name: build

on:
  pull_request:
    types: [opened, synchronize]
  merge_group:
    types: [checks_requested]
  push:
    # Always run on push to main. The build cache can only be reused
    # if it was saved by a run from the repository's default branch.
    # The run result will be identical to that from the merge queue
    # because the commit is identical, yet we need to perform it to
    # seed the build cache.
    branches:
      - main

env:
  HATCH_VERSION: 1.9.4

jobs:
  ci:
    strategy:
      fail-fast: false
      matrix:
        pyVersion: [ '3.8', '3.9', '3.10', '3.11', '3.12' ]
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@v4

      - name: Install Python
        uses: actions/setup-python@v5
        with:
          cache: 'pip'
          cache-dependency-path: '**/pyproject.toml'
          python-version: ${{ matrix.pyVersion }}

      - name: Install hatch
        run: pip install hatch==$HATCH_VERSION

      - name: Run unit tests
        run: make test

      - name: Publish test coverage
        uses: codecov/codecov-action@v4

  fmt:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@v4

      - name: Install hatch
        run: pip install hatch==$HATCH_VERSION

      - name: Format all files
        run: make fmt

      - name: Fail on differences
        run: git diff --exit-code