Thank you for your interest in contributing to SAF! This document will help you get started.
- Fork the repository
- Create a virtual environment and install dependencies (see README.md)
- Read the Developer Guidelines before writing code
All parsers and analysers must follow the conventions documented in docs/developer_guidelines.md. This includes:
- Architecture and method lifecycle
- How to implement
execute()andget_log_files() - Error handling (guard against missing files, use
logger.warning()) - Output format conventions
- Test structure with
skipTestfor missing data - Result summary mechanics
Before submitting a PR, verify:
- Class inherits from
BaseParserInterfaceorBaseAnalyserInterface -
descriptionclass attribute is set -
formatclass attribute matches the functional return type ofexecute() -
get_log_files()returns only files that exist (parsers only) -
execute()guards against emptyget_log_files()withlogger.warning()+ empty return - No
IndexErrorcan propagate fromget_log_files()[0]access - No
print()statements (enforced by ruffT201) - Test file exists under
tests/withskipTestguard for missing data - Output validates correctly with test data
- All existing tests pass
python -m unittest discover tests/- Follow existing code patterns in the repository
- Use type hints
- Keep
execute()focused on parsing logic — let the base class handle I/O and summary tracking - Prefer
logger.warning()over raising exceptions for expected conditions (missing files, empty data)
When reporting bugs, please include:
- iOS version of the sysdiagnose archive
- Python version
- Full traceback
- Minimal reproduction steps
By contributing, you agree that your contributions will be licensed under the European Union Public Licence.