{"id":21828396,"url":"https://github.com/liblaf/copier-python","last_synced_at":"2026-04-05T11:03:16.902Z","repository":{"id":258165115,"uuid":"873481929","full_name":"liblaf/copier-python","owner":"liblaf","description":"🐍 A modern Copier template for Python projects. Pre-configured with mise, ruff, pytest, mkdocs, and GitHub Actions workflows for seamless development.","archived":false,"fork":false,"pushed_at":"2026-01-25T09:32:43.000Z","size":395,"stargazers_count":4,"open_issues_count":7,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2026-01-26T00:27:39.581Z","etag":null,"topics":["automation","code-quality","continuous-integration","copier","copier-template","github-actions","jinja","package-management","python","repository-structure","template"],"latest_commit_sha":null,"homepage":"","language":"Shell","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/liblaf.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null},"funding":{"custom":["https://afdian.com/a/liblaf"]}},"created_at":"2024-10-16T08:43:26.000Z","updated_at":"2026-01-25T09:32:09.000Z","dependencies_parsed_at":"2024-10-17T22:15:12.344Z","dependency_job_id":"f4072aba-b0be-4b3d-b422-9b34793eb9bb","html_url":"https://github.com/liblaf/copier-python","commit_stats":null,"previous_names":["liblaf/copier-python"],"tags_count":15,"template":false,"template_full_name":null,"purl":"pkg:github/liblaf/copier-python","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/liblaf%2Fcopier-python","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/liblaf%2Fcopier-python/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/liblaf%2Fcopier-python/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/liblaf%2Fcopier-python/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/liblaf","download_url":"https://codeload.github.com/liblaf/copier-python/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/liblaf%2Fcopier-python/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28965436,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-01T02:14:24.993Z","status":"ssl_error","status_checked_at":"2026-02-01T02:13:55.706Z","response_time":56,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["automation","code-quality","continuous-integration","copier","copier-template","github-actions","jinja","package-management","python","repository-structure","template"],"created_at":"2024-11-27T18:16:13.890Z","updated_at":"2026-04-01T23:45:54.546Z","avatar_url":"https://github.com/liblaf.png","language":"Shell","funding_links":["https://afdian.com/a/liblaf"],"categories":[],"sub_categories":[],"readme":"\u003cdiv align=\"center\" markdown\u003e\n\n![Copier Python](https://socialify.git.ci/liblaf/copier-python/image?custom_language=Python\u0026description=1\u0026forks=1\u0026issues=1\u0026language=1\u0026logo=https%3A%2F%2Fraw.githubusercontent.com%2Fcopier-org%2Fcopier%2Frefs%2Fheads%2Fmaster%2Fimg%2Flogo.svg\u0026name=1\u0026owner=1\u0026pattern=Transparent\u0026pulls=1\u0026stargazers=1\u0026theme=Auto)\n\n**[Browse the template files »](https://github.com/liblaf/copier-python/tree/main/template)**\n\n[![Made with Copier](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/copier-org/copier/master/img/badge/badge-black.json)](https://github.com/copier-org/copier)\n[![MegaLinter](https://github.com/liblaf/copier-python/actions/workflows/mega-linter.yaml/badge.svg)](https://github.com/liblaf/copier-python/actions/workflows/mega-linter.yaml)\n[![Release PR](https://github.com/liblaf/copier-python/actions/workflows/release-pr.yaml/badge.svg)](https://github.com/liblaf/copier-python/actions/workflows/release-pr.yaml)\n[![Copier Update](https://github.com/liblaf/copier-python/actions/workflows/copier-update.yaml/badge.svg)](https://github.com/liblaf/copier-python/actions/workflows/copier-update.yaml)\n\n[Changelog](https://github.com/liblaf/copier-python/blob/main/CHANGELOG.md) · [Template Files](https://github.com/liblaf/copier-python/tree/main/template) · [Report Bug](https://github.com/liblaf/copier-python/issues) · [Request Feature](https://github.com/liblaf/copier-python/issues)\n\n![Rule](https://cdn.jsdelivr.net/gh/andreasbm/readme/assets/lines/rainbow.png)\n\n\u003c/div\u003e\n\n## 🐍 What Is `copier-python`?\n\n`copier-python` is the Python layer in the `liblaf` Copier stack. It adds packaging, typed source layout, documentation, testing, benchmarking, and PyPI publishing on top of the shared repository and release foundations.\n\n\u003e [!IMPORTANT]\n\u003e This template depends on [`gh:liblaf/copier-shared`](https://github.com/liblaf/copier-shared) and [`gh:liblaf/copier-release`](https://github.com/liblaf/copier-release). Apply the stack in that order: shared → release → python.\n\nIf you want the real source of truth for generated files, start in [`template/`](https://github.com/liblaf/copier-python/tree/main/template). This repository README documents the template itself; the generated project README comes from [`template/README.md.jinja`](https://github.com/liblaf/copier-python/blob/main/template/README.md.jinja).\n\n## ✨ What You Get\n\n- 📦 A modern Python package layout under `src/`, including `py.typed`, version stubs, and lazy-loader-friendly package exports.\n- ⚙️ A `pyproject.toml` wired for PEP 621 metadata, `uv` dependency groups, Hatchling builds, and Hatch VCS versioning.\n- 🧪 A `noxfile.py` with multi-version test sessions, dependency resolution variants, and optional benchmark sessions.\n- 📚 Docs scaffolding with Zensical, MkDocs Material, mkdocstrings, GitHub-friendly Markdown, and Read the Docs configuration.\n- 🚀 Release automation that fits the rest of the `liblaf` Copier stack, including changelog generation, draft releases, and PyPI publishing through OIDC.\n- 🔁 Copier-friendly update paths so the generated repository can be refreshed later without redoing the whole setup by hand.\n\n## 🚀 Apply The Template\n\nAfter applying the shared and release templates, add the Python layer with:\n\n```bash\ncopier copy --trust gh:liblaf/copier-python .\n```\n\n## 🔄 Update The Template\n\nTo refresh the Python layer in an existing repository:\n\n```bash\ncopier recopy --trust --answers-file '.config/copier/.copier-answers.python.yaml'\n```\n\nThe generated repository usually keeps separate Copier answers files for each layer, so scheduled update workflows can refresh the whole stack over time.\n\n## 🧱 Template Stack\n\n- 🧰 [`gh:liblaf/copier-shared`](https://github.com/liblaf/copier-shared): repository hygiene, common automation, editor settings, and shared project metadata.\n- 🏷️ [`gh:liblaf/copier-release`](https://github.com/liblaf/copier-release): release PRs, changelog generation, Git tags, GitHub Releases, and publish orchestration.\n- 🐍 [`gh:liblaf/copier-python`](https://github.com/liblaf/copier-python): Python packaging, docs, tests, benchmarks, and PyPI workflow wiring.\n\n## 🚢 Release Workflow\n\nIn a generated project, the default release flow looks like this:\n\n1. Push commits using Conventional Commits.\n2. `release-pr.yaml` creates a release PR with the changelog and updated version.\n3. Merge the release PR yourself, or approve it and let [`mergery[bot]`](https://github.com/apps/mergery) merge it once the button is green.\n4. `release-draft.yaml` creates a draft release.\n5. `python-release.yaml` builds the package, publishes it to PyPI with GitHub OIDC, and uploads release assets to the draft release.\n6. `release-publish.yaml` publishes the draft release after 6 hours so the release jobs have enough time to finish.\n\n## 🛠️ Post Setup\n\n### 📚 Read the Docs\n\n1. Visit \u003chttps://app.readthedocs.org/dashboard/import/\u003e.\n2. Follow the prompts to import the generated repository.\n3. Configure these settings:\n\n| Location | Value |\n| --- | --- |\n| `Setup \u003e Settings \u003e Default version` | `stable` |\n| `Setup \u003e Settings` | Enable `Build pull requests for this project` |\n| `Setup \u003e Addons \u003e Analytics` | Enable |\n| `Setup \u003e Addons \u003e Link previews` | Enable |\n| `Building \u003e Pull request builds` | Enable `Build pull requests for this project` |\n| `Building \u003e Pull request builds` | Enable `Show build overview in a comment` |\n\n4. Add this automation rule:\n\n| Field | Value |\n| --- | --- |\n| `Description` | `Semantic Versioning` |\n| `Match` | `SemVer versions` |\n| `Version type` | `Tag` |\n| `Action` | `Activate version` |\n\n### 📦 PyPI Trusted Publishing\n\n1. Visit \u003chttps://pypi.org/manage/account/publishing/\u003e.\n2. Create a trusted publisher for the generated repository.\n3. Point it at the GitHub Actions release workflow created by this template stack.\n\nThis template publishes with GitHub OIDC, so you do not need a long-lived PyPI API token.\n\n## 🤝 Contributing\n\nTo improve the template, edit the files under [`template/`](https://github.com/liblaf/copier-python/tree/main/template) and the small helper files around it, then keep commit messages in Conventional Commits format so the release automation can do its job cleanly.\n\n[![PR Welcome](https://img.shields.io/badge/%F0%9F%A4%AF%20PR%20WELCOME-%E2%86%92-ffcb47?labelColor=black\u0026style=for-the-badge)](https://github.com/liblaf/copier-python/pulls)\n\n[![Contributors](https://gh-contributors-gamma.vercel.app/api?repo=liblaf/copier-python)](https://github.com/liblaf/copier-python/graphs/contributors)\n\n## 🔗 More Copier Templates\n\n\u003c!-- tangerine-start: projects/copier.md --\u003e\n\n- **[Shared](https://github.com/liblaf/copier-shared)** - ✨ Automated code quality, repository hygiene, and project-wide defaults for the rest of the template stack.\n- **[Release](https://github.com/liblaf/copier-release)** - 🚀 Release PRs, changelog generation, tags, GitHub Releases, and publishing automation.\n- **[Python](https://github.com/liblaf/copier-python)** - 🐍 Python packaging, docs, tests, benchmarks, and PyPI workflow wiring.\n- **[Rust](https://github.com/liblaf/copier-rust)** - 🦀 Rust project template with modern tooling and CI/CD.\n- **[TypeScript](https://github.com/liblaf/copier-typescript)** - 🚀 TypeScript project template with modern runtime, tooling, and release automation.\n\n\u003c!-- tangerine-end --\u003e\n\n---\n\n#### 📝 License\n\nCopyright © 2024 [liblaf](https://github.com/liblaf). \u003cbr /\u003e\nThis project is [MIT](https://github.com/liblaf/copier-python/blob/main/LICENSE) licensed.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fliblaf%2Fcopier-python","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fliblaf%2Fcopier-python","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fliblaf%2Fcopier-python/lists"}