name: wai-quantum for Python # The Python package (wai/wai-quantum-py): the shared job engine as a pyo3 extension # module (abi3, Python 3.9 on), the service client and the notebook widgets. On # Linux and on macOS, ci/check.sh builds the command line and the job service from # this checkout, clippy on the module, the wheel with maturin, installs the wheel # in a fresh venv with the pinned and hashed test requirements, runs pytest with # every test required (a job run in Python equals the command line's and the # service's; receipts verify across them; the widgets' front ends run under node), # executes the doc notebooks against a job service started here and holds each to # its stored outputs, and installs the same wheel alone on Python 3.9. concurrency: group: ${{ github.workflow }}-${{ github.ref }} cancel-in-progress: true on: push: branches: [main] paths: - 'wai/wai-quantum/**' - 'wai/wai-quantum-py/**' - 'wai/wai-quantum-cli/**' - 'wai/wai-quantum-service/**' - 'rust-toolchain.toml' - '.github/workflows/wai-quantum-py.yml' pull_request: paths: - 'wai/wai-quantum/**' - 'wai/wai-quantum-py/**' - 'wai/wai-quantum-cli/**' - 'wai/wai-quantum-service/**' - 'rust-toolchain.toml' - '.github/workflows/wai-quantum-py.yml' jobs: relevant: name: does this change touch it runs-on: linux outputs: run: ${{ steps.gate.outputs.run }} steps: - uses: actions/checkout@v5 with: fetch-depth: 0 - id: gate run: | set -euo pipefail r=$(python3 scripts/pr-touches-paths.py .github/workflows/wai-quantum-py.yml \ "${{ github.event.pull_request.base.sha }}" \ "${{ github.event.pull_request.head.sha }}") echo "this change touches the Python package: $r" echo "run=$r" >> "$GITHUB_OUTPUT" py-linux: name: python · linux needs: relevant if: needs.relevant.outputs.run == 'true' runs-on: linux timeout-minutes: 90 steps: - uses: actions/checkout@v5 - name: Install Rust 1.98.0 with clippy, and uv shell: bash run: | export PATH="$HOME/.local/bin:$HOME/.cargo/bin:$PATH" command -v rustup >/dev/null 2>&1 || \ curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y --profile minimal --default-toolchain 1.98.0 rustup toolchain install 1.98.0 --profile minimal --component clippy rustup default 1.98.0 command -v uv >/dev/null 2>&1 || curl -LsSf https://astral.sh/uv/install.sh | sh command -v node >/dev/null 2>&1 || { echo "::error::no node on this runner: the widgets' front ends are tested with it"; exit 1; } echo "$HOME/.local/bin" >> "$GITHUB_PATH" echo "$HOME/.cargo/bin" >> "$GITHUB_PATH" - name: Build, test and run the notebooks shell: bash run: bash wai/wai-quantum-py/ci/check.sh py-macos: name: python · macos needs: relevant if: needs.relevant.outputs.run == 'true' runs-on: macos timeout-minutes: 90 steps: - uses: actions/checkout@v5 # launchd's PATH omits cargo, uv and node on the macOS host runner. - name: Put cargo, uv and node on PATH shell: bash run: | echo "$HOME/.cargo/bin" >> "$GITHUB_PATH" echo "$HOME/.local/bin" >> "$GITHUB_PATH" echo "/opt/homebrew/bin" >> "$GITHUB_PATH" - name: Build, test and run the notebooks shell: bash run: | set -euo pipefail command -v uv >/dev/null 2>&1 || curl -LsSf https://astral.sh/uv/install.sh | sh export PATH="$HOME/.local/bin:$PATH" nice -n 10 bash wai/wai-quantum-py/ci/check.sh