# 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/failure/*
```

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.
