Update TypedDict docs (#664) #2339
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
name: Test and lint | |
on: | |
schedule: | |
- cron: "0 2 * * *" # 2am UTC | |
push: | |
branches: | |
- main | |
pull_request: | |
workflow_dispatch: | |
permissions: | |
contents: read | |
env: | |
FORCE_COLOR: 1 | |
PIP_DISABLE_PIP_VERSION_CHECK: 1 | |
concurrency: | |
group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }} | |
cancel-in-progress: true | |
jobs: | |
tests: | |
name: Run tests | |
# if 'schedule' was the trigger, | |
# don't run it on contributors' forks | |
if: >- | |
github.repository == 'python/typing_extensions' | |
|| github.event_name != 'schedule' | |
strategy: | |
fail-fast: false | |
matrix: | |
# We try to test on the earliest available bugfix release of each | |
# Python version, because typing sometimes changed between bugfix releases. | |
# For available versions, see: | |
# https://raw.githubusercontent.com/actions/python-versions/main/versions-manifest.json | |
python-version: | |
- "3.9" | |
- "3.9.12" | |
- "3.10" | |
- "3.10.4" | |
- "3.11" | |
- "3.11.0" | |
- "3.12" | |
- "3.12.0" | |
- "3.13" | |
- "3.13.0" | |
- "3.14" | |
- "pypy3.9" | |
- "pypy3.10" | |
- "pypy3.11" | |
runs-on: ubuntu-latest | |
steps: | |
- uses: actions/checkout@v4 | |
with: | |
persist-credentials: false | |
- name: Set up Python | |
uses: actions/setup-python@v5 | |
with: | |
python-version: ${{ matrix.python-version }} | |
allow-prereleases: true | |
- 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 | |
- name: Test typing_extensions with coverage | |
if: ${{ !startsWith(matrix.python-version, 'pypy') }} | |
run: | | |
# Be wary of running `pip install` here, since it becomes easy for us to | |
# accidentally pick up typing_extensions as installed by a dependency | |
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 | |
- name: Test typing_extensions no coverage on pypy | |
if: ${{ startsWith(matrix.python-version, 'pypy') }} | |
run: | | |
# Be wary of running `pip install` here, since it becomes easy for us to | |
# accidentally pick up typing_extensions as installed by a dependency | |
cd src | |
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') }} | |
run: | | |
cd src | |
# 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 }} | |
create-issue-on-failure: | |
name: Create an issue if daily tests failed | |
runs-on: ubuntu-latest | |
needs: [tests] | |
if: >- | |
${{ | |
github.repository == 'python/typing_extensions' | |
&& always() | |
&& github.event_name == 'schedule' | |
&& needs.tests.result == 'failure' | |
}} | |
permissions: | |
issues: write | |
steps: | |
- uses: actions/github-script@v7 | |
with: | |
github-token: ${{ secrets.GITHUB_TOKEN }} | |
script: | | |
await github.rest.issues.create({ | |
owner: "python", | |
repo: "typing_extensions", | |
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 |