Skip to content

Commit 8feac2f

Browse files
committed
feat: add Python 3.15 support
CPython 3.15.0 is final, but requires-python capped the package at <3.15: pip on 3.15 falls back to diff-diff 2.3.1, and uv builds the sdist. Raise the cap, add the classifier, build cp315 wheels on every platform and add 3.15 to the Rust-backend CI matrix; the pure-Python fallback and the doc snippets move to 3.15 as they moved to 3.14 in #284. PyO3 0.29 already supports 3.15.
1 parent 6874b5d commit 8feac2f

8 files changed

Lines changed: 19 additions & 12 deletions

File tree

‎.github/workflows/build-wheels.yml‎

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ jobs:
5050
- name: Build wheels
5151
run: |
5252
expected=0
53-
for pyver in 39 310 311 312 313 314; do
53+
for pyver in 39 310 311 312 313 314 315; do
5454
pybin="/opt/python/cp${pyver}-cp${pyver}/bin/python"
5555
if [ ! -f "$pybin" ]; then
5656
echo "ERROR: Expected Python interpreter not found: $pybin"
@@ -80,7 +80,7 @@ jobs:
8080
runs-on: macos-14
8181
strategy:
8282
matrix:
83-
python-version: ['3.9', '3.10', '3.11', '3.12', '3.13', '3.14']
83+
python-version: ['3.9', '3.10', '3.11', '3.12', '3.13', '3.14', '3.15']
8484
steps:
8585
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
8686

@@ -113,7 +113,7 @@ jobs:
113113
runs-on: windows-latest
114114
strategy:
115115
matrix:
116-
python-version: ['3.9', '3.10', '3.11', '3.12', '3.13', '3.14']
116+
python-version: ['3.9', '3.10', '3.11', '3.12', '3.13', '3.14', '3.15']
117117
steps:
118118
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
119119

‎.github/workflows/docs-tests.yml‎

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -92,10 +92,10 @@ jobs:
9292
- name: Set up Python
9393
uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0
9494
with:
95-
# 3.14 to mirror Pure Python Fallback (the only existing job
95+
# 3.15 to mirror Pure Python Fallback (the only existing job
9696
# that actually ran these tests). notebooks.yml uses 3.11 for
9797
# nbmake compat, not relevant here.
98-
python-version: '3.14'
98+
python-version: '3.15'
9999

100100
- name: Install dependencies
101101
# Keep in sync with pyproject.toml [project.dependencies] and [project.optional-dependencies.dev]
@@ -248,7 +248,7 @@ jobs:
248248

249249
- name: Run changelog-fragment check on the floor Python
250250
# The compiler promises 3.9 compatibility but its behavioral tests
251-
# run in the 3.14 doc-snippets job; this stdlib-only invocation is
251+
# run in the 3.15 doc-snippets job; this stdlib-only invocation is
252252
# the floor's continuous syntax + behavior smoke for the script.
253253
run: python .claude/scripts/changelog_compile.py check
254254

‎.github/workflows/release-build-check.yml‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ name: Release build check
22

33
# Pre-merge guard for the PyPI release build path. publish.yml only runs on
44
# `release: published`, so its manylinux container build (checkout@v7 inside
5-
# glibc-2.28, openblas, py3.9-3.14) is never exercised by PR CI. This calls the
5+
# glibc-2.28, openblas, py3.9-3.15) is never exercised by PR CI. This calls the
66
# SAME reusable workflow build-only (no PyPI upload) so a PR that would break our
77
# ability to mint a release fails here instead of at release time.
88
#

‎.github/workflows/rust-test.yml‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -131,7 +131,7 @@ jobs:
131131
fail-fast: false
132132
matrix:
133133
os: [ubuntu-latest, macos-latest, windows-latest, ubuntu-24.04-arm]
134-
python-version: ['3.11', '3.13', '3.14']
134+
python-version: ['3.11', '3.13', '3.14', '3.15']
135135
include:
136136
# Python 3.9 floor guard (single Linux leg): mypy >= 2.2 can no
137137
# longer type-check with python_version = "3.9", so this runtime
@@ -251,7 +251,7 @@ jobs:
251251
- name: Set up Python
252252
uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0
253253
with:
254-
python-version: '3.14'
254+
python-version: '3.15'
255255

256256
- name: Install dependencies
257257
# Keep in sync with pyproject.toml [project.dependencies] and [project.optional-dependencies.dev]

‎README.md‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -153,7 +153,7 @@ No other Python or R DiD package offers design-based variance estimation for mod
153153

154154
## Requirements
155155

156-
- Python 3.9 - 3.14
156+
- Python 3.9 - 3.15
157157
- numpy >= 1.20
158158
- pandas >= 1.3
159159
- scipy >= 1.10
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
### Added
2+
- **Python 3.15 support**: `requires-python` now allows 3.15 (`<3.16`) and
3+
the 3.15 classifier is declared; release wheels are built for CPython 3.15
4+
on Linux (x86_64, aarch64), macOS arm64 and Windows, and CI runs the
5+
Rust-backend matrix and the pure-Python fallback on 3.15. PyO3 0.29
6+
already supports 3.15, so no Rust dependency changes.

‎pyproject.toml‎

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ version = "3.12.0"
88
description = "Difference-in-Differences causal inference with sklearn-like API. Callaway-Sant'Anna, Synthetic DiD, Honest DiD, event studies, parallel trends."
99
readme = "README.md"
1010
license = "MIT"
11-
requires-python = ">=3.9,<3.15"
11+
requires-python = ">=3.9,<3.16"
1212
authors = [
1313
{name = "diff-diff contributors"}
1414
]
@@ -40,6 +40,7 @@ classifiers = [
4040
"Programming Language :: Python :: 3.12",
4141
"Programming Language :: Python :: 3.13",
4242
"Programming Language :: Python :: 3.14",
43+
"Programming Language :: Python :: 3.15",
4344
"Topic :: Scientific/Engineering :: Mathematics",
4445
"Topic :: Scientific/Engineering :: Information Analysis",
4546
"Topic :: Scientific/Engineering",

‎rust/Cargo.toml‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ openblas = ["ndarray/blas"]
2525
alloc-profile = []
2626

2727
[dependencies]
28-
# PyO3 0.29 supports Python 3.9-3.14
28+
# PyO3 0.29 supports Python 3.9-3.15
2929
pyo3 = "0.29"
3030
numpy = "0.29"
3131
ndarray = { version = "0.17", features = ["rayon"] }

0 commit comments

Comments
 (0)