name: Build distributions

on:
  pull_request:
  release:
    types:
      - published

jobs:
  ruff:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-python@v5
      - run: pip install ruff
      - name: Check formatting
        run: ruff format --check
      - name: Check linting
        run: ruff check --output-format=github .

  tests_and_coverage:
    needs: [ruff]
    name: Run unit tests and upload coverage report
    runs-on: ${{ matrix.os }}
    strategy:
      matrix:
        os: [ubuntu-latest, macos-latest]
        python-version: ["3.9", "3.10", "3.11", "3.12", "3.13"]

    steps:
      - uses: actions/checkout@v4

      - uses: actions/setup-python@v5
        with:
          python-version: ${{ matrix.python-version }}

      - name: Install test dependencies
        run: pip install tox tox-gh-actions

      - name: Run tests and build coverage report
        run: tox

      # upload the coverage report to coveralls.io
      - name: Upload coverage reports to Coveralls
        uses: coverallsapp/github-action@v2.3.4
        with:
          parallel: true
        if: ${{ matrix.python-version == '3.12' }}

  finish_coverage:
    needs: [tests_and_coverage]
    name: Notify Coveralls that the parallel build has finished
    runs-on: ubuntu-latest
    steps:
      - name: Close parallel build
        uses: coverallsapp/github-action@v2.3.4
        with:
          parallel-finished: true

  build_sdist:
    needs: [ruff]
    name: Build source distribution
    runs-on: ubuntu-latest

    steps:
      - uses: actions/checkout@v4

      - name: Build source distribution
        run: pipx run build --sdist

      - uses: actions/upload-artifact@v4
        with:
          name: inmoose_sdist
          path: dist/inmoose-*.tar.gz

  upload_pypi:
    needs: [build_sdist, tests_and_coverage]
    name: Publish source distribution on PyPI
    runs-on: ubuntu-latest
    permissions:
      # IMPORTANT: this permission is mandatory for trusted publishing
      id-token: write
    if: github.event_name == 'release' && github.event.action == 'published'
    steps:
      - uses: actions/download-artifact@v4
        with:
          name: inmoose_sdist
          path: dist

      - uses: pypa/gh-action-pypi-publish@v1.12.3

