Refactor python package: unify f32/f64 implementations & zero copy views where possible #118
Workflow file for this run
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
name: Python bindings | |
on: | |
push: | |
branches: [main] | |
pull_request: | |
branches: [main] | |
workflow_dispatch: | |
release: | |
types: [published] | |
permissions: | |
contents: read | |
jobs: | |
check_format: | |
name: Check formatting of pySplashsurf crate | |
runs-on: ubuntu-latest | |
steps: | |
- uses: actions/checkout@v4 | |
- name: Check formatting of pySplashsurf crate | |
run: cargo fmt -- --check | |
working-directory: pysplashsurf | |
generate-stub: | |
name: Run stub generator | |
runs-on: ubuntu-latest | |
steps: | |
- uses: actions/checkout@v3 | |
- uses: moonrepo/setup-rust@v1 | |
- run: | | |
cargo run --bin stub_gen --no-default-features | |
working-directory: pysplashsurf | |
- name: Upload stub as artifact | |
uses: actions/upload-artifact@v4 | |
with: | |
name: pysplashsurf.pyi | |
path: pysplashsurf/pysplashsurf/ | |
# linux_wheels: | |
# name: Build wheels for "${{ matrix.python-version }}" | |
# needs: generate-stub | |
# runs-on: ubuntu-24.04 | |
# strategy: | |
# fail-fast: false | |
# matrix: | |
# include: | |
# - python-version: "manylinux_x86_64" | |
# archs: "x86_64" | |
# enable_test: true | |
# - python-version: "manylinux_i686" | |
# archs: "i686" | |
# enable_test: false | |
# - python-version: "manylinux_aarch64" | |
# archs: "aarch64" | |
# enable_test: false | |
# - python-version: "manylinux_armv7l" | |
# archs: "armv7l" | |
# enable_test: false | |
# steps: | |
# - uses: actions/checkout@v4 | |
# - name: Download stub artifact | |
# uses: actions/download-artifact@v4 | |
# with: | |
# name: pysplashsurf.pyi | |
# path: pysplashsurf/pysplashsurf/ | |
# - uses: actions/setup-python@v5 | |
# with: | |
# python-version: 3.12 | |
# # QEMU is required for non-native archs | |
# # https://cibuildwheel.pypa.io/en/stable/faq/#emulation | |
# - name: Set up QEMU | |
# if: runner.os == 'Linux' | |
# uses: docker/setup-qemu-action@v3 | |
# with: | |
# platforms: all | |
# - name: Install cibuildwheel | |
# run: python -m pip install cibuildwheel==3.1.3 | |
# - name: Build wheels with tests | |
# run: python -m cibuildwheel --output-dir wheelhouse pysplashsurf | |
# if: matrix.enable_test == true | |
# env: | |
# CIBW_BUILD: ${{ format('cp312-{0}', matrix.python-version) }} | |
# CIBW_ARCHS: ${{ matrix.archs }} | |
# CIBW_BEFORE_ALL_LINUX: curl -sSf https://sh.rustup.rs | sh -s -- -y | |
# CIBW_ENVIRONMENT_LINUX: "PATH=$HOME/.cargo/bin:$PATH" | |
# CIBW_TEST_COMMAND: "cargo install --path {project}/splashsurf && pytest pysplashsurf/tests" | |
# CIBW_TEST_SOURCES: "pysplashsurf/tests" | |
# CIBW_TEST_REQUIRES: pytest meshio trimesh rtree scipy | |
# - name: Build wheels without tests | |
# run: python -m cibuildwheel --output-dir wheelhouse pysplashsurf | |
# if: matrix.enable_test == false | |
# env: | |
# CIBW_BUILD: ${{ format('cp312-{0}', matrix.python-version) }} | |
# CIBW_ARCHS: ${{ matrix.archs }} | |
# CIBW_BEFORE_ALL_LINUX: curl -sSf https://sh.rustup.rs | sh -s -- -y | |
# CIBW_ENVIRONMENT_LINUX: "PATH=$HOME/.cargo/bin:$PATH" | |
# - name: Upload wheels | |
# uses: actions/upload-artifact@v4 | |
# with: | |
# name: wheels-${{ matrix.python-version }} | |
# path: wheelhouse | |
linux_wheels: | |
name: Build wheels for Linux ${{ matrix.target }} | |
needs: generate-stub | |
runs-on: ubuntu-24.04 | |
strategy: | |
fail-fast: false | |
matrix: | |
target: [x86_64, x86, aarch64, armv7] | |
steps: | |
- uses: actions/checkout@v4 | |
- name: Download stub artifact | |
uses: actions/download-artifact@v4 | |
with: | |
name: pysplashsurf.pyi | |
path: pysplashsurf/pysplashsurf/ | |
- uses: actions/setup-python@v5 | |
with: | |
python-version: 3.12 | |
- name: Build wheels | |
uses: PyO3/maturin-action@v1 | |
with: | |
target: ${{ matrix.target }} | |
args: --release --out wheelhouse --auditwheel repair -m pysplashsurf/Cargo.toml | |
#sccache: ${{ !startsWith(github.ref, 'refs/tags/') }} | |
manylinux: 2014 | |
- name: Audit & fix wheels | |
run: | | |
pip install auditwheel | |
auditwheel repair wheelhouse/*.whl | |
- name: Upload wheels | |
uses: actions/upload-artifact@v4 | |
with: | |
name: wheels-linux-${{ matrix.target }} | |
path: wheelhouse | |
# macos_wheels: | |
# name: Build wheels for "${{ matrix.python-version }}" | |
# needs: generate-stub | |
# runs-on: ${{ matrix.runner }} | |
# strategy: | |
# fail-fast: false | |
# matrix: | |
# include: | |
# - runner: macos-13 | |
# python-version: "macosx_x86_64" | |
# archs: "x86_64" | |
# macosx_deployment_target: "13.0" | |
# - runner: macos-14 | |
# python-version: "macosx_arm64" | |
# archs: "arm64" | |
# macosx_deployment_target: "14.0" | |
# steps: | |
# - uses: actions/checkout@v4 | |
# - name: Download stub artifact | |
# uses: actions/download-artifact@v4 | |
# with: | |
# name: pysplashsurf.pyi | |
# path: pysplashsurf/pysplashsurf/ | |
# - uses: actions/setup-python@v5 | |
# with: | |
# python-version: 3.12 | |
# - name: Install cibuildwheel | |
# run: python -m pip install cibuildwheel==3.1.3 | |
# - name: Build wheels | |
# run: python -m cibuildwheel --output-dir wheelhouse pysplashsurf | |
# env: | |
# CIBW_BUILD: ${{ format('cp312-{0}', matrix.python-version) }} | |
# CIBW_ARCHS: ${{ matrix.archs }} | |
# CIBW_ENVIRONMENT_MACOS: "MACOSX_DEPLOYMENT_TARGET=${{ matrix.macosx_deployment_target }}" | |
# CIBW_TEST_COMMAND: "cargo install --path {project}/splashsurf && pytest pysplashsurf/tests" | |
# CIBW_TEST_SOURCES: "pysplashsurf/tests" | |
# CIBW_TEST_REQUIRES: pytest meshio trimesh rtree scipy | |
# - name: Upload wheels | |
# uses: actions/upload-artifact@v4 | |
# with: | |
# name: wheels-${{ matrix.python-version }} | |
# path: wheelhouse | |
macos_wheels: | |
name: Build wheels for macOS ${{ matrix.target }} | |
needs: generate-stub | |
runs-on: ${{ matrix.runner }} | |
strategy: | |
fail-fast: false | |
matrix: | |
include: | |
- runner: macos-13 | |
target: x86_64 | |
- runner: macos-14 | |
target: aarch64 | |
steps: | |
- uses: actions/checkout@v4 | |
- name: Download stub artifact | |
uses: actions/download-artifact@v4 | |
with: | |
name: pysplashsurf.pyi | |
path: pysplashsurf/pysplashsurf/ | |
- uses: actions/setup-python@v5 | |
with: | |
python-version: 3.12 | |
- name: Build wheels | |
uses: PyO3/maturin-action@v1 | |
with: | |
target: ${{ matrix.target }} | |
args: --release --out wheelhouse -m pysplashsurf/Cargo.toml | |
#sccache: ${{ !startsWith(github.ref, 'refs/tags/') }} | |
- name: Audit & fix wheels | |
run: | | |
pip install delocate | |
delocate-wheel -v wheelhouse/*.whl | |
- name: Upload wheels | |
uses: actions/upload-artifact@v4 | |
with: | |
name: wheels-macos-${{ matrix.target }} | |
path: wheelhouse | |
# windows_wheels: | |
# name: Build wheels for "${{ matrix.python-version }}" | |
# needs: generate-stub | |
# runs-on: windows-latest | |
# strategy: | |
# fail-fast: false | |
# matrix: | |
# include: | |
# - archs: "AMD64" | |
# python-version: "win_amd64" | |
# - archs: "x86" | |
# python-version: "win32" | |
# steps: | |
# - uses: actions/checkout@v4 | |
# - name: Download stub artifact | |
# uses: actions/download-artifact@v4 | |
# with: | |
# name: pysplashsurf.pyi | |
# path: pysplashsurf/pysplashsurf/ | |
# - uses: actions/setup-python@v5 | |
# with: | |
# python-version: 3.12 | |
# - name: Install cibuildwheel | |
# run: python -m pip install cibuildwheel==3.1.3 | |
# - name: Build wheels | |
# run: python -m cibuildwheel --output-dir wheelhouse pysplashsurf | |
# env: | |
# CIBW_BUILD: ${{ format('cp312-{0}', matrix.python-version) }} | |
# CIBW_ARCHS: ${{ matrix.archs }} | |
# # Tests are broken on Windows because trimesh library tries to write temporary files which fails | |
# #CIBW_TEST_COMMAND: "cargo install --path {project}/splashsurf && pytest pysplashsurf/tests" | |
# #CIBW_TEST_SOURCES: "pysplashsurf/tests" | |
# #CIBW_TEST_REQUIRES: pytest meshio trimesh rtree scipy | |
# - name: Upload wheels | |
# uses: actions/upload-artifact@v4 | |
# with: | |
# name: wheels-${{ matrix.python-version }} | |
# path: wheelhouse | |
windows_wheels: | |
name: Build wheels for Windows ${{ matrix.target }} | |
needs: generate-stub | |
runs-on: windows-latest | |
strategy: | |
fail-fast: false | |
matrix: | |
target: [x64, x86] | |
steps: | |
- uses: actions/checkout@v4 | |
- name: Download stub artifact | |
uses: actions/download-artifact@v4 | |
with: | |
name: pysplashsurf.pyi | |
path: pysplashsurf/pysplashsurf/ | |
- uses: actions/setup-python@v5 | |
with: | |
python-version: 3.12 | |
architecture: ${{ matrix.target }} | |
- name: Build wheels | |
uses: PyO3/maturin-action@v1 | |
with: | |
target: ${{ matrix.target }} | |
args: --release --out wheelhouse -m pysplashsurf/Cargo.toml | |
#sccache: ${{ !startsWith(github.ref, 'refs/tags/') }} | |
- name: Audit wheels | |
run: | | |
pip install delvewheel | |
delvewheel show -v wheelhouse/*.whl | |
- name: Upload wheels | |
uses: actions/upload-artifact@v4 | |
with: | |
name: wheels-windows-${{ matrix.target }} | |
path: wheelhouse | |
sdist: | |
name: Build source distribution | |
needs: generate-stub | |
runs-on: ubuntu-latest | |
steps: | |
- uses: actions/checkout@v4 | |
- name: Download stub artifact | |
uses: actions/download-artifact@v4 | |
with: | |
name: pysplashsurf.pyi | |
path: pysplashsurf/pysplashsurf/ | |
- name: Build sdist | |
uses: PyO3/maturin-action@v1 | |
with: | |
command: sdist | |
args: --out dist -m pysplashsurf/Cargo.toml | |
- name: Upload sdist | |
uses: actions/upload-artifact@v4 | |
with: | |
name: wheels-sdist | |
path: dist | |
publish: | |
name: Publish to PyPI | |
runs-on: ubuntu-latest | |
if: ${{ (startsWith(github.ref, 'refs/tags/v') || github.event_name == 'workflow_dispatch') && github.ref == 'refs/heads/main' }} | |
needs: [linux_wheels, macos_wheels, windows_wheels, sdist, tests, docs] | |
steps: | |
- uses: actions/download-artifact@v4 | |
with: | |
pattern: wheels-* | |
merge-multiple: true | |
- uses: actions/setup-python@v5 | |
with: | |
python-version: 3.x | |
- name: Install dependencies | |
run: | | |
python -m pip install --upgrade pip | |
pip install twine | |
- name: Upload wheels | |
env: | |
TWINE_USERNAME: __token__ | |
TWINE_PASSWORD: ${{ secrets.PYPI_API_TOKEN }} | |
run: | | |
ls | |
twine upload --skip-existing *.whl *.tar.gz | |
build_wheel_dev: | |
name: Build wheel for documentation and tests | |
runs-on: ubuntu-latest | |
outputs: | |
filename: ${{ steps.get_filename.outputs.file_name }} | |
steps: | |
- uses: actions/checkout@v4 | |
- uses: actions/setup-python@v5 | |
with: | |
python-version: 3.x | |
- name: Build wheels | |
uses: PyO3/maturin-action@v1 | |
with: | |
target: x86_64 | |
args: --release --out dist -m pysplashsurf/Cargo.toml | |
manylinux: auto | |
- name: Get wheel name | |
id: get_filename | |
run: | | |
FILE_NAME=$(ls dist) | |
echo "file_name=$FILE_NAME" >> $GITHUB_OUTPUT | |
- name: Upload wheel | |
uses: actions/upload-artifact@v4 | |
with: | |
name: doc_tests_wheel | |
path: dist | |
docs: | |
name: Build documentation | |
needs: build_wheel_dev | |
runs-on: ubuntu-latest | |
steps: | |
- uses: actions/checkout@v4 | |
- uses: actions/setup-python@v5 | |
with: | |
python-version: 3.x | |
- name: Download wheel | |
uses: actions/download-artifact@v4 | |
with: | |
name: doc_tests_wheel | |
path: dist/ | |
- name: Append output to file | |
run: | | |
echo "./dist/${{ needs.build_wheel_dev.outputs.filename }}" >> pysplashsurf/pysplashsurf/docs/requirements.txt | |
- uses: ammaraskar/sphinx-action@8.2.3 | |
with: | |
docs-folder: "pysplashsurf/pysplashsurf/docs/" | |
- uses: actions/upload-artifact@v4 | |
with: | |
name: DocumentationHTML | |
path: pysplashsurf/pysplashsurf/docs/build/html/ | |
read_the_docs: | |
name: Read the Docs trigger | |
needs: [docs, publish] | |
runs-on: ubuntu-latest | |
steps: | |
- name: Trigger Read the Docs build | |
run: | | |
curl -X POST -d "branches=main" -d "token=${{ secrets.READTHEDOCS_TOKEN }}" https://app.readthedocs.org/api/v2/webhook/pysplashsurf/299116/ | |
tests: | |
name: Run pytest | |
needs: build_wheel_dev | |
defaults: | |
run: | |
shell: bash -l {0} | |
runs-on: ubuntu-latest | |
steps: | |
- uses: actions/checkout@v4 | |
- uses: actions/setup-python@v5 | |
with: | |
python-version: 3.x | |
- uses: mamba-org/setup-micromamba@v2 | |
with: | |
environment-file: pysplashsurf/python_environment.yaml | |
init-shell: >- | |
bash | |
- run: | | |
conda info | |
conda list | |
- name: Download wheel | |
uses: actions/download-artifact@v4 | |
with: | |
name: doc_tests_wheel | |
path: dist/ | |
- run: pip install dist/${{ needs.build_wheel_dev.outputs.filename }} | |
- name: Install splashsurf CLI | |
run: cargo install splashsurf --path ./splashsurf | |
- name: Run pytest | |
uses: pavelzw/pytest-action@v2 | |
with: | |
verbose: true | |
emoji: false | |
job-summary: true | |
click-to-expand: true | |
report-title: 'Pytest Report' |