From 10315e4d74a167a33497fec8af8d42e226a83cf2 Mon Sep 17 00:00:00 2001 From: AlexWaygood Date: Tue, 27 Sep 2022 19:34:23 +0100 Subject: [PATCH 1/3] `mypy_test.py`: Always add dependencies of stubs to the files to test --- tests/mypy_test.py | 30 +++++++++++++++++++++++------- tests/regr_test.py | 11 ++--------- tests/utils.py | 8 ++++++++ 3 files changed, 33 insertions(+), 16 deletions(-) diff --git a/tests/mypy_test.py b/tests/mypy_test.py index 6299e8d01897..4c33a361c15f 100755 --- a/tests/mypy_test.py +++ b/tests/mypy_test.py @@ -21,7 +21,14 @@ from typing_extensions import Annotated, TypeAlias import tomli -from utils import VERSIONS_RE as VERSION_LINE_RE, colored, print_error, print_success_msg, read_dependencies, strip_comments +from utils import ( + VERSIONS_RE as VERSION_LINE_RE, + colored, + get_recursive_requirements, + print_error, + print_success_msg, + strip_comments, +) SUPPORTED_VERSIONS = ["3.11", "3.10", "3.9", "3.8", "3.7"] SUPPORTED_PLATFORMS = ("linux", "win32", "darwin") @@ -263,11 +270,19 @@ def add_third_party_files( return seen_dists.add(distribution) - dependencies = read_dependencies(distribution) + stubs_dir = Path("stubs") + dependencies = get_recursive_requirements(distribution) + for dependency in dependencies: - add_third_party_files(dependency, files, args, configurations, seen_dists) + if dependency in seen_dists: + continue + seen_dists.add(dependency) + files_to_add = sorted((stubs_dir / dependency).rglob("*.pyi")) + files.extend(files_to_add) + for file in files_to_add: + log(args, file, f"included as a dependency of {distribution!r}") - root = Path("stubs", distribution) + root = stubs_dir / distribution for name in os.listdir(root): if name.startswith("."): continue @@ -343,9 +358,10 @@ def test_third_party_stubs(code: int, args: TestConfig) -> TestResults: if not is_probably_stubs_folder(distribution, distribution_path): continue - this_code, checked = test_third_party_distribution(distribution, args) - code = max(code, this_code) - files_checked += checked + if distribution_path in args.filter or any(distribution_path in path.parents for path in args.filter): + this_code, checked = test_third_party_distribution(distribution, args) + code = max(code, this_code) + files_checked += checked return TestResults(code, files_checked) diff --git a/tests/regr_test.py b/tests/regr_test.py index 2bbf4733d78c..fc9f4b135000 100644 --- a/tests/regr_test.py +++ b/tests/regr_test.py @@ -9,7 +9,7 @@ import subprocess import sys import tempfile -from itertools import filterfalse, product +from itertools import product from pathlib import Path from typing_extensions import TypeAlias @@ -17,9 +17,9 @@ PackageInfo, colored, get_all_testcase_directories, + get_recursive_requirements, print_error, print_success_msg, - read_dependencies, testcase_dir_from_package_name, ) @@ -81,13 +81,6 @@ def package_with_test_cases(package_name: str) -> PackageInfo: ) -def get_recursive_requirements(package_name: str, seen: set[str] | None = None) -> list[str]: - seen = seen if seen is not None else {package_name} - for dependency in filterfalse(seen.__contains__, read_dependencies(package_name)): - seen.update(get_recursive_requirements(dependency, seen)) - return sorted(seen | {package_name}) - - def test_testcase_directory(package: PackageInfo, version: str, platform: str) -> ReturnCode: package_name, test_case_directory = package is_stdlib = package_name == "stdlib" diff --git a/tests/utils.py b/tests/utils.py index 5560dd932f61..fa9909729de0 100644 --- a/tests/utils.py +++ b/tests/utils.py @@ -3,6 +3,7 @@ import os import re from functools import cache +from itertools import filterfalse from pathlib import Path from typing import NamedTuple @@ -52,6 +53,13 @@ def read_dependencies(distribution: str) -> tuple[str, ...]: return tuple(dependencies) +def get_recursive_requirements(package_name: str, seen: set[str] | None = None) -> list[str]: + seen = seen if seen is not None else {package_name} + for dependency in filterfalse(seen.__contains__, read_dependencies(package_name)): + seen.update(get_recursive_requirements(dependency, seen)) + return sorted(seen | {package_name}) + + # ==================================================================== # Parsing the stdlib/VERSIONS file # ==================================================================== From 3aac8ba751512f4bd16b945cf4fb9b375fcf9f72 Mon Sep 17 00:00:00 2001 From: Alex Waygood Date: Tue, 27 Sep 2022 19:39:59 +0100 Subject: [PATCH 2/3] Update utils.py --- tests/utils.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tests/utils.py b/tests/utils.py index fa9909729de0..ace504a79682 100644 --- a/tests/utils.py +++ b/tests/utils.py @@ -1,5 +1,7 @@ """Utilities that are imported by multiple scripts in the tests directory.""" +from __future__ import annotations + import os import re from functools import cache From 705f7467716f25e8f97a4906acfe2ccd942ed5ff Mon Sep 17 00:00:00 2001 From: Alex Waygood Date: Wed, 28 Sep 2022 17:12:16 +0100 Subject: [PATCH 3/3] At a hunch --- .github/workflows/tests.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 86bb88f31474..d0113a50a8ed 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -79,7 +79,7 @@ jobs: with: python-version: 3.x - run: pip install -r requirements-tests.txt - - run: ./tests/mypy_test.py --platform=${{ matrix.platform }} --python-version=${{ matrix.python-version }} + - run: python ./tests/mypy_test.py --platform=${{ matrix.platform }} --python-version=${{ matrix.python-version }} regression-tests: name: Run mypy on the test cases