lenskit/lkpy

View on GitHub
.github/workflows/test.yml

Summary

Maintainability
Test Coverage
name: Test Suite
on:
  push:
    branches:
      - main
  pull_request:

defaults:
  run:
    shell: bash -el {0}

concurrency:
  group: test-${{github.ref}}
  cancel-in-progress: true

jobs:
  conda:
    name: Conda Python ${{matrix.python}} on ${{matrix.platform}}
    runs-on: ${{matrix.platform}}
    timeout-minutes: 30
    strategy:
      fail-fast: false
      matrix:
        python:
        - "3.10"
        - "3.11"
        platform:
        - macos-latest
        - windows-latest
        - ubuntu-latest

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

      - name: 👢 Set up Conda environment
        uses: mamba-org/setup-micromamba@v1
        id: setup
        with:
          environment-file: envs/lenskit-py${{matrix.python}}-ci.yaml
          environment-name: lkpy
          cache-environment: true
          init-shell: bash

      - name: Inspect environment
        run: |
          python -V
          numba -s

      - name: Test LKPY
        run: |
          python -m pytest --cov=lenskit --verbose --log-file=test.log
        env:
          NUMBA_NUM_THREADS: 4
          MKL_THREADING_LAYER: sequential
          OMP_NUM_THREADS: 1
          OPENBLAS_NUM_THREADS: 1

      - name: Non-JIT test coverage
        if: runner.os == 'Linux'
        env:
          NUMBA_DISABLE_JIT: 1
          PYTORCH_JIT: 0
        run: |
          python -m pytest --cov=lenskit --cov-append -m 'not slow' --log-file=test-nojit.log

      - name: Process test results
        uses: lenskit/lkbuild/actions/save-test-results@main
        with:
          artifact-name: test-conda-${{matrix.platform}}-py${{matrix.python}}

  check-docs:
    name: Docs, Examples, and Eval
    timeout-minutes: 30
    runs-on: ubuntu-latest

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

      - name: Create Conda environment file
        run: |
          pipx run pyproject2conda yaml -p 3.10 -e test -e demo -e dev -o environment.yml

      - name: 👢 Set up Conda environment
        uses: mamba-org/setup-micromamba@v1
        id: setup
        with:
          environment-file: environment.yml
          environment-name: lkpy
          cache-environment: true
          init-shell: bash

      - name: Inspect Conda environment
        run: |
          echo "Conda environment info"
          conda info
          echo "Conda environment package list"
          conda list

      - name: Cache ML data
        uses: actions/cache@v2
        with:
          path: |
            data
            !data/*.zip
          key: test-mldata-000

      - name: Download ML data
        run: |
          python -m lenskit.datasets.fetch ml-100k
          python -m lenskit.datasets.fetch ml-1m
          python -m lenskit.datasets.fetch ml-10m
          python -m lenskit.datasets.fetch ml-20m

      - name: Install for testing
        run: |
          pip install --no-deps -e .

      - name: Run Eval Tests
        run: |
          python -m pytest --cov=lenskit -m eval --log-file test-eval.log
          python -m pytest --cov=lenskit --cov-append -m realdata --log-file test-realdata.log

      - name: Validate doc notebooks
        run: |
          cp docs/*.ipynb data
          python -m pytest --nbval-lax --cov=lenskit --cov-append data --log-file test-docs.log

      # - name: Validate Examples
      #   run: |
      #     python -m pytest --nbval-lax --cov=lenskit --cov-append examples --log-file test-examples.log
      - name: Process test results
        uses: lenskit/lkbuild/actions/save-test-results@main
        with:
          artifact-name: test-check-docs

  vanilla:
    name: Vanilla Python ${{matrix.python}} on ${{matrix.platform}}
    runs-on: ${{matrix.platform}}
    timeout-minutes: 30
    strategy:
      fail-fast: false
      matrix:
        python:
        - "3.10"
        - "3.11"
        platform:
        - windows-latest
        - ubuntu-latest
        - macos-latest
    steps:
      - name: Check out source
        uses: actions/checkout@v4
        with:
          fetch-depth: 0

      - name: Set up Python
        uses: actions/setup-python@v5
        id: pyinstall
        with:
          python-version: ${{matrix.python}}
          cache: 'pip'

      - name: Install build tools
        run: |
          "$PYTHON" -m pip install -U 'uv>=0.1.15'
        env:
          PYTHON: ${{ steps.pyinstall.outputs.python-path }}

      - name: Set up Python deps
        run: uv pip install --python "$PYTHON" -e '.[test]'
        env:
          PYTHON: ${{ steps.pyinstall.outputs.python-path }}

      - name: Inspect environment
        run: |
          pip list

      - name: Run tests
        run: |
          "$PYTHON" -m pytest --cov=lenskit --cov-report=xml --log-file=test.log
        env:
          PYTHON: ${{ steps.pyinstall.outputs.python-path }}

      - name: Process test results
        uses: lenskit/lkbuild/actions/save-test-results@main
        with:
          artifact-name: test-vanilla-${{matrix.platform}}-py${{matrix.python}}

  mindep:
    name: Minimal Supported Dependencies
    runs-on: ubuntu-latest
    steps:
      - name: Check out source
        uses: actions/checkout@v4
        with:
          fetch-depth: 0

      - name: Set up Python
        uses: actions/setup-python@v5
        id: pyinstall
        with:
          python-version: '3.10'

      - name: Install build tools
        run: |
          "$PYTHON" -m pip install -U 'uv>=0.1.15'
        env:
          PYTHON: ${{ steps.pyinstall.outputs.python-path }}

      - name: Set up Python deps
        run: uv pip install --python "$PYTHON" --resolution=lowest-direct -e '.[test]'
        env:
          PYTHON: ${{ steps.pyinstall.outputs.python-path }}

      - name: Inspect environment
        run: |
          pip list

      - name: Run tests
        run: |
          python -m pytest --cov=lenskit --cov-report=xml --log-file test.log

      - name: Process Test Results
        uses: lenskit/lkbuild/actions/save-test-results@main
        with:
          artifact-name: test-mindeps

  results:
    name: Test Suite Results
    runs-on: ubuntu-latest
    needs:
    - conda
    - vanilla
    - check-docs
    - mindep

    steps:
      - name: Check out source
        uses: actions/checkout@v4
        with:
          fetch-depth: 0

      - uses: lenskit/lkbuild/actions/report-test-results@main
        env:
          CODECOV_TOKEN: 5cdb6ef4-e80b-44ce-b88d-1402e4dfb781