Skip to content

BLD: add Python 3.15 to the CI matrix - #2015

Merged
cmp0xff merged 3 commits into
pandas-dev:mainfrom
pylaterreur:ci-python-3.15
Oct 21, 2026
Merged

cmp0xff merged 3 commits into
pandas-dev:mainfrom
pylaterreur:ci-python-3.15

Conversation

@pylaterreur

Copy link
Copy Markdown
Contributor
  • Run the Test workflow on Python 3.15 and add the 3.15 classifier. actions/setup-python resolves "3.15" to the stable 3.15.0 build, so allow-prereleases is not needed.

  • test_iceberg: ignore DeprecationWarnings raised from pyiceberg's own modules. Python 3.15 resolves pyiceberg 0.10.0, which calls deprecated pyparsing and pydantic APIs at import time, and the error filter turns those warnings into failures.

  • pyreadstat 1.3.6 has no cp315 wheels, and on Windows its sdist needs prebuilt iconv/zlib libraries that it does not ship. It is now installed only below Python 3.15, and test_spss/test_spss_kwargs are xfail(raises=ImportError) on 3.15, as chore: 🐍 pytest with py314 #1434 did for 3.14 (undone in chore: Roche/pyreadstat#310 pandas-dev/pandas-stubs#1451 introduce pyreadstat for python3.14 #1457).

  • Tests added (n/a: CI change; test_iceberg fails on Python 3.15 without the new filter and passes with it)

  • If I used AI to develop this pull request, I prompted it to follow AGENTS.md.

  • poetry run poe ty, pyrefly, pyright, mypy, type_completeness, pytest, test_dist and style on Python 3.15.0 and 3.14.8 with a freshly resolved lock

AI Implementation Plan

Why Python 3.15 gets pyiceberg 0.10.0. mypy 2.4.0 requires typing_extensions>=4.6.0; python_version < "3.15" and typing_extensions>=4.14.0; python_version >= "3.15", so Poetry 2.5.1 solves the two Python ranges separately. pyiceberg 0.11.0 to 0.12.0 declare requires-python = ">=3.10.0,<4.0.0", which cannot cover the open-ended python_version >= "3.15" range, so there Poetry falls back to pyiceberg 0.10.0, the newest release without the <4 cap (poetry lock -vv: "pyiceberg (0.12.0) requires Python <4.0.0,>=3.10.0", then "selecting pyiceberg (0.10.0)"). Python 3.11 to 3.14 keep pyiceberg 0.12.0. Missing zstandard cp315 wheels, the first suspect, play no part: pyiceberg 0.10.0 only lists zstandard as an extra.

Warnings the filter hides (pyiceberg 0.10.0, pyparsing 3.3.3, pydantic 2.14.1, all raised while importing pyiceberg.catalog.sql):

  • pyiceberg/expressions/parser.py:72: 'enablePackrat' deprecated - use 'enable_packrat' (PyparsingDeprecationWarning)
  • pyiceberg/expressions/parser.py:85: 'escChar' argument is deprecated, use 'esc_char' and 'unquoteResults' argument is deprecated, use 'unquote_results'
  • pyiceberg/table/metadata.py, 9 validators: Using `@model_validator` with mode='after' on a classmethod is deprecated (PydanticDeprecatedSince212)

ignore::DeprecationWarning:pyiceberg matches only warnings attributed to pyiceberg.* modules: a DeprecationWarning from the test itself and a UserWarning from pyiceberg (the test's Delete operation check) still surface. pytest_warns_bounded does not fit, because these are import-time warnings emitted once per process. Ruff's TD003 wants an issue link on a TODO and nothing upstream tracks the <4 cap, so the comment follows the plain style of tests/series/test_series.py ("Python 3.11 resolves NumPy 2.4, ...").

Source builds on Python 3.15. pandas 3.0.5 (3.0.6 has cp315 wheels), numexpr 2.14.2, ndindex 1.10.1, PyYAML 6.0.3 and pyiceberg 0.10.0 have no cp315 wheels yet, so each 3.15 job builds them from sdists. That works on Linux here. pandas' own CI builds pandas in about 3 to 4 minutes on windows-2025 and about 2 on macos-15, so the 20-minute job timeout should hold. The 3.15 jobs will still be slower until those wheels exist or the pandas pin moves to 3.0.6. pyreadstat 1.3.6 has no cp315 wheel either. On Windows its setup.py links static iconv/zlib from win_libs/64bit or a conda Library dir, and neither the sdist nor setup-python's CPython provides them; pyreadstat's own CI builds them in a separate action. Without the marker, the Windows 3.15 job would stop in poetry install. This Windows failure is inferred from setup.py and the sdist contents; I could not run Windows. On Linux and macOS it would build, but the marker keeps all 3.15 jobs alike, as in #1434.

Verification. Poetry 2.5.1 and a freshly resolved lock (ty 0.0.90, pyrefly 1.4.0, pyright 1.1.411, mypy 2.4.0, pytest 9.1.1, pandas 3.0.5), with the actions/python-versions builds of 3.15.0 and 3.14.8, through poetry run poe as test.yml does:

  • 3.15.0: ty, pyrefly, pyright, mypy, type_completeness and test_dist pass; pytest 3424 passed, 5 skipped, 2 xfailed.
  • 3.14.8: ty, pyrefly, pyright, mypy, type_completeness, test_dist and style pass; pytest 3426 passed, 5 skipped.
  • test_iceberg on 3.15.0 fails without the filter (PyparsingDeprecationWarning: 'enablePackrat' deprecated) and passes with it; on 3.14.8 it passes either way.
  • Locally 9 tests using the US/Pacific zone fail on both versions with ZoneInfoNotFoundError, because this machine lacks tzdata-legacy. They pass with PYTHONTZPATH set to the tzdata wheel's zoneinfo (the counts above), and they pass on the CI runners today.

Out of scope. The single-version jobs keep their Python (nightly.yml and optional.yml on 3.14, comment_commands.yml on 3.12). requires-python = ">=3.11" and pyrefly's python-version = "3.11" are floors and stay. No upstream issue was filed.

To do.

  • Remove the pyiceberg filter once Python 3.15 resolves pyiceberg>=0.11.
  • Drop the pyreadstat marker and the two xfails once pyreadstat ships cp315 wheels.
  • Consider moving the nightly and optional jobs to 3.15.

🤖 Generated with Claude Code

https://claude.ai/code/session_01GwUvhmzgfkiZ6vo4uGyesN

Comment thread pyproject.toml Resolved
Comment thread pyproject.toml Resolved
Comment thread pyproject.toml Resolved
pylaterreur and others added 2 commits October 21, 2026 18:12
pandas 3.0.6 and pyreadstat 1.3.7 both ship cp315 wheels, so the pyreadstat
environment marker and the xfail markers on the SPSS tests are no longer
needed.

Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01GwUvhmzgfkiZ6vo4uGyesN
@pylaterreur

Copy link
Copy Markdown
Contributor Author

Pushed d392288 (on top of a rebase onto current main):

  • pandas==3.0.6, as suggested.
  • pyreadstat 1.3.7 now ships cp315 wheels for Linux, macOS and Windows, so I dropped the python_version<'3.15' marker and the two SPSS xfails instead of adding a TODO. tests/test_io.py passes on 3.15 with pandas 3.0.6 and pyreadstat 1.3.7 (86 passed, 3 skipped).
  • Added the # TODO: bump apache/iceberg-python#4128 comment on the pyiceberg line.

🤖 Generated with Claude Code

https://claude.ai/code/session_01GwUvhmzgfkiZ6vo4uGyesN

Comment thread pyproject.toml Resolved
@pylaterreur

Copy link
Copy Markdown
Contributor Author

@cmp0xff cmp0xff left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thank you @pylaterreur

@cmp0xff
cmp0xff merged commit 5393f05 into pandas-dev:main Oct 21, 2026
16 checks passed
@cmp0xff

cmp0xff commented Oct 22, 2026

Copy link
Copy Markdown
Contributor

@Dr-Irv shall we publish a new version for 3.0.6 with py315 support before the release of 3.1.0?

Also I have the idea that we may set up a CI to publish a new version regularly, e.g. every month or every 4 weeks, from main

@Dr-Irv

Dr-Irv commented Oct 22, 2026

Copy link
Copy Markdown
Collaborator

@Dr-Irv shall we publish a new version for 3.0.6 with py315 support before the release of 3.1.0?

Also I have the idea that we may set up a CI to publish a new version regularly, e.g. every month or every 4 weeks, from main

3.1 just got released, so let's upgrade to that now. Do a PR for it, and if it passes, I can do a new release.

I'm OK with some automated way of doing builds and pushing it to pypi on a regular basis, but there are security issues involved in terms of keys and permissions, as far as I understand.

@pylaterreur
pylaterreur deleted the ci-python-3.15 branch October 23, 2026 12:24
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants