name: "CI"

on:
  push:
  pull_request:

defaults:
  run:
    shell: bash

permissions:
  contents: read

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

jobs:

  format:
    name: "Check formatting"
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
        with:
          persist-credentials: false

      - uses: astral-sh/ruff-action@57714a7c8a2e59f32539362ba31877a1957dded1 # v3.5.1
        with:
          args: 'format --check'

  lint:
    name: "Lint"
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
        with:
          persist-credentials: false

      - uses: astral-sh/ruff-action@57714a7c8a2e59f32539362ba31877a1957dded1 # v3.5.1

      - name: "Set up Python"
        uses: actions/setup-python@e797f83bcb11b83ae66e0230d6156d7c80228e7c # v6.0.0
        with:
          python-version: "3.13"

      - name: "Install dependencies"
        run: |
          python -m pip install -r requirements.pip

      - name: "Check the docs are up-to-date"
        run: |
          make lintdoc

  tests:
    name: "Python ${{ matrix.python }} on ${{ matrix.os }}"
    runs-on: "${{ matrix.os }}-${{ matrix.os-version || 'latest' }}"
    env:
      MATRIX_ID: "${{ matrix.python }}.${{ matrix.os }}"

    strategy:
      fail-fast: false
      matrix:
        os:
          - ubuntu
          - macos
          - windows
        python:
          # When changing this list, be sure to check the [gh] list in
          # tox.ini so that tox will run properly.
          - "3.9"
          - "3.10"
          - "3.11"
          - "3.12"
          - "3.13"
          - "3.14"
        include:
          - python: "3.9"
            os: "macos"
            os-version: "13"

    steps:
      - name: "Check out the repo"
        uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
        with:
          persist-credentials: false

      - name: "Set up Python"
        uses: actions/setup-python@e797f83bcb11b83ae66e0230d6156d7c80228e7c # v6.0.0
        with:
          python-version: "${{ matrix.python }}"
          allow-prereleases: true

      - name: "Install dependencies"
        run: |
          python -m pip install -r requirements.pip

      - name: "Run tox for ${{ matrix.python }}"
        run: |
          python -m tox
          python -m coverage debug data

      - name: "Upload coverage data"
        uses: actions/upload-artifact@v4
        with:
          name: covdata-${{ env.MATRIX_ID }}
          path: .coverage.*
          include-hidden-files: true

  combine:
    name: "Combine and report coverage"
    needs: tests
    runs-on: ubuntu-latest

    steps:
      - name: "Check out the repo"
        uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
        with:
          fetch-depth: "0"
          persist-credentials: false

      - name: "Set up Python"
        uses: actions/setup-python@e797f83bcb11b83ae66e0230d6156d7c80228e7c # v6.0.0
        with:
          python-version: "3.9"

      - name: "Install dependencies"
        run: |
          python -m pip install -r requirements.pip

      - name: "Download coverage data"
        uses: actions/download-artifact@634f93cb2916e3fdff6788551b99b062d0335ce0 # v5.0.0
        with:
          pattern: covdata-*
          merge-multiple: true

      - name: "Combine and report"
        run: |
          python -m coverage combine
          python -m coverage report -m
