name: Python Wheels
on:
push:
branches: ["**"]
tags: ["v*"]
paths:
- "bindings/python/**"
- "src/**"
- "Cargo.toml"
- "Cargo.lock"
- "pyproject.toml"
- ".github/workflows/python-wheels.yml"
pull_request:
paths:
- "bindings/python/**"
- "src/**"
- "Cargo.toml"
- "Cargo.lock"
- "pyproject.toml"
- ".github/workflows/python-wheels.yml"
workflow_dispatch:
env:
RUSTFLAGS: "-C target-cpu=generic"
jobs:
build:
strategy:
fail-fast: false
matrix:
include:
- os: ubuntu-latest
target: x86_64
artifact: wheel-ubuntu-latest-x86_64
interpreter_args: -i python3.10 -i python3.11 -i python3.12 -i python3.13 -i python3.14
- os: ubuntu-latest
target: aarch64
artifact: wheel-ubuntu-latest-aarch64
interpreter_args: -i python3.10 -i python3.11 -i python3.12 -i python3.13 -i python3.14
- os: macos-15-intel
target: x86_64
artifact: wheel-macos-15-intel-x86_64
interpreter_args: -i python
- os: macos-14
target: aarch64
artifact: wheel-macos-14-aarch64
interpreter_args: -i python
- os: windows-latest
target: x86_64
artifact: wheel-windows-latest-x86_64
interpreter_args: -i python
runs-on: ${{ matrix.os }}
steps:
- uses: actions/checkout@v4
- uses: actions/setup-python@v5
if: runner.os != 'Linux'
with:
python-version: "3.10"
allow-prereleases: true
- uses: PyO3/maturin-action@v1
with:
target: ${{ matrix.target }}
args: --release --out dist ${{ matrix.interpreter_args }}
manylinux: auto
- uses: actions/upload-artifact@v4
with:
name: ${{ matrix.artifact }}
path: dist/*.whl
sdist:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: PyO3/maturin-action@v1
with:
command: sdist
args: --out dist
- uses: actions/upload-artifact@v4
with:
name: sdist
path: dist/*.tar.gz
test:
needs: [build]
strategy:
fail-fast: false
matrix:
python-version: ["3.10", "3.11", "3.12", "3.13", "3.14"]
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-python@v5
with:
python-version: ${{ matrix.python-version }}
allow-prereleases: true
- uses: actions/download-artifact@v4
with:
name: wheel-ubuntu-latest-x86_64
path: dist
- env:
PYTEST_DISABLE_PLUGIN_AUTOLOAD: 1
run: |
python -m pip install numpy pytest
python -m pip install --no-index --find-links dist copp-py
python -m pytest bindings/python/tests/ -v
smoke-test:
needs: [build]
strategy:
fail-fast: false
matrix:
include:
- runner: ubuntu-latest
artifact: wheel-ubuntu-latest-x86_64
- runner: ubuntu-24.04-arm
artifact: wheel-ubuntu-latest-aarch64
- runner: macos-15-intel
artifact: wheel-macos-15-intel-x86_64
- runner: macos-14
artifact: wheel-macos-14-aarch64
- runner: windows-latest
artifact: wheel-windows-latest-x86_64
runs-on: ${{ matrix.runner }}
steps:
- uses: actions/checkout@v4
- uses: actions/setup-python@v5
with:
python-version: "3.10"
allow-prereleases: true
- uses: actions/download-artifact@v4
with:
name: ${{ matrix.artifact }}
path: dist
- env:
PYTEST_DISABLE_PLUGIN_AUTOLOAD: 1
run: |
python -m pip install numpy pytest
python -m pip install --no-index --find-links dist copp-py
python -m pytest bindings/python/tests/ -v