From 266b12ad07da8642ad6d4722ab3578f1b68fc23d Mon Sep 17 00:00:00 2001 From: Paul Timmins Date: Thu, 20 Nov 2025 14:10:36 +0000 Subject: [PATCH 01/17] ci: add cp315/cp315t to builds. --- dev/tasks/tasks.yml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/dev/tasks/tasks.yml b/dev/tasks/tasks.yml index 6cf11d66b9f1..c8451225ee8d 100644 --- a/dev/tasks/tasks.yml +++ b/dev/tasks/tasks.yml @@ -186,7 +186,10 @@ tasks: ("3.13", "cp313", "cp313"), ("3.13", "cp313", "cp313t"), ("3.14", "cp314", "cp314"), - ("3.14", "cp314", "cp314t")] %} + ("3.14", "cp314", "cp314t"), + ("3.15", "cp315", "cp315"), + ("3.15", "cp315", "cp315t") + ] %} {############################## Wheel Linux ##################################} From 2d2a557e066505e911c02615911799644d2b70cd Mon Sep 17 00:00:00 2001 From: Paul Timmins Date: Thu, 20 Nov 2025 14:13:58 +0000 Subject: [PATCH 02/17] ci: add marker for cffi and pandas for < "3.15". this is temporary until they ship 3.15 wheels. --- python/requirements-test.txt | 4 ++-- python/requirements-wheel-test.txt | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/python/requirements-test.txt b/python/requirements-test.txt index 4339aeb9c161..f6e1c5d0470c 100644 --- a/python/requirements-test.txt +++ b/python/requirements-test.txt @@ -1,7 +1,7 @@ -cffi +cffi; python_version < "3.15" # TODO: temporary - reenable when 3.15 wheels ship hypothesis packaging -pandas +pandas; python_version < "3.15" # TODO: temporary - reenable when 3.15 wheels ship pytest pytz pyuwsgi; sys.platform != 'win32' and python_version < '3.13' diff --git a/python/requirements-wheel-test.txt b/python/requirements-wheel-test.txt index b2ff4553b455..71bdc3b23051 100644 --- a/python/requirements-wheel-test.txt +++ b/python/requirements-wheel-test.txt @@ -1,4 +1,4 @@ -cffi +cffi; python_version < "3.15" # TODO: temporary - reenable when 3.15 wheels ship cython hypothesis packaging @@ -18,4 +18,4 @@ numpy~=1.26.0; python_version == "3.12" numpy~=2.1.0; python_version == "3.13" numpy~=2.3.3; python_version >= "3.14" -pandas +pandas; python_version < "3.15" # TODO: temporary - reenable when 3.15 wheels ship From 9ed3dc3bb7f316286681369015e617cb0df6b434 Mon Sep 17 00:00:00 2001 From: Paul Timmins Date: Thu, 13 Aug 2026 10:18:53 -0400 Subject: [PATCH 03/17] bump libcst to 1.9.0 for Python 3.15 --- ci/conda_env_python.txt | 2 +- python/pyproject.toml | 2 +- python/requirements-build.txt | 2 +- python/requirements-wheel-build.txt | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/ci/conda_env_python.txt b/ci/conda_env_python.txt index dd16d66b725d..f3768bf44c77 100644 --- a/ci/conda_env_python.txt +++ b/ci/conda_env_python.txt @@ -24,7 +24,7 @@ cython>=3.1 cloudpickle fsspec hypothesis -libcst>=1.8.6 +libcst>=1.9.0 numpy>=1.16.6 pytest pytest-faulthandler diff --git a/python/pyproject.toml b/python/pyproject.toml index fe508b855a87..8b8834213549 100644 --- a/python/pyproject.toml +++ b/python/pyproject.toml @@ -20,7 +20,7 @@ requires = [ "scikit-build-core", "cython >= 3.1", # Needed for build-time stub docstring extraction - "libcst>=1.8.6", + "libcst>=1.9.0", "numpy>=1.25", "setuptools_scm[toml]>=8", ] diff --git a/python/requirements-build.txt b/python/requirements-build.txt index fdd3e68a1b16..3846387340e0 100644 --- a/python/requirements-build.txt +++ b/python/requirements-build.txt @@ -1,6 +1,6 @@ build cython>=3.1 -libcst>=1.8.6 +libcst>=1.9.0 numpy>=1.25 scikit-build-core setuptools_scm>=8 diff --git a/python/requirements-wheel-build.txt b/python/requirements-wheel-build.txt index a3ac13967729..5f3532deef68 100644 --- a/python/requirements-wheel-build.txt +++ b/python/requirements-wheel-build.txt @@ -1,7 +1,7 @@ build cython>=3.1 # Needed for build-time stub docstring extraction -libcst>=1.8.6 +libcst>=1.9.0 numpy>=2.0.0 scikit-build-core setuptools_scm From 9214919d614bcd4699f02209a6cfa9107b93dd3d Mon Sep 17 00:00:00 2001 From: Paul Timmins Date: Thu, 13 Aug 2026 14:22:19 -0400 Subject: [PATCH 04/17] chore: bump manylinux image to 08.08 to include 3.15-rc1 --- compose.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/compose.yaml b/compose.yaml index c13bd831ecff..c551e5c18615 100644 --- a/compose.yaml +++ b/compose.yaml @@ -1154,7 +1154,7 @@ services: args: arch: ${ARCH} arch_short: ${ARCH_SHORT} - base: quay.io/pypa/manylinux_2_28_${ARCH_ALIAS}:2026.05.31-3 + base: quay.io/pypa/manylinux_2_28_${ARCH_ALIAS}:2026.08.08-1 manylinux: 2_28 python: ${PYTHON} python_abi_tag: ${PYTHON_ABI_TAG} @@ -1179,7 +1179,7 @@ services: args: arch: ${ARCH} arch_short: ${ARCH_SHORT} - base: quay.io/pypa/musllinux_1_2_${ARCH_ALIAS}:2026.05.31-3 + base: quay.io/pypa/musllinux_1_2_${ARCH_ALIAS}:2026.08.08-1 musllinux: 1_2 python: ${PYTHON} python_abi_tag: ${PYTHON_ABI_TAG} From 879a77749fdfd81f353d78a3a10788f86fcd67b5 Mon Sep 17 00:00:00 2001 From: Paul Timmins Date: Thu, 13 Aug 2026 14:23:20 -0400 Subject: [PATCH 05/17] add -rc suffix for 3.15, since 3.15 is not yet released. --- dev/tasks/python-wheels/github.linux.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/dev/tasks/python-wheels/github.linux.yml b/dev/tasks/python-wheels/github.linux.yml index e211343953bf..a6344bbec241 100644 --- a/dev/tasks/python-wheels/github.linux.yml +++ b/dev/tasks/python-wheels/github.linux.yml @@ -42,7 +42,12 @@ jobs: {% endif %} PYTHON: "{{ python_version }}" PYTHON_ABI_TAG: "{{ python_abi_tag }}" + {% if python_version == "3.15" %} + # TODO: Remove -rc suffix after 3.15 release + PYTHON_IMAGE_TAG: "{{ python_version }}-rc" + {% else %} PYTHON_IMAGE_TAG: "{{ python_version }}" + {% endif %} steps: {{ macros.github_checkout_arrow()|indent }} From b6d48c65fa1f015b01da5959904d2297dc2ad450 Mon Sep 17 00:00:00 2001 From: Paul Timmins Date: Thu, 13 Aug 2026 14:26:33 -0400 Subject: [PATCH 06/17] disable pandas tests for cp315 by checking whether pandas is installed, which doesn't yet have wheels --- ci/scripts/python_wheel_unix_test.sh | 3 +++ ci/scripts/python_wheel_windows_test.bat | 3 +++ 2 files changed, 6 insertions(+) diff --git a/ci/scripts/python_wheel_unix_test.sh b/ci/scripts/python_wheel_unix_test.sh index cb445611e233..265f5ebcffb4 100755 --- a/ci/scripts/python_wheel_unix_test.sh +++ b/ci/scripts/python_wheel_unix_test.sh @@ -104,6 +104,9 @@ if [ "${CHECK_UNITTESTS}" == "ON" ]; then # Install testing dependencies python -m pip install -U -r "${source_dir}/python/requirements-wheel-test.txt" + # TODO: This check added for cp315, which does not yet have pandas wheels. Remove when shipped. + python -c "import pandas" 2>/dev/null || export PYARROW_TEST_PANDAS=OFF + # Execute unittest, test dependencies must be installed python -c 'import pyarrow; pyarrow.create_library_symlinks()' python -m pytest -r s --pyargs pyarrow diff --git a/ci/scripts/python_wheel_windows_test.bat b/ci/scripts/python_wheel_windows_test.bat index 1e9cacac8bfa..b9685d6f7cd1 100755 --- a/ci/scripts/python_wheel_windows_test.bat +++ b/ci/scripts/python_wheel_windows_test.bat @@ -60,5 +60,8 @@ py -0p @REM Validate wheel contents %PYTHON_CMD% C:\arrow\ci\scripts\python_wheel_validate_contents.py --path C:\arrow\python\repaired_wheels || exit /B 1 +@REM TODO: This check added for cp315, which does not yet have pandas wheels. Remove when shipped. +%PYTHON_CMD% -c "import pandas" 2>NUL || set PYARROW_TEST_PANDAS=OFF + @REM Execute unittest %PYTHON_CMD% -m pytest -r s --pyargs pyarrow || exit /B 1 From 89f007d887aede25e59bcf2d688030f00256c6e9 Mon Sep 17 00:00:00 2001 From: Paul Timmins Date: Thu, 13 Aug 2026 14:33:01 -0400 Subject: [PATCH 07/17] reenable cffi for cp315 --- python/requirements-wheel-test.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/python/requirements-wheel-test.txt b/python/requirements-wheel-test.txt index ea402a1e66c2..d5994748b160 100644 --- a/python/requirements-wheel-test.txt +++ b/python/requirements-wheel-test.txt @@ -1,4 +1,4 @@ -cffi; python_version < "3.15" # TODO: temporary - reenable when 3.15 wheels ship +cffi cython hypothesis packaging From e8fc497d75cd6adf45b3e42334ec0f2dfca3a4b5 Mon Sep 17 00:00:00 2001 From: Paul Timmins Date: Thu, 13 Aug 2026 14:48:09 -0400 Subject: [PATCH 08/17] reenable cffi on 3.15 --- python/requirements-test.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/python/requirements-test.txt b/python/requirements-test.txt index f56d74670ee0..6af9aba6aeb3 100644 --- a/python/requirements-test.txt +++ b/python/requirements-test.txt @@ -1,4 +1,4 @@ -cffi; python_version < "3.15" # TODO: temporary - reenable when 3.15 wheels ship +cffi hypothesis packaging pandas; python_version < "3.15" # TODO: temporary - reenable when 3.15 wheels ship From 5de3f4badb9643896eb68697b7c57021453be0bf Mon Sep 17 00:00:00 2001 From: Paul Timmins Date: Thu, 13 Aug 2026 14:48:41 -0400 Subject: [PATCH 09/17] numpy 2.5.2 is minimum for 3.15-rc1 --- python/requirements-wheel-test.txt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/python/requirements-wheel-test.txt b/python/requirements-wheel-test.txt index d5994748b160..00c0fcc4684f 100644 --- a/python/requirements-wheel-test.txt +++ b/python/requirements-wheel-test.txt @@ -16,6 +16,7 @@ numpy~=1.23.2; python_version < "3.11" numpy~=1.23.2; python_version == "3.11" numpy~=1.26.0; python_version == "3.12" numpy~=2.1.0; python_version == "3.13" -numpy~=2.3.3; python_version >= "3.14" +numpy~=2.3.3; python_version == "3.14" +numpy~=2.5.2; python_version == "3.15" # TODO: 2.5.2 is for 3.15-rc1, after release, update to correct version pandas; python_version < "3.15" # TODO: temporary - reenable when 3.15 wheels ship From 7046bfa28a5cfc114d7a8344d7c83abaa1a9e7a4 Mon Sep 17 00:00:00 2001 From: Paul Timmins Date: Fri, 14 Aug 2026 08:49:23 -0400 Subject: [PATCH 10/17] ALPINE_LINUX => 3.23: Python is no longer rebuilt on 3.22 --- dev/tasks/python-wheels/github.linux.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dev/tasks/python-wheels/github.linux.yml b/dev/tasks/python-wheels/github.linux.yml index a6344bbec241..e485a1440bcd 100644 --- a/dev/tasks/python-wheels/github.linux.yml +++ b/dev/tasks/python-wheels/github.linux.yml @@ -32,7 +32,7 @@ jobs: {% endif %} env: {% if linux_wheel_kind == "musllinux" %} - ALPINE_LINUX: "3.22" + ALPINE_LINUX: "3.23" {% endif %} # archery uses these environment variables {% if arch == "amd64" %} From 6fb35d8eb7d46bfb1ea96ca977bef29749daa8ce Mon Sep 17 00:00:00 2001 From: Paul Timmins Date: Fri, 14 Aug 2026 09:09:20 -0400 Subject: [PATCH 11/17] Use a version gate, rather than import gate, for 3.15 pandas --- ci/scripts/python_wheel_unix_test.sh | 10 ++++++---- ci/scripts/python_wheel_windows_test.bat | 7 +++---- 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/ci/scripts/python_wheel_unix_test.sh b/ci/scripts/python_wheel_unix_test.sh index 265f5ebcffb4..14fccc05a786 100755 --- a/ci/scripts/python_wheel_unix_test.sh +++ b/ci/scripts/python_wheel_unix_test.sh @@ -47,7 +47,12 @@ export PYARROW_TEST_GANDIVA=OFF export PYARROW_TEST_GCS=${ARROW_GCS} export PYARROW_TEST_HDFS=ON export PYARROW_TEST_ORC=ON -export PYARROW_TEST_PANDAS=ON +# TODO: To be removed once pandas provides wheels for Python 3.15 +if python -c "import sys; sys.exit(0 if sys.version_info < (3, 15) else 1)"; then + export PYARROW_TEST_PANDAS=ON +else + export PYARROW_TEST_PANDAS=OFF +fi export PYARROW_TEST_PARQUET=ON export PYARROW_TEST_PARQUET_ENCRYPTION=ON export PYARROW_TEST_SUBSTRAIT=${ARROW_SUBSTRAIT} @@ -104,9 +109,6 @@ if [ "${CHECK_UNITTESTS}" == "ON" ]; then # Install testing dependencies python -m pip install -U -r "${source_dir}/python/requirements-wheel-test.txt" - # TODO: This check added for cp315, which does not yet have pandas wheels. Remove when shipped. - python -c "import pandas" 2>/dev/null || export PYARROW_TEST_PANDAS=OFF - # Execute unittest, test dependencies must be installed python -c 'import pyarrow; pyarrow.create_library_symlinks()' python -m pytest -r s --pyargs pyarrow diff --git a/ci/scripts/python_wheel_windows_test.bat b/ci/scripts/python_wheel_windows_test.bat index b9685d6f7cd1..9d4d06249e4d 100755 --- a/ci/scripts/python_wheel_windows_test.bat +++ b/ci/scripts/python_wheel_windows_test.bat @@ -26,7 +26,9 @@ set PYARROW_TEST_GANDIVA=OFF set PYARROW_TEST_GCS=ON set PYARROW_TEST_HDFS=ON set PYARROW_TEST_ORC=ON -set PYARROW_TEST_PANDAS=ON +@REM TODO: To be removed once pandas provides wheels for Python 3.15 +%PYTHON_CMD% -c "import sys; sys.exit(0 if sys.version_info < (3, 15) else 1)" +if errorlevel 1 (set PYARROW_TEST_PANDAS=OFF) else (set PYARROW_TEST_PANDAS=ON) set PYARROW_TEST_PARQUET=ON set PYARROW_TEST_PARQUET_ENCRYPTION=ON set PYARROW_TEST_SUBSTRAIT=ON @@ -60,8 +62,5 @@ py -0p @REM Validate wheel contents %PYTHON_CMD% C:\arrow\ci\scripts\python_wheel_validate_contents.py --path C:\arrow\python\repaired_wheels || exit /B 1 -@REM TODO: This check added for cp315, which does not yet have pandas wheels. Remove when shipped. -%PYTHON_CMD% -c "import pandas" 2>NUL || set PYARROW_TEST_PANDAS=OFF - @REM Execute unittest %PYTHON_CMD% -m pytest -r s --pyargs pyarrow || exit /B 1 From 521c6ec76e853b5e7a8086358806b8409e73df5e Mon Sep 17 00:00:00 2001 From: Paul Timmins Date: Fri, 14 Aug 2026 09:16:05 -0400 Subject: [PATCH 12/17] Add Python 3.15.0rc1: bump build_date to 20260807, add 3.15.0rc1 and (maintenance) bump 3.14.5 to 3.14.7 --- ...thon-free-threaded-wheel-musllinux-test-imports.dockerfile | 3 ++- ...on-free-threaded-wheel-musllinux-test-unittests.dockerfile | 3 ++- compose.yaml | 4 ++-- 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/ci/docker/python-free-threaded-wheel-musllinux-test-imports.dockerfile b/ci/docker/python-free-threaded-wheel-musllinux-test-imports.dockerfile index af56749202d4..69ddaf70d589 100644 --- a/ci/docker/python-free-threaded-wheel-musllinux-test-imports.dockerfile +++ b/ci/docker/python-free-threaded-wheel-musllinux-test-imports.dockerfile @@ -35,7 +35,8 @@ RUN apk update && \ # See available releases at: https://github.com/astral-sh/python-build-standalone/releases RUN set -e; \ case "${python_version}" in \ - 3.14) python_patch_version="3.14.5";; \ + 3.14) python_patch_version="3.14.7";; \ + 3.15) python_patch_version="3.15.0rc1";; \ esac && \ curl -L -o python.tar.zst \ https://github.com/astral-sh/python-build-standalone/releases/download/${build_date}/cpython-${python_patch_version}+${build_date}-${arch}-unknown-linux-musl-freethreaded+lto-full.tar.zst && \ diff --git a/ci/docker/python-free-threaded-wheel-musllinux-test-unittests.dockerfile b/ci/docker/python-free-threaded-wheel-musllinux-test-unittests.dockerfile index 7efcd2107a81..f1e959675467 100644 --- a/ci/docker/python-free-threaded-wheel-musllinux-test-unittests.dockerfile +++ b/ci/docker/python-free-threaded-wheel-musllinux-test-unittests.dockerfile @@ -37,7 +37,8 @@ RUN apk update && \ # See available releases at: https://github.com/astral-sh/python-build-standalone/releases RUN set -e; \ case "${python_version}" in \ - 3.14) python_patch_version="3.14.5";; \ + 3.14) python_patch_version="3.14.7";; \ + 3.15) python_patch_version="3.15.0rc1";; \ esac && \ curl -L -o python.tar.zst \ https://github.com/astral-sh/python-build-standalone/releases/download/${build_date}/cpython-${python_patch_version}+${build_date}-${arch}-unknown-linux-musl-freethreaded+lto-full.tar.zst && \ diff --git a/compose.yaml b/compose.yaml index c551e5c18615..ef30e2568452 100644 --- a/compose.yaml +++ b/compose.yaml @@ -1220,7 +1220,7 @@ services: args: base: "alpine:${ALPINE_LINUX}" python_version: ${PYTHON} - build_date: "20260510" # python-build-standalone release date + build_date: "20260807" # python-build-standalone release date arch: ${ARCH_ALIAS} context: . dockerfile: ci/docker/python-free-threaded-wheel-musllinux-test-imports.dockerfile @@ -1264,7 +1264,7 @@ services: args: base: "alpine:${ALPINE_LINUX}" python_version: ${PYTHON} - build_date: "20260510" # python-build-standalone release date + build_date: "20260807" # python-build-standalone release date arch: ${ARCH_ALIAS} context: . dockerfile: ci/docker/python-free-threaded-wheel-musllinux-test-unittests.dockerfile From 5b13d85415413931fcc1dafee45bbb2585e4946d Mon Sep 17 00:00:00 2001 From: "paul@iqmo.com" Date: Fri, 14 Aug 2026 10:58:27 -0400 Subject: [PATCH 13/17] bump image revision --- .env | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.env b/.env index 980dc243b83f..81486f0e9be9 100644 --- a/.env +++ b/.env @@ -98,5 +98,5 @@ VCPKG="9b965a116838c6cdcd36bca60d1b81b030c8ab8d" # 2026.05.27 (not release, u # ci/docker/python-*-windows-*.dockerfile or the vcpkg config. # This is a workaround for our CI problem that "archery docker build" doesn't # use pulled built images in dev/tasks/python-wheels/github.windows.yml. -PYTHON_WHEEL_WINDOWS_IMAGE_REVISION=2026-06-03 -PYTHON_WHEEL_WINDOWS_TEST_IMAGE_REVISION=2026-06-03 +PYTHON_WHEEL_WINDOWS_IMAGE_REVISION=2026-08-14 +PYTHON_WHEEL_WINDOWS_TEST_IMAGE_REVISION=2026-08-14 From 7e5f9008d825f504ce5afed4ddc4b4a4e46cb476 Mon Sep 17 00:00:00 2001 From: "paul@iqmo.com" Date: Fri, 14 Aug 2026 10:59:07 -0400 Subject: [PATCH 14/17] add 3.15 for windows dockerfiles, and maintenance: move 3.14.5 to latest 3.14.7 --- ...hon-free-threaded-wheel-windows-test-vs2022.dockerfile | 8 ++++++-- ci/docker/python-wheel-windows-test-vs2022.dockerfile | 3 ++- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/ci/docker/python-free-threaded-wheel-windows-test-vs2022.dockerfile b/ci/docker/python-free-threaded-wheel-windows-test-vs2022.dockerfile index d0d9793d1f71..684596e50104 100644 --- a/ci/docker/python-free-threaded-wheel-windows-test-vs2022.dockerfile +++ b/ci/docker/python-free-threaded-wheel-windows-test-vs2022.dockerfile @@ -26,13 +26,17 @@ FROM ${base} ARG python=3.14 +# PYTHON_RELEASE is the python.org ftp directory, which for a pre-release is the +# final release it leads to, e.g. 3.15.0/python-3.15.0rc1-amd64.exe # hadolint ignore=SC1072 -RUN (if "%python%"=="3.14" setx PYTHON_VERSION "3.14.5") +RUN (if "%python%"=="3.14" setx PYTHON_VERSION "3.14.7" && setx PYTHON_RELEASE "3.14.7") & \ + (if "%python%"=="3.15" setx PYTHON_VERSION "3.15.0rc1" && setx PYTHON_RELEASE "3.15.0") SHELL ["powershell", "-NoProfile", "-Command", "$ErrorActionPreference = 'Stop'; $ProgressPreference = 'SilentlyContinue';"] RUN $version = $env:PYTHON_VERSION; \ + $release = $env:PYTHON_RELEASE; \ $filename = 'python-' + $version + '-amd64.exe'; \ - $url = 'https://www.python.org/ftp/python/' + $version + '/' + $filename; \ + $url = 'https://www.python.org/ftp/python/' + $release + '/' + $filename; \ Invoke-WebRequest -Uri $url -OutFile $filename; \ Start-Process -FilePath $filename -ArgumentList '/quiet', 'Include_freethreaded=1' -Wait diff --git a/ci/docker/python-wheel-windows-test-vs2022.dockerfile b/ci/docker/python-wheel-windows-test-vs2022.dockerfile index 73a9e167fea6..e440f7a2e8a6 100644 --- a/ci/docker/python-wheel-windows-test-vs2022.dockerfile +++ b/ci/docker/python-wheel-windows-test-vs2022.dockerfile @@ -32,7 +32,8 @@ RUN (if "%python%"=="3.10" setx PYTHON_VERSION "3.10.11" && setx PYTHON_CMD "py (if "%python%"=="3.11" setx PYTHON_VERSION "3.11.9" && setx PYTHON_CMD "py -3.11") & \ (if "%python%"=="3.12" setx PYTHON_VERSION "3.12.10" && setx PYTHON_CMD "py -3.12") & \ (if "%python%"=="3.13" setx PYTHON_VERSION "3.13.9" && setx PYTHON_CMD "py -3.13") & \ - (if "%python%"=="3.14" setx PYTHON_VERSION "3.14.0" && setx PYTHON_CMD "py -3.14") + (if "%python%"=="3.14" setx PYTHON_VERSION "3.14.0" && setx PYTHON_CMD "py -3.14") & \ + (if "%python%"=="3.15" setx PYTHON_VERSION "3.15.0-rc1" && setx PYTHON_CMD "py -3.15") # hadolint ignore=DL3059 RUN choco install -r -y --pre --no-progress --force python --version=%PYTHON_VERSION% From bb049d5ec66216129d5faea0dac5c6803e05e33d Mon Sep 17 00:00:00 2001 From: Paul Timmins Date: Fri, 14 Aug 2026 19:21:50 -0400 Subject: [PATCH 15/17] add 3.15.0rc1 (and bump 3.14.6 to latest: 3.14.7) --- ci/scripts/install_python.sh | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/ci/scripts/install_python.sh b/ci/scripts/install_python.sh index f6502b1be8ce..3939e5154b70 100755 --- a/ci/scripts/install_python.sh +++ b/ci/scripts/install_python.sh @@ -28,8 +28,11 @@ declare -A versions versions=([3.11]=3.11.9 [3.12]=3.12.10 [3.13]=3.13.14 - [3.14]=3.14.6 - [3.14t]=3.14.6) + [3.14]=3.14.7 + [3.14t]=3.14.7 + [3.15]=3.15.0rc1 + [3.15t]=3.15.0rc1 + ) if [ "$#" -ne 2 ]; then echo "Usage: $0 " @@ -50,7 +53,7 @@ if [ "$platform" = "macOS" ]; then wget "https://www.python.org/ftp/python/${full_version}/${fname}" echo "Installing Python..." - if [[ $2 == "3.14t" ]]; then + if [[ $2 == *t ]]; then # Extract the base version without 't' suffix base_version="${version%t}" # See https://github.com/python/cpython/issues/120098#issuecomment-2151122033 for more info on this. @@ -78,7 +81,7 @@ EOF rm "$fname" python="/Library/Frameworks/Python.framework/Versions/${version}/bin/python${version}" - if [[ $2 == "3.14t" ]]; then + if [[ $2 == *t ]]; then base_version="${version%t}" python="/Library/Frameworks/PythonT.framework/Versions/${base_version}/bin/python${base_version}t" fi From 7bf40dcb25d8ac85721888e3f5c724b9a85ce87f Mon Sep 17 00:00:00 2001 From: Paul Timmins Date: Fri, 14 Aug 2026 21:18:09 -0400 Subject: [PATCH 16/17] disable --only-binary for 3.15 as a temp workaround for missing builds. Other platforms don't use --only-binary so built around this issue. --- ci/scripts/python_wheel_macos_build.sh | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/ci/scripts/python_wheel_macos_build.sh b/ci/scripts/python_wheel_macos_build.sh index b931dfa4dd23..4724f8e15246 100755 --- a/ci/scripts/python_wheel_macos_build.sh +++ b/ci/scripts/python_wheel_macos_build.sh @@ -48,9 +48,15 @@ else exit 1 fi +wheel_build_binary_flag="--only-binary=:all:" +if python -c "import sys; sys.exit(0 if sys.version_info[:2] == (3, 15) else 1)"; then + # TODO: 3.15 workaround due to pyyaml (via libcst). Remove once pyyaml ships 3.15 wheels. + wheel_build_binary_flag="" +fi + pip install \ --force-reinstall \ - --only-binary=:all: \ + ${wheel_build_binary_flag} \ --upgrade \ -r "${source_dir}/python/requirements-wheel-build.txt" pip install "delocate>=0.10.3" From 1b9702dc0e1a7f331a17c8a6deb15b0efd44f6ba Mon Sep 17 00:00:00 2001 From: Paul Timmins Date: Sat, 15 Aug 2026 21:51:36 -0400 Subject: [PATCH 17/17] Truncate pre-release suffixes --- ci/scripts/install_python.sh | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/ci/scripts/install_python.sh b/ci/scripts/install_python.sh index 3939e5154b70..7aeda91f727d 100755 --- a/ci/scripts/install_python.sh +++ b/ci/scripts/install_python.sh @@ -49,8 +49,11 @@ full_version=${versions[$2]} if [ "$platform" = "macOS" ]; then echo "Downloading Python installer..." + # Match python.org directory by truncating any pre-release suffix: + # 3.15.0rc1 is https://www.python.org/ftp/python/3.15.0/python-3.15.0rc1-macos11.pkg + release_version="${full_version%%[abrc]*}" fname="python-${full_version}-macos11.pkg" - wget "https://www.python.org/ftp/python/${full_version}/${fname}" + wget "https://www.python.org/ftp/python/${release_version}/${fname}" echo "Installing Python..." if [[ $2 == *t ]]; then