.. _development:
Development
-----------
Prerequisites:
- `uv `__ for package management and virtual
environments.
- `direnv `__ (recommended) for automatic environment
activation.
- ``make`` for running development tasks.
Dependencies and their versions are specified in ``pyproject.toml`` (with
dependency groups for dev, lint, tests and docs) and locked in ``uv.lock``.
Lockfile updates are automated via GitHub Actions and Renovate.
Setting up a development environment with direnv
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
The project includes an ``.envrc`` file that automatically creates a virtual
environment (honoring ``.python-version``), activates it and syncs all
dependencies::
direnv allow
make init # install pre-commit hooks
Setting up a development environment manually
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
::
uv venv
uv sync --locked --all-groups --all-extras
uv run pre-commit install
Available Make targets
~~~~~~~~~~~~~~~~~~~~~~
Run ``make help`` to see all available targets. Key commands::
make lint # run pre-commit on all files
make test # run pytest with coverage
make cov # combine and report coverage
make type # run mypy type checking
make xdoc # run xdoctest
make test-all # run all of the above
make docs # build Sphinx documentation
make docs-serve # serve docs locally
If ``pre-commit`` fails during a push, stage changes, amend the commit, and
push again.
Building docs
~~~~~~~~~~~~~
::
make docs
make docs-serve
sphinx-autoapi automatically discovers and documents the API from ``src/``.
No manual ``sphinx-apidoc`` run is needed.
Bump and releasing
~~~~~~~~~~~~~~~~~~
Version bumping uses ``git-cliff`` for changelog generation and ``uv version``
for version management::
make bump # bump version, update changelog, commit and tag
make ch # update CHANGELOG.md only
``make bump`` will refuse to run on a dirty working tree. After bumping, push
the commit and tag::
git push && git push --tags
Release to PyPI is automated via GitHub Actions on tag push.
To keep a clean development history, use branches and PRs::
gh pr create --fill
gh pr merge --squash --delete-branch [-t "fix|ci|feat: msg"]
Configuration files
~~~~~~~~~~~~~~~~~~~
Configuration files:
- pre-commit configured in .pre-commit-config.yaml;
- ruff (linting and formatting) configured in pyproject.toml;
- pydoclint configured in pyproject.toml;
- typos configured in pyproject.toml;
- coverage configured in pyproject.toml;
- mypy configured in pyproject.toml;
- git-cliff configured in cliff.toml;
- yamlfmt configured in .yamlfmt.yml;
- taplo (TOML formatting) configured in .taplo.toml;
- mdformat configured in .mdformat.toml.