Skip to content

Commit 52f65c6

Browse files
author
Vladimir Vilimaitis
committed
Add Python 3.14 compatibility matrix
1 parent 641cb1d commit 52f65c6

5 files changed

Lines changed: 13 additions & 7 deletions

File tree

.github/workflows/ci.yml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ jobs:
2525
- "3.11"
2626
- "3.12"
2727
- "3.13"
28+
- "3.14"
2829

2930
steps:
3031
- uses: actions/checkout@v4
@@ -54,7 +55,7 @@ jobs:
5455
uv run --no-sync python scripts/smoke_public_api.py
5556
5657
- name: Rust and lint gates
57-
if: matrix.os == 'ubuntu-latest' && matrix.python-version == '3.13'
58+
if: matrix.os == 'ubuntu-latest' && matrix.python-version == '3.14'
5859
run: |
5960
cargo fmt --check
6061
cargo clippy --all-targets -- -D warnings

.github/workflows/release.yml

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ jobs:
4343
-i python3.11
4444
-i python3.12
4545
-i python3.13
46+
-i python3.14
4647
sccache: "true"
4748

4849
- uses: actions/upload-artifact@v4
@@ -61,6 +62,7 @@ jobs:
6162
- "3.11"
6263
- "3.12"
6364
- "3.13"
65+
- "3.14"
6466

6567
steps:
6668
- uses: actions/checkout@v4
@@ -97,6 +99,7 @@ jobs:
9799
- "3.11"
98100
- "3.12"
99101
- "3.13"
102+
- "3.14"
100103
platform:
101104
- os: macos-13
102105
target: x86_64
@@ -160,7 +163,7 @@ jobs:
160163

161164
- uses: actions/setup-python@v5
162165
with:
163-
python-version: "3.13"
166+
python-version: "3.14"
164167

165168
- uses: actions/download-artifact@v4
166169
with:
@@ -172,9 +175,10 @@ jobs:
172175

173176
- name: Install artifact in a clean environment
174177
run: |
178+
PACKAGE_VERSION=$(python -c "import tomllib; print(tomllib.load(open('pyproject.toml', 'rb'))['project']['version'])")
175179
python -m venv .smoke
176180
.smoke/bin/python -m pip install --upgrade pip
177-
.smoke/bin/python -m pip install --find-links dist polars-janitor==0.1.0
181+
.smoke/bin/python -m pip install --find-links dist "polars-janitor==$PACKAGE_VERSION"
178182
.smoke/bin/python scripts/smoke_public_api.py
179183
.smoke/bin/python -m pip install --force-reinstall "polars==1.29.0"
180184
.smoke/bin/python scripts/smoke_public_api.py

README.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,15 +25,15 @@ import polars_janitor as pj
2525
pip install polars-janitor
2626
```
2727

28-
`polars-janitor` supports Python Polars `1.29.0` and newer. Older Polars `1.x` wheels do not expose the data exchange API this extension uses.
28+
`polars-janitor` supports CPython 3.10 through 3.14 and Python Polars `1.29.0` and newer. Older Polars `1.x` wheels do not expose the data exchange API this extension uses.
2929

3030
From a local checkout:
3131

3232
```powershell
3333
uv run --extra dev maturin develop --release
3434
```
3535

36-
The Rust extension is built for the Python interpreter active in your environment. If you switch interpreters, for example from CPython 3.13 to CPython 3.11, rebuild it. The compiled `_rust.*.pyd` on Windows, or `_rust.*.so` on Linux and macOS, is not portable across Python versions.
36+
The Rust extension is built for the Python interpreter active in your environment. If you switch interpreters, for example from CPython 3.14 to CPython 3.13, rebuild it. The compiled `_rust.*.pyd` on Windows, or `_rust.*.so` on Linux and macOS, is not portable across Python versions.
3737

3838
## Python usage
3939

@@ -319,7 +319,7 @@ Those may be useful in R, but in Polars they either duplicate existing APIs or p
319319

320320
LazyFrame support is deliberately conservative. `clean_names`, `remove_empty(..., axis="rows")`, `get_dupes`, `compare_df_cols`, and `compare_df_cols_same` can work from lazy schemas or build lazy plans without collecting data. Helpers that need to inspect values are eager-only: `find_header`, `row_to_names`, `remove_constant`, and `remove_empty(..., axis="cols" | "both")`.
321321

322-
The package supports Python Polars `1.29.0` and newer. Compatibility tests run against that lower bound and the current lockfile version.
322+
The package supports CPython 3.10 through 3.14 and Python Polars `1.29.0` and newer. Compatibility tests run against that lower bound and the current lockfile version.
323323

324324
The project favors broad Python Polars compatibility over direct Rust deserialization of Python lazy plans. Most eager frame helpers cross through `pyo3-polars`; lazy frames keep their plans in Python Polars, with Rust deciding what public Polars plan to build. `clean_names` is a little different: Rust cleans the names, then Polars' public `rename` API applies them.
325325

pyproject.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ classifiers = [
3636
"Programming Language :: Python :: 3.11",
3737
"Programming Language :: Python :: 3.12",
3838
"Programming Language :: Python :: 3.13",
39+
"Programming Language :: Python :: 3.14",
3940
"Programming Language :: Rust",
4041
"Topic :: Scientific/Engineering :: Information Analysis",
4142
"Typing :: Typed",

scripts/check_release_artifacts.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
if TYPE_CHECKING:
1111
from collections.abc import Callable
1212

13-
PYTHON_TAGS = ("cp310", "cp311", "cp312", "cp313")
13+
PYTHON_TAGS = ("cp310", "cp311", "cp312", "cp313", "cp314")
1414
PLATFORM_CHECKS: dict[str, Callable[[str], bool]] = {
1515
"win_amd64": lambda name: "win_amd64" in name,
1616
"macos_x86_64": lambda name: "macosx" in name and "x86_64" in name,

0 commit comments

Comments
 (0)