diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 00000000..e5db8cc7 --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,78 @@ +# Contributing + +Thanks for contributing to parsedmarc. + +## Local setup + +Use a virtual environment for local development. + +```bash +python3 -m venv .venv +. .venv/bin/activate +python -m pip install --upgrade pip +pip install .[build] +``` + +## Before opening a pull request + +Run the checks that match your change: + +```bash +ruff check . +pytest --cov --cov-report=xml tests.py +``` + +If you changed documentation: + +```bash +cd docs +make html +``` + +If you changed CLI behavior or parsing logic, it is also useful to exercise the +sample reports: + +```bash +parsedmarc --debug -c ci.ini samples/aggregate/* +parsedmarc --debug -c ci.ini samples/forensic/* +``` + +To skip DNS lookups during tests, set: + +```bash +GITHUB_ACTIONS=true +``` + +## Pull request guidelines + +- Keep pull requests small and focused. Separate bug fixes, docs updates, and + repo-maintenance changes where practical. +- Add or update tests when behavior changes. +- Update docs when configuration or user-facing behavior changes. +- Include a short summary, the reason for the change, and the testing you ran. +- Link the related issue when there is one. + +## Branch maintenance + +Upstream `master` may move quickly. Before asking for review or after another PR +lands, rebase your branch onto the current upstream branch and force-push with +lease if needed: + +```bash +git fetch upstream +git rebase upstream/master +git push --force-with-lease +``` + +## CI and coverage + +GitHub Actions is the source of truth for linting, docs, and test status. + +Codecov patch coverage is usually the most relevant signal for small PRs. Project +coverage can be noisier when the base comparison is stale, so interpret it in +the context of the actual diff. + +## Questions + +Use GitHub issues for bugs and feature requests. If you are not sure whether a +change is wanted, opening an issue first is usually the safest path.