name: CI
on:
pull_request:
branches: [main]
env:
CARGO_TERM_COLOR: always
RUST_BACKTRACE: 1
jobs:
build-and-test:
name: Build & Test (${{ matrix.os }})
runs-on: ${{ matrix.os }}
strategy:
fail-fast: false
matrix:
os: [ubuntu-latest, macos-latest, windows-latest]
steps:
- name: Checkout code
uses: actions/checkout@v6
- name: Set up Python
uses: actions/setup-python@v6
with:
python-version: '3.14'
- name: Install Rust
uses: dtolnay/rust-toolchain@stable
- name: Cache Rust dependencies
uses: actions/cache@v5
with:
path: |
~/.cargo/bin/
~/.cargo/registry/index/
~/.cargo/registry/cache/
~/.cargo/git/db/
target/
key: ${{ runner.os }}-cargo-py3.14-${{ hashFiles('**/Cargo.lock') }}
restore-keys: |
${{ runner.os }}-cargo-py3.14-
- name: Install maturin and test dependencies
run: pip install maturin numpy pandas polars
- name: Clean old wheels
run: rm -rf target/wheels || true
shell: bash
- name: Build with maturin
run: maturin build --release --interpreter python --features extension-module
- name: Run Rust tests
if: matrix.os == 'ubuntu-latest'
run: cargo test --release
- name: Install wheel (Unix)
if: matrix.os != 'windows-latest'
run: pip install target/wheels/survival-*.whl
- name: Install wheel (Windows)
if: matrix.os == 'windows-latest'
run: |
$wheel = Get-ChildItem -Path target/wheels -Filter "survival-*.whl" | Select-Object -First 1
pip install $wheel.FullName
- name: Run Python tests
run: python test/test_all.py
python-matrix:
name: Python ${{ matrix.python-version }}
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
python-version: ['3.14']
steps:
- name: Checkout code
uses: actions/checkout@v6
- name: Set up Python ${{ matrix.python-version }}
uses: actions/setup-python@v6
with:
python-version: ${{ matrix.python-version }}
- name: Install Rust
uses: dtolnay/rust-toolchain@stable
- name: Cache Rust dependencies
uses: actions/cache@v5
with:
path: |
~/.cargo/bin/
~/.cargo/registry/index/
~/.cargo/registry/cache/
~/.cargo/git/db/
target/
key: ${{ runner.os }}-cargo-py${{ matrix.python-version }}-${{ hashFiles('**/Cargo.lock') }}
restore-keys: |
${{ runner.os }}-cargo-py${{ matrix.python-version }}-
- name: Install maturin and test dependencies
run: pip install maturin numpy pandas polars
- name: Clean old wheels
run: rm -rf target/wheels || true
- name: Build and install
run: |
maturin build --release --interpreter python --features extension-module
pip install target/wheels/survival-*.whl
- name: Run Rust tests
run: cargo test --release
- name: Run Python tests
run: python test/test_all.py
r-validation:
name: R Survival Package Validation
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v6
- name: Install R
uses: r-lib/actions/setup-r@v2
with:
r-version: '4.5.2'
- name: Install R dependencies
run: |
install.packages(c("survival", "jsonlite"), repos = "https://cloud.r-project.org")
shell: Rscript {0}
- name: Regenerate expected values
run: |
cd test
Rscript generate_r_expected_values.R
- name: Check for differences
run: |
if git diff --exit-code test/r_expected_values.json; then
echo "✓ R expected values are up to date"
else
echo "✗ R expected values have changed!"
echo "Please run 'Rscript test/generate_r_expected_values.R' and commit the changes"
exit 1
fi
docs:
name: Documentation
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v6
- name: Set up Python
uses: actions/setup-python@v6
with:
python-version: '3.14'
- name: Install Rust
uses: dtolnay/rust-toolchain@stable
- name: Cache Rust dependencies
uses: actions/cache@v5
with:
path: |
~/.cargo/bin/
~/.cargo/registry/index/
~/.cargo/registry/cache/
~/.cargo/git/db/
target/
key: ${{ runner.os }}-cargo-docs-${{ hashFiles('**/Cargo.lock') }}
restore-keys: |
${{ runner.os }}-cargo-
- name: Build documentation
run: cargo doc --no-deps
env:
RUSTDOCFLAGS: -D warnings