name: Python Wheels

# Build on every branch push, tag push, and pull request change:
on: [push, pull_request]
# Alternatively, to publish when a (published) GitHub Release is created, use the following:
# on:
#   push:
#   pull_request:
#   release:
#     types:
#       - published

jobs:
  build_wheels:
    name: Build wheels on ${{ matrix.os }}
    if: >-
      (github.event_name == 'pull_request' &&
      contains(github.event.pull_request.labels.*.name, 'release preparation')) ||
      github.event_name == 'workflow_dispatch' ||
      (github.event_name == 'push' && startsWith(github.ref, 'refs/tags/v'))
    runs-on: ${{ matrix.os }}
    strategy:
      matrix:
        # windows-2019, macos-11
        os: [ubuntu-20.04]

    steps:
      - uses: actions/checkout@v4

      - name: Build wheels
        uses: pypa/cibuildwheel@v2.11.3

      - uses: actions/upload-artifact@v4
        with:
          path: ./wheelhouse/*.whl

  build_sdist:
    name: Build source distribution
    if: >-
      (github.event_name == 'pull_request' &&
      contains(github.event.pull_request.labels.*.name, 'release preparation')) ||
      github.event_name == 'workflow_dispatch' ||
      (github.event_name == 'push' && startsWith(github.ref, 'refs/tags/v'))
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4

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

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

  upload_pypi:
    needs: [build_wheels, build_sdist]
    runs-on: ubuntu-latest
    # upload to PyPI on every tag starting with 'v'
    if: github.event_name == 'push' && startsWith(github.ref, 'refs/tags/v')
    # alternatively, to publish when a GitHub Release is created, use the following rule:
    # if: github.event_name == 'release' && github.event.action == 'published'
    steps:
      - uses: actions/download-artifact@v4
        with:
          # unpacks default artifact into dist/
          # if `name: artifact` is omitted, the action will create extra parent dir
          name: artifact
          path: dist

      - uses: pypa/gh-action-pypi-publish@v1
        with:
          user: __token__
          password: ${{ secrets.PYPI_TOKEN }}
          # To test: repository_url: https://test.pypi.org/legacy/
