Thanks for your interest. This repo is maintained by one person, so please read this before opening a large pull request — it will save us both time.
For anything beyond a bug fix or a docs correction, open an issue first and describe what you want to change. This repo has a few conventions that are load-bearing for the rest of Continuo (the contract's hash and layout config, the closure resolver's import roots, the sqlglot read gate), so a pull request that cuts across them is painful to land no matter how good the code is.
This project is licensed under the Apache License 2.0. Contributions are accepted under the same license.
We use the Developer Certificate of Origin — a short statement that you wrote the code, or otherwise have the right to submit it. You agree to it by adding a sign-off line to each commit:
Signed-off-by: Your Name <your.email@example.com>
git commit -s adds this for you. To sign off a branch you already wrote:
git rebase --signoff origin/main
git push --force-with-leaseA CI check enforces this on every pull request. There is no separate agreement to sign.
We do not use per-file license headers. The root LICENSE covers the whole
repository; please do not add headers to new files.
Prerequisites: Python 3.14+, uv, and Docker (only needed
for the Postgres/Trino integration tests and the csv-reader/validation-runner
integration tests, which start a real minio backend via docker run).
uv sync --all-packages --all-groupsThis is a uv workspace: the root package (continuo_python_runtime/, the harness), the
port (contract/), and the two engine adapters (adapters/postgres/, adapters/trino/)
are separate packages sharing one lockfile.
uv run ruff check .
uv run ruff check contract
uv run mypy continuo_python_runtime
uv run mypy contract/continuo_engine_contract
uv run --package continuo-postgres-adapter mypy adapters/postgres/continuo_postgres_adapter
uv run --package continuo-trino-adapter mypy adapters/trino/continuo_trino_adapter
uv run pytest --cov=continuo_python_runtime -m "not image and not integration" -v
uv run pytest tests/test_csv_readers_integration.py tests/test_validation_runner.py -m integration -v
uv run pytest contract/tests -v
uv run pytest adapters/postgres/tests adapters/trino/tests -m "not integration" -vThese are exactly what .github/workflows/ci.yml runs. Integration tests against a real
Postgres/Trino stack, or against the csv-reader/validation-runner minio backend, need
Docker and are not required for most changes — see .github/workflows/ci.yml for how CI
stands them up if you want to run them locally.
Also run the security scan before opening a pull request that touches dependencies or anything that could carry a credential:
scripts/security-scan.sh- Changelog. A pull request whose changes are worth a release note adds an entry
under
## [Unreleased]in CHANGELOG.md, Keep a Changelog style. At release time that section is renamed to the new version and a fresh empty## [Unreleased]goes above it —.github/workflows/release.ymlreads the section matching the pushed tag to build the GitHub Release notes, and falls back to GitHub's generated notes if none exists. - Python logging. Use the standard
loggingmodule for diagnostic output, neverprint. The only exception is machine-parsed stdout protocols (e.g. the CLI's sentinel-framed result blocks) — those stay as explicitprint, since stdout is reserved exclusively for them. - Exact-pinned dependencies.
continuo-engine-contractand other in-repo packages are pinned exactly, not with a range — see the comment inpyproject.tomlfor why.
Participation in this project is governed by our Code of Conduct.
Please don't open a public issue — see SECURITY.md.