tempoch-py 0.2.1

Python bindings for tempoch astronomical time primitives
Documentation
name: Release

on:
  push:
    tags:
      - "v[0-9]*"

permissions:
  contents: read

concurrency:
  group: release-${{ github.ref }}
  cancel-in-progress: false

env:
  MATURIN_VERSION: v1.15.0

jobs:
  validate:
    name: Validate release
    runs-on: ubuntu-24.04
    steps:
      - uses: actions/checkout@v7.0.1
        with:
          fetch-depth: 0

      - uses: dtolnay/rust-toolchain@stable

      - name: Validate tag, versions, and crate package
        run: bash scripts/publish.sh --dry-run

  linux-wheels:
    name: Linux wheels (${{ matrix.arch }})
    needs: validate
    strategy:
      fail-fast: false
      matrix:
        include:
          - runner: ubuntu-24.04
            arch: x86_64
            target: x86_64-unknown-linux-gnu
          - runner: ubuntu-24.04-arm
            arch: aarch64
            target: aarch64-unknown-linux-gnu
    runs-on: ${{ matrix.runner }}
    steps:
      - uses: actions/checkout@v7.0.1

      - name: Build wheels
        uses: PyO3/maturin-action@v1.51.0
        with:
          command: build
          maturin-version: ${{ env.MATURIN_VERSION }}
          target: ${{ matrix.target }}
          manylinux: "2_28"
          args: >-
            --release
            --locked
            --compatibility pypi
            --out dist
            -i python3.8
            -i python3.9
            -i python3.10
            -i python3.11
            -i python3.12
            -i python3.13
            -i python3.14

      - uses: actions/upload-artifact@v7.0.1
        with:
          name: wheels-linux-${{ matrix.arch }}
          path: dist/*.whl
          if-no-files-found: error

  macos-wheels:
    name: macOS wheels (${{ matrix.arch }})
    needs: validate
    strategy:
      fail-fast: false
      matrix:
        include:
          - runner: macos-15-intel
            arch: x86_64
            python_versions: |
              3.8
              3.9
              3.10
              3.11
              3.12
              3.13
              3.14
          - runner: macos-15
            arch: aarch64
            python_versions: |
              3.11
              3.12
              3.13
              3.14
    runs-on: ${{ matrix.runner }}
    steps:
      - uses: actions/checkout@v7.0.1

      - uses: actions/setup-python@v7.0.0
        with:
          python-version: ${{ matrix.python_versions }}

      - name: Build wheels
        uses: PyO3/maturin-action@v1.51.0
        with:
          command: build
          maturin-version: ${{ env.MATURIN_VERSION }}
          args: >-
            --release
            --locked
            --compatibility pypi
            --out dist
            --find-interpreter

      - uses: actions/upload-artifact@v7.0.1
        with:
          name: wheels-macos-${{ matrix.arch }}
          path: dist/*.whl
          if-no-files-found: error

  windows-wheels:
    name: Windows wheels (x86_64)
    needs: validate
    runs-on: windows-2025
    steps:
      - uses: actions/checkout@v7.0.1

      - uses: actions/setup-python@v7.0.0
        with:
          python-version: |
            3.8
            3.9
            3.10
            3.11
            3.12
            3.13
            3.14

      - name: Build wheels
        uses: PyO3/maturin-action@v1.51.0
        with:
          command: build
          maturin-version: ${{ env.MATURIN_VERSION }}
          args: >-
            --release
            --locked
            --compatibility pypi
            --out dist
            --find-interpreter

      - uses: actions/upload-artifact@v7.0.1
        with:
          name: wheels-windows-x86_64
          path: dist/*.whl
          if-no-files-found: error

  sdist:
    name: Source distribution
    needs: validate
    runs-on: ubuntu-24.04
    steps:
      - uses: actions/checkout@v7.0.1

      - name: Build sdist
        uses: PyO3/maturin-action@v1.51.0
        with:
          command: sdist
          maturin-version: ${{ env.MATURIN_VERSION }}
          args: --out dist

      - uses: actions/upload-artifact@v7.0.1
        with:
          name: sdist
          path: dist/*.tar.gz
          if-no-files-found: error

  publish-pypi:
    name: Publish to PyPI
    needs:
      - linux-wheels
      - macos-wheels
      - windows-wheels
      - sdist
    runs-on: ubuntu-24.04
    environment:
      name: pypi
    permissions:
      contents: read
      id-token: write
    steps:
      - uses: actions/download-artifact@v8.0.1
        with:
          path: dist
          merge-multiple: true

      - name: Show release artifacts
        run: ls -lah dist

      - name: Publish Python distribution
        uses: pypa/gh-action-pypi-publish@v1.14.2

  publish-crates:
    name: Publish to crates.io if missing
    needs:
      - linux-wheels
      - macos-wheels
      - windows-wheels
      - sdist
    runs-on: ubuntu-24.04
    steps:
      - uses: actions/checkout@v7.0.1
        with:
          fetch-depth: 0

      - uses: dtolnay/rust-toolchain@stable

      - name: Publish crate or skip existing version
        run: bash scripts/publish.sh
        env:
          CARGO_REGISTRY_TOKEN: ${{ secrets.CARGO_REGISTRY_TOKEN }}