name: Release

on:
  push:
    tags:
      - '*.*.*'
  workflow_dispatch:

jobs:
  build:
    name: Build on ${{ matrix.platform || matrix.os }} (${{ matrix.target }} - ${{ matrix.manylinux || 'auto' }})
    environment: release
    strategy:
      fail-fast: false
      matrix:
        os: [ubuntu, macos, windows]
        target: [x86_64, aarch64]
        manylinux: [auto]
        include:
          - os: ubuntu
            platform: linux
          - os: windows
            ls: dir
            interpreter: 3.9 3.10 3.11 3.12 3.13 3.14 pypy3.11
          - os: windows
            ls: dir
            target: aarch64
            interpreter: 3.11 3.12 3.13 3.14
          - os: macos
            target: aarch64
            interpreter: 3.9 3.10 3.11 3.12 3.13 3.14 pypy3.11
          - os: ubuntu
            platform: linux
            target: aarch64
          # musllinux
          - os: ubuntu
            platform: linux
            target: x86_64
            manylinux: musllinux_1_1
          - os: ubuntu
            platform: linux
            target: aarch64
            manylinux: musllinux_1_1
          - os: ubuntu
            platform: linux
            target: ppc64le
            interpreter: 3.9 3.10 3.11 3.12 3.13 3.14
          - os: ubuntu
            platform: linux
            target: s390x
            interpreter: 3.9 3.10 3.11 3.12 3.13 3.14

    runs-on: ${{ matrix.os }}-latest
    steps:
      - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2

      - name: set up python
        uses: actions/setup-python@83679a892e2d95755f2dac6acb0bfd1e9ac5d548 # v6.1.0
        with:
          python-version: '3.11'
          architecture: ${{ matrix.python-architecture || 'x64' }}

      - name: build wheels
        uses: PyO3/maturin-action@86b9d133d34bc1b40018696f782949dac11bd380 # v1.49.4
        with:
          target: ${{ matrix.target }}
          manylinux: ${{ matrix.manylinux || 'auto' }}
          container: ${{ matrix.container }}
          args: --release --out dist --interpreter ${{ matrix.interpreter || '3.9 3.10 3.11 3.12 3.13 3.14 pypy3.11' }} ${{ matrix.extra-build-args }}
          rust-toolchain: stable
          docker-options: -e CI

      - run: ${{ matrix.ls || 'ls -lh' }} dist/

      - uses: actions/upload-artifact@b7c566a772e6b6bfb58ed0dc250532a479d7789f # v6.0.0
        with:
          name: dist-${{ matrix.os }}-${{ matrix.target }}-${{ matrix.manylinux }}
          path: dist

  build_sdist:
    runs-on: ubuntu-latest
    environment: release
    steps:
      - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
      - name: Build sdist
        uses: PyO3/maturin-action@86b9d133d34bc1b40018696f782949dac11bd380 # v1.49.4
        with:
          command: sdist
          args: --out dist
      - name: Upload sdist
        uses: actions/upload-artifact@b7c566a772e6b6bfb58ed0dc250532a479d7789f # v6.0.0
        with:
          name: dist-sdist
          path: dist

  build_no_ext:
    runs-on: ubuntu-latest
    environment: release
    steps:
      - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
      - name: Install and configure Poetry
        run: pipx install poetry
      - name: Hotswap build backend for Poetry
        # Maturin doesn't support building no-extension wheels, so we swap to Poetry for that
        run: |
          sed -i -e '/^\[build-system\]/,/^\[/{s/^requires = .*/requires = ["poetry-core>=2.0.0,<3.0.0"]/; s/^build-backend = .*/build-backend = "poetry.core.masonry.api"/}' pyproject.toml
      - name: Install dependencies
        run: poetry install --only main --only test --only typing --only build
      - name: Run poetry build
        run: poetry build -f wheel
      - name: Upload no-ext wheel
        uses: actions/upload-artifact@b7c566a772e6b6bfb58ed0dc250532a479d7789f # v6.0.0
        with:
          name: dist-any
          path: dist


  Release:
    needs: [ build, build_sdist, build_no_ext ]
    if: success()
    runs-on: ubuntu-latest
    permissions:
      id-token: write
      contents: write
    environment:
      name: pypi
      url: https://pypi.org/project/pendulum/
    steps:
      - name: Checkout code
        uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2

      - name: Download artifacts
        uses: actions/download-artifact@37930b1c2abaa49bbe596cd826c3c89aef350131 # v7.0.0
        with:
          pattern: dist*
          path: dist
          merge-multiple: true

      - name: Check distributions
        run: |
          ls -la dist

      - name: Check Version
        id: check-version
        run: |
          [[ "${GITHUB_REF#refs/tags/}" =~ ^[0-9]+\.[0-9]+\.[0-9]+$ ]] \
            || echo prerelease=true >> $GITHUB_OUTPUT

      - name: Create Release
        uses: ncipollo/release-action@b7eabc95ff50cbeeedec83973935c8f306dfcd0b # v1.20.0
        with:
          artifacts: "dist/*"
          draft: false
          prerelease: steps.check-version.outputs.prerelease == 'true'
          body: "See CHANGELOG.md for details"

      - name: Publish package distributions to PyPI
        uses: pypa/gh-action-pypi-publish@ed0c53931b1dc9bd32cbe73a98c7f6766f8a527e # v1.13.0
