pip install -e ".[dev]"
pre-commit install
pytestruff check . # lint
ruff format . # format
mypy src/ # type check
pytest # tests (coverage enforced ≥85%)- One feature or fix per PR
- Include tests for new code
- Update CHANGELOG.md under
[Unreleased] - All CI checks must pass (lint, types, tests across Python 3.9–3.13)
Two layers, both required for new wire-touching code:
- Unit (
tests/unit/) — mock httpx withrespxand assert the exact request body sent on the wire, not just the return value. This is what catches wrong field names / shapes / required-but-missing fields. Coverage gate ≥85%. - Live (
tests/integration/) — exercise the operation against the real eupago sandbox (skipped automatically when env vars are missing). When the upstream channel doesn't have a feature provisioned, usepytest.skip("clear reason …")rather than letting the test pass silently.
For the README / CHANGELOG / roadmap, status is per operation (not per service). service.create_payment being live-validated does not entitle service.authorize to a green check. See the matrix style in README.md for the convention.
See SECURITY.md — do not open a public issue for vulnerabilities.