name: continuous-integration

on:
  push:
    branches: [main]
    tags:
      - 'v*'
  pull_request:

jobs:

  pre-commit:

    runs-on: ubuntu-latest

    steps:
    - uses: actions/checkout@v4
    - name: Set up Python 3.9
      uses: actions/setup-python@v5
      with:
        python-version: 3.9
    - uses: pre-commit/action@v3.0.1

  tests:

    strategy:
      fail-fast: false
      matrix:
        os: [ubuntu-latest]
        python-version: ["3.9", "3.10", "3.11", "3.12"]
        sphinx-version: ["~=7.0"]
        extras: ["testing"]
        include:
        - os: ubuntu-latest
          python-version: "3.9"
          sphinx-version: "~=6.0"
          extras: "testing"
        - os: ubuntu-latest
          python-version: "3.10"
          sphinx-version: "~=8.0"
          extras: "testing-no-myst"  # TODO myst does not yet support Sphinx 8.0
        - os: windows-latest
          python-version: "3.9"
          sphinx-version: "~=7.0"
          extras: "testing"

    runs-on: ${{ matrix.os }}

    name: Tests (py${{ matrix.python-version }}, Sphinx${{ matrix.sphinx-version }}, on ${{ matrix.os }})

    steps:
    - uses: actions/checkout@v4
    - name: Set up Python ${{ matrix.python-version }}
      uses: actions/setup-python@v5
      with:
        python-version: ${{ matrix.python-version }}
        cache: pip
    - name: Install dependencies
      run: |
        python -m pip install --upgrade pip
        pip install --upgrade "sphinx${{ matrix.sphinx-version }}" -e .[${{ matrix.extras}}]
    - name: Run pytest
      run: |
        pytest --cov=sphinx_design --cov-report=xml --cov-report=term-missing
    - name: Upload to Codecov
      if: matrix.python-version == '3.9' && matrix.os == 'ubuntu-latest'
      uses: codecov/codecov-action@v3
      with:
        token: ${{ secrets.CODECOV_TOKEN }}
        name: pytests
        flags: pytests
        file: ./coverage.xml
        fail_ci_if_error: true

  docs-build-format:

    runs-on: ubuntu-latest
    strategy:
      matrix:
        format: [html, latex, man]

    steps:
    - uses: actions/checkout@v4
    - name: Set up Python 3.9
      uses: actions/setup-python@v5
      with:
        python-version: "3.9"
        cache: pip
    - name: Install dependencies
      run: |
        python -m pip install --upgrade pip
        pip install -e .[rtd]
    - name: Build documentation
      run: sphinx-build -nW --keep-going -b ${{ matrix.format }} docs/ docs/_build/${{ matrix.format }}

  # https://github.com/marketplace/actions/alls-green#why
  check:  # This job does nothing and is only used for the branch protection

    if: always()

    needs:
    - pre-commit
    - tests
    - docs-build-format

    runs-on: ubuntu-latest

    steps:
    - name: Decide whether the needed jobs succeeded or failed
      uses: re-actors/alls-green@release/v1
      with:
        jobs: ${{ toJSON(needs) }}

  publish:

    name: Publish to PyPi
    needs: [pre-commit, tests]
    if: github.event_name == 'push' && startsWith(github.event.ref, 'refs/tags')
    runs-on: ubuntu-latest
    steps:
    - name: Checkout source
      uses: actions/checkout@v4
    - name: Set up Python
      uses: actions/setup-python@v5
      with:
        python-version: 3.9
    - name: install flit
      run: |
        pip install flit~=3.4
    - name: Build and publish
      run: |
        flit publish
      env:
        FLIT_USERNAME: __token__
        FLIT_PASSWORD: ${{ secrets.PYPI_KEY }}
