Skip to content

Commit eba639e

Browse files
committed
Rework Inference Rules section
Update conformance tests accordingly Restore the `NamedTuple` section
1 parent d764ec3 commit eba639e

11 files changed

Lines changed: 322 additions & 249 deletions

‎conformance/README.md‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,7 @@ Test cases support the following special comments for declaring where errors sho
6363
* `# E[tag]`, where `tag` is an arbitrary string: must appear multiple times in a file with the same tag.
6464
Exactly one line with this tag must raise an error.
6565
* `# E[tag+]`: like `# E[tag]`, but errors may be raised on multiple lines.
66+
* `# E[tag!]`: like `# E[tag]`, but at least one line must not raise an error.
6667

6768
Each comment may be followed by a colon plus an explanation of the error; the explanation is ignored
6869
by the scoring system.
Lines changed: 44 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -1,51 +1,57 @@
11
conformant = "Partial"
22
notes = """
3+
Infers invalid `Literal` values from `float`.
34
Does not treat use of `Final` name as if it was replaced by the literal in `NamedTuple` definition.
45
Does not allow conditional assignment of `Final` instance variable in `__init__` method.
56
Does not allow redefinition of private class variable that is marked `Final` in parent class.
67
Does not report modification of local `Final` variable via `for` statement.
78
"""
89
output = """
9-
qualifiers_final_annotation.py:23: error: Argument 1 to "expects_one" has incompatible type "int"; expected "Literal[1]" [arg-type]
10-
qualifiers_final_annotation.py:33: error: Type in Final[...] can only be omitted if there is an initializer [misc]
11-
qualifiers_final_annotation.py:35: error: Final[...] takes at most one type argument [misc]
12-
qualifiers_final_annotation.py:51: error: Type in Final[...] can only be omitted if there is an initializer [misc]
13-
qualifiers_final_annotation.py:55: error: Final name must be initialized with a value [misc]
14-
qualifiers_final_annotation.py:71: error: Cannot assign to final attribute "ID5" [misc]
15-
qualifiers_final_annotation.py:76: error: Cannot assign to final attribute "ID6" [misc]
16-
qualifiers_final_annotation.py:79: error: Can only declare a final attribute in class body or __init__ [misc]
17-
qualifiers_final_annotation.py:80: error: Can only declare a final attribute in class body or __init__ [misc]
18-
qualifiers_final_annotation.py:82: error: Cannot assign to final attribute "ID7" [misc]
19-
qualifiers_final_annotation.py:84: error: Cannot assign to final attribute "ID7" [misc]
20-
qualifiers_final_annotation.py:88: error: Cannot assign to final name "RATE" [misc]
21-
qualifiers_final_annotation.py:98: error: Cannot assign to final attribute "DEFAULT_ID" [misc]
22-
qualifiers_final_annotation.py:111: error: Cannot assign to final name "BORDER_WIDTH" [misc]
23-
qualifiers_final_annotation.py:113: error: Cannot assign to final name "__private" [misc]
24-
qualifiers_final_annotation.py:124: error: Final can be only used as an outermost qualifier in a variable annotation [valid-type]
25-
qualifiers_final_annotation.py:125: error: Variable should not be annotated with both ClassVar and Final [misc]
26-
qualifiers_final_annotation.py:135: error: Final can be only used as an outermost qualifier in a variable annotation [valid-type]
27-
qualifiers_final_annotation.py:138: error: Final can be only used as an outermost qualifier in a variable annotation [valid-type]
28-
qualifiers_final_annotation.py:148: error: Final[...] can't be used inside a TypedDict [valid-type]
29-
qualifiers_final_annotation.py:153: error: Final[...] can't be used inside a NamedTuple [valid-type]
30-
qualifiers_final_annotation.py:162: error: Invalid "NamedTuple()" field name [misc]
31-
qualifiers_final_annotation.py:164: error: Unexpected keyword argument "x" for "N" [call-arg]
32-
qualifiers_final_annotation.py:164: error: Unexpected keyword argument "y" for "N" [call-arg]
33-
qualifiers_final_annotation.py:165: error: Unexpected keyword argument "a" for "N" [call-arg]
34-
qualifiers_final_annotation.py:166: error: Unexpected keyword argument "x" for "N" [call-arg]
35-
qualifiers_final_annotation.py:166: error: Unexpected keyword argument "y" for "N" [call-arg]
36-
qualifiers_final_annotation.py:172: error: Cannot assign to final name "ID1" [misc]
37-
qualifiers_final_annotation.py:176: error: Cannot assign to final name "x" [misc]
38-
qualifiers_final_annotation.py:178: error: Cannot assign to final name "x" [misc]
39-
qualifiers_final_annotation.py:183: error: Incompatible types in assignment (expression has type "TextIOWrapper[_WrappedBuffer]", variable has type "int") [assignment]
10+
qualifiers_final_annotation.py:26: error: Expression is of type "Literal[3]", not "int" [assert-type]
11+
qualifiers_final_annotation.py:31: error: Expression is of type "Literal[3.14]", not "float" [assert-type]
12+
qualifiers_final_annotation.py:32: error: Expression is of type "Literal[3.14]", not "float | int" [assert-type]
13+
qualifiers_final_annotation.py:39: error: Type in Final[...] can only be omitted if there is an initializer [misc]
14+
qualifiers_final_annotation.py:41: error: Final[...] takes at most one type argument [misc]
15+
qualifiers_final_annotation.py:57: error: Type in Final[...] can only be omitted if there is an initializer [misc]
16+
qualifiers_final_annotation.py:61: error: Final name must be initialized with a value [misc]
17+
qualifiers_final_annotation.py:77: error: Cannot assign to final attribute "ID5" [misc]
18+
qualifiers_final_annotation.py:82: error: Cannot assign to final attribute "ID6" [misc]
19+
qualifiers_final_annotation.py:85: error: Can only declare a final attribute in class body or __init__ [misc]
20+
qualifiers_final_annotation.py:86: error: Can only declare a final attribute in class body or __init__ [misc]
21+
qualifiers_final_annotation.py:88: error: Cannot assign to final attribute "ID7" [misc]
22+
qualifiers_final_annotation.py:90: error: Cannot assign to final attribute "ID7" [misc]
23+
qualifiers_final_annotation.py:94: error: Cannot assign to final name "RATE" [misc]
24+
qualifiers_final_annotation.py:104: error: Cannot assign to final attribute "DEFAULT_ID" [misc]
25+
qualifiers_final_annotation.py:117: error: Cannot assign to final name "BORDER_WIDTH" [misc]
26+
qualifiers_final_annotation.py:119: error: Cannot assign to final name "__private" [misc]
27+
qualifiers_final_annotation.py:130: error: Final can be only used as an outermost qualifier in a variable annotation [valid-type]
28+
qualifiers_final_annotation.py:131: error: Variable should not be annotated with both ClassVar and Final [misc]
29+
qualifiers_final_annotation.py:141: error: Final can be only used as an outermost qualifier in a variable annotation [valid-type]
30+
qualifiers_final_annotation.py:144: error: Final can be only used as an outermost qualifier in a variable annotation [valid-type]
31+
qualifiers_final_annotation.py:154: error: Final[...] can't be used inside a TypedDict [valid-type]
32+
qualifiers_final_annotation.py:159: error: Final[...] can't be used inside a NamedTuple [valid-type]
33+
qualifiers_final_annotation.py:168: error: Invalid "NamedTuple()" field name [misc]
34+
qualifiers_final_annotation.py:170: error: Unexpected keyword argument "x" for "N" [call-arg]
35+
qualifiers_final_annotation.py:170: error: Unexpected keyword argument "y" for "N" [call-arg]
36+
qualifiers_final_annotation.py:171: error: Unexpected keyword argument "a" for "N" [call-arg]
37+
qualifiers_final_annotation.py:172: error: Unexpected keyword argument "x" for "N" [call-arg]
38+
qualifiers_final_annotation.py:172: error: Unexpected keyword argument "y" for "N" [call-arg]
39+
qualifiers_final_annotation.py:180: error: Cannot assign to final name "ID1" [misc]
40+
qualifiers_final_annotation.py:184: error: Cannot assign to final name "x" [misc]
4041
qualifiers_final_annotation.py:186: error: Cannot assign to final name "x" [misc]
41-
qualifiers_final_annotation.py:197: error: Cannot assign to final name "TEN" [misc]
42-
qualifiers_final_annotation.py:201: error: Cannot assign to final name "PI" [misc]
42+
qualifiers_final_annotation.py:191: error: Incompatible types in assignment (expression has type "TextIOWrapper[_WrappedBuffer]", variable has type "int") [assignment]
43+
qualifiers_final_annotation.py:194: error: Cannot assign to final name "x" [misc]
44+
qualifiers_final_annotation.py:205: error: Cannot assign to final name "TEN" [misc]
45+
qualifiers_final_annotation.py:209: error: Cannot assign to final name "PI" [misc]
4346
"""
4447
conformance_automated = "Fail"
4548
errors_diff = """
46-
Line 180: Expected 1 errors
47-
Line 76: Unexpected errors ['qualifiers_final_annotation.py:76: error: Cannot assign to final attribute "ID6" [misc]']
48-
Line 113: Unexpected errors ['qualifiers_final_annotation.py:113: error: Cannot assign to final name "__private" [misc]']
49-
Line 162: Unexpected errors ['qualifiers_final_annotation.py:162: error: Invalid "NamedTuple()" field name [misc]']
50-
Line 164: Unexpected errors ['qualifiers_final_annotation.py:164: error: Unexpected keyword argument "x" for "N" [call-arg]', 'qualifiers_final_annotation.py:164: error: Unexpected keyword argument "y" for "N" [call-arg]']
49+
Line 188: Expected 1 errors
50+
Lines 31, 32: Expected at least one success (tag 'bare3')
51+
Line 31: Unexpected errors ['qualifiers_final_annotation.py:31: error: Expression is of type "Literal[3.14]", not "float" [assert-type]']
52+
Line 32: Unexpected errors ['qualifiers_final_annotation.py:32: error: Expression is of type "Literal[3.14]", not "float | int" [assert-type]']
53+
Line 82: Unexpected errors ['qualifiers_final_annotation.py:82: error: Cannot assign to final attribute "ID6" [misc]']
54+
Line 119: Unexpected errors ['qualifiers_final_annotation.py:119: error: Cannot assign to final name "__private" [misc]']
55+
Line 168: Unexpected errors ['qualifiers_final_annotation.py:168: error: Invalid "NamedTuple()" field name [misc]']
56+
Line 170: Unexpected errors ['qualifiers_final_annotation.py:170: error: Unexpected keyword argument "x" for "N" [call-arg]', 'qualifiers_final_annotation.py:170: error: Unexpected keyword argument "y" for "N" [call-arg]']
5157
"""
Lines changed: 43 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -1,37 +1,47 @@
1-
conformance_automated = "Pass"
1+
conformance = "Partial"
2+
notes = """
3+
Infers invalid `Literal` values from `float` and `range`.
4+
"""
5+
conformance_automated = "Fail"
26
errors_diff = """
7+
Lines 31, 32: Expected at least one success (tag 'bare3')
8+
Line 31: Unexpected errors ['./qualifiers_final_annotation.py:31:12: Literal[3.14] is not equivalent to float | int']
9+
Line 32: Unexpected errors ['./qualifiers_final_annotation.py:32:12: Literal[3.14] is not equivalent to float | int']
10+
Line 35: Unexpected errors ['./qualifiers_final_annotation.py:35:12: Literal[range(0, 3)] is not equivalent to range']
311
"""
412
output = """
5-
./qualifiers_final_annotation.py:23:12: Incompatible argument type for x: expected Literal[1] but got int [incompatible_argument]
6-
./qualifiers_final_annotation.py:29:12: Literal[range(0, 1)] is not equivalent to range
7-
./qualifiers_final_annotation.py:33:6: Final annotation without assignment requires an explicit type [invalid_qualifier]
8-
./qualifiers_final_annotation.py:35:6: Invalid type annotation (<class 'str'>, <class 'int'>) [invalid_annotation]
9-
./qualifiers_final_annotation.py:51:9: Final annotation without assignment requires an explicit type [invalid_qualifier]
10-
./qualifiers_final_annotation.py:51:4: Final class attributes without initializers must be assigned in __init__ [invalid_qualifier]
11-
./qualifiers_final_annotation.py:55:4: Final class attributes without initializers must be assigned in __init__ [invalid_qualifier]
12-
./qualifiers_final_annotation.py:71:8: Cannot assign to final name ID5 [incompatible_assignment]
13-
./qualifiers_final_annotation.py:79:18: Final instance attributes may be declared only in __init__ [invalid_qualifier]
14-
./qualifiers_final_annotation.py:80:18: Final instance attributes may be declared only in __init__ [invalid_qualifier]
15-
./qualifiers_final_annotation.py:82:8: Cannot assign to final name ID7 [incompatible_assignment]
16-
./qualifiers_final_annotation.py:84:8: Cannot assign to final name ID7 [incompatible_assignment]
17-
./qualifiers_final_annotation.py:88:0: Cannot assign to final name RATE [incompatible_assignment]
18-
./qualifiers_final_annotation.py:98:0: Cannot assign to final name DEFAULT_ID [incompatible_assignment]
19-
./qualifiers_final_annotation.py:111:4: Cannot override final attribute BORDER_WIDTH [incompatible_override]
20-
./qualifiers_final_annotation.py:124:12: Final cannot be combined with ClassVar [invalid_qualifier]
21-
./qualifiers_final_annotation.py:125:12: Final cannot be combined with ClassVar [invalid_qualifier]
22-
./qualifiers_final_annotation.py:135:3: Unrecognized annotation typing.Final[<class 'int'>] [invalid_annotation]
23-
./qualifiers_final_annotation.py:138:13: Unexpected Final annotation [invalid_qualifier]
24-
./qualifiers_final_annotation.py:148:7: Unexpected Final annotation [invalid_qualifier]
25-
./qualifiers_final_annotation.py:153:4: Final class attributes without initializers must be assigned in __init__ [invalid_qualifier]
26-
./qualifiers_final_annotation.py:165:0: In call to pycroscope.signature.N: Missing required argument 'x' [incompatible_call]
27-
./qualifiers_final_annotation.py:166:4: Incompatible argument type for x: expected int but got Literal[''] [incompatible_argument]
28-
./qualifiers_final_annotation.py:166:10: Incompatible argument type for y: expected int but got Literal[''] [incompatible_argument]
29-
./qualifiers_final_annotation.py:172:4: Cannot assign to final name ID1 [incompatible_assignment]
30-
./qualifiers_final_annotation.py:176:4: Cannot assign to final name x [incompatible_assignment]
31-
./qualifiers_final_annotation.py:178:9: Cannot assign to final name x [incompatible_assignment]
32-
./qualifiers_final_annotation.py:180:8: Cannot assign to final name x [incompatible_assignment]
33-
./qualifiers_final_annotation.py:183:29: Cannot assign to final name x [incompatible_assignment]
34-
./qualifiers_final_annotation.py:186:8: Cannot assign to final name x [incompatible_assignment]
35-
./qualifiers_final_annotation.py:197:0: Cannot assign to final name TEN [incompatible_assignment]
36-
./qualifiers_final_annotation.py:201:0: Cannot assign to final name PI [incompatible_assignment]
13+
./qualifiers_final_annotation.py:26:12: Literal[3] is not equivalent to int
14+
./qualifiers_final_annotation.py:31:12: Literal[3.14] is not equivalent to float | int
15+
./qualifiers_final_annotation.py:32:12: Literal[3.14] is not equivalent to float | int
16+
./qualifiers_final_annotation.py:35:12: Literal[range(0, 3)] is not equivalent to range
17+
./qualifiers_final_annotation.py:39:6: Final annotation without assignment requires an explicit type [invalid_qualifier]
18+
./qualifiers_final_annotation.py:41:6: Invalid type annotation (<class 'str'>, <class 'int'>) [invalid_annotation]
19+
./qualifiers_final_annotation.py:57:9: Final annotation without assignment requires an explicit type [invalid_qualifier]
20+
./qualifiers_final_annotation.py:57:4: Final class attributes without initializers must be assigned in __init__ [invalid_qualifier]
21+
./qualifiers_final_annotation.py:61:4: Final class attributes without initializers must be assigned in __init__ [invalid_qualifier]
22+
./qualifiers_final_annotation.py:77:8: Cannot assign to final name ID5 [incompatible_assignment]
23+
./qualifiers_final_annotation.py:85:18: Final instance attributes may be declared only in __init__ [invalid_qualifier]
24+
./qualifiers_final_annotation.py:86:18: Final instance attributes may be declared only in __init__ [invalid_qualifier]
25+
./qualifiers_final_annotation.py:88:8: Cannot assign to final name ID7 [incompatible_assignment]
26+
./qualifiers_final_annotation.py:90:8: Cannot assign to final name ID7 [incompatible_assignment]
27+
./qualifiers_final_annotation.py:94:0: Cannot assign to final name RATE [incompatible_assignment]
28+
./qualifiers_final_annotation.py:104:0: Cannot assign to final name DEFAULT_ID [incompatible_assignment]
29+
./qualifiers_final_annotation.py:117:4: Cannot override final attribute BORDER_WIDTH [incompatible_override]
30+
./qualifiers_final_annotation.py:130:12: Final cannot be combined with ClassVar [invalid_qualifier]
31+
./qualifiers_final_annotation.py:131:12: Final cannot be combined with ClassVar [invalid_qualifier]
32+
./qualifiers_final_annotation.py:141:3: Unrecognized annotation typing.Final[<class 'int'>] [invalid_annotation]
33+
./qualifiers_final_annotation.py:144:13: Unexpected Final annotation [invalid_qualifier]
34+
./qualifiers_final_annotation.py:154:7: Unexpected Final annotation [invalid_qualifier]
35+
./qualifiers_final_annotation.py:159:4: Final class attributes without initializers must be assigned in __init__ [invalid_qualifier]
36+
./qualifiers_final_annotation.py:171:0: In call to pycroscope.signature.N: Missing required argument 'x' [incompatible_call]
37+
./qualifiers_final_annotation.py:172:4: Incompatible argument type for x: expected int but got Literal[''] [incompatible_argument]
38+
./qualifiers_final_annotation.py:172:10: Incompatible argument type for y: expected int but got Literal[''] [incompatible_argument]
39+
./qualifiers_final_annotation.py:180:4: Cannot assign to final name ID1 [incompatible_assignment]
40+
./qualifiers_final_annotation.py:184:4: Cannot assign to final name x [incompatible_assignment]
41+
./qualifiers_final_annotation.py:186:9: Cannot assign to final name x [incompatible_assignment]
42+
./qualifiers_final_annotation.py:188:8: Cannot assign to final name x [incompatible_assignment]
43+
./qualifiers_final_annotation.py:191:29: Cannot assign to final name x [incompatible_assignment]
44+
./qualifiers_final_annotation.py:194:8: Cannot assign to final name x [incompatible_assignment]
45+
./qualifiers_final_annotation.py:205:0: Cannot assign to final name TEN [incompatible_assignment]
46+
./qualifiers_final_annotation.py:209:0: Cannot assign to final name PI [incompatible_assignment]
3747
"""

0 commit comments

Comments
 (0)