Skip to main content

ONE Data Python project utilities - templates, tools, and workflows

Project description

bblocks-projects

A CLI for creating, updating, and auditing Python projects against a shared Copier template.

PyPI Python License

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.11+, 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. create and update rely on .copier-answers.yml to track which template version generated the project. If you'd rather not have that file, use add to take a one-shot copy of the components you want and walk away.
  • Your project predates Copier and you want full template adoption. update requires .copier-answers.yml. Either start from add for 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.

Source · Issues · MIT — see LICENSE.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

bblocks_projects-1.0.1.tar.gz (18.8 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

bblocks_projects-1.0.1-py3-none-any.whl (22.5 kB view details)

Uploaded Python 3

File details

Details for the file bblocks_projects-1.0.1.tar.gz.

File metadata

  • Download URL: bblocks_projects-1.0.1.tar.gz
  • Upload date:
  • Size: 18.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for bblocks_projects-1.0.1.tar.gz
Algorithm Hash digest
SHA256 dc7f83bfcc6bff9734212b7e4b19dce172457e293edb9dc48acba7a7c315376d
MD5 70dd3edeed51e6ed991b5ae83224fb67
BLAKE2b-256 7cc29ee07a5ee636de9c33a22015c35e954651d04e27a7410a74711278c25989

See more details on using hashes here.

Provenance

The following attestation bundles were made for bblocks_projects-1.0.1.tar.gz:

Publisher: publish.yml on ONEcampaign/bblocks-projects

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file bblocks_projects-1.0.1-py3-none-any.whl.

File metadata

File hashes

Hashes for bblocks_projects-1.0.1-py3-none-any.whl
Algorithm Hash digest
SHA256 9bbff4d41152d7ce5a344b79112507b76b4ae7d18394e26b7201a9543317be91
MD5 a739b6ec1bdeea4399b066cdc473cf57
BLAKE2b-256 7ece5be555ea00a439df956123c648088fb2328a8ef692ac15c2f41ac1e29e4f

See more details on using hashes here.

Provenance

The following attestation bundles were made for bblocks_projects-1.0.1-py3-none-any.whl:

Publisher: publish.yml on ONEcampaign/bblocks-projects

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page