chore: update API clients to latest specification #1357
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 package | |
| on: [ push ] | |
| # Supply-chain protection: refuse PyPI packages uploaded less than 3 days ago. | |
| # The cutoff is computed per job as an ISO 8601 datetime (see the "Compute | |
| # supply-chain cutoff" step). pip 26.1 added the relative-duration form | |
| # ("P3D"), but that requires Python>=3.10 and we still test on 3.9. | |
| jobs: | |
| test: | |
| runs-on: ubuntu-22.04 | |
| strategy: | |
| fail-fast: false | |
| max-parallel: 5 | |
| matrix: | |
| python-version: | |
| - "3.13" | |
| - "3.12" | |
| - "3.11" | |
| - "3.10" | |
| - "3.9" | |
| changed-dir: | |
| - "qase-api-client" | |
| - "qase-api-v2-client" | |
| - "qase-pytest" | |
| - "qase-robotframework" | |
| - "qase-python-commons" | |
| - "qase-behave" | |
| - "qase-tavern" | |
| name: Project ${{ matrix.changed-dir }} - Python ${{ matrix.python-version }} | |
| steps: | |
| - uses: actions/checkout@v4 | |
| - uses: dorny/paths-filter@v3 | |
| id: filter | |
| with: | |
| list-files: "shell" | |
| filters: | | |
| changes: | |
| - '${{ matrix.changed-dir }}/**' | |
| - name: Set up Python ${{ matrix.python-version }} | |
| if: steps.filter.outputs.changes == 'true' | |
| uses: actions/setup-python@v5 | |
| with: | |
| python-version: ${{ matrix.python-version }} | |
| - name: Compute supply-chain cutoff | |
| if: steps.filter.outputs.changes == 'true' | |
| run: | | |
| cutoff=$(date -u -d '3 days ago' +%Y-%m-%dT%H:%M:%SZ) | |
| echo "PIP_UPLOADED_PRIOR_TO=$cutoff" >> "$GITHUB_ENV" | |
| - name: Prefetch first-party qase-* releases (cutoff-exempt) | |
| if: steps.filter.outputs.changes == 'true' | |
| # qase-* packages are released from this repo's own pipeline, so the | |
| # 3-day quarantine that guards against external supply-chain attacks | |
| # does not need to apply to them. Otherwise a cross-package PR that | |
| # depends on a freshly-published qase-python-commons cannot pass CI | |
| # until the cutoff window rolls past, blocking releases for 3 days. | |
| # Download them with the cutoff disabled into a find-links cache; | |
| # PIP_UPLOADED_PRIOR_TO does not filter wheels resolved via | |
| # --find-links (the flag inspects PyPI metadata, which local wheels | |
| # do not carry). Subsequent pip invocations - including those tox | |
| # spawns inside its venv - pick up PIP_FIND_LINKS via the | |
| # environment. | |
| run: | | |
| mkdir -p /tmp/qase-wheel-cache | |
| env -u PIP_UPLOADED_PRIOR_TO python -m pip download \ | |
| --no-deps --dest /tmp/qase-wheel-cache \ | |
| qase-python-commons qase-api-client qase-api-v2-client | |
| echo "PIP_FIND_LINKS=/tmp/qase-wheel-cache" >> "$GITHUB_ENV" | |
| - name: Install dependencies | |
| if: steps.filter.outputs.changes == 'true' | |
| run: | | |
| # Bootstrap with PIP_UPLOADED_PRIOR_TO unset: a seeded pip older than | |
| # 26.0 would treat the env var as an unknown --uploaded-prior-to flag | |
| # and abort. | |
| env -u PIP_UPLOADED_PRIOR_TO python -m pip install --upgrade 'pip>=26.0' | |
| pip install tox tox-gh-actions | |
| - name: Run tox | |
| if: steps.filter.outputs.changes == 'true' | |
| working-directory: ./${{ matrix.changed-dir }} | |
| run: | | |
| tox | |
| integration-test: | |
| runs-on: ubuntu-latest | |
| needs: test | |
| steps: | |
| - uses: actions/checkout@v4 | |
| - uses: actions/setup-python@v5 | |
| with: | |
| python-version: '3.12' | |
| - name: Compute supply-chain cutoff | |
| run: | | |
| cutoff=$(date -u -d '3 days ago' +%Y-%m-%dT%H:%M:%SZ) | |
| echo "PIP_UPLOADED_PRIOR_TO=$cutoff" >> "$GITHUB_ENV" | |
| - name: Install reporters-validator | |
| run: | | |
| env -u PIP_UPLOADED_PRIOR_TO python -m pip install --upgrade 'pip>=26.0' | |
| pip install git+https://github.com/qase-tms/reporters-validator.git | |
| - name: Download report schemas | |
| run: git clone --depth 1 https://github.com/qase-tms/specs.git /tmp/specs | |
| - name: Validate Pytest reporter | |
| run: | | |
| python -m venv /tmp/venv-pytest | |
| env -u PIP_UPLOADED_PRIOR_TO /tmp/venv-pytest/bin/python -m pip install --upgrade 'pip>=26.0' | |
| /tmp/venv-pytest/bin/pip install -q \ | |
| ./qase-api-client ./qase-api-v2-client ./qase-python-commons ./qase-pytest | |
| QASE_MODE=report \ | |
| QASE_REPORT_CONNECTION_PATH=${{ github.workspace }}/build/pytest-report \ | |
| /tmp/venv-pytest/bin/python -m pytest integration/pytest/tests/ -v || true | |
| reporters-validator validate \ | |
| --report-dir ${{ github.workspace }}/build/pytest-report \ | |
| --expected integration/pytest/expected/pytest-examples.yaml \ | |
| --schema-dir /tmp/specs/report/schemas | |
| - name: Validate Behave reporter | |
| run: | | |
| python -m venv /tmp/venv-behave | |
| env -u PIP_UPLOADED_PRIOR_TO /tmp/venv-behave/bin/python -m pip install --upgrade 'pip>=26.0' | |
| /tmp/venv-behave/bin/pip install -q \ | |
| ./qase-api-client ./qase-api-v2-client ./qase-python-commons ./qase-behave | |
| cd integration/behave | |
| QASE_MODE=report \ | |
| QASE_REPORT_CONNECTION_PATH=${{ github.workspace }}/build/behave-report \ | |
| /tmp/venv-behave/bin/behave --format=qase.behave.formatter:QaseFormatter --no-capture features/ || true | |
| reporters-validator validate \ | |
| --report-dir ${{ github.workspace }}/build/behave-report \ | |
| --expected expected/behave-examples.yaml \ | |
| --schema-dir /tmp/specs/report/schemas | |
| - name: Validate Robot Framework reporter | |
| run: | | |
| python -m venv /tmp/venv-robot | |
| env -u PIP_UPLOADED_PRIOR_TO /tmp/venv-robot/bin/python -m pip install --upgrade 'pip>=26.0' | |
| /tmp/venv-robot/bin/pip install -q \ | |
| ./qase-api-client ./qase-api-v2-client ./qase-python-commons ./qase-robotframework \ | |
| robotframework | |
| QASE_MODE=report \ | |
| QASE_REPORT_CONNECTION_PATH=${{ github.workspace }}/build/robot-report \ | |
| /tmp/venv-robot/bin/robot --listener qase.robotframework.Listener \ | |
| --outputdir /tmp/robot-output \ | |
| integration/robot/tests/ || true | |
| reporters-validator validate \ | |
| --report-dir ${{ github.workspace }}/build/robot-report \ | |
| --expected integration/robot/expected/robot-examples.yaml \ | |
| --schema-dir /tmp/specs/report/schemas | |
| - name: Validate Tavern reporter | |
| run: | | |
| python -m venv /tmp/venv-tavern | |
| env -u PIP_UPLOADED_PRIOR_TO /tmp/venv-tavern/bin/python -m pip install --upgrade 'pip>=26.0' | |
| /tmp/venv-tavern/bin/pip install -q \ | |
| ./qase-api-client ./qase-api-v2-client ./qase-python-commons ./qase-tavern \ | |
| tavern | |
| QASE_MODE=report \ | |
| QASE_REPORT_CONNECTION_PATH=${{ github.workspace }}/build/tavern-report \ | |
| /tmp/venv-tavern/bin/python -m pytest integration/tavern/tests/ -v || true | |
| reporters-validator validate \ | |
| --report-dir ${{ github.workspace }}/build/tavern-report \ | |
| --expected integration/tavern/expected/tavern-examples.yaml \ | |
| --schema-dir /tmp/specs/report/schemas | |
| build-n-publish: | |
| runs-on: ubuntu-latest | |
| permissions: | |
| contents: write | |
| needs: test | |
| strategy: | |
| max-parallel: 1 | |
| matrix: | |
| prefix: | |
| [ | |
| "qase-api-client", | |
| "qase-api-v2-client", | |
| "qase-pytest", | |
| "qase-robotframework", | |
| "qase-python-commons", | |
| "qase-behave", | |
| "qase-tavern" | |
| ] | |
| if: startsWith(github.event.ref, 'refs/tags') | |
| steps: | |
| - uses: actions/checkout@v4 | |
| - name: Set up Python 3.9 | |
| if: contains(github.event.ref, matrix.prefix) | |
| uses: actions/setup-python@v5 | |
| with: | |
| python-version: 3.9 | |
| - name: Compute supply-chain cutoff | |
| if: contains(github.event.ref, matrix.prefix) | |
| run: | | |
| cutoff=$(date -u -d '3 days ago' +%Y-%m-%dT%H:%M:%SZ) | |
| echo "PIP_UPLOADED_PRIOR_TO=$cutoff" >> "$GITHUB_ENV" | |
| - name: Install build dependencies | |
| if: contains(github.event.ref, matrix.prefix) | |
| run: | | |
| env -u PIP_UPLOADED_PRIOR_TO python -m pip install --upgrade 'pip>=26.0' | |
| pip install --upgrade setuptools wheel build | |
| - name: Build the package | |
| if: contains(github.event.ref, matrix.prefix) | |
| working-directory: ./${{ matrix.prefix }} | |
| run: | | |
| python -m build | |
| - name: Publish distribution to PyPI | |
| if: contains(github.event.ref, matrix.prefix) | |
| uses: pypa/gh-action-pypi-publish@release/v1 | |
| with: | |
| user: __token__ | |
| password: ${{ secrets.PYPI_PASSWORD }} | |
| packages-dir: ./${{ matrix.prefix }}/dist | |
| - name: Extract tag name | |
| if: contains(github.event.ref, matrix.prefix) | |
| id: tag | |
| run: | | |
| TAG_NAME=${GITHUB_REF#refs/tags/} | |
| echo "tag=$TAG_NAME" >> $GITHUB_OUTPUT | |
| - name: Create GitHub Release | |
| if: contains(github.event.ref, matrix.prefix) | |
| uses: softprops/action-gh-release@v2 | |
| with: | |
| tag_name: ${{ steps.tag.outputs.tag }} | |
| name: Release ${{ steps.tag.outputs.tag }} | |
| generate_release_notes: true | |
| env: | |
| GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} |