From a97859d508f3184002926bc9e1c3a2d8a99ed4e4 Mon Sep 17 00:00:00 2001 From: Kamil Kozik Date: Mon, 21 Sep 2026 12:11:39 +0200 Subject: [PATCH 1/3] feat: declare and test support for Python 3.14 The full suite passes on 3.14 unchanged, so this only adds the classifier, the tox env, and the CI matrix entry. Co-Authored-By: Claude Opus 5 (1M context) --- .github/workflows/pr_check.yml | 2 +- CHANGELOG.md | 5 ++++- pyproject.toml | 1 + tox.ini | 3 ++- 4 files changed, 8 insertions(+), 3 deletions(-) diff --git a/.github/workflows/pr_check.yml b/.github/workflows/pr_check.yml index 71a4436d..386ebe6b 100644 --- a/.github/workflows/pr_check.yml +++ b/.github/workflows/pr_check.yml @@ -13,7 +13,7 @@ jobs: runs-on: github-hosted-static-ip strategy: matrix: - python-version: ['3.8', '3.9', '3.10', '3.11', '3.12', '3.13'] + python-version: ['3.8', '3.9', '3.10', '3.11', '3.12', '3.13', '3.14'] steps: - uses: actions/checkout@master - name: Set up Python ${{ matrix.python-version }} diff --git a/CHANGELOG.md b/CHANGELOG.md index 24d448a5..69a3666b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,7 +7,10 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0. ## \[Unreleased\] -- Nothing yet. +### Added + +- Python 3.14 is now tested and declared as supported. No source changes were needed; the full + suite passes on 3.14 as-is. ## \[8.1.4\] - 2026-09-08 diff --git a/pyproject.toml b/pyproject.toml index 8e4a1753..cc4c243a 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -22,6 +22,7 @@ classifiers = [ "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", "Programming Language :: Python :: 3.13", + "Programming Language :: Python :: 3.14", ] requires-python = ">=3.8.0" diff --git a/tox.ini b/tox.ini index 45c926ee..f997b37c 100644 --- a/tox.ini +++ b/tox.ini @@ -1,5 +1,5 @@ [tox] -envlist={py38}-unit,{py39}-unit,{py310}-unit,{py311}-unit,{py312}-unit,{py313}-unit +envlist={py38}-unit,{py39}-unit,{py310}-unit,{py311}-unit,{py312}-unit,{py313}-unit,{py314}-unit skipsdist=true [gh-actions] @@ -10,6 +10,7 @@ python = 3.11: py311-unit 3.12: py312-unit 3.13: py313-unit + 3.14: py314-unit [testenv] commands = From ba9b1c4c97d3d6a76f1f6c5578531ec0b5d7bd50 Mon Sep 17 00:00:00 2001 From: Kamil Kozik Date: Mon, 21 Sep 2026 12:15:10 +0200 Subject: [PATCH 2/3] ci: bump actions/setup-python to v5 v4 is old enough that provisioning 3.14 is not a safe assumption. Co-Authored-By: Claude Opus 5 (1M context) --- .github/workflows/pr_check.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/pr_check.yml b/.github/workflows/pr_check.yml index 386ebe6b..752404d2 100644 --- a/.github/workflows/pr_check.yml +++ b/.github/workflows/pr_check.yml @@ -17,7 +17,7 @@ jobs: steps: - uses: actions/checkout@master - name: Set up Python ${{ matrix.python-version }} - uses: actions/setup-python@v4 + uses: actions/setup-python@v5 with: python-version: ${{ matrix.python-version }} - name: Install dependencies From 18794143eb4156b6d4f7281df76c49db8256a5ee Mon Sep 17 00:00:00 2001 From: Kamil Kozik Date: Mon, 21 Sep 2026 12:39:17 +0200 Subject: [PATCH 3/3] ci: exclude annotation-only lines from coverage Python 3.14 implements PEP 649, so a bare `_children_layout:` class annotation is no longer evaluated at class-body time and coverage stops counting it as executed. That dropped the total from 95.5% to 94.7% and tripped fail_under=95, failing the 3.14 job with every test passing. These are type declarations with no runtime behaviour, so excluding them makes the metric version-independent: 3.9/3.13/3.14 now agree. Co-Authored-By: Claude Opus 5 (1M context) --- .coveragerc | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.coveragerc b/.coveragerc index 6e581776..c1323f88 100644 --- a/.coveragerc +++ b/.coveragerc @@ -11,5 +11,9 @@ omit = [report] show_missing = true fail_under = 95 +# Python 3.14 (PEP 649) defers annotation evaluation, so a bare `_children_layout:` +# declaration never executes and coverage stops counting it. Excluding it keeps the +# total comparable across versions. exclude_lines = raise NotImplementedError + ^\s*_children_layout: