name: Publish to PyPI on: push: tags: - 'v[0-9]+.[0-9]+.[0-9]+*' workflow_dispatch: jobs: build_wheels: name: Build wheels on ${{ matrix.os }} runs-on: ${{ matrix.os }} # SPEED FIX: Skip on manual dispatch (use artifacts) if: github.event_name == 'push' && !startsWith(github.ref, 'refs/tags/') strategy: matrix: include: - os: ubuntu-latest target: x86_64 - os: macos-latest target: x86_64 - os: windows-latest target: x86_64 steps: - uses: actions/checkout@v4 - name: Set up Python uses: actions/setup-python@v5 with: python-version: '3.12' - name: Install Rust uses: dtolnay/rust-toolchain@stable with: toolchain: stable - name: Build wheels with Maturin uses: PyO3/maturin-action@v1 with: target: ${{ matrix.target }} command: build args: --release --out dist --find-interpreter - name: Upload built wheels as Artifact uses: actions/upload-artifact@v4 with: name: wheels-${{ matrix.os }}-${{ matrix.target }} path: dist publish: name: Publish to PyPI needs: [build_wheels] runs-on: ubuntu-latest # REMOVED problematic if condition steps: - name: Install maturin for upload run: pip install maturin - name: Download ALL wheels uses: actions/download-artifact@v4 with: path: dist - name: Flatten wheels to dist/ run: | find dist -name "*.whl" -exec cp {} dist/ \; echo "Wheels ready:" ls -la dist/*.whl - name: Publish to PyPI env: PYPI_TOKEN: ${{ secrets.PYPI_API_TOKEN }} run: | cd dist ls -la *.whl maturin upload --skip-existing --non-interactive