name: CI

on:
  workflow_dispatch:
  pull_request:
  push:
    branches:
      - main

jobs:
  pre-commit:
    name: Format + lint code
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
        with:
          fetch-depth: 0
      - uses: actions/setup-python@v4
        with:
          python-version: "3.x"
      - uses: pre-commit/action@v3.0.0
        with:
          extra_args: --hook-stage manual --all-files

  checks:
    name: Run tests for Python ${{ matrix.python-version }} on ${{ matrix.runs-on }}
    runs-on: ${{ matrix.runs-on }}
    needs: [pre-commit]
    strategy:
      fail-fast: false
      matrix:
        python-version: [3.10, 3.12]  # test oldest and latest supported versions
        runs-on: [ubuntu-latest]  # can be extended to other OSes, e.g. [ubuntu-latest, macos-latest]

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

      - uses: actions/setup-python@v4
        with:
          python-version: ${{ matrix.python-version }}
          allow-prereleases: true

      - name: Install package
        run: python -m pip install .[test]

      - name: Test package
        run: >-
          python -m pytest -ra --cov --cov-report=xml --cov-report=term
          --durations=20

      - name: Upload coverage report
        uses: codecov/codecov-action@v3.1.4