From 4914f53e2c78d7349d0ddeaa1c3926e34f83afb9 Mon Sep 17 00:00:00 2001 From: Claude Date: Tue, 13 Oct 2026 22:40:53 +0000 Subject: [PATCH 1/5] Add support for Python 3.15 - Bump python_max to 15 (classifiers, .python-version, CI, docs tasks). - Gate the 3.{python_max + 1} prerelease CI entry behind a new hidden python_next_in_beta copier variable (default false). Alphas are too unstable to be a useful signal; flip it on once 3.16 reaches beta. - Bump ctt test targets from 3.14 to 3.15. Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01P1UQo4jmZREtzrWn1xjcDN --- .python-version | 2 +- copier.yml | 9 ++++++++- ctt.toml | 6 +++--- project_name/.github/workflows/ci.yml.jinja | 2 ++ 4 files changed, 14 insertions(+), 5 deletions(-) diff --git a/.python-version b/.python-version index 6324d40..93a848f 100644 --- a/.python-version +++ b/.python-version @@ -1 +1 @@ -3.14 +3.15 diff --git a/copier.yml b/copier.yml index 9669ae9..d4e4e65 100644 --- a/copier.yml +++ b/copier.yml @@ -93,7 +93,14 @@ python_min: python_max: type: int - default: 14 + default: 15 + when: false + +# Set to true once 3.{python_max + 1} reaches beta (feature freeze), +# to add it to the prerelease CI job. Alphas are too unstable to be useful. +python_next_in_beta: + type: bool + default: false when: false get_package_version_from_vcs: diff --git a/ctt.toml b/ctt.toml index c763e74..e143db1 100644 --- a/ctt.toml +++ b/ctt.toml @@ -10,7 +10,7 @@ _post_tasks = [ "VIRTUAL_ENV='' uv run just lint test release 1.0.0", "VIRTUAL_ENV='' uv run just _assert_clean_repo", "VIRTUAL_ENV='' uv run dmypy stop", - "VIRTUAL_ENV='' uv run just test-lowest 3.14", + "VIRTUAL_ENV='' uv run just test-lowest 3.15", "VIRTUAL_ENV='' uv run just build-docs", "VIRTUAL_ENV='' uv run just deps-audit", @@ -102,7 +102,7 @@ in_rtd = true in_codecov = true jupyter_files = "ignore" -[output.".ctt/python3.14"] -python_min = 14 +[output.".ctt/python3.15"] +python_min = 15 jupyter_files = "allow" format_tool = "ruff" diff --git a/project_name/.github/workflows/ci.yml.jinja b/project_name/.github/workflows/ci.yml.jinja index a2392c8..5527b85 100644 --- a/project_name/.github/workflows/ci.yml.jinja +++ b/project_name/.github/workflows/ci.yml.jinja @@ -191,9 +191,11 @@ jobs: - resolution: prerelease os: ubuntu-latest python-version: '3.{{ python_max }}' + {%- if python_next_in_beta %} - resolution: prerelease os: ubuntu-latest python-version: '3.{{ python_max + 1 }}' + {%- endif %} fail-fast: false {%- raw %} runs-on: ${{ matrix.os }} From 7e43c71cdc13c39d64e5279f3a86752b36c0b92f Mon Sep 17 00:00:00 2001 From: Claude Date: Wed, 14 Oct 2026 05:25:26 +0000 Subject: [PATCH 2/5] Move the next-Python beta gate to its own PR Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01P1UQo4jmZREtzrWn1xjcDN --- copier.yml | 7 ------- project_name/.github/workflows/ci.yml.jinja | 2 -- 2 files changed, 9 deletions(-) diff --git a/copier.yml b/copier.yml index d4e4e65..c596597 100644 --- a/copier.yml +++ b/copier.yml @@ -96,13 +96,6 @@ python_max: default: 15 when: false -# Set to true once 3.{python_max + 1} reaches beta (feature freeze), -# to add it to the prerelease CI job. Alphas are too unstable to be useful. -python_next_in_beta: - type: bool - default: false - when: false - get_package_version_from_vcs: type: bool help: Use the version control system for versioning? diff --git a/project_name/.github/workflows/ci.yml.jinja b/project_name/.github/workflows/ci.yml.jinja index 5527b85..a2392c8 100644 --- a/project_name/.github/workflows/ci.yml.jinja +++ b/project_name/.github/workflows/ci.yml.jinja @@ -191,11 +191,9 @@ jobs: - resolution: prerelease os: ubuntu-latest python-version: '3.{{ python_max }}' - {%- if python_next_in_beta %} - resolution: prerelease os: ubuntu-latest python-version: '3.{{ python_max + 1 }}' - {%- endif %} fail-fast: false {%- raw %} runs-on: ${{ matrix.os }} From 5325a3116961a72b818382ec62906b9f764cc19a Mon Sep 17 00:00:00 2001 From: Claude Date: Wed, 14 Oct 2026 11:37:03 +0000 Subject: [PATCH 3/5] Keep the template repo's own tooling on Python 3.14 The template's dev tools are not 3.15-ready yet: ctt imports beartype, which needs typing.no_type_check_decorator (removed in 3.15), and pyyaml has no 3.15 wheel and fails to build from source under uv 0.10.12. Generated projects still default to 3.15 via python_max. Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01P1UQo4jmZREtzrWn1xjcDN --- .python-version | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.python-version b/.python-version index 93a848f..6324d40 100644 --- a/.python-version +++ b/.python-version @@ -1 +1 @@ -3.15 +3.14 From 10df33861bfc8f85b84b236e9153651ff0333b72 Mon Sep 17 00:00:00 2001 From: Claude Date: Wed, 14 Oct 2026 11:41:00 +0000 Subject: [PATCH 4/5] Require uv >=0.13.0, the first release that ships CPython 3.15.0 uv 0.10.12 only knows 3.15.0a7, so a generated project (pinned to 3.15) got an alpha interpreter that cannot load wheels built for 3.15.0 final (mypy's librt: "unknown slot ID 85"). uv 0.12.24 tops out at 3.15.0rc3; 0.13.0 is the first with 3.15.0. Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01P1UQo4jmZREtzrWn1xjcDN --- .github/workflows/uv-tests.yml | 2 +- README.md | 2 +- project_name/pyproject.toml.jinja | 2 +- pyproject.toml | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/uv-tests.yml b/.github/workflows/uv-tests.yml index 811995c..17b4102 100644 --- a/.github/workflows/uv-tests.yml +++ b/.github/workflows/uv-tests.yml @@ -35,7 +35,7 @@ jobs: strategy: fail-fast: false matrix: - uv-version: ["0.10.12", "latest"] + uv-version: ["0.13.0", "latest"] steps: - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 with: diff --git a/README.md b/README.md index dff2483..bbd610f 100644 --- a/README.md +++ b/README.md @@ -10,7 +10,7 @@ A modern Python project template using recommended development tools and best pr ## TL;DR -Assuming that you have `uv` installed (version `>=0.10.12`) +Assuming that you have `uv` installed (version `>=0.13.0`) 1. `uvx copier copy gh:tsvikas/python-template path/to/project/directory/` diff --git a/project_name/pyproject.toml.jinja b/project_name/pyproject.toml.jinja index 7e8a3a6..0825399 100644 --- a/project_name/pyproject.toml.jinja +++ b/project_name/pyproject.toml.jinja @@ -115,7 +115,7 @@ typing = [ [tool.uv] -required-version = ">=0.10.12" +required-version = ">=0.13.0" default-groups = ["dev", "test", "typing"] # Minimum age guard: only consider package versions released at least 24h ago, # as a lightweight supply-chain defense against just-published malicious releases. diff --git a/pyproject.toml b/pyproject.toml index 0ec8a68..ab2d745 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -14,7 +14,7 @@ dev = [ CPY001 = "CPY001" [tool.uv] -required-version = ">=0.10.12" +required-version = ">=0.13.0" # Minimum age guard: only consider package versions released at least 24h ago, # as a lightweight supply-chain defense against just-published malicious releases. exclude-newer = "24 hours" From eba6e2dd79eb85bb0410132594537c5c47666053 Mon Sep 17 00:00:00 2001 From: Claude Date: Wed, 14 Oct 2026 11:43:08 +0000 Subject: [PATCH 5/5] Keep the template repo's own uv floor at 0.10.12 The repo itself stays on Python 3.14, so it does not need uv 0.13, and the higher floor broke the uv-lock pre-commit hook (pinned to uv 0.12.23). Generated projects keep requiring uv >=0.13.0. Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01P1UQo4jmZREtzrWn1xjcDN --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index ab2d745..0ec8a68 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -14,7 +14,7 @@ dev = [ CPY001 = "CPY001" [tool.uv] -required-version = ">=0.13.0" +required-version = ">=0.10.12" # Minimum age guard: only consider package versions released at least 24h ago, # as a lightweight supply-chain defense against just-published malicious releases. exclude-newer = "24 hours"