Skip to content

Commit b36d8cf

Browse files
authored
stubtest: use VERSIONS for submodules (#12083)
Closes #12062 Addresses feedback in #12066
1 parent e285203 commit b36d8cf

File tree

2 files changed

+26
-11
lines changed

2 files changed

+26
-11
lines changed

mypy/stubtest.py

Lines changed: 17 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1107,19 +1107,27 @@ def get_stub(module: str) -> Optional[nodes.MypyFile]:
11071107
return _all_stubs.get(module)
11081108

11091109

1110-
def get_typeshed_stdlib_modules(custom_typeshed_dir: Optional[str]) -> List[str]:
1110+
def get_typeshed_stdlib_modules(
1111+
custom_typeshed_dir: Optional[str],
1112+
version_info: Optional[Tuple[int, int]] = None
1113+
) -> List[str]:
11111114
"""Returns a list of stdlib modules in typeshed (for current Python version)."""
11121115
stdlib_py_versions = mypy.modulefinder.load_stdlib_py_versions(custom_typeshed_dir)
1113-
packages = set()
1116+
if version_info is None:
1117+
version_info = sys.version_info[0:2]
11141118
# Typeshed's minimum supported Python 3 is Python 3.6
11151119
if sys.version_info < (3, 6):
11161120
version_info = (3, 6)
1117-
else:
1118-
version_info = sys.version_info[0:2]
1119-
for module, versions in stdlib_py_versions.items():
1120-
minver, maxver = versions
1121-
if version_info >= minver and (maxver is None or version_info <= maxver):
1122-
packages.add(module)
1121+
1122+
def exists_in_version(module: str) -> bool:
1123+
assert version_info is not None
1124+
parts = module.split(".")
1125+
for i in range(len(parts), 0, -1):
1126+
current_module = ".".join(parts[:i])
1127+
if current_module in stdlib_py_versions:
1128+
minver, maxver = stdlib_py_versions[current_module]
1129+
return version_info >= minver and (maxver is None or version_info <= maxver)
1130+
return False
11231131

11241132
if custom_typeshed_dir:
11251133
typeshed_dir = Path(custom_typeshed_dir)
@@ -1132,7 +1140,7 @@ def get_typeshed_stdlib_modules(custom_typeshed_dir: Optional[str]) -> List[str]
11321140
if path.stem == "__init__":
11331141
path = path.parent
11341142
module = ".".join(path.relative_to(stdlib_dir).parts[:-1] + (path.stem,))
1135-
if module.split(".")[0] in packages:
1143+
if exists_in_version(module):
11361144
modules.append(module)
11371145
return sorted(modules)
11381146

mypy/test/teststubtest.py

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -983,12 +983,19 @@ def test_missing_stubs(self) -> None:
983983
assert "error: not_a_module failed to find stubs" in remove_color_code(output.getvalue())
984984

985985
def test_get_typeshed_stdlib_modules(self) -> None:
986-
stdlib = mypy.stubtest.get_typeshed_stdlib_modules(None)
986+
stdlib = mypy.stubtest.get_typeshed_stdlib_modules(None, (3, 6))
987987
assert "builtins" in stdlib
988988
assert "os" in stdlib
989989
assert "os.path" in stdlib
990990
assert "asyncio" in stdlib
991-
assert ("dataclasses" in stdlib) == (sys.version_info >= (3, 7))
991+
assert "graphlib" not in stdlib
992+
assert "formatter" in stdlib
993+
assert "importlib.metadata" not in stdlib
994+
995+
stdlib = mypy.stubtest.get_typeshed_stdlib_modules(None, (3, 10))
996+
assert "graphlib" in stdlib
997+
assert "formatter" not in stdlib
998+
assert "importlib.metadata" in stdlib
992999

9931000
def test_signature(self) -> None:
9941001
def f(a: int, b: int, *, c: int, d: int = 0, **kwargs: Any) -> None:

0 commit comments

Comments
 (0)