Third-party tests #593
This file contains 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
# This workflow is a daily cron job, | |
# running the tests of various third-party libraries that use us. | |
# This helps us spot regressions early, | |
# and helps flag when third-party libraries are making incorrect assumptions | |
# that might cause them to break when we cut a new release. | |
name: Third-party tests | |
on: | |
schedule: | |
- cron: "30 2 * * *" # 02:30 UTC | |
pull_request: | |
paths: | |
- ".github/workflows/third_party.yml" | |
workflow_dispatch: | |
permissions: | |
contents: read | |
env: | |
PIP_DISABLE_PIP_VERSION_CHECK: 1 | |
FORCE_COLOR: 1 | |
concurrency: | |
group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }} | |
cancel-in-progress: true | |
jobs: | |
pydantic: | |
name: pydantic tests | |
if: >- | |
# if 'schedule' was the trigger, | |
# don't run it on contributors' forks | |
${{ | |
github.event_name != 'schedule' | |
|| ( | |
github.repository == 'python/typing_extensions' | |
&& github.event_name == 'schedule' | |
) | |
}} | |
strategy: | |
fail-fast: false | |
matrix: | |
# PyPy is deliberately omitted here, | |
# since pydantic's tests intermittently segfault on PyPy, | |
# and it's nothing to do with typing_extensions | |
python-version: ["3.9", "3.10", "3.11", "3.12", "3.13"] | |
runs-on: ubuntu-latest | |
timeout-minutes: 60 | |
steps: | |
- name: Setup Python | |
uses: actions/setup-python@v5 | |
with: | |
python-version: ${{ matrix.python-version }} | |
allow-prereleases: true | |
- name: Install uv | |
run: curl -LsSf https://astral.sh/uv/install.sh | sh | |
- name: Checkout pydantic | |
run: git clone --depth=1 https://github.com/pydantic/pydantic.git || git clone --depth=1 https://github.com/pydantic/pydantic.git | |
- name: Checkout typing_extensions | |
uses: actions/checkout@v4 | |
with: | |
path: typing-extensions-latest | |
- name: Add local version of typing_extensions as a dependency | |
run: cd pydantic; uv add --editable ../typing-extensions-latest | |
- name: Install pydantic test dependencies | |
run: cd pydantic; uv sync --group dev | |
- name: List installed dependencies | |
run: cd pydantic; uv pip list | |
- name: Run pydantic tests | |
run: cd pydantic; uv run pytest | |
typing_inspect: | |
name: typing_inspect tests | |
if: >- | |
# if 'schedule' was the trigger, | |
# don't run it on contributors' forks | |
${{ | |
github.event_name != 'schedule' | |
|| ( | |
github.repository == 'python/typing_extensions' | |
&& github.event_name == 'schedule' | |
) | |
}} | |
strategy: | |
fail-fast: false | |
matrix: | |
python-version: ["3.9", "3.10", "3.11", "3.12", "3.13"] | |
runs-on: ubuntu-latest | |
timeout-minutes: 60 | |
steps: | |
- name: Setup Python | |
uses: actions/setup-python@v5 | |
with: | |
python-version: ${{ matrix.python-version }} | |
- name: Install uv | |
run: curl -LsSf https://astral.sh/uv/install.sh | sh | |
- name: Checkout typing_inspect | |
run: git clone --depth=1 https://github.com/ilevkivskyi/typing_inspect.git || git clone --depth=1 https://github.com/ilevkivskyi/typing_inspect.git | |
- name: Checkout typing_extensions | |
uses: actions/checkout@v4 | |
with: | |
path: typing-extensions-latest | |
- name: Install typing_inspect test dependencies | |
run: | | |
set -x | |
cd typing_inspect | |
uv pip install --system -r test-requirements.txt --exclude-newer $(git show -s --date=format:'%Y-%m-%dT%H:%M:%SZ' --format=%cd HEAD) | |
- name: Install typing_extensions latest | |
run: uv pip install --system "typing-extensions @ ./typing-extensions-latest" | |
- name: List all installed dependencies | |
run: uv pip freeze | |
- name: Run typing_inspect tests | |
run: | | |
cd typing_inspect | |
pytest | |
pyanalyze: | |
name: pyanalyze tests | |
if: >- | |
# if 'schedule' was the trigger, | |
# don't run it on contributors' forks | |
${{ | |
github.event_name != 'schedule' | |
|| ( | |
github.repository == 'python/typing_extensions' | |
&& github.event_name == 'schedule' | |
) | |
}} | |
strategy: | |
fail-fast: false | |
matrix: | |
python-version: ["3.9", "3.10", "3.11", "3.12", "3.13"] | |
runs-on: ubuntu-latest | |
timeout-minutes: 60 | |
steps: | |
- name: Setup Python | |
uses: actions/setup-python@v5 | |
with: | |
python-version: ${{ matrix.python-version }} | |
allow-prereleases: true | |
- name: Install uv | |
run: curl -LsSf https://astral.sh/uv/install.sh | sh | |
- name: Check out pyanalyze | |
run: git clone --depth=1 https://github.com/quora/pyanalyze.git || git clone --depth=1 https://github.com/quora/pyanalyze.git | |
- name: Checkout typing_extensions | |
uses: actions/checkout@v4 | |
with: | |
path: typing-extensions-latest | |
- name: Install pyanalyze test requirements | |
run: | | |
set -x | |
cd pyanalyze | |
uv pip install --system 'pyanalyze[tests] @ .' --exclude-newer $(git show -s --date=format:'%Y-%m-%dT%H:%M:%SZ' --format=%cd HEAD) | |
- name: Install typing_extensions latest | |
run: uv pip install --system "typing-extensions @ ./typing-extensions-latest" | |
- name: List all installed dependencies | |
run: uv pip freeze | |
- name: Run pyanalyze tests | |
run: | | |
cd pyanalyze | |
pytest pyanalyze/ | |
typeguard: | |
name: typeguard tests | |
if: >- | |
# if 'schedule' was the trigger, | |
# don't run it on contributors' forks | |
${{ | |
github.event_name != 'schedule' | |
|| ( | |
github.repository == 'python/typing_extensions' | |
&& github.event_name == 'schedule' | |
) | |
}} | |
strategy: | |
fail-fast: false | |
matrix: | |
python-version: ["3.9", "3.10", "3.11", "3.12", "3.13"] | |
runs-on: ubuntu-latest | |
timeout-minutes: 60 | |
steps: | |
- name: Setup Python | |
uses: actions/setup-python@v5 | |
with: | |
python-version: ${{ matrix.python-version }} | |
allow-prereleases: true | |
- name: Install uv | |
run: curl -LsSf https://astral.sh/uv/install.sh | sh | |
- name: Check out typeguard | |
run: git clone --depth=1 https://github.com/agronholm/typeguard.git || git clone --depth=1 https://github.com/agronholm/typeguard.git | |
- name: Checkout typing_extensions | |
uses: actions/checkout@v4 | |
with: | |
path: typing-extensions-latest | |
- name: Install typeguard test requirements | |
run: | | |
set -x | |
cd typeguard | |
uv pip install --system "typeguard[test] @ ." --exclude-newer $(git show -s --date=format:'%Y-%m-%dT%H:%M:%SZ' --format=%cd HEAD) | |
- name: Install typing_extensions latest | |
run: uv pip install --system "typing-extensions @ ./typing-extensions-latest" | |
- name: List all installed dependencies | |
run: uv pip freeze | |
- name: Run typeguard tests | |
run: | | |
cd typeguard | |
export PYTHON_COLORS=0 # A test fails if tracebacks are colorized | |
pytest | |
typed-argument-parser: | |
name: typed-argument-parser tests | |
if: >- | |
# if 'schedule' was the trigger, | |
# don't run it on contributors' forks | |
${{ | |
github.event_name != 'schedule' | |
|| ( | |
github.repository == 'python/typing_extensions' | |
&& github.event_name == 'schedule' | |
) | |
}} | |
strategy: | |
fail-fast: false | |
matrix: | |
python-version: ["3.9", "3.10", "3.11", "3.12", "3.13"] | |
runs-on: ubuntu-latest | |
timeout-minutes: 60 | |
steps: | |
- name: Setup Python | |
uses: actions/setup-python@v5 | |
with: | |
python-version: ${{ matrix.python-version }} | |
- name: Install uv | |
run: curl -LsSf https://astral.sh/uv/install.sh | sh | |
- name: Check out typed-argument-parser | |
run: git clone --depth=1 https://github.com/swansonk14/typed-argument-parser.git || git clone --depth=1 https://github.com/swansonk14/typed-argument-parser.git | |
- name: Checkout typing_extensions | |
uses: actions/checkout@v4 | |
with: | |
path: typing-extensions-latest | |
- name: Configure git for typed-argument-parser tests | |
# typed-argument parser does this in their CI, | |
# and the tests fail unless we do this | |
run: | | |
git config --global user.email "[email protected]" | |
git config --global user.name "Your Name" | |
- name: Install typed-argument-parser test requirements | |
run: | | |
set -x | |
cd typed-argument-parser | |
uv pip install --system "typed-argument-parser @ ." --exclude-newer $(git show -s --date=format:'%Y-%m-%dT%H:%M:%SZ' --format=%cd HEAD) | |
uv pip install --system pytest --exclude-newer $(git show -s --date=format:'%Y-%m-%dT%H:%M:%SZ' --format=%cd HEAD) | |
- name: Install typing_extensions latest | |
run: uv pip install --system "typing-extensions @ ./typing-extensions-latest" | |
- name: List all installed dependencies | |
run: uv pip freeze | |
- name: Run typed-argument-parser tests | |
run: | | |
cd typed-argument-parser | |
pytest | |
mypy: | |
name: stubtest & mypyc tests | |
if: >- | |
# if 'schedule' was the trigger, | |
# don't run it on contributors' forks | |
${{ | |
github.event_name != 'schedule' | |
|| ( | |
github.repository == 'python/typing_extensions' | |
&& github.event_name == 'schedule' | |
) | |
}} | |
strategy: | |
fail-fast: false | |
matrix: | |
python-version: ["3.9", "3.10", "3.11", "3.12", "3.13"] | |
runs-on: ubuntu-latest | |
timeout-minutes: 60 | |
steps: | |
- name: Setup Python | |
uses: actions/setup-python@v5 | |
with: | |
python-version: ${{ matrix.python-version }} | |
allow-prereleases: true | |
- name: Install uv | |
run: curl -LsSf https://astral.sh/uv/install.sh | sh | |
- name: Checkout mypy for stubtest and mypyc tests | |
run: git clone --depth=1 https://github.com/python/mypy.git || git clone --depth=1 https://github.com/python/mypy.git | |
- name: Checkout typing_extensions | |
uses: actions/checkout@v4 | |
with: | |
path: typing-extensions-latest | |
- name: Install mypy test requirements | |
run: | | |
set -x | |
cd mypy | |
uv pip install --system -r test-requirements.txt --exclude-newer $(git show -s --date=format:'%Y-%m-%dT%H:%M:%SZ' --format=%cd HEAD) | |
uv pip install --system -e . | |
- name: Install typing_extensions latest | |
run: uv pip install --system "typing-extensions @ ./typing-extensions-latest" | |
- name: List all installed dependencies | |
run: uv pip freeze | |
- name: Run stubtest & mypyc tests | |
run: | | |
cd mypy | |
pytest -n 2 ./mypy/test/teststubtest.py ./mypyc/test/test_run.py ./mypyc/test/test_external.py | |
cattrs: | |
name: cattrs tests | |
if: >- | |
# if 'schedule' was the trigger, | |
# don't run it on contributors' forks | |
${{ | |
github.event_name != 'schedule' | |
|| ( | |
github.repository == 'python/typing_extensions' | |
&& github.event_name == 'schedule' | |
) | |
}} | |
strategy: | |
fail-fast: false | |
matrix: | |
# skip 3.13 because msgspec doesn't support 3.13 yet | |
python-version: ["3.9", "3.10", "3.11", "3.12"] | |
runs-on: ubuntu-latest | |
timeout-minutes: 60 | |
steps: | |
- name: Setup Python | |
uses: actions/setup-python@v5 | |
with: | |
python-version: ${{ matrix.python-version }} | |
- name: Checkout cattrs | |
run: git clone --depth=1 https://github.com/python-attrs/cattrs.git || git clone --depth=1 https://github.com/python-attrs/cattrs.git | |
- name: Checkout typing_extensions | |
uses: actions/checkout@v4 | |
with: | |
path: typing-extensions-latest | |
- name: Install pdm for cattrs | |
run: pip install pdm | |
- name: Add latest typing-extensions as a dependency | |
run: | | |
cd cattrs | |
pdm remove typing-extensions | |
pdm add --dev ../typing-extensions-latest | |
- name: Install cattrs test dependencies | |
run: cd cattrs; pdm install --dev -G :all | |
- name: List all installed dependencies | |
run: cd cattrs; pdm list -vv | |
- name: Run cattrs tests | |
run: cd cattrs; pdm run pytest tests | |
create-issue-on-failure: | |
name: Create an issue if daily tests failed | |
runs-on: ubuntu-latest | |
needs: | |
- pydantic | |
- typing_inspect | |
- pyanalyze | |
- typeguard | |
- typed-argument-parser | |
- mypy | |
- cattrs | |
if: >- | |
${{ | |
github.repository == 'python/typing_extensions' | |
&& always() | |
&& github.event_name == 'schedule' | |
&& ( | |
needs.pydantic.result == 'failure' | |
|| needs.typing_inspect.result == 'failure' | |
|| needs.pyanalyze.result == 'failure' | |
|| needs.typeguard.result == 'failure' | |
|| needs.typed-argument-parser.result == 'failure' | |
|| needs.mypy.result == 'failure' | |
|| needs.cattrs.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: `Third-party tests failed on ${new Date().toDateString()}`, | |
body: "Full history of runs listed here: https://github.com/python/typing_extensions/actions/workflows/third_party.yml", | |
}) |