Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
30 commits
Select commit Hold shift + click to select a range
1cca427
Sort imports
ngnpope May 13, 2026
e34c352
Switch to `tomllib` from the stdlib
ngnpope May 13, 2026
cb1407f
Remove outdated comment in template
ngnpope May 13, 2026
8e94764
Move outer table tags to the template
ngnpope May 13, 2026
2a07f12
Sort type checker columns by name
ngnpope May 13, 2026
903ff1a
Fix validation errors in HTML
ngnpope May 13, 2026
74457f8
Use `<td>` instead of `<th>` for non-header cells
ngnpope May 13, 2026
37f4f57
Add a `<thead>` for header row
ngnpope May 13, 2026
c227f71
Simplify applying styles to header row
ngnpope May 13, 2026
3f5bd6f
Simplify applying styles to body columns
ngnpope May 13, 2026
adc3991
Use a more appropriate cursor, and only if tooltip
ngnpope May 13, 2026
9b9862f
Make use of a `<colgroup>`
ngnpope May 13, 2026
fca0e19
Remove unused CSS rules
ngnpope May 13, 2026
3a0ebb6
Reduce excess elements for tooltip implementation
ngnpope May 13, 2026
2ae0371
Use padding instead of non-breaking spaces
ngnpope May 13, 2026
08bcbff
Remove another unnecessary class
ngnpope May 13, 2026
e9363e6
Move base template to a folder
ngnpope May 13, 2026
05e4b14
Add jinja2 as a dependency
ngnpope May 13, 2026
faf18d1
Switch to using jinja2 templates
ngnpope May 13, 2026
ab1028c
Improvements to styling
ngnpope May 13, 2026
1847d03
Add markdown rendering of notes
ngnpope May 13, 2026
d821c3c
Ensure existing notes use markdown syntax
ngnpope May 13, 2026
b188375
Add a favicon using an emoji
ngnpope May 13, 2026
ecbec59
Improve structure of table
ngnpope May 13, 2026
2f12495
Add per-group and overall summary rows
ngnpope May 13, 2026
f1cdf9a
Add explicit type hint to `results_dict`
ngnpope May 13, 2026
bca6a05
Hide generated `results.html` from diff in GitHub
ngnpope Jun 18, 2026
13f9504
Force links to open in a new tab
ngnpope Jun 18, 2026
99f1536
Add a footer with a generation timestamp
ngnpope Jun 18, 2026
0e3660a
Revert "Add a footer with a generation timestamp"
ngnpope Jun 19, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .gitattributes
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
conformance/results/results.html linguist-generated
6 changes: 4 additions & 2 deletions conformance/pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -3,14 +3,16 @@ name = "typing-conformance"
version = "0.1.0"
requires-python = "==3.12.*"
dependencies = [
"jinja2",
"markdown",
"mypy",
"pycroscope",
"pyrefly",
"pyright",
"tomli",
"tomlkit",
"zuban",
"ty",
"types-markdown",
"zuban",
]

[tool.uv]
Expand Down
4 changes: 2 additions & 2 deletions conformance/results/mypy/aliases_typealiastype.toml
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
conformant = "Partial"
notes = """
Incorrectly rejects some recursive type aliases using TypeAliasType.
Incorrectly rejects the use of a class-scoped TypeVar in a TypeAliasType definition.
Incorrectly rejects some recursive type aliases using `TypeAliasType`.
Incorrectly rejects the use of a class-scoped `TypeVar` in a `TypeAliasType` definition.
"""
output = """
aliases_typealiastype.py:20: error: Cannot resolve name "GoodAlias5" (possible cyclic definition) [misc]
Expand Down
2 changes: 1 addition & 1 deletion conformance/results/mypy/annotations_forward_refs.toml
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
conformant = "Partial"
notes = """
Does not report error for a forward reference that is not enclosed in quotes.
Does not report error for use of quoted type with "|" operator (runtime error).
Does not report error for use of quoted type with `|` operator (runtime error).
Incorrectly generates error for quoted type defined in class scope.
"""
output = """
Expand Down
2 changes: 1 addition & 1 deletion conformance/results/mypy/annotations_generators.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
conformant = "Partial"
notes = """
Does not report incompatible Generator type in `yield from` statement.
Does not report incompatible `Generator` type in `yield from` statement.
"""
output = """
annotations_generators.py:51: error: Missing return statement [return]
Expand Down
4 changes: 2 additions & 2 deletions conformance/results/mypy/callables_annotation.toml
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
conformant = "Partial"
notes = """
Incorrectly treats "*args: T, **kwargs: T" as "..." when T is specialized to Any.
Does not treat "*args: Any, **kargs: Any" as "..." when separated by keyword parameter.
Incorrectly treats `*args: T, **kwargs: T` as `...` when `T` is specialized to `Any`.
Does not treat `*args: Any, **kargs: Any` as `...` when separated by keyword parameter.
"""
output = """
callables_annotation.py:25: error: Too few arguments [call-arg]
Expand Down
2 changes: 1 addition & 1 deletion conformance/results/mypy/callables_kwargs.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
conformant = "Partial"
notes = """
Allows callable without kwargs to be assigned to callable with unpacked kwargs
Allows callable without kwargs to be assigned to callable with unpacked kwargs.
"""
output = """
callables_kwargs.py:46: error: Missing named argument "v1" for "func1" [call-arg]
Expand Down
8 changes: 4 additions & 4 deletions conformance/results/mypy/classes_classvar.toml
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
conformant = "Partial"
notes = """
Internal error if TypeVarTuple is used in ClassVar.
Does not reject use of ParamSpec in ClassVar.
Rejects ClassVar nested in Annotated.
Does not reject use of ClassVar in TypeAlias definition.
Internal error if `TypeVarTuple` is used in `ClassVar`.
Does not reject use of `ParamSpec` in `ClassVar`.
Rejects `ClassVar` nested in `Annotated`.
Does not reject use of `ClassVar` in `TypeAlias` definition.
"""
output = """
classes_classvar.py:38: error: ClassVar[...] must have at most one type argument [valid-type]
Expand Down
4 changes: 2 additions & 2 deletions conformance/results/mypy/constructors_call_init.toml
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
conformant = "Partial"
notes = """
Does not report errors during binding to self parameter of __init__ method.
Does not reject use of class-scoped type variables in annotation of self parameter in __init__ method.
Does not report errors during binding to self parameter of `__init__` method.
Does not reject use of class-scoped type variables in annotation of self parameter in `__init__` method.
"""
conformance_automated = "Fail"
errors_diff = """
Expand Down
4 changes: 2 additions & 2 deletions conformance/results/mypy/constructors_call_metaclass.toml
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
conformant = "Unsupported"
notes = """
Does not honor metaclass __call__ method when evaluating constructor call.
Does not skip evaluation of __new__ and __init__ if custom metaclass call returns non-class.
Does not honor metaclass `__call__` method when evaluating constructor call.
Does not skip evaluation of `__new__` and `__init__` if custom metaclass call returns non-class.
"""
conformance_automated = "Fail"
errors_diff = """
Expand Down
6 changes: 3 additions & 3 deletions conformance/results/mypy/constructors_call_new.toml
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
conformant = "Partial"
notes = """
Does not support __new__ return type that is not a subclass of the class being constructed.
Does not skip evaluation of __init__ based on __new__ return type.
Does not report errors during binding to cls parameter of __new__ method.
Does not support `__new__` return type that is not a subclass of the class being constructed.
Does not skip evaluation of `__init__` based on `__new__` return type.
Does not report errors during binding to `cls` parameter of `__new__` method.
"""
conformance_automated = "Fail"
errors_diff = """
Expand Down
2 changes: 1 addition & 1 deletion conformance/results/mypy/constructors_call_type.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
conformant = "Partial"
notes = """
Does not validate call to custom metaclass __call__ method through type[T].
Does not validate call to custom metaclass `__call__` method through `type[T]`.
"""
conformance_automated = "Fail"
errors_diff = """
Expand Down
6 changes: 3 additions & 3 deletions conformance/results/mypy/constructors_callable.toml
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
conformant = "Partial"
notes = """
Does not generate a union type for __new__ and __init__ when converting class to callable.
Does not ignore __init__ based on __new__ return type when converting class to callable.
Does not support __new__ return type that is different from class being constructed.
Does not generate a union type for `__new__` and `__init__` when converting class to callable.
Does not ignore `__init__` based on `__new__` return type when converting class to callable.
Does not support `__new__` return type that is different from class being constructed.
"""
conformance_automated = "Fail"
errors_diff = """
Expand Down
2 changes: 1 addition & 1 deletion conformance/results/mypy/constructors_consistency.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
conformant = "Pass"
notes = """
Does not report inconsistency between __new__ and __init__ (optional).
Does not report inconsistency between `__new__` and `__init__` (optional).
"""
conformance_automated = "Pass"
errors_diff = """
Expand Down
4 changes: 2 additions & 2 deletions conformance/results/mypy/dataclasses_final.toml
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
conformant = "Partial"
notes = """
Wrongly requires a Final dataclass field to be initialized at class level.
Doesn't support Final nested inside ClassVar.
Wrongly requires a `Final` dataclass field to be initialized at class level.
Doesn't support `Final` nested inside `ClassVar`.
"""
conformance_automated = "Fail"
errors_diff = """
Expand Down
2 changes: 1 addition & 1 deletion conformance/results/mypy/dataclasses_hash.toml
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ conformant = "Unsupported"
notes = """
Does not synthesize `__hash__ = None` as a class attribute for unhashable dataclasses.
Does not report when an unhashable dataclass has `__hash__` called directly on an instance.
Does not report when dataclass is not compatible with Hashable protocol.
Does not report when dataclass is not compatible with `Hashable` protocol.
"""
output = """
dataclasses_hash.py:14: error: Expression is of type "Callable[[object], int]", not "None" [assert-type]
Expand Down
2 changes: 1 addition & 1 deletion conformance/results/mypy/dataclasses_slots.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
conformant = "Partial"
notes = """
Does not reject write to instance variable that is not defined in __slots__.
Does not reject write to instance variable that is not defined in `__slots__`.
"""
output = """
dataclasses_slots.py:11: error: "DC1" both defines "__slots__" and is used with "slots=True" [misc]
Expand Down
2 changes: 1 addition & 1 deletion conformance/results/mypy/directives_type_ignore.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
conformant = "Partial"
notes = """
Does not honor "# type: ignore" comment if comment includes additional text.
Does not honor `# type: ignore` comment if comment includes additional text.
"""
output = """
directives_type_ignore.py:11: error: Invalid "type: ignore" comment [syntax]
Expand Down
4 changes: 2 additions & 2 deletions conformance/results/mypy/directives_version_platform.toml
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
conformant = "Pass"
notes = """
Does not understand three-element form of sys.version checks.
Does not understand os.name checks.
Does not understand three-element form of `sys.version` checks.
Does not understand `os.name` checks.
"""
output = """
directives_version_platform.py:26: error: Expression is of type "int | str", not "int" [assert-type]
Expand Down
2 changes: 1 addition & 1 deletion conformance/results/mypy/enums_expansion.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
conformant = "Partial"
notes = """
Improperly applies narrowing to Flag subclass.
Improperly applies narrowing to `Flag` subclass.
"""
conformance_automated = "Fail"
errors_diff = """
Expand Down
4 changes: 2 additions & 2 deletions conformance/results/mypy/generics_defaults.toml
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
conformant = "Partial"
notes = """
Does not detect a TypeVar with a default used after a TypeVarTuple.
Does not fully support defaults on TypeVarTuple and ParamSpec.
Does not detect a `TypeVar` with a default used after a `TypeVarTuple`.
Does not fully support defaults on `TypeVarTuple` and `ParamSpec`.
"""
output = """
generics_defaults.py:24: error: "T" cannot appear after "DefaultStrT" in type parameter list because it has no default type [misc]
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
conformant = "Partial"
notes = """
Does not correctly handle defaults referencing other TypeVars.
Does not correctly handle defaults referencing other `TypeVar`s.
"""
output = """
generics_defaults_referential.py:23: error: Expression is of type "type[slice[StartT, StopT, StepT]]", not "type[slice[int, int, int | None]]" [assert-type]
Expand Down
4 changes: 2 additions & 2 deletions conformance/results/mypy/generics_type_erasure.toml
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
conformant = "Partial"
notes = """
Infers Node[Never] instead of Node[Any] when argument is not provided.
False negative on instance attribute access on type(node).
Infers `Node[Never]` instead of `Node[Any]` when argument is not provided.
False negative on instance attribute access on `type(node)`.
"""
output = """
generics_type_erasure.py:19: error: Expression is of type "Node[Never]", not "Node[Any]" [assert-type]
Expand Down
2 changes: 1 addition & 1 deletion conformance/results/mypy/generics_typevartuple_args.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
conformant = "Partial"
notes = """
Does not enforce that tuples captured by TypeVarTuple are of the same length.
Does not enforce that tuples captured by `TypeVarTuple` are of the same length.
"""
output = """
generics_typevartuple_args.py:33: error: Argument 3 to "exec_le" has incompatible type "str"; expected "Env" [arg-type]
Expand Down
2 changes: 1 addition & 1 deletion conformance/results/mypy/generics_typevartuple_basic.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
conformant = "Partial"
notes = """
Does not enforce that tuples captured by TypeVarTuple are same length.
Does not enforce that tuples captured by `TypeVarTuple` are same length.
"""
output = """
generics_typevartuple_basic.py:42: error: Argument 1 to "Array" has incompatible type "Height"; expected "tuple[Height, Width]" [arg-type]
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
conformant = "Partial"
notes = """
Incorrectly specializes generic alias that includes a TypeVar and TypeVarTuple if no type arguments are provided.
Rejects specialization of generic type alias defined as a tuple containing a TypeVar.
Incorrectly specializes generic alias that includes a `TypeVar` and `TypeVarTuple` if no type arguments are provided.
Rejects specialization of generic type alias defined as a tuple containing a `TypeVar`.
"""
output = """
generics_typevartuple_specialization.py:85: error: Argument 1 to "takes_float_array_with_specific_shape" has incompatible type "Array2[float, *tuple[Any, ...]]"; expected "Array2[float, Height, Width]" [arg-type]
Expand Down
2 changes: 1 addition & 1 deletion conformance/results/mypy/generics_variance.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
conformant = "Partial"
notes = """
Does not reject use of class-scoped TypeVar used in a base class when variance is incompatible.
Does not reject use of class-scoped `TypeVar` used in a base class when variance is incompatible.
"""
output = """
generics_variance.py:14: error: TypeVar cannot be both covariant and contravariant [misc]
Expand Down
2 changes: 1 addition & 1 deletion conformance/results/mypy/literals_parameterizations.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
conformant = "Partial"
notes = """
Does not reject tuple within Literal.
Does not reject tuple within `Literal`.
"""
output = """
literals_parameterizations.py:41: error: Invalid type: Literal[...] cannot contain arbitrary expressions [valid-type]
Expand Down
2 changes: 1 addition & 1 deletion conformance/results/mypy/overloads_definitions.toml
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
conformant = "Partial"
conformance_automated = "Fail"
notes = """
Allows @override to be on all overloads and implementation, instead of just implementation.
Allows `@override` to be on all overloads and implementation, instead of just implementation.
"""
errors_diff = """
Lines 226, 227, 228, 231, 232: Expected error (tag 'override_impl')
Expand Down
2 changes: 1 addition & 1 deletion conformance/results/mypy/overloads_definitions_stub.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
conformant = "Partial"
notes = """
Allows @override to appear in a stub file not on the first overload.
Allows `@override` to appear in a stub file not on the first overload.
"""
conformance_automated = "Fail"
errors_diff = """
Expand Down
6 changes: 3 additions & 3 deletions conformance/results/mypy/overloads_evaluation.toml
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
conformant = "Partial"
notes = """
Does not expand boolean arguments to Literal[True] and Literal[False].
Does not expand boolean arguments to `Literal[True]` and `Literal[False]`.
Does not expand enum arguments to literal variants.
Does not expand tuple arguments to possible combinations.
Does not evaluate Any in some cases where overload is ambiguous.
Evaluates Any in some cases where overload is not ambiguous.
Does not evaluate `Any` in some cases where overload is ambiguous.
Evaluates `Any` in some cases where overload is not ambiguous.
"""
conformance_automated = "Fail"
errors_diff = """
Expand Down
2 changes: 1 addition & 1 deletion conformance/results/mypy/protocols_runtime_checkable.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
conformant = "Partial"
notes = """
Does not report unsafe overlap for runtime_checkable protocol.
Does not report unsafe overlap for `runtime_checkable` protocol.
"""
output = """
protocols_runtime_checkable.py:23: error: Only @runtime_checkable protocols can be used with instance and class checks [misc]
Expand Down
10 changes: 5 additions & 5 deletions conformance/results/mypy/qualifiers_annotated.toml
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
conformant = "Partial"
notes = """
Does not allow ClassVar to be nested within Annotated.
Does not allow Final to be nested within Annotated.
Does not allow Required and NotRequired to be nested within Annotated.
Does not reject type[T] compatibility for type alias defined with Annotated.
Does not reject call of type alias defined with Annotated.
Does not allow `ClassVar` to be nested within `Annotated`.
Does not allow `Final` to be nested within `Annotated`.
Does not allow `Required` and `NotRequired` to be nested within `Annotated`.
Does not reject `type[T]` compatibility for type alias defined with `Annotated`.
Does not reject call of type alias defined with `Annotated`.
"""
output = """
qualifiers_annotated.py:38: error: Bracketed expression "[...]" is not valid as a type [valid-type]
Expand Down
8 changes: 4 additions & 4 deletions conformance/results/mypy/qualifiers_final_annotation.toml
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
conformant = "Partial"
notes = """
Does not treat use of Final name as if it was replaced by the literal in NamedTuple definition.
Does not allow conditional assignment of Final instance variable in __init__ method.
Does not allow redefinition of private class variable that is marked Final in parent class.
Does not report modification of local Final variable via "for" statement.
Does not treat use of `Final` name as if it was replaced by the literal in `NamedTuple` definition.
Does not allow conditional assignment of `Final` instance variable in `__init__` method.
Does not allow redefinition of private class variable that is marked `Final` in parent class.
Does not report modification of local `Final` variable via `for` statement.
"""
output = """
qualifiers_final_annotation.py:16: error: Type in Final[...] can only be omitted if there is an initializer [misc]
Expand Down
2 changes: 1 addition & 1 deletion conformance/results/mypy/specialtypes_type.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
conformant = "Partial"
notes = """
Does not treat `type` same as `type[Any]` for assert_type.
Does not treat `type` same as `type[Any]` for `assert_type`.
Does not allow access to unknown attributes from object of type `type[Any]`.
"""
output = """
Expand Down
2 changes: 1 addition & 1 deletion conformance/results/mypy/typeddicts_class_syntax.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
conformant = "Partial"
notes = """
Does not support version-conditional items in TypedDict definitions.
Does not support version-conditional items in `TypedDict` definitions.
"""
output = """
typeddicts_class_syntax.py:30: error: Invalid statement in TypedDict definition; expected "field_name: field_type" [misc]
Expand Down
3 changes: 0 additions & 3 deletions conformance/results/mypy/typeddicts_extra_items.toml
Original file line number Diff line number Diff line change
@@ -1,7 +1,4 @@
conformant = "Unsupported"
notes = """
Not supported.
"""
conformance_automated = "Fail"
errors_diff = """
Line 215: Expected 1 errors
Expand Down
6 changes: 3 additions & 3 deletions conformance/results/mypy/typeddicts_readonly_inheritance.toml
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
conformant = "Partial"
notes = """
Incorrectly rejects non-ReadOnly override of ReadOnly item.
Incorrectly rejects override of ReadOnly item with another ReadOnly item with narrower type.
Incorrectly rejects override of NotRequired ReadOnly item with a Required ReadOnly item.
Incorrectly rejects non-`ReadOnly` override of `ReadOnly` item.
Incorrectly rejects override of `ReadOnly` item with another `ReadOnly` item with narrower type.
Incorrectly rejects override of `NotRequired ReadOnly` item with a `Required ReadOnly` item.
"""
output = """
typeddicts_readonly_inheritance.py:19: error: Overwriting TypedDict field "name" while extending [misc]
Expand Down
4 changes: 2 additions & 2 deletions conformance/results/mypy/typeddicts_readonly_update.toml
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
conformant = "Partial"
notes = """
Incorrectly allows update of ReadOnly item.
Incorrectly rejects update involving an item with Never type.
Incorrectly allows update of `ReadOnly` item.
Incorrectly rejects update involving an item with `Never` type.
"""
output = """
typeddicts_readonly_update.py:34: error: Argument 1 to "update" of "TypedDict" has incompatible type "B"; expected "TypedDict({'x'?=: int, 'y': int})" [typeddict-item]
Expand Down
2 changes: 1 addition & 1 deletion conformance/results/mypy/typeforms_typeform.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
conformant = "Partial"
notes = """
Does not support assigning Union and GenericAlias objects to their runtime types.
Does not support assigning `Union` and `GenericAlias` objects to their runtime types.
"""
conformance_automated = "Fail"
errors_diff = """
Expand Down
2 changes: 1 addition & 1 deletion conformance/results/pycroscope/aliases_typealiastype.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
conformant = "Partial"
notes = """
Rejects valid ParamSpec specialization.
Rejects valid `ParamSpec` specialization.
"""
conformance_automated = "Fail"
errors_diff = """
Expand Down
Loading