mode: memory
run: uv run --no-sync pytest tests/memory_benchmarks --codspeed
+ regression-test:
+ runs-on: ubuntu-latest
+ timeout-minutes: 10
+ steps:
+ - name: Check out the pull request
+ if: github.event_name == 'pull_request'
+ uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
+ with:
+ ref: ${{ github.sha }}
+ path: pr
+ persist-credentials: false
+ fetch-depth: 0
+ - name: Find changed tests
+ if: github.event_name == 'pull_request'
+ id: changed-tests
+ working-directory: pr
+ env:
+ BASE_SHA: ${{ github.event.pull_request.base.sha }}
+ HEAD_SHA: ${{ github.event.pull_request.head.sha }}
+ run: |
+ git diff --name-only --diff-filter=AM -z "$BASE_SHA" "$HEAD_SHA" -- tests \
+ | while IFS= read -r -d '' file; do
+ case "$(basename "$file")" in
+ test_*.py) printf '%s\0' "$file" ;;
+ esac
+ done > "$RUNNER_TEMP/changed-tests"
+ if [ -s "$RUNNER_TEMP/changed-tests" ]; then
+ echo "found=true" >> "$GITHUB_OUTPUT"
+ git diff --binary "$BASE_SHA" "$HEAD_SHA" -- tests \
+ > "$RUNNER_TEMP/tests.patch"
+ else
+ echo "found=false" >> "$GITHUB_OUTPUT"
+ echo "No added or modified test files; regression proof is not applicable."
+ fi
+ - name: Check out the base revision
+ if: steps.changed-tests.outputs.found == 'true'
+ uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
+ with:
+ ref: ${{ github.event.pull_request.base.sha }}
+ path: base
+ persist-credentials: false
+ - name: Set up Python
+ if: steps.changed-tests.outputs.found == 'true'
+ uses: actions/setup-python@ece7cb06caefa5fff74198d8649806c4678c61a1 # v6.3.0
+ with:
+ python-version-file: "base/.python-version"
+ - name: Setup uv
+ if: steps.changed-tests.outputs.found == 'true'
+ uses: astral-sh/setup-uv@d31148d669074a8d0a63714ba94f3201e7020bc3 # v8.3.0
+ with:
+ # Before upgrading uv version, make sure astral-sh/setup-uv knows its checksum.
+ # See: https://github.com/astral-sh/setup-uv/issues/851#issuecomment-4282017837
+ version: "0.11.18"
+ enable-cache: true
+ - name: Run the changed tests against the base code
+ if: steps.changed-tests.outputs.found == 'true'
+ working-directory: base
+ run: |
+ git apply "$RUNNER_TEMP/tests.patch"
+ uv sync --locked --no-dev --group tests --extra all
+ set +e
+ xargs -0 uv run --no-sync pytest -- < "$RUNNER_TEMP/changed-tests"
+ status=$?
+ set -e
+ if [ "$status" -eq 0 ]; then
+ echo "::warning::The changed tests already pass on the base revision. Check whether the fix is still needed."
+ echo "### Regression proof: base already passes :warning:" >> "$GITHUB_STEP_SUMMARY"
+ echo "The changed tests pass without the pull request's code changes." >> "$GITHUB_STEP_SUMMARY"
+ elif [ "$status" -eq 1 ]; then
+ echo "The changed tests fail on the base revision as expected."
+ echo "### Regression proof: base fails as expected :white_check_mark:" >> "$GITHUB_STEP_SUMMARY"
+ else
+ echo "::error::The base test run was inconclusive (pytest exit code $status)."
+ exit "$status"
+ fi
coverage-combine:
needs:
- test
- test
- coverage-combine
- benchmark
+ - regression-test
runs-on: ubuntu-latest
timeout-minutes: 5
steps: