## Summary There have been some larger-scale updates to the conformance suite since we introduced our CI job, so it seems sensible to bump the version of the conformance suite to the latest state. ## Test plan This is a bit awkward to test. Here is the diff of running ty on the conformance suite before and after this bump. I filtered out line/column information (`sed -re 's/\.py:[0-9]+:[0-9]+:/.py/'`) to avoid spurious changes from content that has simply been moved around. ```diff 1,2c1 < fatal[panic] Panicked at /home/shark/.cargo/git/checkouts/salsa-e6f3bb7c2a062968/cdd0b85/src/function/execute.rs:419:17 when checking `/home/shark/typing/conformance/tests/aliases_typealiastype.py`: `infer_definition_types(Id(1a99c)): execute: too many cycle iterations` < src/type_checker.py error[unresolved-import] Cannot resolve imported module `tqdm` --- > fatal[panic] Panicked at /home/shark/.cargo/git/checkouts/salsa-e6f3bb7c2a062968/cdd0b85/src/function/execute.rs:419:17 when checking `/home/shark/typing/conformance/tests/aliases_typealiastype.py`: `infer_definition_types(Id(6e4c)): execute: too many cycle iterations` 205,206d203 < tests/constructors_call_metaclass.py error[type-assertion-failure] Argument does not have asserted type `Never` < tests/constructors_call_metaclass.py error[missing-argument] No argument provided for required parameter `x` of function `__new__` 268a266,273 > tests/dataclasses_match_args.py error[type-assertion-failure] Argument does not have asserted type `tuple[Literal["x"]]` > tests/dataclasses_match_args.py error[unresolved-attribute] Class `DC1` has no attribute `__match_args__` > tests/dataclasses_match_args.py error[type-assertion-failure] Argument does not have asserted type `tuple[Literal["x"]]` > tests/dataclasses_match_args.py error[unresolved-attribute] Class `DC2` has no attribute `__match_args__` > tests/dataclasses_match_args.py error[type-assertion-failure] Argument does not have asserted type `tuple[Literal["x"]]` > tests/dataclasses_match_args.py error[unresolved-attribute] Class `DC3` has no attribute `__match_args__` > tests/dataclasses_match_args.py error[unresolved-attribute] Class `DC4` has no attribute `__match_args__` > tests/dataclasses_match_args.py error[type-assertion-failure] Argument does not have asserted type `tuple[()]` 339a345 > tests/directives_assert_type.py error[type-assertion-failure] Argument does not have asserted type `Any` 424a431 > tests/generics_defaults.py error[type-assertion-failure] Argument does not have asserted type `Any` 520a528,529 > tests/generics_syntax_infer_variance.py error[invalid-return-type] Function always implicitly returns `None`, which is not assignable to return type `T@ShouldBeCovariant2 | Sequence[T@ShouldBeCovariant2]` > tests/generics_syntax_infer_variance.py error[invalid-return-type] Function always implicitly returns `None`, which is not assignable to return type `int` 711a721 > tests/namedtuples_define_class.py error[too-many-positional-arguments] Too many positional arguments: expected 3, got 4 795d804 < tests/protocols_explicit.py error[invalid-attribute-access] Cannot assign to ClassVar `cm1` from an instance of type `Self@__init__` 822,823d830 < tests/qualifiers_annotated.py error[invalid-syntax] named expression cannot be used within a type annotation < tests/qualifiers_annotated.py error[invalid-syntax] await expression cannot be used within a type annotation 922a930,953 > tests/typeddicts_extra_items.py error[invalid-key] Invalid key for TypedDict `Movie`: Unknown key "novel_adaptation" > tests/typeddicts_extra_items.py error[invalid-key] Invalid key for TypedDict `Movie`: Unknown key "year" > tests/typeddicts_extra_items.py error[type-assertion-failure] Argument does not have asserted type `bool` > tests/typeddicts_extra_items.py error[invalid-key] Invalid key for TypedDict `Movie`: Unknown key "novel_adaptation" > tests/typeddicts_extra_items.py error[invalid-argument-type] Invalid argument to key "year" with declared type `int` on TypedDict `InheritedMovie`: value of type `None` > tests/typeddicts_extra_items.py error[invalid-key] Invalid key for TypedDict `InheritedMovie`: Unknown key "other_extra_key" > tests/typeddicts_extra_items.py error[invalid-key] Invalid key for TypedDict `MovieEI`: Unknown key "year" > tests/typeddicts_extra_items.py error[invalid-key] Invalid key for TypedDict `MovieExtraInt`: Unknown key "year" > tests/typeddicts_extra_items.py error[invalid-key] Invalid key for TypedDict `MovieExtraStr`: Unknown key "description" > tests/typeddicts_extra_items.py error[invalid-key] Invalid key for TypedDict `MovieExtraInt`: Unknown key "year" > tests/typeddicts_extra_items.py error[invalid-key] Invalid key for TypedDict `NonClosedMovie`: Unknown key "year" > tests/typeddicts_extra_items.py error[invalid-key] Invalid key for TypedDict `ExtraMovie`: Unknown key "year" > tests/typeddicts_extra_items.py error[invalid-key] Invalid key for TypedDict `ExtraMovie`: Unknown key "language" > tests/typeddicts_extra_items.py error[invalid-key] Invalid key for TypedDict `ClosedMovie`: Unknown key "year" > tests/typeddicts_extra_items.py error[invalid-key] Invalid key for TypedDict `MovieExtraStr`: Unknown key "summary" > tests/typeddicts_extra_items.py error[invalid-key] Invalid key for TypedDict `MovieExtraInt`: Unknown key "year" > tests/typeddicts_extra_items.py error[invalid-assignment] Object of type `dict[Unknown | str, Unknown | str | int]` is not assignable to `Mapping[str, int]` > tests/typeddicts_extra_items.py error[type-assertion-failure] Argument does not have asserted type `list[tuple[str, int | str]]` > tests/typeddicts_extra_items.py error[type-assertion-failure] Argument does not have asserted type `list[int | str]` > tests/typeddicts_extra_items.py error[unresolved-attribute] Object of type `IntDict` has no attribute `clear` > tests/typeddicts_extra_items.py error[invalid-key] Invalid key for TypedDict `IntDictWithNum`: Unknown key "bar" - did you mean "num"? > tests/typeddicts_extra_items.py error[type-assertion-failure] Argument does not have asserted type `tuple[str, int]` > tests/typeddicts_extra_items.py error[invalid-key] Cannot access `IntDictWithNum` with a key of type `str`. Only string literals are allowed as keys on TypedDicts. > tests/typeddicts_extra_items.py error[invalid-key] Invalid key for TypedDict `IntDictWithNum` of type `str` 950c981 < Found 949 diagnostics --- > Found 980 diagnostics ```
117 lines
3.7 KiB
YAML
117 lines
3.7 KiB
YAML
name: Run typing conformance
|
|
|
|
permissions: {}
|
|
|
|
on:
|
|
pull_request:
|
|
paths:
|
|
- "crates/ty*/**"
|
|
- "crates/ruff_db"
|
|
- "crates/ruff_python_ast"
|
|
- "crates/ruff_python_parser"
|
|
- ".github/workflows/typing_conformance.yaml"
|
|
- ".github/workflows/typing_conformance_comment.yaml"
|
|
- "Cargo.lock"
|
|
- "!**.md"
|
|
|
|
concurrency:
|
|
group: ${{ github.workflow }}-${{ github.ref_name }}-${{ github.event.pull_request.number || github.sha }}
|
|
cancel-in-progress: true
|
|
|
|
env:
|
|
CARGO_INCREMENTAL: 0
|
|
CARGO_NET_RETRY: 10
|
|
CARGO_TERM_COLOR: always
|
|
RUSTUP_MAX_RETRIES: 10
|
|
RUST_BACKTRACE: 1
|
|
CONFORMANCE_SUITE_COMMIT: 9f6d8ced7cd1c8d92687a4e9c96d7716452e471e
|
|
|
|
jobs:
|
|
typing_conformance:
|
|
name: Compute diagnostic diff
|
|
runs-on: ${{ github.repository == 'astral-sh/ruff' && 'depot-ubuntu-22.04-32' || 'ubuntu-latest' }}
|
|
timeout-minutes: 10
|
|
steps:
|
|
- uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
|
|
with:
|
|
path: ruff
|
|
fetch-depth: 0
|
|
persist-credentials: false
|
|
|
|
- uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
|
|
with:
|
|
repository: python/typing
|
|
ref: ${{ env.CONFORMANCE_SUITE_COMMIT }}
|
|
path: typing
|
|
persist-credentials: false
|
|
|
|
- uses: Swatinem/rust-cache@f13886b937689c021905a6b90929199931d60db1 # v2.8.1
|
|
with:
|
|
workspaces: "ruff"
|
|
|
|
- name: Install Rust toolchain
|
|
run: rustup show
|
|
|
|
- name: Compute diagnostic diff
|
|
shell: bash
|
|
env:
|
|
# TODO: Remove this once we fixed the remaining panics in the conformance suite.
|
|
TY_MAX_PARALLELISM: 1
|
|
run: |
|
|
RUFF_DIR="$GITHUB_WORKSPACE/ruff"
|
|
|
|
# Build the executable for the old and new commit
|
|
(
|
|
cd ruff
|
|
|
|
echo "new commit"
|
|
git rev-list --format=%s --max-count=1 "$GITHUB_SHA"
|
|
cargo build --bin ty
|
|
mv target/debug/ty ty-new
|
|
|
|
MERGE_BASE="$(git merge-base "$GITHUB_SHA" "origin/$GITHUB_BASE_REF")"
|
|
git checkout -b old_commit "$MERGE_BASE"
|
|
echo "old commit (merge base)"
|
|
git rev-list --format=%s --max-count=1 old_commit
|
|
cargo build --bin ty
|
|
mv target/debug/ty ty-old
|
|
)
|
|
|
|
(
|
|
cd typing/conformance/tests
|
|
|
|
echo "Running ty on old commit (merge base)"
|
|
"$RUFF_DIR/ty-old" check --color=never --output-format=concise . > "$GITHUB_WORKSPACE/old-output.txt" 2>&1 || true
|
|
|
|
echo "Running ty on new commit"
|
|
"$RUFF_DIR/ty-new" check --color=never --output-format=concise . > "$GITHUB_WORKSPACE/new-output.txt" 2>&1 || true
|
|
)
|
|
|
|
if ! diff -u old-output.txt new-output.txt > typing_conformance_diagnostics.diff; then
|
|
echo "Differences found between base and PR"
|
|
else
|
|
echo "No differences found"
|
|
touch typing_conformance_diagnostics.diff
|
|
fi
|
|
|
|
echo ${{ github.event.number }} > pr-number
|
|
echo "${CONFORMANCE_SUITE_COMMIT}" > conformance-suite-commit
|
|
|
|
- name: Upload diff
|
|
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
|
|
with:
|
|
name: typing_conformance_diagnostics_diff
|
|
path: typing_conformance_diagnostics.diff
|
|
|
|
- name: Upload pr-number
|
|
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
|
|
with:
|
|
name: pr-number
|
|
path: pr-number
|
|
|
|
- name: Upload conformance suite commit
|
|
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
|
|
with:
|
|
name: conformance-suite-commit
|
|
path: conformance-suite-commit
|