| --- |
| name: CI |
| |
| on: |
| merge_group: |
| push: |
| branches: [main] |
| tags: ["*"] |
| pull_request: |
| workflow_dispatch: |
| |
| env: |
| FORCE_COLOR: "1" |
| PIP_DISABLE_PIP_VERSION_CHECK: "1" |
| PIP_NO_PYTHON_VERSION_WARNING: "1" |
| |
| permissions: {} |
| |
| |
| jobs: |
| build-package: |
| name: Build & verify package |
| runs-on: ubuntu-latest |
| |
| steps: |
| - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 |
| with: |
| fetch-depth: 0 |
| persist-credentials: false |
| |
| - uses: hynek/build-and-inspect-python-package@c52c3a4710070b50470d903818a7b25115dcd076 # v2.13.0 |
| id: baipp |
| |
| outputs: |
| # Used to define the matrix for tests below. The value is based on |
| # packaging metadata (trove classifiers). |
| supported-python-versions: ${{ steps.baipp.outputs.supported_python_classifiers_json_array }} |
| |
| tests: |
| name: Tests & Mypy on ${{ matrix.python-version }} |
| runs-on: ubuntu-latest |
| needs: build-package |
| |
| strategy: |
| fail-fast: false |
| matrix: |
| # Created by the build-and-inspect-python-package action above. |
| python-version: ${{ fromJson(needs.build-package.outputs.supported-python-versions) }} |
| |
| steps: |
| - name: Download pre-built packages |
| uses: actions/download-artifact@634f93cb2916e3fdff6788551b99b062d0335ce0 # v5.0.0 |
| with: |
| name: Packages |
| path: dist |
| - run: tar xf dist/*.tar.gz --strip-components=1 |
| - uses: actions/setup-python@e797f83bcb11b83ae66e0230d6156d7c80228e7c # v6.0.0 |
| with: |
| python-version: ${{ matrix.python-version }} |
| allow-prereleases: true |
| - uses: hynek/setup-cached-uv@757bedc3f972eb7227a1aa657651f15a8527c817 # v2.3.0 |
| |
| - name: Prepare tox |
| env: |
| V: ${{ matrix.python-version }} |
| run: | |
| DO_MYPY=1 |
| |
| if [[ "$V" == "3.9" ]]; then |
| DO_MYPY=0 |
| fi |
| |
| echo DO_MYPY=$DO_MYPY >>$GITHUB_ENV |
| echo TOX_PYTHON=py$(echo $V | tr -d .) >>$GITHUB_ENV |
| |
| - run: > |
| uvx --with=tox-uv |
| tox run |
| -e $TOX_PYTHON-mypy |
| if: env.DO_MYPY == '1' |
| |
| - name: Remove src to ensure tests run against wheel |
| run: rm -rf src |
| |
| - run: > |
| uvx --with=tox-uv |
| tox run |
| --installpkg dist/*.whl |
| -e $TOX_PYTHON-tests |
| |
| - name: Upload coverage data |
| uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2 |
| with: |
| name: coverage-data-${{ matrix.python-version }} |
| path: .coverage.* |
| include-hidden-files: true |
| if-no-files-found: ignore |
| |
| tests-pypy: |
| name: Tests on ${{ matrix.python-version }} |
| runs-on: ubuntu-latest |
| needs: build-package |
| |
| strategy: |
| fail-fast: false |
| matrix: |
| python-version: |
| - pypy-3.10 |
| |
| steps: |
| - name: Download pre-built packages |
| uses: actions/download-artifact@634f93cb2916e3fdff6788551b99b062d0335ce0 # v5.0.0 |
| with: |
| name: Packages |
| path: dist |
| - run: | |
| tar xf dist/*.tar.gz --strip-components=1 |
| rm -rf src # ensure tests run against wheel |
| - uses: hynek/setup-cached-uv@757bedc3f972eb7227a1aa657651f15a8527c817 # v2.3.0 |
| |
| - run: > |
| uvx --with=tox-uv |
| tox run |
| --installpkg dist/*.whl |
| -e pypy3-tests |
| |
| coverage: |
| name: Combine & check coverage |
| runs-on: ubuntu-latest |
| needs: tests |
| |
| steps: |
| - name: Download pre-built packages |
| uses: actions/download-artifact@634f93cb2916e3fdff6788551b99b062d0335ce0 # v5.0.0 |
| with: |
| name: Packages |
| path: dist |
| - run: tar xf dist/*.tar.gz --strip-components=1 |
| - uses: hynek/setup-cached-uv@757bedc3f972eb7227a1aa657651f15a8527c817 # v2.3.0 |
| |
| - name: Download coverage data |
| uses: actions/download-artifact@634f93cb2916e3fdff6788551b99b062d0335ce0 # v5.0.0 |
| with: |
| pattern: coverage-data-* |
| merge-multiple: true |
| |
| - name: Combine coverage & fail if it's <100%. |
| run: | |
| uv tool install --python $(cat .python-version-default) coverage |
| |
| coverage combine |
| coverage html --skip-covered --skip-empty |
| |
| # Report and write to summary. |
| coverage report --format=markdown >> $GITHUB_STEP_SUMMARY |
| |
| # Report again and fail if under 100%. |
| coverage report --fail-under=100 |
| |
| - name: Upload HTML report if check failed. |
| uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2 |
| with: |
| name: html-report |
| path: htmlcov |
| if: ${{ failure() }} |
| |
| docs: |
| name: Run doctests & render changelog |
| runs-on: ubuntu-latest |
| needs: build-package |
| steps: |
| - name: Download pre-built packages |
| uses: actions/download-artifact@634f93cb2916e3fdff6788551b99b062d0335ce0 # v5.0.0 |
| with: |
| name: Packages |
| path: dist |
| - run: tar xf dist/*.tar.gz --strip-components=1 |
| - uses: hynek/setup-cached-uv@757bedc3f972eb7227a1aa657651f15a8527c817 # v2.3.0 |
| |
| - run: uvx --with=tox-uv tox run -e docs-doctests,changelog |
| |
| typing: |
| name: Check types using supported type checkers |
| runs-on: ubuntu-latest |
| steps: |
| - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 |
| with: |
| persist-credentials: false |
| - uses: hynek/setup-cached-uv@757bedc3f972eb7227a1aa657651f15a8527c817 # v2.3.0 |
| |
| - run: > |
| uvx --with=tox-uv |
| --python $(cat .python-version-default) |
| tox run -f typing |
| |
| install-dev: |
| name: Verify dev env |
| runs-on: ubuntu-latest |
| |
| steps: |
| - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 |
| with: |
| persist-credentials: false |
| - uses: hynek/setup-cached-uv@757bedc3f972eb7227a1aa657651f15a8527c817 # v2.3.0 |
| |
| - run: uv venv --python $(cat .python-version-default) |
| - run: uv pip install -e . --group dev |
| |
| - name: Ensure we can import attr and attrs packages |
| run: | |
| source .venv/bin/activate |
| |
| python -Ic 'import attr; print(attr.__version__)' |
| python -Ic 'import attrs; print(attrs.__version__)' |
| |
| # Ensure everything required is passing for branch protection. |
| required-checks-pass: |
| if: always() |
| |
| needs: |
| - coverage |
| - tests-pypy |
| - docs |
| - install-dev |
| - typing |
| |
| runs-on: ubuntu-latest |
| |
| steps: |
| - name: Decide whether the needed jobs succeeded or failed |
| uses: re-actors/alls-green@05ac9388f0aebcb5727afa17fcccfecd6f8ec5fe # v1.2.2 |
| with: |
| jobs: ${{ toJSON(needs) }} |