name: Test, build, generate docs, and publish to PyPI

on:
  push:
    tags:
      - 'v[0-9]+.[0-9]+.[0-9]+'

jobs:
  test:
    name: Test Python versions
    runs-on: ubuntu-latest
    strategy:
      matrix:
        python-version: ['3.10', '3.11', '3.12']
    steps:
    - uses: actions/checkout@v4
    - name: Set up Python
      uses: actions/setup-python@v5
      with:
        python-version: ${{ matrix.python-version }}
    - name: Install dependencies
      run: |
        python -m pip install --upgrade pip
        python -m pip install flake8 pytest
    - name: Lint with flake8
      run: |
        # stop the build if there are Python syntax errors or undefined names
        flake8 . --count --select=E9,F63,F7,F82 --show-source --statistics
        # exit-zero treats all errors as warnings. The project default is 100 char lines
        flake8 . --count --exit-zero --max-complexity=10 --max-line-length=100 --statistics
    - name: Test with pytest
      run: |
        pytest
  pypi-publish:
    name: Upload release to PyPI and update documentation
    runs-on: ubuntu-latest
    environment: release
    permissions:
      id-token: write
    steps:
    - uses: actions/checkout@v4
    - name: Set up Python
      uses: actions/setup-python@v5
      with:
        python-version: '3.x'
    - name: Install dependencies
      run: |
        python -m pip install --upgrade pip
        python -m pip install build setuptools setuptools-scm sphinx sphinx_rtd_theme myst_parser
    - name: Build the packages
      run: |
        python -m build
    - name: Publish package distributions to PyPI
      uses: pypa/gh-action-pypi-publish@release/v1
    - name: Generate documentation with latest version
      run: |
        sphinx-build -b html docsrc docs -E -d "docsrc/_doctrees"
    - name: Commit and push the new documentation
      if: steps.verify_diff.outputs.changed == 'true'
      run: |
        git config user.name "Brian Warner (autocommit)"
        git config user.email brian@bdwarner.com
        git add docs
        git commit -m "Rebuild the documentation" || exit 0
        git push
