Contributing
Development setup
This project uses uv for dependency management.
git clone https://github.com/dioscuri-tda/pyBallMapper.git
cd pyBallMapper
uv sync
uv run --group dev pre-commit install # enable git hooks
Never use pip install for local development — always uv sync.
Pull requests
Open pull requests against the develop branch, not main. The main branch is reserved for releases.
CI pipeline
Every push and PR runs three stages in order. All must pass before merging.
Stage |
Command |
What it checks |
|---|---|---|
Lint |
|
Ruff lint + format |
Typecheck |
|
Static types (package only) |
Test |
|
Unit tests |
Running tests
uv run pytest # all tests
uv run pytest -x # stop on first failure
uv run pytest tests/test_ballmapper.py # single file
uv run pytest -k "TestBallMapperConstruction" # single test class
Fixtures live in tests/conftest.py and are shared across all test files.
Code quality
Ruff (lint + format)
Configured in pyproject.toml: line-length 88, target py313, rules E/F/W/I (ignores E203/E501/E731).
uv run pre-commit run --all-files # run on entire tree
Pre-commit runs ruff (with --fix) and ruff-format automatically on every commit.
Mypy (type checking)
uv run mypy pyballmapper/
Only the package source is checked — tests and docs are excluded. ignore_missing_imports = true for untyped third-party libraries.
Pre-commit hooks
Hooks are defined in .pre-commit-config.yaml:
ruff— lint and auto-fixruff-format— formatmypy— typecheck onpyballmapper/only
Run them on demand: uv run pre-commit run --all-files
Packaging
Built with setuptools. Version is read dynamically from pyballmapper/__init__.py.
uv build
Dependencies are declared in pyproject.toml under [project] dependencies. Dev-only deps (pre-commit, ruff, mypy, pytest) go under [dependency-groups] dev.