Skip to content

Commit c683ae3

Browse files
committed
Targetted flag reset approach for error code tests
Reloading module did not work for mypyc, switch ErrorCode.enabled reset TypeCheckSuite.run_test_case now checks for flags on enable_error_code and disable_error_code, iterating through the resulting codes and resetting each's enabled attribute based on default_enabled
1 parent 1763fa8 commit c683ae3

File tree

5 files changed

+59
-52
lines changed

5 files changed

+59
-52
lines changed

mypy/errorcodes.py

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,11 +14,15 @@
1414

1515

1616
class ErrorCode:
17-
def __init__(self, code: str, description: str, category: str, enabled: bool = True) -> None:
17+
def __init__(self, code: str,
18+
description: str,
19+
category: str,
20+
default_enabled: bool = True) -> None:
1821
self.code = code
1922
self.description = description
2023
self.category = category
21-
self.enabled = enabled
24+
self.default_enabled = default_enabled
25+
self.enabled = default_enabled
2226
error_codes[code] = self
2327

2428
def __str__(self) -> str:

mypy/main.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
from mypy.find_sources import create_source_list, InvalidSourceList
1919
from mypy.fscache import FileSystemCache
2020
from mypy.errors import CompileError
21-
from mypy import errorcodes
21+
from mypy.errorcodes import error_codes
2222
from mypy.options import Options, BuildType
2323
from mypy.config_parser import parse_version, parse_config_file
2424
from mypy.split_namespace import SplitNamespace
@@ -1017,7 +1017,7 @@ def process_error_codes(codes: Iterable[str], enable: bool) -> List[str]:
10171017

10181018
# process globally disabled error codes
10191019
for code in codes:
1020-
as_code = errorcodes.error_codes.get(code)
1020+
as_code = error_codes.get(code)
10211021
if not as_code:
10221022
invalid_error_codes.append(code)
10231023
continue

mypy/test/testcheck.py

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
"""Type checker test cases"""
22

3-
import importlib
43
import os
54
import re
65
import sys
@@ -55,7 +54,6 @@
5554
'check-type-promotion.test',
5655
'check-semanal-error.test',
5756
'check-flags.test',
58-
'check-errorcode-flags.test',
5957
'check-incremental.test',
6058
'check-serialize.test',
6159
'check-bound.test',
@@ -258,8 +256,12 @@ def run_case_once(self, testcase: DataDrivenTestCase,
258256

259257
# Post run cleanup step to reset the state of the ErrorCodes that may
260258
# have been enabled or disabled by flags
261-
if 'errorcode-flags' in testcase.file:
262-
importlib.reload(errorcodes)
259+
if options.disable_error_code or options.enable_error_code:
260+
altered_error_codes = set(
261+
options.disable_error_code).union(set(options.enable_error_code))
262+
for code in altered_error_codes:
263+
error_code = errorcodes.error_codes[code]
264+
error_code.enabled = error_code.default_enabled
263265

264266
def verify_cache(self, module_data: List[Tuple[str, str, str]], a: List[str],
265267
manager: build.BuildManager, graph: Graph) -> None:

test-data/unit/check-errorcode-flags.test

Lines changed: 0 additions & 44 deletions
This file was deleted.

test-data/unit/check-flags.test

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1501,3 +1501,48 @@ class ShouldNotBeFine(x): ... # E: Class cannot subclass 'x' (has type 'Any')
15011501
disallow_subclassing_any = True
15021502
\[mypy-m]
15031503
disallow_subclassing_any = False
1504+
1505+
[case testDisableErrorCode]
1506+
# flags: --disable-error-code attr-defined
1507+
x = 'should be fine'
1508+
x.trim()
1509+
1510+
[case testDisableDifferentErrorCode]
1511+
# flags: --disable-error-code name-defined --show-error-code
1512+
x = 'should not be fine'
1513+
x.trim() # E: "str" has no attribute "trim" [attr-defined]
1514+
1515+
[case testDisableMultipleErrorCode]
1516+
# flags: --disable-error-code attr-defined --disable-error-code return-value --show-error-code
1517+
x = 'should be fine'
1518+
x.trim()
1519+
1520+
def bad_return_type() -> str:
1521+
return None
1522+
1523+
bad_return_type('no args taken!') # E: Too many arguments for "bad_return_type" [call-arg]
1524+
1525+
[case testEnableErrorCode]
1526+
# flags: --disable-error-code attr-defined --enable-error-code attr-defined --show-error-code
1527+
x = 'should be fine'
1528+
x.trim() # E: "str" has no attribute "trim" [attr-defined]
1529+
1530+
[case testEnableDifferentErrorCode]
1531+
# flags: --disable-error-code attr-defined --enable-error-code name-defined --show-error-code
1532+
x = 'should not be fine'
1533+
x.trim() # E: "str" has no attribute "trim" [attr-defined]
1534+
1535+
[case testEnableMultipleErrorCode]
1536+
# flags: \
1537+
--disable-error-code attr-defined \
1538+
--disable-error-code return-value \
1539+
--disable-error-code call-arg \
1540+
--enable-error-code attr-defined \
1541+
--enable-error-code return-value --show-error-code
1542+
x = 'should be fine'
1543+
x.trim() # E: "str" has no attribute "trim" [attr-defined]
1544+
1545+
def bad_return_type() -> str:
1546+
return None # E: Incompatible return value type (got "None", expected "str") [return-value]
1547+
1548+
bad_return_type('no args taken!')

0 commit comments

Comments
 (0)