Skip to main content

A Copier template for modern Python projects.

Project description

Modern Python package template

Copier CI Changelog

A Copier template for modern Python projects.

Demo repo generated from this template: mgaitan/yet-another-demo

Features

  • 🐍 Modern Python package (3.12+)
  • 📦 Build and dependency management with uv, split by groups (dev/qa/docs)
  • 🧊 Dependency cooldowns enabled by default in uv ([tool.uv].exclude-newer = "1 week"), with targeted overrides when needed (for example ty) to reduce supply-chain risk without blocking QA tools
  • 🧹 Linting and formatting via Ruff with a broad set of rules enabled
  • ✅ Type checking via ty
  • 🪝 Optional pre-commit style QA orchestration via prek as an external tool (uv tool install prek; hooks include check-ast, check-yaml, check-toml, Ruff, Ty)
  • 🧪 Tests with pytest, coverage.py and extensions
  • 📚 Docs with Sphinx, MyST and a few extensions, deployed to GitHub Pages
  • 👀 Automatic docs preview deployment for PRs that modify documentation (/_preview/pr-<PR_NUMBER>/ on GitHub Pages)
  • 🧭 Generated docs follow Diataxis and document rationale in about_the_docs
  • 🏗️ Use of GitHub CLI for autotic project creation
  • ⚙️ CI workflow on GitHub Actions
  • 🚀 Automated releases to PyPI via Trusted Publishing
  • 🧠 Sensible defaults via introspection to minimize answers during the initial setup
  • 🛠️ Makefile with shortcuts for common tasks
  • 📄 Generation of generic docs such as LICENSE, CODE_OF_CONDUCT, etc.
  • 🤖 Heavily curated AGENTS.md
  • 🌀 Initial setup of the development environment and git repo
  • 🔁 Scheduled template refresh workflow that opens a PR every 20 days when updates are available
  • ♻️ Projects updatable with copier update

Please read my blog post to learn about the details of the decisions I made and the alternatives I considered.

Package Documentation

The package now includes a Diataxis-based docs set under docs/ that expands this README:

Quick setup and usage

Quick shortcut (auto-detects copy vs update):

uvx python-package-copier-template [PATH_TO_PROJECT]

This runs copier copy --defaults --unsafe to PATH_TO_PROJECT (or . if omitted) when no .copier-answers.yml is present, or copier update --defaults --unsafe when it is. Check the installed version with uvx python-package-copier-template --version. When installed from PyPI, the wrapper copies from the matching template release instead of always using main.

If you want the latest development version straight from this repository instead of the latest published release, use:

uvx git+https://github.com/mgaitan/python-package-copier-template [PATH_TO_PROJECT]

You can check that wrapper version with uvx git+https://github.com/mgaitan/python-package-copier-template -- --version.

Start a new project explicitly with Copier if you want to bypass the wrapper:

uvx --with=copier-template-extensions copier copy --trust "gh:mgaitan/python-package-copier-template" /path/to/your/new/project

To upgrade an existing project created from this template to the latest version, run:

uvx --with=copier-template-extensions copier update . --trust 

This will fetch the latest template version and guide you through updating your project, preserving your customizations whenever possible.

The generated project also ships a Template Update GitHub Actions workflow that runs every 20 days (or on manual dispatch) to execute uvx copier update --trust --defaults . and open a pull request with the changes and template version bump.

To test a local development version of the template, clone the repository and run:

uv sync
uv run copier copy --trust  --vcs-ref=HEAD . /path/to/your/test/project

If you create the GitHub repository via the gh CLI prompt, the template will attempt to enable GitHub Pages (using the Actions build type) so documentation deployments succeed. If Pages is unavailable (for example, with some private repositories or account policies), the docs workflow will keep failing until Pages is allowed.

To publish a release of your project to PyPI, you need to register the project with trusted publishing. Read more about how this workflow works here.

This repository's own release workflow also refreshes the demo repository after a successful publish. That step requires the DEMO_REPO_TOKEN GitHub Actions secret, documented in Configuration.

Then

$ make bump    # optional
$ make release

Acknowledgement

This project template started as a fork of pawamoy/copier-uv. Then I simplified and changed it to fit my needs.

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

python_package_copier_template-0.4.3.tar.gz (6.1 kB view details)

Uploaded Source

Built Distribution

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

File details

Details for the file python_package_copier_template-0.4.3.tar.gz.

File metadata

  • Download URL: python_package_copier_template-0.4.3.tar.gz
  • Upload date:
  • Size: 6.1 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: uv/0.11.3 {"installer":{"name":"uv","version":"0.11.3","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

File hashes

Hashes for python_package_copier_template-0.4.3.tar.gz
Algorithm Hash digest
SHA256 b6caf7b4f8c0d8b00267d1b3def393faba6fb0e22e5c85e419bc8033a0f083a7
MD5 6f2be8cfa43353311af5aeee80148c05
BLAKE2b-256 025a6508dbc90df03ad3d9b5f35e2db27305cc2b064ea931c2d8be6a5a404b2e

See more details on using hashes here.

File details

Details for the file python_package_copier_template-0.4.3-py3-none-any.whl.

File metadata

  • Download URL: python_package_copier_template-0.4.3-py3-none-any.whl
  • Upload date:
  • Size: 7.7 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: uv/0.11.3 {"installer":{"name":"uv","version":"0.11.3","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

File hashes

Hashes for python_package_copier_template-0.4.3-py3-none-any.whl
Algorithm Hash digest
SHA256 d4e637dcc4348889bc6a86343a454dfdfb736777a7c22c7ed735d5c8b46b2ca6
MD5 d3891403423d6dc1e1b015a29216f857
BLAKE2b-256 460e4a9b757b373e96df5d1d8aa9c6e321539c2f6f82ff9c890811fc2d9d74d4

See more details on using hashes here.

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