Repository navigation
BLD: add Python 3.15 to the CI matrix - #2015
Conversation
Co-Authored-By: Claude Opus 5.5 <[email protected]> Claude-Session: https://claude.ai/code/session_01GwUvhmzgfkiZ6vo4uGyesN
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
0d5c80d to
d392288
Compare
|
Pushed d392288 (on top of a rebase onto current main):
🤖 Generated with Claude Code |
Co-Authored-By: Claude Sonnet 5.5 <[email protected]> Claude-Session: https://claude.ai/code/session_01GwUvhmzgfkiZ6vo4uGyesN
|
Done in 7ccfe7d: 🤖 Generated with Claude Code |
|
@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 |
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. |
Run the
Testworkflow on Python 3.15 and add the 3.15 classifier.actions/setup-pythonresolves"3.15"to the stable 3.15.0 build, soallow-prereleasesis not needed.test_iceberg: ignoreDeprecationWarnings 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 theerrorfilter 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_kwargsarexfail(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_icebergfails 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 poety, pyrefly, pyright, mypy, type_completeness, pytest, test_dist and style on Python 3.15.0 and 3.14.8 with a freshly resolved lockAI 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"andtyping_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 declarerequires-python = ">=3.10.0,<4.0.0", which cannot cover the open-endedpython_version >= "3.15"range, so there Poetry falls back to pyiceberg 0.10.0, the newest release without the<4cap (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):'enablePackrat' deprecated - use 'enable_packrat'(PyparsingDeprecationWarning)'escChar' argument is deprecated, use 'esc_char'and'unquoteResults' argument is deprecated, use 'unquote_results'Using `@model_validator` with mode='after' on a classmethod is deprecated(PydanticDeprecatedSince212)ignore::DeprecationWarning:pyicebergmatches only warnings attributed topyiceberg.*modules: aDeprecationWarningfrom the test itself and aUserWarningfrom pyiceberg (the test'sDelete operationcheck) still surface.pytest_warns_boundeddoes 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<4cap, 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/64bitor a condaLibrarydir, 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 inpoetry 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 poeas test.yml does:test_icebergon 3.15.0 fails without the filter (PyparsingDeprecationWarning: 'enablePackrat' deprecated) and passes with it; on 3.14.8 it passes either way.US/Pacificzone fail on both versions withZoneInfoNotFoundError, because this machine lackstzdata-legacy. They pass withPYTHONTZPATHset 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'spython-version = "3.11"are floors and stay. No upstream issue was filed.To do.
🤖 Generated with Claude Code
https://claude.ai/code/session_01GwUvhmzgfkiZ6vo4uGyesN