name: CI
on:
  push:
    branches: [main]
  pull_request:
  workflow_dispatch:
    # allow manual runs on branches without a PR

env:
  FORCE_COLOR: "1"

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

permissions: {}

jobs:
  build:
    runs-on: ${{ matrix.os }}
    strategy:
      fail-fast: false
      matrix:
        os: [ubuntu-latest, windows-latest, macos-latest]
        python-version:
          - "3.8"
          - "3.10"
          - "3.13"
          - "3.14"
        include:
          - os: ubuntu-22.04
            python-version: "3.9"
          - os: ubuntu-22.04
            python-version: "3.11"
          - os: macos-15-intel
            python-version: "3.12"
    steps:
      - uses: actions/checkout@v5
        with:
          persist-credentials: false
      - name: Set up non-default Pythons
        uses: actions/setup-python@v6
        with:
          python-version: |
            3.9
            3.10
      - name: Set up Python ${{ matrix.python-version }}
        uses: actions/setup-python@v6
        with:
          python-version: ${{ matrix.python-version }}
          allow-prereleases: true
      - name: Setup uv
        uses: astral-sh/setup-uv@v7
      - name: Set up Miniconda
        uses: conda-incubator/setup-miniconda@v3
        if: matrix.python-version == '3.13'
        with:
          auto-update-conda: true
          python-version: ${{ matrix.python-version }}
          use-mamba: true
          channels: conda-forge
      - name: Install Nox-under-test (uv)
        run:  uv pip install --system .
      - name: Run tests on ${{ matrix.os }}
        run: nox --session "tests-${{ matrix.python-version }}" -- --full-trace
      - name: Run min-version tests on ${{ matrix.os }}
        run: nox --session minimums --force-python="${{ matrix.python-version }}" -- --full-trace
      - name: Run Conda tests
        if: matrix.python-version == '3.13'
        run: nox --session "conda_tests" -- --full-trace
      - name: Save coverage report
        uses: actions/upload-artifact@v5
        with:
          name: coverage-${{ github.job }}-${{ strategy.job-index }}
          path: .coverage.*
          include-hidden-files: true
          if-no-files-found: error

  coverage:
    needs: build
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v5
        with:
          persist-credentials: false
      - name: Set up Python 3.12
        uses: actions/setup-python@v6
        with:
          python-version: "3.12"
      - name: Setup uv
        uses: astral-sh/setup-uv@v7
      - name: Install Nox-under-test
        run:  uv pip install --system .
      - name: Download individual coverage reports
        uses: actions/download-artifact@v6
        with:
          pattern: coverage-*
          merge-multiple: true
      - name: Display structure of downloaded files
        run: ls -aR
      - name: Run coverage
        run: nox --session "cover"

  lint:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v5
        with:
          persist-credentials: false
      - name: Set up Python 3.12
        uses: actions/setup-python@v6
        with:
          python-version: "3.12"
      - name: Install Nox-under-test
        run: python -m pip install --disable-pip-version-check .
      - name: Lint
        run: nox --session "lint"

  docs:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v5
        with:
          persist-credentials: false
      - name: Set up Python 3.12
        uses: actions/setup-python@v6
        with:
          python-version: "3.12"
      - name: Setup uv
        uses: astral-sh/setup-uv@v7
      - name: Install Nox-under-test
        run:  uv pip install --system .
      - name: Docs
        run: nox --session "docs"
