--- 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@v4 with: fetch-depth: 0 - uses: hynek/build-and-inspect-python-package@v2 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@v4 with: name: Packages path: dist - run: tar xf dist/*.tar.gz --strip-components=1 - uses: actions/setup-python@v5 with: python-version: ${{ matrix.python-version }} allow-prereleases: true - uses: hynek/setup-cached-uv@v2 - name: Prepare tox run: | V=${{ matrix.python-version }} DO_MYPY=1 if [[ "$V" == "3.7" || "$V" == "3.8" ]]; then DO_MYPY=0 fi echo DO_MYPY=$DO_MYPY >>$GITHUB_ENV echo TOX_PYTHON=py$(echo $V | tr -d .) >>$GITHUB_ENV uv pip install --system tox - run: uv pip install --system tox-uv if: matrix.python-version != '3.7' - run: python -Im tox run -e ${{ env.TOX_PYTHON }}-mypy if: env.DO_MYPY == '1' - name: Remove src to ensure tests run against wheel run: rm -rf src - run: > python -Im tox run --installpkg dist/*.whl -e ${{ env.TOX_PYTHON }}-tests - name: Upload coverage data uses: actions/upload-artifact@v4 with: name: coverage-data-${{ matrix.python-version }} path: .coverage.* 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.9 - pypy-3.10 steps: - name: Download pre-built packages uses: actions/download-artifact@v4 with: name: Packages path: dist - run: | tar xf dist/*.tar.gz --strip-components=1 rm -rf src # ensure tests run against wheel - uses: actions/setup-python@v5 with: python-version: ${{ matrix.python-version }} allow-prereleases: true - uses: hynek/setup-cached-uv@v2 - run: uv pip install --system tox-uv - run: > python -Im 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@v4 with: name: Packages path: dist - run: tar xf dist/*.tar.gz --strip-components=1 - uses: actions/setup-python@v5 with: python-version-file: .python-version-default - uses: hynek/setup-cached-uv@v2 - name: Download coverage data uses: actions/download-artifact@v4 with: pattern: coverage-data-* merge-multiple: true - name: Combine coverage & fail if it's <100%. run: | uv pip install --system coverage[toml] python -Im coverage combine python -Im coverage html --skip-covered --skip-empty # Report and write to summary. python -Im coverage report --format=markdown >> $GITHUB_STEP_SUMMARY # Report again and fail if under 100%. python -Im coverage report --fail-under=100 - name: Upload HTML report if check failed. uses: actions/upload-artifact@v4 with: name: html-report path: htmlcov if: ${{ failure() }} docs: name: Build docs & run doctests runs-on: ubuntu-latest needs: build-package steps: - name: Download pre-built packages uses: actions/download-artifact@v4 with: name: Packages path: dist - run: tar xf dist/*.tar.gz --strip-components=1 - uses: actions/setup-python@v5 with: # Keep in sync with tox/docs and .readthedocs.yaml. python-version: "3.12" - uses: hynek/setup-cached-uv@v2 - run: uv pip install --system tox-uv - run: python -Im tox run -e docs,changelog pyright: name: Check types using pyright runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - uses: actions/setup-python@v5 with: python-version-file: .python-version-default - uses: hynek/setup-cached-uv@v2 - run: uv pip install --system tox-uv - run: python -Im tox run -e pyright install-dev: name: Verify dev env runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - uses: actions/setup-python@v5 with: python-version-file: .python-version-default - uses: hynek/setup-cached-uv@v2 - run: uv venv --python $(cat .python-version-default) - run: uv pip install -e .[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 - pyright runs-on: ubuntu-latest steps: - name: Decide whether the needed jobs succeeded or failed uses: re-actors/alls-green@release/v1 with: jobs: ${{ toJSON(needs) }}