name: tests

on: [push, pull_request]

env:
  # Environment variables to support color support (jaraco/skeleton#66):
  # Request colored output from CLI tools supporting it. Different tools
  # interpret the value differently. For some, just being set is sufficient.
  # For others, it must be a non-zero integer. For yet others, being set
  # to a non-empty value is sufficient.
  FORCE_COLOR: -106
  # MyPy's color enforcement (must be a non-zero number)
  MYPY_FORCE_COLOR: -42
  # Recognized by the `py` package, dependency of `pytest` (must be "1")
  PY_COLORS: 1
  # Make tox-wrapped tools see color requests
  TOX_TESTENV_PASSENV: >-
    FORCE_COLOR
    MYPY_FORCE_COLOR
    NO_COLOR
    PY_COLORS
    PYTEST_THEME
    PYTEST_THEME_MODE

  # Suppress noisy pip warnings
  PIP_DISABLE_PIP_VERSION_CHECK: 'true'
  PIP_NO_PYTHON_VERSION_WARNING: 'true'
  PIP_NO_WARN_SCRIPT_LOCATION: 'true'

  # Disable the spinner, noise in GHA; TODO(webknjaz): Fix this upstream
  # Must be "1".
  TOX_PARALLEL_NO_SPINNER: 1


jobs:
  test:
    strategy:
      matrix:
        python:
        - "3.7"
        - "3.11"
        - "3.12"
        # Workaround for actions/setup-python#508
        dev:
        - -dev
        platform:
        - ubuntu-latest
        - macos-latest
        - windows-latest
        include:
        - python: "3.8"
          platform: ubuntu-latest
        - python: "3.9"
          platform: ubuntu-latest
        - python: "3.10"
          platform: ubuntu-latest
        - python: pypy3.9
          platform: ubuntu-latest
    runs-on: ${{ matrix.platform }}
    steps:
      - uses: actions/checkout@v3
      - name: Setup Python
        uses: actions/setup-python@v4
        with:
          python-version: ${{ matrix.python }}${{ matrix.dev }}
      - name: Install tox
        run: |
          python -m pip install tox
      - name: Run tests
        run: tox

  check:  # This job does nothing and is only used for the branch protection
    if: always()

    needs:
    - test

    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) }}

  release:
    needs:
    - check
    if: github.event_name == 'push' && contains(github.ref, 'refs/tags/')
    runs-on: ubuntu-latest

    steps:
      - uses: actions/checkout@v3
      - name: Setup Python
        uses: actions/setup-python@v4
        with:
          python-version: 3.11-dev
      - name: Install tox
        run: |
          python -m pip install tox
      - name: Release
        run: tox -e release
        env:
          TWINE_PASSWORD: ${{ secrets.PYPI_TOKEN }}
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
