name: Testing and deployment
on:
  push:
  workflow_dispatch:

jobs:
  lint-python:
    name: Lint Python code
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@v2

      - name: Install pipenv
        run: pipx install pipenv

      - uses: actions/setup-python@v3
        with:
          python-version: "3.9"
          cache: "pipenv"

      - id: pipenv-install
        name: Install Python dependencies
        run: pipenv install --dev --python `which python`

      - id: lint
        name: Lint
        run: make lint

  test-docs:
    name: Test Sphinx build
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@v2

      - name: Install pipenv
        run: pipx install pipenv

      - uses: actions/setup-python@v2
        with:
          python-version: "3.9"
          cache: "pipenv"

      - id: pipenv-install
        name: Install Python dependencies
        run: pipenv install --dev --python `which python`

      - id: build
        name: Build
        run: make test-docs

      - id: save
        name: Save artifact
        uses: actions/upload-artifact@v2
        with:
          name: docs
          path: ./docs
          if-no-files-found: error

  test-python:
    name: "Test Python code"
    runs-on: ubuntu-latest
    strategy:
      matrix:
        python: ["3.7", "3.8", "3.9", "3.10"]
    steps:
      - id: checkout
        name: Checkout
        uses: actions/checkout@v2

      - name: Install pipenv
        run: pipx install pipenv

      - uses: actions/setup-python@v2
        with:
          python-version: ${{ matrix.python }}
          cache: "pipenv"

      - id: pipenv-install
        name: Install Python dependencies
        run: pipenv install --dev --python `which python`

      - id: tests
        name: Tests
        run: pipenv run coverage run --source court_scraper -m pytest

      - id: coverage
        name: Coverage
        run: pipenv run coverage report -m

  test-build:
    name: Build Python package
    runs-on: ubuntu-latest
    needs: [test-python]
    steps:
      - name: Checkout
        uses: actions/checkout@v2

      - name: Install pipenv
        run: pipx install pipenv

      - uses: actions/setup-python@v2
        with:
          python-version: '3.9'
          cache: 'pipenv'

      - id: pipenv-install
        name: Install Python dependencies
        run: pipenv install --dev --python `which python`

      - id: build
        name: Build release
        run: make build-release

      - id: check
        name: Check release
        run: make check-release

      - id: save
        name: Save artifact
        uses: actions/upload-artifact@v2
        with:
          name: release
          path: ./dist
          if-no-files-found: error

  tag-release:
    name: Tagged PyPI release
    runs-on: ubuntu-latest
    needs: [test-build]
    if: github.event_name == 'push' && startsWith(github.ref, 'refs/tags')
    steps:
      - uses: actions/setup-python@v2
        with:
          python-version: '3.9'

      - id: fetch
        name: Fetch artifact
        uses: actions/download-artifact@v2
        with:
          name: release
          path: ./dist

      - id: publish
        name: Publish release
        uses: pypa/gh-action-pypi-publish@release/v1
        with:
          user: __token__
          password: ${{ secrets.PYPI_API_TOKEN }}
          verbose: true
          verify_metadata: false
