Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 12 additions & 4 deletions .github/actions/build-wheel/action.yml
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ inputs:
required: false
default: ""
python-tag:
description: "abi3 (covers 3.10..3.14 GIL builds) or a free-threaded interpreter such as 3.13t / 3.14t"
description: "abi3 (covers 3.10..3.14 GIL builds), abi3t (covers 3.15+, GIL and free-threaded; built with 3.15t), or a version-specific free-threaded interpreter such as 3.14t"
required: true
build-mode:
description: "release or debug"
Expand Down Expand Up @@ -67,6 +67,14 @@ runs:
BUILD_ARGS="--features ${FEATURES}"
else
# Free-threaded build: disable abi3, force mimalloc back in, pin interpreter.
# `abi3t` builds a PEP 803 wheel (cp315-abi3t), importable on 3.15+
# GIL and free-threaded builds, using the 3.15 free-threaded
# interpreter. Older free-threaded tags get version-specific wheels.
ABI_FEATURE=""
if [ "$TAG" = "abi3t" ]; then
ABI_FEATURE="abi3t,"
TAG="3.15t"
fi
if [ "${RUNNER_OS:-}" = "Windows" ]; then
# Windows free-threaded builds ship as `python.exe` (no `tN`
# suffix). Resolve sys.executable so the path is independent of
Expand All @@ -83,7 +91,7 @@ runs:
else
INTERP="python${TAG}"
fi
BUILD_ARGS="--no-default-features --features mimalloc,${FEATURES} --interpreter ${INTERP}"
BUILD_ARGS="--no-default-features --features mimalloc,${ABI_FEATURE}${FEATURES} --interpreter ${INTERP}"
fi
if [ "${{ inputs.build-mode }}" = "release" ]; then
BUILD_ARGS="--release --strip ${BUILD_ARGS}"
Expand All @@ -98,7 +106,7 @@ runs:
with:
target: ${{ inputs.target }}
manylinux: ${{ inputs.manylinux }}
maturin-version: "1.13.3"
maturin-version: "1.15.0"
args: ${{ steps.args.outputs.args }}
rustup-components: rust-std

Expand All @@ -107,4 +115,4 @@ runs:
shell: bash
# Use `uvx` so maturin is available even when `uv sync` was skipped
# (free-threaded matrix entries don't pre-populate the project venv).
run: uvx maturin@1.13.3 build ${{ steps.args.outputs.args }}
run: uvx maturin@1.15.0 build ${{ steps.args.outputs.args }}
14 changes: 8 additions & 6 deletions .github/workflows/build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -144,7 +144,7 @@ jobs:
strategy:
fail-fast: false
matrix:
python-tag: ["abi3", "3.14t"]
python-tag: ["abi3", "3.14t", "abi3t"]
steps:
- uses: actions/checkout@v7

Expand Down Expand Up @@ -235,7 +235,7 @@ jobs:
strategy:
fail-fast: false
matrix:
python-tag: ["abi3", "3.14t"]
python-tag: ["abi3", "3.14t", "abi3t"]
steps:
- uses: actions/checkout@v7

Expand Down Expand Up @@ -298,7 +298,7 @@ jobs:
fail-fast: false
matrix:
os: [macos-latest, windows-latest]
python-tag: ["abi3", "3.14t"]
python-tag: ["abi3", "3.14t", "abi3t"]
steps:
- uses: actions/checkout@v7

Expand All @@ -321,7 +321,8 @@ jobs:
if: matrix.python-tag != 'abi3'
uses: actions/setup-python@v7
with:
python-version: ${{ matrix.python-tag }}
# abi3t wheels are built with the 3.15 free-threaded interpreter.
python-version: ${{ matrix.python-tag == 'abi3t' && '3.15' || matrix.python-tag }}
freethreaded: true

- uses: astral-sh/setup-uv@c18668ad3cf93ea998bef934396af7bb5c839dc7
Expand Down Expand Up @@ -381,7 +382,7 @@ jobs:
strategy:
fail-fast: false
matrix:
python-tag: ["abi3", "3.14t"]
python-tag: ["abi3", "3.14t", "abi3t"]
steps:
- uses: actions/checkout@v7

Expand All @@ -404,7 +405,8 @@ jobs:
if: matrix.python-tag != 'abi3'
uses: actions/setup-python@v7
with:
python-version: ${{ matrix.python-tag }}
# abi3t wheels are built with the 3.15 free-threaded interpreter.
python-version: ${{ matrix.python-tag == 'abi3t' && '3.15' || matrix.python-tag }}
freethreaded: true

- uses: astral-sh/setup-uv@c18668ad3cf93ea998bef934396af7bb5c839dc7
Expand Down
11 changes: 8 additions & 3 deletions .github/workflows/test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -16,8 +16,9 @@
# under the License.

# Reusable workflow for running tests.
# Single matrix covers both GIL (abi3 wheel) and free-threaded
# (per-interpreter wheels) builds.
# Single matrix covers GIL (abi3 wheel), free-threaded (per-interpreter
# wheels) and 3.15+ (abi3t wheel, loadable on both GIL and free-threaded
# builds) interpreters.

name: Test

Expand All @@ -43,8 +44,12 @@ jobs:
- { python-version: "3.12", wheel-tag: "abi3", freethreaded: false }
- { python-version: "3.13", wheel-tag: "abi3", freethreaded: false }
- { python-version: "3.14", wheel-tag: "abi3", freethreaded: false }
# Free-threaded builds — one wheel per interpreter.
- { python-version: "3.15", wheel-tag: "abi3", freethreaded: false }
# The abi3t wheel (PEP 803) loads on both GIL and free-threaded 3.15+.
- { python-version: "3.15", wheel-tag: "abi3t", freethreaded: false }
# Free-threaded builds — one wheel per interpreter (abi3t covers 3.15+).
- { python-version: "3.14t", wheel-tag: "3.14t", freethreaded: true }
- { python-version: "3.15t", wheel-tag: "abi3t", freethreaded: true }
steps:
- uses: actions/checkout@v7

Expand Down
4 changes: 4 additions & 0 deletions crates/core/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -81,6 +81,10 @@ default = ["mimalloc", "abi3"]
# Mutually exclusive with free-threaded interpreters (cp313t / cp314t); the
# free-threaded wheel build must pass --no-default-features.
abi3 = ["pyo3/abi3", "pyo3/abi3-py310"]
# PEP 803 stable ABI — single wheel covers Python 3.15+ on both GIL and
# free-threaded builds. Requires a 3.15+ host interpreter and maturin >= 1.14.
# Enable via `--no-default-features` so it is not combined with `abi3`.
abi3t = ["pyo3/abi3t", "pyo3/abi3t-py315"]
protoc = ["datafusion-substrait/protoc"]
substrait = ["dep:datafusion-substrait"]

Expand Down
4 changes: 2 additions & 2 deletions pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@
# under the License.

[build-system]
requires = ["maturin>=1.8.1"]
requires = ["maturin>=1.14.0"]
build-backend = "maturin"

[project]
Expand Down Expand Up @@ -217,7 +217,7 @@ constraint-dependencies = ["typing-extensions>=4.15.0"]
dev = [
"arro3-core==0.6.5",
"codespell==2.4.1",
"maturin>=1.8.1",
"maturin>=1.14.0",
"nanoarrow==0.8.0",
"numpy>1.25.0;python_version<'3.14'",
"numpy>=2.3.2;python_version>='3.14'",
Expand Down
2 changes: 1 addition & 1 deletion uv.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.