name: Python
on:
push:
tags: ["v*"]
pull_request:
paths:
- "src/python.rs"
- "python/**"
- "pyproject.toml"
- "murk.pyi"
- "Cargo.toml"
- ".github/workflows/python.yaml"
permissions: read-all
env:
PYO3_USE_ABI3_FORWARD_COMPATIBILITY: "1"
jobs:
lint:
name: Lint
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd - uses: astral-sh/ruff-action@0ce1b0bf8b818ef400413f810f8a11cdbda0034b with:
src: python/
test:
name: Test
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd - uses: dtolnay/rust-toolchain@631a55b12751854ce901bb631d5902ceb48146f7 - uses: Swatinem/rust-cache@c19371144df3bb44fab255c43d04cbc2ab54d1c4
- name: Build release binary (for test fixture)
run: cargo build --release
- uses: astral-sh/setup-uv@08807647e7069bb48b6ef5acd8ec9567f424441b
- name: Install and test
run: |
uv venv
source .venv/bin/activate
uv pip install maturin pytest
maturin develop --features python
pytest python/tests -v
wheels:
name: Build wheels (${{ matrix.os }}, ${{ matrix.target }})
needs: [lint, test]
runs-on: ${{ matrix.os }}
strategy:
fail-fast: false
matrix:
include:
- os: ubuntu-latest
target: x86_64
- os: ubuntu-latest
target: aarch64
manylinux: manylinux_2_28
- os: macos-14
target: x86_64
- os: macos-latest
target: aarch64
- os: windows-latest
target: x64
steps:
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd
- uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 with:
python-version: "3.12"
- name: Set up QEMU
if: runner.os == 'Linux' && matrix.target == 'aarch64'
uses: docker/setup-qemu-action@ce360397dd3f832beb865e1373c09c0e9f86d70a with:
platforms: arm64
- name: Build wheels
uses: PyO3/maturin-action@e83996d129638aa358a18fbd1dfb82f0b0fb5d3b env:
PYO3_USE_ABI3_FORWARD_COMPATIBILITY: "1"
with:
target: ${{ matrix.target }}
args: --release --out dist --features python -i python3.12
manylinux: ${{ matrix.manylinux || 'auto' }}
docker-options: -e PYO3_USE_ABI3_FORWARD_COMPATIBILITY=1
- uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a with:
name: wheels-${{ matrix.os }}-${{ matrix.target }}
path: dist/
sdist:
name: Build sdist
needs: [lint, test]
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd
- name: Build sdist
uses: PyO3/maturin-action@e83996d129638aa358a18fbd1dfb82f0b0fb5d3b with:
command: sdist
args: --out dist
- uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a with:
name: wheels-sdist
path: dist/
publish:
name: Publish to PyPI
if: startsWith(github.ref, 'refs/tags/v')
needs: [wheels, sdist]
runs-on: ubuntu-latest
permissions:
id-token: write
steps:
- uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c with:
pattern: wheels-*
merge-multiple: true
path: dist/
- name: Publish to PyPI
uses: pypa/gh-action-pypi-publish@cef221092ed1bacb1cc03d23a2d87d1d172e277b with:
skip-existing: true