blob: 558e751c80147abbc717b151bdbeb83a9d6a71f6 [file]
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied. See the License for the
# specific language governing permissions and limitations
# under the License.
# Reusable workflow for running tests.
# Single matrix covers both GIL (abi3 wheel) and free-threaded
# (per-interpreter wheels) builds.
name: Test
on:
workflow_call:
env:
UV_LOCKED: true
jobs:
test-matrix:
runs-on: ubuntu-latest
# Backstop: a hung multiprocessing worker (e.g. during a pickle regression)
# should not block CI longer than this.
timeout-minutes: 30
strategy:
fail-fast: false
matrix:
include:
# GIL builds — all share the same abi3 wheel.
- { python-version: "3.10", wheel-tag: "abi3", freethreaded: false }
- { python-version: "3.11", wheel-tag: "abi3", freethreaded: false }
- { 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.14t", wheel-tag: "3.14t", freethreaded: true }
steps:
- uses: actions/checkout@v6
- name: Setup Python
id: setup-python
uses: actions/setup-python@v6
with:
python-version: ${{ matrix.python-version }}
freethreaded: ${{ matrix.freethreaded }}
- name: Cache Cargo
uses: actions/cache@v5
with:
path: ~/.cargo
key: cargo-cache-stable-${{ hashFiles('Cargo.lock') }}
- name: Install dependencies
uses: astral-sh/setup-uv@fac544c07dec837d0ccb6301d7b5580bf5edae39
with:
enable-cache: true
- name: Download pre-built Linux wheel
uses: actions/download-artifact@v8
with:
name: dist-manylinux-x86_64-${{ matrix.wheel-tag }}
path: wheels/
# FFI test wheel only built once (under the abi3 matrix entry in build.yml).
- name: Download pre-built FFI test wheel
if: matrix.wheel-tag == 'abi3'
uses: actions/download-artifact@v8
with:
name: test-ffi-manylinux-x86_64
path: wheels/
- name: Install from pre-built wheels
run: |
set -x
# Create the venv with the setup-python interpreter, then point
# every uv command explicitly at the venv's own interpreter.
# uv's interpreter discovery skips free-threaded builds unless
# asked by exact path, so plain `uv sync` (even with an activated
# venv or --active) re-picks the system 3.12 and recreates .venv.
# Targeting .venv/bin/python keeps sync and pip install in the
# same 3.14t environment as the cp314t wheel.
uv venv --python "${{ steps.setup-python.outputs.python-path }}"
VENV_PY="$PWD/.venv/bin/python"
uv sync --python "$VENV_PY" --dev --no-install-package datafusion
WHEELS=$(find wheels/ -name "*.whl")
if [ -n "$WHEELS" ]; then
echo "Installing wheels:"
echo "$WHEELS"
uv pip install --python "$VENV_PY" wheels/*.whl
else
echo "ERROR: No wheels found!"
exit 1
fi
- name: Run tests
env:
RUST_BACKTRACE: 1
# On free-threaded interpreters, fail loud if any C extension
# re-enables the GIL implicitly.
PYTHON_GIL: ${{ matrix.freethreaded && '0' || '' }}
run: |
git submodule update --init
# Use the .venv interpreter directly; uv discovery would skip the
# free-threaded build and re-pick the system 3.12 (see install step).
uv run --python "$PWD/.venv/bin/python" --no-project pytest -v --import-mode=importlib
# FFI + TPC-H examples only need to run once; gate to abi3 entries.
- name: FFI unit tests
if: matrix.wheel-tag == 'abi3'
run: |
cd examples/datafusion-ffi-example
uv run --no-project pytest python/tests/_test*.py
- name: Run tpchgen-cli to create 1 Gb dataset
if: matrix.wheel-tag == 'abi3'
run: |
mkdir examples/tpch/data
cd examples/tpch/data
uv pip install tpchgen-cli
uv run --no-project tpchgen-cli -s 1 --format=parquet
- name: Run TPC-H examples
if: matrix.wheel-tag == 'abi3'
run: |
cd examples/tpch
uv run --no-project pytest _tests.py