From 0d31c67cde4e7ee803c0f3337d6cb83d2bed4d11 Mon Sep 17 00:00:00 2001 From: "paul@iqmo.com" Date: Tue, 25 Aug 2026 18:24:07 -0400 Subject: [PATCH 1/6] ci: Add 3.15.0rc0 builds --- .github/actions/build-wheel/action.yml | 2 +- .github/workflows/packaging_wheels.yml | 2 +- pyproject.toml | 25 +++++++++++++++++++++---- 3 files changed, 23 insertions(+), 6 deletions(-) diff --git a/.github/actions/build-wheel/action.yml b/.github/actions/build-wheel/action.yml index a945a68f..6c5071da 100644 --- a/.github/actions/build-wheel/action.yml +++ b/.github/actions/build-wheel/action.yml @@ -122,7 +122,7 @@ runs: # traversing the full filesystem, which produces an error on Windows. # - CIBW_TEST_SKIP we always skip tests for *-macosx_universal2 builds, because we run tests for arm64 and x86_64. - name: Build${{ inputs.testsuite != 'none' && ' and test ' || ' ' }}wheel - uses: pypa/cibuildwheel@v3.2 + uses: pypa/cibuildwheel@v4.2.0 env: CIBW_ARCHS: ${{ inputs.arch == 'amd64' && 'AMD64' || inputs.arch }} CIBW_BUILD: ${{ inputs.python }}-${{ inputs.cibw-system }}_${{ inputs.arch }} diff --git a/.github/workflows/packaging_wheels.yml b/.github/workflows/packaging_wheels.yml index b86ec800..e45ca448 100644 --- a/.github/workflows/packaging_wheels.yml +++ b/.github/workflows/packaging_wheels.yml @@ -127,7 +127,7 @@ jobs: strategy: fail-fast: false matrix: - python: [ cp311, cp312, cp313 ] + python: [ cp311, cp312, cp313, cp315 ] platform: - { os: windows-2022, arch: amd64, cibw_system: win } - { os: windows-11-arm, arch: ARM64, cibw_system: win } # cibw requires ARM64 to be uppercase diff --git a/pyproject.toml b/pyproject.toml index 098c1a19..ade8cbb1 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -29,6 +29,7 @@ classifiers = [ "Programming Language :: Python :: 3.12", "Programming Language :: Python :: 3.13", "Programming Language :: Python :: 3.14", + "Programming Language :: Python :: 3.15", "Programming Language :: C++", ] authors = [{name = "DuckDB Foundation"}] @@ -233,9 +234,21 @@ name = "pytorch-cpu" url = "https://download.pytorch.org/whl/cpu" explicit = true +[[tool.uv.index]] +# TODO: Remove after 3.15.0 release +name = "scientific-python-nightly" +url = "https://pypi.anaconda.org/scientific-python-nightly-wheels/simple" +explicit = true + [tool.uv.sources] torch = [ { index = "pytorch-cpu" } ] torchvision = [ { index = "pytorch-cpu" } ] +pandas = [ + { index = "scientific-python-nightly", marker = "python_version >= '3.15'" }, +] +pyarrow = [ + { index = "scientific-python-nightly", marker = "python_version >= '3.15'" }, +] # todo: adjust for windows arm64 while test dependencies become available [dependency-groups] # used for development only, requires pip >=25.1.0 @@ -270,9 +283,11 @@ test = [ # dependencies used for running tests "requests", "urllib3", "fsspec>=2022.11.0; sys_platform != 'win32' or platform_machine != 'ARM64'", - "pandas>=3.0.0; python_version > '3.10'", + "pandas>=3.0.0; python_version >= '3.11' and python_version < '3.15'", + "pandas>=3.0.0.dev0; python_version >= '3.15'", "pandas<3.0.0; python_version < '3.11'", - "pyarrow>=23.0.0; python_version >= '3.10' and (sys_platform != 'win32' or platform_machine != 'ARM64')", + "pyarrow>=23.0.0; python_version >= '3.10' and python_version < '3.15' and (sys_platform != 'win32' or platform_machine != 'ARM64')", + "pyarrow>=23.0.0.dev0; python_version >= '3.15' and (sys_platform != 'win32' or platform_machine != 'ARM64')", "pyarrow>=18.0.0; python_version < '3.10' and (sys_platform != 'win32' or platform_machine != 'ARM64')", "torch>=2.2.2; python_version < '3.13' and ( sys_platform != 'win32' or platform_machine != 'ARM64' )", "torch>=2.2.2,<2.12.1; python_version > '3.11' and python_version < '3.13' and sys_platform == 'win32' and platform_machine == 'ARM64'", @@ -296,9 +311,11 @@ bench = [ # Pinned deps for the benchmark suite (see benchmarks/README.md). Mini "numpy<2; ( sys_platform != 'win32' or platform_machine != 'ARM64' ) and python_version < '3.12'", "numpy>=2; ( sys_platform != 'win32' or platform_machine != 'ARM64' ) and python_version >= '3.12'", "numpy>=2.3; sys_platform == 'win32' and platform_machine == 'ARM64' and python_version >= '3.11'", - "pandas>=3.0.0; python_version > '3.10'", + "pandas>=3.0.0; python_version >= '3.11' and python_version < '3.15'", + "pandas>=3.0.0.dev0; python_version >= '3.15'", "pandas<3.0.0; python_version < '3.11'", - "pyarrow>=23.0.0; python_version >= '3.10' and (sys_platform != 'win32' or platform_machine != 'ARM64')", + "pyarrow>=23.0.0; python_version >= '3.10' and python_version < '3.15' and (sys_platform != 'win32' or platform_machine != 'ARM64')", + "pyarrow>=23.0.0.dev0; python_version >= '3.15' and (sys_platform != 'win32' or platform_machine != 'ARM64')", "pyarrow>=18.0.0; python_version < '3.10' and (sys_platform != 'win32' or platform_machine != 'ARM64')", ] scripts = [ # dependencies used for running scripts From ce85b04d4ef86aa761785efffb92bc53028d9ae3 Mon Sep 17 00:00:00 2001 From: "paul@iqmo.com" Date: Thu, 27 Aug 2026 07:23:14 -0400 Subject: [PATCH 2/6] exclude win32_arm64 --- pyproject.toml | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index ade8cbb1..994ada55 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -47,7 +47,8 @@ all = [ # users can install duckdb with 'duckdb[all]', which will install this l "fsspec", # used in duckdb.filesystem "numpy", # used in duckdb.experimental.spark and in duckdb.fetchnumpy() "pandas", # used for pandas dataframes all over the place - "pyarrow", # used for pyarrow support + # TODO: Remove after 3.15.0 release + "pyarrow; sys_platform != 'win32' or platform_machine != 'ARM64'", # used for pyarrow support "adbc-driver-manager", # for the adbc driver ] @@ -63,7 +64,7 @@ build-backend = "duckdb_packaging.build_backend" backend-path = ["./"] requires = [ "scikit-build-core>=0.11.4", - "nanobind>=2.0", + "nanobind>=2.0,<3.0", "setuptools_scm>=8.0", # numpy C API headers (PyArray_Empty in the result path). Building against numpy 2.x yields a # binary compatible with numpy >=1.19 AND 2.x at runtime (numpy 2.0 backward-compat), so the @@ -262,19 +263,19 @@ stubdeps = [ # dependencies used for typehints in the stubs "typing-extensions", ] test = [ # dependencies used for running tests - "adbc-driver-manager>=1.10.0; python_version >= '3.10' and (sys_platform != 'win32' or platform_machine != 'ARM64')", + "adbc-driver-manager>=1.10.0; python_version >= '3.10' and python_version < '3.15' and (sys_platform != 'win32' or platform_machine != 'ARM64')", "adbc-driver-manager>=1.7.0; python_version < '3.10' and (sys_platform != 'win32' or platform_machine != 'ARM64')", "pytest", "pytest-reraise", "pytest-timeout", "pytest-timestamper", "pytest-xdist", # parallel test execution (-n auto); without this `uv sync --reinstall` prunes a manual install - "pytest_codspeed", + "pytest_codspeed; python_version < '3.15' or sys_platform != 'win32'", "coverage", "gcovr; sys_platform != 'win32' or platform_machine != 'ARM64'", - "gcsfs; sys_platform != 'win32' or platform_machine != 'ARM64'", + "gcsfs; python_version < '3.15' and (sys_platform != 'win32' or platform_machine != 'ARM64')", "packaging", - "polars>=1.33.0", + "polars>=1.33.0; python_version < '3.15'", "psutil", "py4j", "pyotp", @@ -292,7 +293,9 @@ test = [ # dependencies used for running tests "torch>=2.2.2; python_version < '3.13' and ( sys_platform != 'win32' or platform_machine != 'ARM64' )", "torch>=2.2.2,<2.12.1; python_version > '3.11' and python_version < '3.13' and sys_platform == 'win32' and platform_machine == 'ARM64'", "torch>=2.2.2,<2.11.0; python_version >= '3.13' and python_version < '3.14' and ( sys_platform != 'darwin' or platform_machine != 'x86_64' ) and ( sys_platform != 'win32' or platform_machine != 'ARM64' )", - "torch>=2.10.0; python_version >= '3.14' and ( sys_platform != 'darwin' or platform_machine != 'x86_64' ) and ( sys_platform != 'win32' or platform_machine != 'ARM64' )", + "torch>=2.10.0; python_version >= '3.14' and python_version < '3.15' and ( sys_platform != 'darwin' or platform_machine != 'x86_64' ) and ( sys_platform != 'win32' or platform_machine != 'ARM64' )", + # cp315: torch only ships manylinux wheels on the cpu index; skip elsewhere (torch tests importorskip) + "torch>=2.10.0; python_version >= '3.15' and sys_platform == 'linux'", "tensorflow==2.14.0; sys_platform == 'darwin' and python_version < '3.12'", "tensorflow-cpu>=2.14.0; sys_platform == 'linux' and platform_machine != 'aarch64' and python_version < '3.12'", "tensorflow-cpu>=2.14.0; sys_platform == 'win32' and platform_machine != 'ARM64' and python_version < '3.12'", From a7ed7744ad5486fc5d304fb45300b294f5edd31d Mon Sep 17 00:00:00 2001 From: "paul@iqmo.com" Date: Thu, 27 Aug 2026 08:03:41 -0400 Subject: [PATCH 3/6] bind nanobind <3.0 --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 994ada55..31bc76ed 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -339,7 +339,7 @@ pypi = [ # dependencies used by the pypi cleanup script build = [ "cmake>=3.29.0", "ninja>=1.10", - "nanobind>=2.0", + "nanobind>=2.0,<3.0", "scikit_build_core>=0.11.4", "setuptools_scm>=8.0", ] From 470265950da65f2e808f4d48b594060524672bc1 Mon Sep 17 00:00:00 2001 From: "paul@iqmo.com" Date: Thu, 27 Aug 2026 09:40:40 -0400 Subject: [PATCH 4/6] build: revert codspeed and polars marker ; works on 3.15 --- pyproject.toml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 31bc76ed..30625392 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -270,12 +270,12 @@ test = [ # dependencies used for running tests "pytest-timeout", "pytest-timestamper", "pytest-xdist", # parallel test execution (-n auto); without this `uv sync --reinstall` prunes a manual install - "pytest_codspeed; python_version < '3.15' or sys_platform != 'win32'", + "pytest_codspeed", "coverage", "gcovr; sys_platform != 'win32' or platform_machine != 'ARM64'", "gcsfs; python_version < '3.15' and (sys_platform != 'win32' or platform_machine != 'ARM64')", "packaging", - "polars>=1.33.0; python_version < '3.15'", + "polars>=1.33.0", "psutil", "py4j", "pyotp", From ecce1df17dda0d0d5bd7075d86161bf79af21507 Mon Sep 17 00:00:00 2001 From: "paul@iqmo.com" Date: Thu, 27 Aug 2026 11:04:10 -0400 Subject: [PATCH 5/6] ci: redisabling: polars fails on cp315 --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 30625392..0b024a26 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -275,7 +275,7 @@ test = [ # dependencies used for running tests "gcovr; sys_platform != 'win32' or platform_machine != 'ARM64'", "gcsfs; python_version < '3.15' and (sys_platform != 'win32' or platform_machine != 'ARM64')", "packaging", - "polars>=1.33.0", + "polars>=1.33.0; python_version < '3.15'", "psutil", "py4j", "pyotp", From 88a49b8bd3681c75fc339ceb96d74670d8016c00 Mon Sep 17 00:00:00 2001 From: "paul@iqmo.com" Date: Thu, 27 Aug 2026 12:28:33 -0400 Subject: [PATCH 6/6] tests: ignore Pandas4warnings --- pyproject.toml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/pyproject.toml b/pyproject.toml index 0b024a26..ae66b595 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -377,6 +377,8 @@ filterwarnings = [ # Pyspark is throwing these warnings "ignore:distutils Version classes are deprecated:DeprecationWarning", "ignore:is_datetime64tz_dtype is deprecated:DeprecationWarning", + # pandas 3.1.0.dev0deprecates the inplace keyword with a warning + "ignore::pandas.errors.Pandas4Warning", ] [tool.mypy]