summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlex Waygood <Alex.Waygood@Gmail.com>2023-11-30 23:00:14 (GMT)
committerGitHub <noreply@github.com>2023-11-30 23:00:14 (GMT)
commit674c288b1c29b5d838c0cb6de0ea7a64caf294ff (patch)
tree56f13cc25a91ae2e9863eaf51f0fa87e9320f14a
parent6d5e0dc0e330f4009e8dc3d1642e46b129788877 (diff)
downloadcpython-674c288b1c29b5d838c0cb6de0ea7a64caf294ff.zip
cpython-674c288b1c29b5d838c0cb6de0ea7a64caf294ff.tar.gz
cpython-674c288b1c29b5d838c0cb6de0ea7a64caf294ff.tar.bz2
gh-109413: Run mypy on `libregrtest` in CI (#112558)
Co-authored-by: Hugo van Kemenade <hugovk@users.noreply.github.com>
-rw-r--r--.github/workflows/mypy.yml2
-rw-r--r--Lib/test/libregrtest/cmdline.py4
-rw-r--r--Lib/test/libregrtest/main.py12
-rw-r--r--Lib/test/libregrtest/mypy.ini2
-rw-r--r--Lib/test/libregrtest/refleak.py3
-rw-r--r--Lib/test/libregrtest/results.py2
-rw-r--r--Lib/test/libregrtest/run_workers.py9
-rw-r--r--Lib/test/libregrtest/runtests.py3
-rw-r--r--Lib/test/libregrtest/setup.py3
-rw-r--r--Lib/test/libregrtest/utils.py9
10 files changed, 32 insertions, 17 deletions
diff --git a/.github/workflows/mypy.yml b/.github/workflows/mypy.yml
index 405511c..72ae67a 100644
--- a/.github/workflows/mypy.yml
+++ b/.github/workflows/mypy.yml
@@ -8,6 +8,7 @@ on:
pull_request:
paths:
- ".github/workflows/mypy.yml"
+ - "Lib/test/libregrtest/**"
- "Tools/cases_generator/**"
- "Tools/clinic/**"
- "Tools/peg_generator/**"
@@ -32,6 +33,7 @@ jobs:
strategy:
matrix:
target: [
+ "Lib/test/libregrtest",
"Tools/cases_generator",
"Tools/clinic",
"Tools/peg_generator",
diff --git a/Lib/test/libregrtest/cmdline.py b/Lib/test/libregrtest/cmdline.py
index a5f02d6..0053bce 100644
--- a/Lib/test/libregrtest/cmdline.py
+++ b/Lib/test/libregrtest/cmdline.py
@@ -3,7 +3,7 @@ import os.path
import shlex
import sys
from test.support import os_helper, Py_DEBUG
-from .utils import ALL_RESOURCES, RESOURCE_NAMES
+from .utils import ALL_RESOURCES, RESOURCE_NAMES, TestFilter
USAGE = """\
@@ -161,7 +161,7 @@ class Namespace(argparse.Namespace):
self.forever = False
self.header = False
self.failfast = False
- self.match_tests = []
+ self.match_tests: TestFilter = []
self.pgo = False
self.pgo_extended = False
self.worker_json = None
diff --git a/Lib/test/libregrtest/main.py b/Lib/test/libregrtest/main.py
index 8642894..55fc3a8 100644
--- a/Lib/test/libregrtest/main.py
+++ b/Lib/test/libregrtest/main.py
@@ -295,7 +295,9 @@ class Regrtest:
namespace = dict(locals())
tracer.runctx(cmd, globals=globals(), locals=namespace)
result = namespace['result']
- result.covered_lines = list(tracer.counts)
+ # Mypy doesn't know about this attribute yet,
+ # but it will do soon: https://github.com/python/typeshed/pull/11091
+ result.covered_lines = list(tracer.counts) # type: ignore[attr-defined]
else:
result = run_single_test(test_name, runtests)
@@ -371,7 +373,8 @@ class Regrtest:
os.unlink(self.next_single_filename)
if coverage is not None:
- coverage.write_results(show_missing=True, summary=True,
+ # uses a new-in-Python 3.13 keyword argument that mypy doesn't know about yet:
+ coverage.write_results(show_missing=True, summary=True, # type: ignore[call-arg]
coverdir=self.coverage_dir,
ignore_missing_files=True)
@@ -432,7 +435,10 @@ class Regrtest:
if self.num_workers < 0:
# Use all CPUs + 2 extra worker processes for tests
# that like to sleep
- self.num_workers = (os.process_cpu_count() or 1) + 2
+ #
+ # os.process.cpu_count() is new in Python 3.13;
+ # mypy doesn't know about it yet
+ self.num_workers = (os.process_cpu_count() or 1) + 2 # type: ignore[attr-defined]
# For a partial run, we do not need to clutter the output.
if (self.want_header
diff --git a/Lib/test/libregrtest/mypy.ini b/Lib/test/libregrtest/mypy.ini
index fefc347..331fe68 100644
--- a/Lib/test/libregrtest/mypy.ini
+++ b/Lib/test/libregrtest/mypy.ini
@@ -5,7 +5,7 @@
[mypy]
files = Lib/test/libregrtest
explicit_package_bases = True
-python_version = 3.11
+python_version = 3.12
platform = linux
pretty = True
diff --git a/Lib/test/libregrtest/refleak.py b/Lib/test/libregrtest/refleak.py
index ada1a65..5836a84 100644
--- a/Lib/test/libregrtest/refleak.py
+++ b/Lib/test/libregrtest/refleak.py
@@ -52,7 +52,8 @@ def runtest_refleak(test_name, test_func,
except ImportError:
zdc = None # Run unmodified on platforms without zipimport support
else:
- zdc = zipimport._zip_directory_cache.copy()
+ # private attribute that mypy doesn't know about:
+ zdc = zipimport._zip_directory_cache.copy() # type: ignore[attr-defined]
abcs = {}
for abc in [getattr(collections.abc, a) for a in collections.abc.__all__]:
if not isabstract(abc):
diff --git a/Lib/test/libregrtest/results.py b/Lib/test/libregrtest/results.py
index 71aaef3..59a566c 100644
--- a/Lib/test/libregrtest/results.py
+++ b/Lib/test/libregrtest/results.py
@@ -34,7 +34,7 @@ class TestResults:
self.test_times: list[tuple[float, TestName]] = []
self.stats = TestStats()
# used by --junit-xml
- self.testsuite_xml: list[str] = []
+ self.testsuite_xml: list = []
# used by -T with -j
self.covered_lines: set[Location] = set()
diff --git a/Lib/test/libregrtest/run_workers.py b/Lib/test/libregrtest/run_workers.py
index 99c2cf3..35aaf90 100644
--- a/Lib/test/libregrtest/run_workers.py
+++ b/Lib/test/libregrtest/run_workers.py
@@ -10,7 +10,7 @@ import tempfile
import threading
import time
import traceback
-from typing import Literal, TextIO
+from typing import Any, Literal, TextIO
from test import support
from test.support import os_helper, MS_WINDOWS
@@ -243,7 +243,9 @@ class WorkerThread(threading.Thread):
json_fd = json_tmpfile.fileno()
if MS_WINDOWS:
- json_handle = msvcrt.get_osfhandle(json_fd)
+ # The msvcrt module is only available on Windows;
+ # we run mypy with `--platform=linux` in CI
+ json_handle: int = msvcrt.get_osfhandle(json_fd) # type: ignore[attr-defined]
json_file = JsonFile(json_handle,
JsonFileType.WINDOWS_HANDLE)
else:
@@ -259,7 +261,7 @@ class WorkerThread(threading.Thread):
else:
match_tests = None
- kwargs = {}
+ kwargs: dict[str, Any] = {}
if match_tests:
kwargs['match_tests'] = [(test, True) for test in match_tests]
if self.runtests.output_on_failure:
@@ -345,6 +347,7 @@ class WorkerThread(threading.Thread):
json_file, json_tmpfile = self.create_json_file(stack)
worker_runtests = self.create_worker_runtests(test_name, json_file)
+ retcode: str | int | None
retcode, tmp_files = self.run_tmp_files(worker_runtests,
stdout_file.fileno())
diff --git a/Lib/test/libregrtest/runtests.py b/Lib/test/libregrtest/runtests.py
index ac47c07..b765ba5 100644
--- a/Lib/test/libregrtest/runtests.py
+++ b/Lib/test/libregrtest/runtests.py
@@ -33,7 +33,8 @@ class JsonFile:
popen_kwargs['pass_fds'] = [self.file]
case JsonFileType.WINDOWS_HANDLE:
# Windows handle
- startupinfo = subprocess.STARTUPINFO()
+ # We run mypy with `--platform=linux` so it complains about this:
+ startupinfo = subprocess.STARTUPINFO() # type: ignore[attr-defined]
startupinfo.lpAttributeList = {"handle_list": [self.file]}
popen_kwargs['startupinfo'] = startupinfo
diff --git a/Lib/test/libregrtest/setup.py b/Lib/test/libregrtest/setup.py
index 97edba9..9e97414 100644
--- a/Lib/test/libregrtest/setup.py
+++ b/Lib/test/libregrtest/setup.py
@@ -124,7 +124,8 @@ def setup_tests(runtests: RunTests):
support.LONG_TIMEOUT = min(support.LONG_TIMEOUT, timeout)
if runtests.hunt_refleak:
- unittest.BaseTestSuite._cleanup = False
+ # private attribute that mypy doesn't know about:
+ unittest.BaseTestSuite._cleanup = False # type: ignore[attr-defined]
if runtests.gc_threshold is not None:
gc.set_threshold(runtests.gc_threshold)
diff --git a/Lib/test/libregrtest/utils.py b/Lib/test/libregrtest/utils.py
index e4a28af..d47e938 100644
--- a/Lib/test/libregrtest/utils.py
+++ b/Lib/test/libregrtest/utils.py
@@ -12,7 +12,7 @@ import sys
import sysconfig
import tempfile
import textwrap
-from collections.abc import Callable
+from collections.abc import Callable, Iterable
from test import support
from test.support import os_helper
@@ -547,7 +547,7 @@ def is_cross_compiled():
return ('_PYTHON_HOST_PLATFORM' in os.environ)
-def format_resources(use_resources: tuple[str, ...]):
+def format_resources(use_resources: Iterable[str]):
use_resources = set(use_resources)
all_resources = set(ALL_RESOURCES)
@@ -580,9 +580,10 @@ def display_header(use_resources: tuple[str, ...],
print("== Python build:", ' '.join(get_build_info()))
print("== cwd:", os.getcwd())
- cpu_count = os.cpu_count()
+ cpu_count: object = os.cpu_count()
if cpu_count:
- process_cpu_count = os.process_cpu_count()
+ # The function is new in Python 3.13; mypy doesn't know about it yet:
+ process_cpu_count = os.process_cpu_count() # type: ignore[attr-defined]
if process_cpu_count and process_cpu_count != cpu_count:
cpu_count = f"{process_cpu_count} (process) / {cpu_count} (system)"
print("== CPU count:", cpu_count)