name: CI

on:
  push:
    branches: ["main"]
  pull_request:
    branches: ["main"]
  workflow_dispatch:

jobs:
  tests:
    name: "Python ${{ matrix.python-version }}"
    runs-on: "ubuntu-latest"
    env:
      USING_COVERAGE: '3.8,3.9,3.10,3.11,3.12'

    strategy:
      fail-fast: false
      matrix:
        python-version: ["3.8", "3.9", "3.10", "3.11", "3.12"]

    steps:
      - uses: "actions/checkout@v4"
      - uses: "actions/setup-python@v5"
        with:
          python-version: ${{ matrix.python-version }}
      - name: "Install dependencies"
        run: |
          set -xe
          python -VV
          python -m site
          python -m pip install --upgrade pip setuptools wheel coverage[toml] virtualenv tox tox-gh-actions

      - name: "Run tox targets for ${{ matrix.python-version }}"
        run: python -m tox

      - name: "Generate coverage XML"
        if: "contains(env.USING_COVERAGE, matrix.python-version)"
        run: python -m coverage xml

      - name: "Upload coverage to Codecov"
        uses: codecov/codecov-action@v4

  others:
    runs-on: ubuntu-20.04
    strategy:
      fail-fast: false
      matrix:
        toxenv: ["manifest", "docs", "binder"]
    env:
      TOXENV: ${{ matrix.toxenv }}
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-python@v5
        with:
          python-version: 3.11
      - name: "Install dependencies"
        run: |
          set -xe
          python -m pip install virtualenv tox
      - name: "Run tox targets for ${{ matrix.toxenv }}"
        run: python -m tox
