diff --git a/.github/actions/build-wheel/action.yml b/.github/actions/build-wheel/action.yml index 6c5071da..6c67988b 100644 --- a/.github/actions/build-wheel/action.yml +++ b/.github/actions/build-wheel/action.yml @@ -104,9 +104,9 @@ runs: save: ${{ inputs.ccache-save }} # Install Astral UV, which will be used as build-frontend for cibuildwheel - - uses: astral-sh/setup-uv@v7 + - uses: astral-sh/setup-uv@v10.3.0 with: - version: "0.9.0" + version: "0.12.10" enable-cache: false ### cibuildwheel configuration @@ -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@v4.2.0 + uses: pypa/cibuildwheel@v4.3.1 env: CIBW_ARCHS: ${{ inputs.arch == 'amd64' && 'AMD64' || inputs.arch }} CIBW_BUILD: ${{ inputs.python }}-${{ inputs.cibw-system }}_${{ inputs.arch }} diff --git a/.github/workflows/cleanup_pypi.yml b/.github/workflows/cleanup_pypi.yml index 51c8b257..cfae7e1b 100644 --- a/.github/workflows/cleanup_pypi.yml +++ b/.github/workflows/cleanup_pypi.yml @@ -70,9 +70,9 @@ jobs: exit 1 - name: Install Astral UV - uses: astral-sh/setup-uv@v7 + uses: astral-sh/setup-uv@v10.3.0 with: - version: "0.9.0" + version: "0.12.10" - name: Install dependencies run: uv sync --only-group pypi --no-install-project diff --git a/.github/workflows/code_quality.yml b/.github/workflows/code_quality.yml index bec5f886..b023ae75 100644 --- a/.github/workflows/code_quality.yml +++ b/.github/workflows/code_quality.yml @@ -29,9 +29,9 @@ jobs: persist-credentials: false - name: Install Astral UV - uses: astral-sh/setup-uv@v7 + uses: astral-sh/setup-uv@v10.3.0 with: - version: "0.9.0" + version: "0.12.10" python-version: "3.12" - name: pre-commit (cache) diff --git a/.github/workflows/coverage.yml b/.github/workflows/coverage.yml index 3b51e641..8c3277cc 100644 --- a/.github/workflows/coverage.yml +++ b/.github/workflows/coverage.yml @@ -68,9 +68,9 @@ jobs: sudo apt-get -y install ccache - name: Install Astral UV and enable the cache - uses: astral-sh/setup-uv@v7 + uses: astral-sh/setup-uv@v10.3.0 with: - version: "0.9.0" + version: "0.12.10" python-version: 3.12 enable-cache: true cache-suffix: -${{ github.workflow }} diff --git a/.github/workflows/packaging_sdist.yml b/.github/workflows/packaging_sdist.yml index 912b26d1..9cb6b894 100644 --- a/.github/workflows/packaging_sdist.yml +++ b/.github/workflows/packaging_sdist.yml @@ -70,9 +70,9 @@ jobs: fi - name: Install Astral UV - uses: astral-sh/setup-uv@v7 + uses: astral-sh/setup-uv@v10.3.0 with: - version: "0.9.0" + version: "0.12.10" python-version: 3.12 - name: Build sdist 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/.github/workflows/targeted_test.yml b/.github/workflows/targeted_test.yml index eff62fe2..4cf163b1 100644 --- a/.github/workflows/targeted_test.yml +++ b/.github/workflows/targeted_test.yml @@ -55,9 +55,9 @@ jobs: submodules: true - name: Install uv - uses: astral-sh/setup-uv@v7 + uses: astral-sh/setup-uv@v10.3.0 with: - version: "0.9.0" + version: "0.12.10" enable-cache: false python-version: ${{ inputs.python_version }} diff --git a/pyproject.toml b/pyproject.toml index 78d42c9a..bfdf7b61 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"}] @@ -198,16 +199,14 @@ exclude = [ # # This section has dependency groups for testing and development. Tread carefully, the current setup makes sure that # test dependencies can be installed on as many platforms we build wheel for. Especially picky are: -# - tensorflow: we can only run tests on cp310-cp311, for osx there is no tensorflow-cpu, for windows we need -# tensorflow-cpu-aws and there is no distribution availalbe for Linux aarch64. +# - tensorflow: wheels exist for cp310-cp313 only. tensorflow-cpu covers Linux x86_64 and Windows AMD64. The full +# tensorflow package covers macOS arm64 and Linux aarch64. There are no wheels for macOS x86_64 or Windows +# ARM64. >=2.20 is first release w/o a numpy upper bound. # - torch: since we can't use gpu acceleration, we need to rely on torch-cpu, which isn't available on pypi. We use # `tool.uv.index` and `tool.uv.sources` to make sure the official pytorch index is used. Even there, we don't # have a wheel available for x86_64 OSX + cp313. -# - numpy: tensorflow doesn't play nice with numpy>2 so for every platform that can run tensorflow (cp310-cp311) we use -# numpy<2. numpy<2 has no wheels for cp31[2|3], meaning an sdist will be used. However, on Windows amd64 + -# cp313 this results in a segfault / access violation. To get around this, we install numpy>=2 on all >=cp312 -# platforms. Then for windows arm64, for which there is no tensorflow, we only allow numpy>=2.3 because that -# ships arm64 win32 wheels. +# - numpy: numpy 1.x is EOL and pyarrow>=26 requires numpy>=2, so numpy>=2 everywhere. Windows ARM64 needs +# numpy>=2.3 because that is the first release with win32 arm64 wheels. ###################################################################################################### [tool.uv] @@ -256,7 +255,7 @@ 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", @@ -277,22 +276,22 @@ 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.6; 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>=26.0.0; 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'", "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' )", - "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'", - "tensorflow-cpu-aws==2.15.1; sys_platform == 'linux' and platform_machine == 'aarch64' and python_version < '3.12'", + "tensorflow-cpu>=2.20.0; python_version < '3.14' and ( ( sys_platform == 'linux' and platform_machine == 'x86_64' ) or ( sys_platform == 'win32' and platform_machine == 'AMD64' ) )", + "tensorflow>=2.20.0; python_version < '3.14' and ( ( sys_platform == 'darwin' and platform_machine == 'arm64' ) or ( sys_platform == 'linux' and platform_machine == 'aarch64' ) )", "typing-extensions", - "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'", + "numpy>=2; ( sys_platform != 'win32' or platform_machine != 'ARM64' ) and python_version < '3.15'", + "numpy>=2.3; sys_platform == 'win32' and platform_machine == 'ARM64' and python_version >= '3.11' and python_version < '3.15'", + "numpy>=2.5.2; python_version >= '3.15'", ] bench = [ # Pinned deps for the benchmark suite (see benchmarks/README.md). Minimal, not the heavy `test` group. # Constraints mirror `test` so the lockfile resolves identically; torch/tf are local-only (importorskip). @@ -300,12 +299,14 @@ bench = [ # Pinned deps for the benchmark suite (see benchmarks/README.md). Mini "pytest_codspeed", "polars>=1.33.0", "pytz", - "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'", + "numpy>=2; ( sys_platform != 'win32' or platform_machine != 'ARM64' ) and python_version < '3.15'", + "numpy>=2.3; sys_platform == 'win32' and platform_machine == 'ARM64' and python_version >= '3.11' and python_version < '3.15'", + "numpy>=2.5.2; python_version >= '3.15'", + "pandas>=3.0.0; python_version >= '3.11' and python_version < '3.15'", + "pandas>=3.0.6; 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>=26.0.0; 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 @@ -328,6 +329,11 @@ build = [ "ninja>=1.10", "nanobind>=3.0", "scikit_build_core>=0.11.4", + # numpy C API headers; mirrors [build-system].requires, needed because the dev flow uses + # --no-build-isolation. Markers match the test/bench groups so the lock resolves. + "numpy>=2; ( sys_platform != 'win32' or platform_machine != 'ARM64' ) and python_version < '3.15'", + "numpy>=2.3; sys_platform == 'win32' and platform_machine == 'ARM64' and python_version >= '3.11' and python_version < '3.15'", + "numpy>=2.5.2; python_version >= '3.15'", ] dev = [ # tooling like uv will install this automatically when syncing the environment "pre-commit", @@ -363,6 +369,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.dev0 deprecates the inplace keyword with a warning + "ignore::pandas.errors.Pandas4Warning", ] [tool.mypy]