From 6c998fbb5545da7eb128921e25100010493568f1 Mon Sep 17 00:00:00 2001 From: Brian Schubert Date: Mon, 8 Sep 2025 16:36:57 -0400 Subject: [PATCH 1/4] Add Codecov step to CI --- .github/workflows/ci.yml | 121 ++++++--------------------------------- 1 file changed, 16 insertions(+), 105 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 1059f458..bf51f6ac 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -80,8 +80,9 @@ jobs: cd src python --version # just to make sure we're running the right one # Run tests under coverage - export COVERAGE_FILE=.coverage_${{ matrix.python-version }} python -m coverage run -m unittest test_typing_extensions.py + # Create xml file for Codecov + coverage xml --rcfile=../pyproject.toml --fail-under=0 - name: Test typing_extensions no coverage on pypy if: ${{ startsWith(matrix.python-version, 'pypy') }} run: | @@ -91,15 +92,6 @@ jobs: python --version # just to make sure we're running the right one python -m unittest test_typing_extensions.py - - name: Archive code coverage results - id: archive-coverage - if: ${{ !startsWith(matrix.python-version, 'pypy') }} - uses: actions/upload-artifact@v4 - with: - name: .coverage_${{ matrix.python-version }} - path: ./src/.coverage* - include-hidden-files: true - compression-level: 0 # no compression - name: Test CPython typing test suite # Test suite fails on PyPy even without typing_extensions if: ${{ !startsWith(matrix.python-version, 'pypy') }} @@ -108,9 +100,20 @@ jobs: # Run the typing test suite from CPython with typing_extensions installed, # because we monkeypatch typing under some circumstances. python -c 'import typing_extensions; import test.__main__' test_typing -v - outputs: - # report if coverage was uploaded - cov_uploaded: ${{ steps.archive-coverage.outputs.artifact-id }} + + - name: Upload coverage reports to Codecov + uses: codecov/codecov-action@5a1091511ad55cbe89839c7260b706298ca349f7 + if: >- + ${{ + !startsWith(matrix.python-version, 'pypy') + && (github.event_name == 'push' || github.event_name == 'pull_request') + }} + with: + token: ${{ secrets.CODECOV_ORG_TOKEN }} + flags: ${{ matrix.python-version }} + directory: src + fail_ci_if_error: true + verbose: true create-issue-on-failure: name: Create an issue if daily tests failed @@ -140,95 +143,3 @@ jobs: title: `Daily tests failed on ${new Date().toDateString()}`, body: "Runs listed here: https://github.com/python/typing_extensions/actions/workflows/ci.yml", }) - - report-coverage: - name: Report coverage - - runs-on: ubuntu-latest - - needs: [tests] - - permissions: - pull-requests: write - - # Job will run even if tests failed but only if at least one artifact was uploaded - if: ${{ always() && needs.tests.outputs.cov_uploaded != '' }} - - steps: - - uses: actions/checkout@v4 - with: - persist-credentials: false - - name: Set up Python - uses: actions/setup-python@v5 - with: - python-version: "3" - - name: Download coverage artifacts - uses: actions/download-artifact@v4 - with: - pattern: .coverage_* - path: . - # merge only when files are named differently - merge-multiple: true - - name: Install dependencies - run: pip install coverage - - name: Combine coverage results - run: | - # List the files to see what we have - echo "Combining coverage files..." - ls -aR .coverage* - coverage combine .coverage* - echo "Creating coverage report..." - # Create xml file for further processing; Create even if below minimum - coverage xml --fail-under=0 - # Write markdown report to job summary - coverage report --fail-under=0 --format=markdown -m >> "$GITHUB_STEP_SUMMARY" - - # For future use in case we want to add a PR comment for 3rd party PRs which requires - # a workflow with elevated PR write permissions. Move below steps into a separate job. - - name: Archive code coverage report - id: cov_xml_upload - uses: actions/upload-artifact@v4 - with: - name: coverage - path: coverage.xml - - name: Code Coverage Report (console) - run: | - # Create a coverage report (console), respects fail_under in pyproject.toml - coverage report - - - name: Code Coverage Report - uses: irongut/CodeCoverageSummary@51cc3a756ddcd398d447c044c02cb6aa83fdae95 # v1.3.0 - # Create markdown file even if coverage report fails due to fail_under - if: ${{ always() && steps.cov_xml_upload.outputs.artifact-id != '' }} - with: - filename: coverage.xml - badge: true - fail_below_min: true - format: markdown - hide_branch_rate: false - hide_complexity: true - indicators: true - output: both # console, file or both - # Note: it appears fail below min is one off, use fail_under -1 here - thresholds: '95 98' - - - name: Add link to report badge - if: ${{ always() && steps.cov_xml_upload.outputs.artifact-id != '' }} - run: | - run_url="${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}?pr=${{ github.event.pull_request.number }}" - sed -i "1s|^\(!.*\)$|[\1]($run_url)|" code-coverage-results.md - - - name: Add Coverage PR Comment - uses: marocchino/sticky-pull-request-comment@52423e01640425a022ef5fd42c6fb5f633a02728 # v2.9.3 - # Create PR comment when the branch is on the repo, otherwise we lack PR write permissions - # -> need another workflow with access to secret token - if: >- - ${{ - always() - && github.event_name == 'pull_request' - && github.event.pull_request.head.repo.full_name == github.repository - && steps.cov_xml_upload.outputs.artifact-id != '' - }} - with: - hide_and_recreate: true - path: code-coverage-results.md From eb3e8705804f069b933e4569d9f11bdc92e4cc3b Mon Sep 17 00:00:00 2001 From: Brian Schubert Date: Mon, 8 Sep 2025 16:46:02 -0400 Subject: [PATCH 2/4] Install toml extra for Python <3.11 --- .github/workflows/ci.yml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index bf51f6ac..21b94708 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -69,8 +69,9 @@ jobs: - name: Install coverage if: ${{ !startsWith(matrix.python-version, 'pypy') }} run: | - # Be wary that this does not install typing_extensions in the future - pip install coverage + # Be wary that this does not install typing_extensions in the future. + # 'toml' extra is needed to read settings from pyproject.toml on Python <3.11 + pip install 'coverage[toml]' - name: Test typing_extensions with coverage if: ${{ !startsWith(matrix.python-version, 'pypy') }} From 7f04d259e495c5f1ccb98c0dca58a27c0a5e64cb Mon Sep 17 00:00:00 2001 From: Brian Schubert Date: Mon, 8 Sep 2025 18:33:18 -0400 Subject: [PATCH 3/4] Test PR comment without base commit coverage, set comment layout https://docs.codecov.com/docs/pull-request-comments#requiring-the-base-andor-head-commit https://docs.codecov.com/docs/codecov-yaml#can-i-name-the-file-codecovyml --- .github/codecov.yml | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 .github/codecov.yml diff --git a/.github/codecov.yml b/.github/codecov.yml new file mode 100644 index 00000000..d5faaef2 --- /dev/null +++ b/.github/codecov.yml @@ -0,0 +1,10 @@ +# Inherits global settings from https://app.codecov.io/account/gh/python/yaml/ +# TODO: enable status checks to fail CI if coverage drops? +# https://docs.codecov.com/docs/commit-status +comment: + # https://docs.codecov.com/docs/pull-request-comments + layout: "condensed_header, diff, flags, files" + # TODO: remove; temporary to test PR comment + # https://docs.codecov.com/docs/pull-request-comments#requiring-the-base-andor-head-commit + require_base: false + require_head: false From 0ebc8993daf3c74abd84d678e945aa1b3e4b8069 Mon Sep 17 00:00:00 2001 From: Brian Schubert Date: Tue, 9 Sep 2025 11:28:38 -0400 Subject: [PATCH 4/4] Revert temporary comment config This doesn't seem to be doing anything yet --- .github/codecov.yml | 4 ---- 1 file changed, 4 deletions(-) diff --git a/.github/codecov.yml b/.github/codecov.yml index d5faaef2..21acaf76 100644 --- a/.github/codecov.yml +++ b/.github/codecov.yml @@ -4,7 +4,3 @@ comment: # https://docs.codecov.com/docs/pull-request-comments layout: "condensed_header, diff, flags, files" - # TODO: remove; temporary to test PR comment - # https://docs.codecov.com/docs/pull-request-comments#requiring-the-base-andor-head-commit - require_base: false - require_head: false