bblocks-projects
A CLI for creating, updating, and auditing Python projects against a shared Copier template.
bblocks-projects is the ONE Campaign's tool for keeping its Python projects consistent. It scaffolds new repos, pulls template improvements into existing ones, and adds individual pieces (pre-commit, CI, ruff config) to projects that didn't start from the template.
Why this exists
Every Python project starts with the same decisions and boilerplate: which linter, which type checker, how to wire CI, where tests live, how publishing works. bblocks-projects keeps the choices in one place (the template repo) and gives you four commands to apply them: create, update, add, and doctor.
Install
Requires Python 3.12+, git, and uv on PATH.
# One-off, no install (recommended)
uvx bblocks-projects create my-project
# Install with uv
uv tool install bblocks-projects
# Or pipx / pip
pipx install bblocks-projects
pip install bblocks-projects
If you're signed into the GitHub CLI (gh auth login), create prefills your name, email, and username from your GitHub profile.
Usage
Create a new project. Interactive by default — answer a handful of questions about name, license, and project type:
bblocks-projects create my-analysis # new subdirectory
bblocks-projects create --here # current directory
You'll be asked to pick package (publishable to PyPI; src layout, pytest, py.typed) or project (analysis, pipeline, internal tool — adds data/raw/, data/processed/, optional notebooks, and ruff/ty configs that tolerate pandas/numpy stub gaps). To skip the prompts:
bblocks-projects create my-package --type package --defaults
Update an existing project when the template changes upstream:
cd my-analysis
uvx bblocks-projects update
git diff # review what changed
uv sync
Previously-answered questions are reused silently. Pass --no-skip-answered to re-prompt for any of them, or --ref v1.2.0 to update to a specific template version instead of main.
Add a single component to any Python project — including ones that didn't start from the template:
uvx bblocks-projects add --list # see what's available
uvx bblocks-projects add pre-commit # one component
uvx bblocks-projects add ruff ci pytest # several at once
Available components: pre-commit, ruff, ci, pytest, and pypi-publish (packages only). add merges into your existing pyproject.toml rather than overwriting it, and shows the diff before applying.
Run the doctor to check a project against the current standards:
uvx bblocks-projects doctor # diagnose the current directory
uvx bblocks-projects doctor --strict # exit non-zero on findings (CI-friendly)
uvx bblocks-projects doctor --check-updates # is the template newer upstream?
When not to use this
- You're not at ONE Data. The template encodes our specific choices (uv, ruff, ty, GitHub Actions, src-layout). If your team has different ones, fork the template repo — don't fight ours.
- You don't want a Copier-managed project.
createandupdaterely on.copier-answers.ymlto track which template version generated the project. If you'd rather not have that file, useaddto take a one-shot copy of the components you want and walk away. - Your project predates Copier and you want full template adoption.
updaterequires.copier-answers.yml. Either start fromaddfor the pieces you need, or follow the adoption guide.
What you get
Every generated project includes uv, ruff, ty, pre-commit, and a GitHub Actions CI workflow. Packages also get pytest with coverage, a py.typed marker, and a PyPI trusted-publishing workflow. Projects also get a data/ tree (raw/ gitignored, processed/ tracked) and an optional notebooks/ directory.
Next
- Getting Started — a 15-minute walkthrough from zero to a generated project you've made a real change to.
Metadata
Release files for bblocks-projects 1.1.1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| bblocks_projects-1.1.1.tar.gz | 50.3 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| bblocks_projects-1.1.1-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 105.2 kB
Release files / bblocks_projects-1.1.1.tar.gz
| Download URL | bblocks_projects-1.1.1.tar.gz |
|---|---|
| Size | 50.3 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
7d9c59f37362242f856fb75a747dfac7ce8102a62c0861fd5339ddbca8a0c5b2
|
|
BLAKE2b-256 checksum How to use checksums |
bf7178009e4bcbda05382354cba33c6c0eb412a44f67612866519c54b687a0ca
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Aug 13, 2026.
Transparency logRelease files / bblocks_projects-1.1.1-py3-none-any.whl
| Download URL | bblocks_projects-1.1.1-py3-none-any.whl |
|---|---|
| Size | 54.9 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
9ceab18c1d7f516e769514053fabeb0cfaa94f7c06923bea9f84b92dd714efae
|
|
BLAKE2b-256 checksum How to use checksums |
0c1fd11d585821402c550ab702eed854a14bff97e27a4e30424d3367de629a3c
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Aug 13, 2026.
Transparency log