name: Python CI
on:
push:
branches: [ main ]
paths:
- 'bindings/python/**'
- 'src/**'
- 'Cargo.toml'
- 'Cargo.lock'
- '.github/workflows/python-ci.yml'
pull_request:
branches: [ main ]
paths:
- 'bindings/python/**'
- 'src/**'
- 'Cargo.toml'
- 'Cargo.lock'
- '.github/workflows/python-ci.yml'
permissions:
contents: read
env:
CARGO_TERM_COLOR: always
RUST_BACKTRACE: 1
jobs:
lint:
name: Code Quality (Ruff)
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Setup Python
uses: actions/setup-python@v6
with:
python-version: '3.12'
- name: Install Ruff
run: pip install ruff
- name: Check formatting
working-directory: bindings/python
run: ruff format --check .
- name: Run linter
working-directory: bindings/python
run: ruff check .
test:
name: Test (${{ matrix.os }} / Py ${{ matrix.python-version }})
runs-on: ${{ matrix.os }}
strategy:
fail-fast: false
matrix:
os: [ubuntu-latest, macos-latest, windows-latest]
python-version: ['3.8', '3.10', '3.12', '3.13', '3.13t']
exclude:
- os: macos-latest
python-version: '3.8'
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Install Rust toolchain
uses: actions-rust-lang/setup-rust-toolchain@v1
with:
toolchain: stable
cache: true
- name: Setup Python ${{ matrix.python-version }}
uses: actions/setup-python@v6
with:
python-version: ${{ matrix.python-version }}
cache: 'pip'
- name: Build Extension and Install Dependencies
working-directory: bindings/python
shell: bash
run: pip install -e ".[test]"
- name: Run Pytest
working-directory: bindings/python
shell: bash
run: pytest -v --color=yes --junitxml=junit.xml
- name: Upload Test Results
if: always()
uses: actions/upload-artifact@v4
with:
name: test-results-python-${{ matrix.os }}-${{ matrix.python-version }}
path: bindings/python/junit.xml
if-no-files-found: ignore