| name: CI |
| |
| on: |
| push: |
| branches: |
| - main |
| - 2.* |
| pull_request: ~ |
| |
| env: |
| CACHE_VERSION: 3 |
| KEY_PREFIX: venv |
| DEFAULT_PYTHON: "3.12" |
| PRE_COMMIT_CACHE: ~/.cache/pre-commit |
| |
| concurrency: |
| group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} |
| cancel-in-progress: true |
| |
| jobs: |
| base-checks: |
| name: Checks |
| runs-on: ubuntu-latest |
| timeout-minutes: 20 |
| steps: |
| - name: Check out code from GitHub |
| uses: actions/checkout@v4.1.7 |
| - name: Set up Python ${{ env.DEFAULT_PYTHON }} |
| id: python |
| uses: actions/setup-python@v5.1.0 |
| with: |
| python-version: ${{ env.DEFAULT_PYTHON }} |
| check-latest: true |
| - name: Generate partial Python venv restore key |
| id: generate-python-key |
| run: >- |
| echo "key=base-venv-${{ env.CACHE_VERSION }}-${{ |
| hashFiles('pyproject.toml', 'requirements_dev.txt', |
| 'requirements_full.txt', 'requirements_minimal.txt') }}" >> $GITHUB_OUTPUT |
| - name: Restore Python virtual environment |
| id: cache-venv |
| uses: actions/cache@v4.0.2 |
| with: |
| path: venv |
| key: >- |
| ${{ runner.os }}-${{ steps.python.outputs.python-version }}-${{ |
| steps.generate-python-key.outputs.key }} |
| - name: Create Python virtual environment |
| if: steps.cache-venv.outputs.cache-hit != 'true' |
| run: | |
| python -m venv venv |
| . venv/bin/activate |
| python -m pip install -U pip setuptools wheel |
| pip install -U -r requirements_full.txt |
| - name: Generate pre-commit restore key |
| id: generate-pre-commit-key |
| run: >- |
| echo "key=pre-commit-${{ env.CACHE_VERSION }}-${{ |
| hashFiles('.pre-commit-config.yaml') }}" >> $GITHUB_OUTPUT |
| - name: Restore pre-commit environment |
| id: cache-precommit |
| uses: actions/cache@v4.0.2 |
| with: |
| path: ${{ env.PRE_COMMIT_CACHE }} |
| key: >- |
| ${{ runner.os }}-${{ steps.generate-pre-commit-key.outputs.key }} |
| - name: Install pre-commit dependencies |
| if: steps.cache-precommit.outputs.cache-hit != 'true' |
| run: | |
| . venv/bin/activate |
| pre-commit install --install-hooks |
| - name: Run pre-commit checks |
| run: | |
| . venv/bin/activate |
| pre-commit run pylint --all-files |
| |
| tests-linux: |
| name: tests / run / ${{ matrix.python-version }} / Linux |
| runs-on: ubuntu-latest |
| timeout-minutes: 20 |
| strategy: |
| fail-fast: false |
| matrix: |
| python-version: [3.9, "3.10", "3.11", "3.12"] |
| outputs: |
| python-key: ${{ steps.generate-python-key.outputs.key }} |
| steps: |
| - name: Check out code from GitHub |
| uses: actions/checkout@v4.1.7 |
| - name: Set up Python ${{ matrix.python-version }} |
| id: python |
| uses: actions/setup-python@v5.1.0 |
| with: |
| python-version: ${{ matrix.python-version }} |
| check-latest: true |
| - name: Install Qt |
| if: ${{ matrix.python-version == '3.10' }} |
| run: | |
| sudo apt-get update |
| sudo apt-get install build-essential libgl1-mesa-dev |
| - name: Generate partial Python venv restore key |
| id: generate-python-key |
| run: >- |
| echo "key=${{ env.KEY_PREFIX }}-${{ env.CACHE_VERSION }}-${{ |
| hashFiles('pyproject.toml', 'requirements_dev.txt', |
| 'requirements_full.txt', 'requirements_minimal.txt') }}" >> $GITHUB_OUTPUT |
| - name: Restore Python virtual environment |
| id: cache-venv |
| uses: actions/cache@v4.0.2 |
| with: |
| path: venv |
| key: >- |
| ${{ runner.os }}-${{ steps.python.outputs.python-version }}-${{ |
| steps.generate-python-key.outputs.key }} |
| - name: Create Python virtual environment |
| if: steps.cache-venv.outputs.cache-hit != 'true' |
| run: | |
| python -m venv venv |
| . venv/bin/activate |
| python -m pip install -U pip setuptools wheel |
| pip install -U -r requirements_full.txt |
| pip install -e . |
| - name: Run pytest |
| run: | |
| . venv/bin/activate |
| pytest --cov |
| - name: Upload coverage artifact |
| uses: actions/upload-artifact@v4.3.3 |
| with: |
| name: coverage-linux-${{ matrix.python-version }} |
| path: .coverage |
| |
| tests-windows: |
| name: tests / run / ${{ matrix.python-version }} / Windows |
| runs-on: windows-latest |
| timeout-minutes: 20 |
| needs: tests-linux |
| strategy: |
| fail-fast: false |
| matrix: |
| python-version: [3.9, "3.10", "3.11", "3.12"] |
| steps: |
| - name: Set temp directory |
| run: echo "TEMP=$env:USERPROFILE\AppData\Local\Temp" >> $env:GITHUB_ENV |
| # Workaround to set correct temp directory on Windows |
| # https://github.com/actions/virtual-environments/issues/712 |
| - name: Check out code from GitHub |
| uses: actions/checkout@v4.1.7 |
| - name: Set up Python ${{ matrix.python-version }} |
| id: python |
| uses: actions/setup-python@v5.1.0 |
| with: |
| python-version: ${{ matrix.python-version }} |
| check-latest: true |
| - name: Generate partial Python venv restore key |
| id: generate-python-key |
| run: >- |
| echo "key=${{ env.KEY_PREFIX }}-${{ env.CACHE_VERSION }}-${{ |
| hashFiles('pyproject.toml', 'requirements_dev.txt', |
| 'requirements_full.txt', 'requirements_minimal.txt') }}" >> $GITHUB_OUTPUT |
| - name: Restore Python virtual environment |
| id: cache-venv |
| uses: actions/cache@v4.0.2 |
| with: |
| path: venv |
| key: >- |
| ${{ runner.os }}-${{ steps.python.outputs.python-version }}-${{ |
| steps.generate-python-key.outputs.key }} |
| - name: Create Python virtual environment |
| if: steps.cache-venv.outputs.cache-hit != 'true' |
| run: | |
| python -m venv venv |
| . venv\\Scripts\\activate |
| python -m pip install -U pip setuptools wheel |
| pip install -U -r requirements_full.txt |
| pip install -e . |
| - name: Run pytest |
| run: | |
| . venv\\Scripts\\activate |
| pytest --cov |
| - name: Upload coverage artifact |
| uses: actions/upload-artifact@v4.3.3 |
| with: |
| name: coverage-windows-${{ matrix.python-version }} |
| path: .coverage |
| |
| tests-pypy: |
| name: tests / run / ${{ matrix.python-version }} / Linux |
| runs-on: ubuntu-latest |
| timeout-minutes: 20 |
| strategy: |
| fail-fast: false |
| matrix: |
| # We only test on the lowest and highest supported PyPy versions |
| python-version: ["pypy3.9", "pypy3.10"] |
| steps: |
| - name: Check out code from GitHub |
| uses: actions/checkout@v4.1.7 |
| - name: Set up Python ${{ matrix.python-version }} |
| id: python |
| uses: actions/setup-python@v5.1.0 |
| with: |
| python-version: ${{ matrix.python-version }} |
| check-latest: true |
| - name: Generate partial Python venv restore key |
| id: generate-python-key |
| run: >- |
| echo "key=${{ env.KEY_PREFIX }}-${{ env.CACHE_VERSION }}-${{ |
| hashFiles('pyproject.toml', 'requirements_minimal.txt') |
| }}" >> $GITHUB_OUTPUT |
| - name: Restore Python virtual environment |
| id: cache-venv |
| uses: actions/cache@v4.0.2 |
| with: |
| path: venv |
| key: >- |
| ${{ runner.os }}-${{ matrix.python-version }}-${{ |
| steps.generate-python-key.outputs.key }} |
| - name: Create Python virtual environment |
| if: steps.cache-venv.outputs.cache-hit != 'true' |
| run: | |
| python -m venv venv |
| . venv/bin/activate |
| python -m pip install -U pip setuptools wheel |
| pip install -U -r requirements_minimal.txt |
| pip install -e . |
| - name: Run pytest |
| run: | |
| . venv/bin/activate |
| pytest --cov |
| - name: Upload coverage artifact |
| uses: actions/upload-artifact@v4.3.3 |
| with: |
| name: coverage-pypy-${{ matrix.python-version }} |
| path: .coverage |
| |
| coverage: |
| name: tests / process / coverage |
| runs-on: ubuntu-latest |
| timeout-minutes: 10 |
| needs: ["tests-linux", "tests-windows", "tests-pypy"] |
| steps: |
| - name: Check out code from GitHub |
| uses: actions/checkout@v4.1.7 |
| - name: Set up Python 3.12 |
| id: python |
| uses: actions/setup-python@v5.1.0 |
| with: |
| python-version: "3.12" |
| check-latest: true |
| - name: Install dependencies |
| run: pip install -U -r requirements_minimal.txt |
| - name: Download all coverage artifacts |
| uses: actions/download-artifact@v4.1.7 |
| - name: Combine Linux coverage results |
| run: | |
| coverage combine coverage-linux*/.coverage |
| coverage xml -o coverage-linux.xml |
| - uses: codecov/codecov-action@v4 |
| with: |
| token: ${{ secrets.CODECOV_TOKEN }} |
| fail_ci_if_error: true |
| verbose: true |
| flags: linux |
| files: coverage-linux.xml |
| - name: Combine Windows coverage results |
| run: | |
| coverage combine coverage-windows*/.coverage |
| coverage xml -o coverage-windows.xml |
| - uses: codecov/codecov-action@v4 |
| with: |
| token: ${{ secrets.CODECOV_TOKEN }} |
| fail_ci_if_error: true |
| verbose: true |
| flags: windows |
| files: coverage-windows.xml |
| - name: Combine PyPy coverage results |
| run: | |
| coverage combine coverage-pypy*/.coverage |
| coverage xml -o coverage-pypy.xml |
| - uses: codecov/codecov-action@v4 |
| with: |
| token: ${{ secrets.CODECOV_TOKEN }} |
| fail_ci_if_error: true |
| verbose: true |
| flags: pypy |
| files: coverage-pypy.xml |