Development¶
The unit test suite uses synthetic data and fake readers. A separate integration
test creates a temporary GPG key and password store when pass, gpg, and
gpgconf are available.
Setup¶
git clone https://github.com/fbossiere/gnu-pass-to-csv.git
cd gnu-pass-to-csv
uv sync --locked --extra dev --extra docs
uv run pre-commit install
Quality gate¶
Run the same checks used for review and release:
uv lock --check
uv run ruff format --check .
uv run ruff check .
uv run mypy
uv run pytest
uv run mkdocs build --strict
uv build
uv run twine check dist/*
Run the real pass and GPG test explicitly with:
Documentation workflow¶
Documentation sources live in docs/, with navigation and theme configuration
in mkdocs.yml.
Open the local URL printed by MkDocs. Before committing, run the strict build so broken navigation, links, and configuration warnings fail locally.
Pull requests build the documentation but never deploy it. A push to main
builds the same sources and deploys the generated static site to GitHub Pages.
Design invariants¶
- Never accept or forward a GPG passphrase.
- Invoke
passwithout a shell and keep arguments independent of decrypted content. - Never log decrypted content or include it in exceptions.
- Make complete exports the default; partial output must be explicit.
- Write plaintext with restrictive permissions outside the encrypted store.
- Preserve deterministic row ordering and the documented CSV field order.
Read the canonical
CONTRIBUTING.md
before opening a pull request.