diff --git a/.github/codecov.yml b/.github/codecov.yml new file mode 100644 index 00000000..21acaf76 --- /dev/null +++ b/.github/codecov.yml @@ -0,0 +1,6 @@ +# 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" diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 4120c3e5..63a84a85 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -68,8 +68,9 @@ jobs: - name: Install coverage 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 run: | @@ -78,17 +79,10 @@ 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: Archive code coverage results - id: archive-coverage - 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') }} @@ -97,9 +91,16 @@ 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: ${{ (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 @@ -129,95 +130,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