outlines-core 0.2.14

Structured Generation
Documentation
name: Tests

on:
  pull_request:
    branches: [main]
  push:
    branches: [main]

jobs:
  style:
    name: Check the code style
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v4
    - uses: actions/setup-python@v4
      with:
        python-version: "3.10"

    # toolchain choice needs to happen before cache: rustc version used as its cache key
    - uses: dtolnay/rust-toolchain@nightly
      with:
          components: rustfmt
    - uses: Swatinem/rust-cache@v2
    - uses: pre-commit/action@v3.0.0

  tests:
    name: Run python tests
    runs-on: ubuntu-latest
    strategy:
      matrix:
        python-version: ["3.10"]
    steps:
    - uses: actions/checkout@v4
    - name: Set up Python ${{ matrix.python-version }}
      uses: actions/setup-python@v4
      with:
        python-version: ${{ matrix.python-version }}
    - name: Set up test environment
      run: |
        python -m venv .venv
        source .venv/bin/activate
        python -m pip install --upgrade pip
        pip install .[test]
        maturin develop
    - name: Create matrix id
      id: matrix-id
      env:
        MATRIX_CONTEXT: ${{ toJson(matrix) }}
      run: |
        echo $MATRIX_CONTEXT
        export MATRIX_ID=`echo $MATRIX_CONTEXT | md5sum | cut -c 1-32`
        echo $MATRIX_ID
        echo "::set-output name=id::$MATRIX_ID"
    - name: Run tests
      run: |
        .venv/bin/python -m pytest --cov=outlines_core -vv
      env:
        COVERAGE_FILE: .coverage.${{ steps.matrix-id.outputs.id }}
    - name: Upload coverage data
      uses: actions/upload-artifact@v4
      with:
        name: coverage-data
        path: .coverage.*
        if-no-files-found: ignore
        include-hidden-files: true
        # TODO FIXME: This is only using the last run
        overwrite: true

  coverage:
    name: Check combined coverage
    needs: [tests, cargo-test]
    runs-on: ubuntu-latest

    steps:
      - uses: actions/checkout@v4
        with:
          fetch-depth: 0

      - uses: actions/setup-python@v4
        with:
          cache: pip
          python-version: "3.10"

      - name: Set up environment
        run: |
          python -m venv .venv
          source .venv/bin/activate
          python -m pip install --upgrade pip
          pip install --upgrade "coverage[toml]>=5.1" diff-cover maturin
          maturin develop

      - name: Install lcov
        run: sudo apt-get update && sudo apt-get install -yqq lcov

      - name: Download python coverage data
        uses: actions/download-artifact@v4
        with:
          name: coverage-data

      - name: Download rust coverage data
        uses: actions/download-artifact@v4
        with:
          name: rust-coverage-data

      - name: Fetch main for coverage diff
        run: |
          git fetch --no-tags --prune origin main

      - name: Combine coverage & fail if it's <100%.
        run: |
          source .venv/bin/activate
          python -m coverage combine
          python -m coverage lcov
          lcov -a coverage.lcov -a lcov.info -o combined_coverage
          genhtml combined_coverage --output-directory htmlcov
          diff-cover combined_coverage --markdown-report=coverage.md --fail-under=100 || (cat coverage.md >> $GITHUB_STEP_SUMMARY && exit 1)

      - name: Upload HTML report if check failed.
        uses: actions/upload-artifact@v4
        with:
          name: html-report
          path: htmlcov
          # TODO FIXME: This is only using the last run
          overwrite: true
        if: ${{ failure() }}

  build-wheel:
    name: Build Wheel and Test SDist
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - name: Build SDist and Wheel
        run: ./.github/scripts/build_sdist_and_wheel.sh

  cargo-test:
    name: Run Cargo tests
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v4
    # toolchain choice needs to happen before cache: rustc version used as its cache key
    - uses: dtolnay/rust-toolchain@stable
    - uses: Swatinem/rust-cache@v2

    - name: Install cargo tarpaulin if not cached
      run: |
        if ! command -v cargo-tarpaulin &> /dev/null; then
          echo "cargo-tarpaulin is not found, installing..."
          cargo install cargo-tarpaulin
        else
          echo "cargo-tarpaulin is cached"
        fi

    - name: Generate rust code coverage
      run: >
        cargo tarpaulin
        --out=Lcov
        --output-dir=rust-coverage
        --engine=llvm
        --exclude-files=src/python_bindings/*
        --no-dead-code
        --workspace
        --verbose
      env:
        RUSTFLAGS: -C instrument-coverage

    - name: Upload rust coverage data
      uses: actions/upload-artifact@v4
      with:
        name: rust-coverage-data
        path: rust-coverage/
        if-no-files-found: ignore
        include-hidden-files: true
        overwrite: true

  cargo-audit:
    name: Run Cargo audit
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v4
    # toolchain choice needs to happen before cache: rustc version used as its cache key
    - uses: dtolnay/rust-toolchain@stable
    - uses: Swatinem/rust-cache@v2

    - name: Install cargo audit if not cached
      run: |
        if ! command -v cargo-audit &> /dev/null; then
          echo "cargo-audit is not found, installing..."
          cargo install cargo-audit
        else
          echo "cargo-audit is cached"
        fi

    - name: Run cargo audit
      run: cargo audit