name: Test and Deploy
on:
  pull_request:
    branches:
      - main
  push:

env:
  FORCE_COLOR: 1

jobs:
  check:
    runs-on: ubuntu-latest

    # We want to run on external PRs, but not on our own internal PRs as they'll be run
    # by the push to the branch.
    if: github.event_name == 'push' || github.event.pull_request.head.repo.full_name != github.repository

    steps:
    - uses: actions/checkout@v3
    - uses: actions/setup-python@v4
      with:
        python-version: '3.x'
        cache: pip
        cache-dependency-path: .github/workflows/workflow.yml
    - name: Black
      run: |
        pip install black
        black --check --exclude /docs --diff .

  build-wheel:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
        with:
          fetch-depth: 0
      - name: Set up Python
        uses: actions/setup-python@v4
        with:
          python-version: "3.7"
          cache: pip
          cache-dependency-path: |
            .github/workflows/workflow.yml
            dev-requirements.txt
      - name: Install dependencies
        run: |
          set -xe
          python -VV
          python -m site
          python -m pip install --upgrade pip setuptools wheel
          python -m pip install -r dev-requirements.txt
      - name: Install package
        run: |
          python -m pip install .
      - name: Build wheel
        run: |
          python -m pip install build
          python -m build
      - name: Upload sdist and wheel artifacts
        uses: actions/upload-artifact@v3
        with:
          name: my-dist
          path: dist/*

  test:
    needs: build-wheel
    runs-on: ${{ matrix.os }}
    strategy:
      fail-fast: false
      matrix:
        python-version: ['3.7',  '3.8', '3.9', '3.10', '3.11', 'pypy3.8']
        sphinx-version: ['>=4,<5', '>=5,<6', '>=6a0,<7']
        os: [windows-latest, macos-latest, ubuntu-latest]
        exclude:
          # Sphinx 6 supports 3.8+
          - { python-version: '3.7', sphinx-version: '>=6a0,<7' }
    steps:
      - uses: actions/checkout@v3
      - name: Set up Python ${{ matrix.python-version }}
        uses: actions/setup-python@v4
        with:
          python-version: ${{ matrix.python-version }}
          cache: pip
          cache-dependency-path: |
            .github/workflows/workflow.yml
            dev-requirements.txt
      - name: Install dependencies
        run: |
          python -VV
          python -m site
          python -m pip install --upgrade pip setuptools wheel
          python -m pip install -r dev-requirements.txt
          python -m pip install "sphinx${{ matrix.sphinx-version }}"
      - name: Download sdist and wheel artifacts
        uses: actions/download-artifact@v3
        with:
          name: my-dist
          path: dist
      - name: Install downloaded wheel
        run: |
          python -m pip install --only-binary=:all: --no-index --find-links=dist sphinxext-opengraph
      - name: Run tests for ${{ matrix.python-version }}
        run: |
          python -m pytest -vv

  build-docs:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
        with:
          fetch-depth: 0
      - name: Setup Python
        uses: actions/setup-python@v4
        with:
          python-version: '3.x'
          cache: pip
          cache-dependency-path: docs/requirements.txt
      - name: Install dependencies
        run: |
          pip install -r docs/requirements.txt
      - name: Build documentation
        run: |
          cd docs
          make html

  pypi-release:
    needs: test
    runs-on: ubuntu-latest
    if: contains(github.ref, 'refs/tags/') && github.repository_owner == 'wpilibsuite'
    steps:
      - name: Download sdist and wheel artifacts
        uses: actions/download-artifact@v3
        with:
          name: my-dist
          path: dist
      - name: Publish a Python distribution to PyPI
        uses: pypa/gh-action-pypi-publish@release/v1
        with:
          password: ${{ secrets.pypi_password }}
