Development#
You need the following requirements:
hatchfor test automation and package dependency managements. If you don’t have hatch, you can usepipx run hatchto run it without installing, orpipx install hatch. Dependencies are locked thanks to pip-deepfreeze. You can runhatch env showto list available environments and scripts.hatch run init # init repo with pre-commit hooks hatch run sync # sync venv with deepfreeze hatch run lint:run hatch run tests.py3.11:all
Hatch handles everything for you, including setting up an temporary virtual environment for each run.
pre-commitfor all style and consistency checking. While you can run it with nox, this is such an important tool that it deserves to be installed on its own. If pre-commit fails during pushing upstream then stage changes, Commit Extend (into previous commit), and repeat pushing.
pip, pip-deepfreeze and hatch are pinned in
.github/workflows/constraints.txt for consistency with CI/CD.
pipx install pre-commit
pipx install pip-deepfreeze
pacman -S python-hatch python-hyperlink python-httpx
Setting up a development with direnv#
echo "layout hatch" > .envrc
hatch run init
Setting up a development environment manually#
You can set up a development environment by running:
python3 -m venv .venv
source ./.venv/bin/activate
pip install -v -e .[dev,tests,docs]
With direnv for using Jupyter during development:
jupiter notebook
And only in case you need a system wide easy accessible kernel:
python -m ipykernel install --user --name="clop"
Testing and coverage#
Use pytest to run the unit checks:
pytest
Use coverage to generate coverage reports:
coverage run --parallel -m pytest
Or use hatch:
hatch run tests:all
hatch run coverage:combine
hatch run coverage:report
Building docs#
You can build the docs using:
hatch run docs:sync
hatch run docs:build
You can see a preview with:
hatch run docs:serve
When needed (e.g. API updates):
sphinx-apidoc -f -o docs/api/ src/clophfit/
Bump and releasing#
To bump version and upload build to test.pypi using:
hatch run bump
hatch run bump "--increment PATCH" "--files-only" \
["--no-verify" to bypass pre-commit and commit-msg hooks]
git push
while to update only the CHANGELOG.md file:
hatch run ch
Release will automatically occur after pushing.
(Otherwise)
pipx run --spec commitizen cz bump --changelog-to-stdout --files-only \
(--prerelease alpha) --increment MINOR
To keep clean development history use branches and pr:
gh pr create --fill
gh pr merge --squash --delete-branch [-t “fix|ci|feat: msg”]
Configuration files#
Manually updated pinned dependencies for CI/CD:
.github/workflows/constraints.txt (testing dependabot)
Configuration files:
pre-commit configured in .pre-commit-config.yaml;
bandit (sys) configured in bandit.yml;
pylint (sys) configured in pyproject.toml;
isort (sys) configured in pyproject.toml;
black configured in pyproject.toml (pinned in pre-commit);
ruff configured in pyproject.toml (pinned in pre-commit);
darglint configured in .darglint (pinned in pre-commit);
codespell configured in .codespellrc (pinned in pre-commit);
coverage configured in pyproject.toml (tests deps);
mypy configured in pyproject.toml (tests deps);
commitizen in pyproject.toml (dev deps and pinned in pre-commit).
pip-df generates requirements[-dev,docs,tests].txt.
Other manual actions:
pylint src/ tests/
bandit -r src/