https://github.com/python/cpython/commit/04377a1bd161d2d05ef28a1988a2b61d79245fae
commit: 04377a1bd161d2d05ef28a1988a2b61d79245fae
branch: main
author: sobolevn <[email protected]>
committer: sobolevn <[email protected]>
date: 2025-08-14T16:58:02+03:00
summary:

gh-133403: Run `mypy` on `Tools/build/check_warnings.py` (#137700)

files:
M .github/workflows/mypy.yml
M Tools/build/check_warnings.py
M Tools/build/mypy.ini

diff --git a/.github/workflows/mypy.yml b/.github/workflows/mypy.yml
index 0413d5f905d771..5d5d77f29f6eb1 100644
--- a/.github/workflows/mypy.yml
+++ b/.github/workflows/mypy.yml
@@ -13,16 +13,17 @@ on:
       - "Lib/test/libregrtest/**"
       - "Lib/tomllib/**"
       - "Misc/mypy/**"
-      - "Tools/build/mypy.ini"
       - "Tools/build/check_extension_modules.py"
+      - "Tools/build/check_warnings.py"
       - "Tools/build/compute-changes.py"
       - "Tools/build/deepfreeze.py"
+      - "Tools/build/generate-build-details.py"
       - "Tools/build/generate_sbom.py"
       - "Tools/build/generate_stdlib_module_names.py"
-      - "Tools/build/generate-build-details.py"
-      - "Tools/build/verify_ensurepip_wheels.py"
-      - "Tools/build/update_file.py"
+      - "Tools/build/mypy.ini"
       - "Tools/build/umarshal.py"
+      - "Tools/build/update_file.py"
+      - "Tools/build/verify_ensurepip_wheels.py"
       - "Tools/cases_generator/**"
       - "Tools/clinic/**"
       - "Tools/jit/**"
diff --git a/Tools/build/check_warnings.py b/Tools/build/check_warnings.py
index 3f49d8e7f2ee48..44ccf9708ad72f 100644
--- a/Tools/build/check_warnings.py
+++ b/Tools/build/check_warnings.py
@@ -8,21 +8,29 @@
 import sys
 from collections import defaultdict
 from pathlib import Path
-from typing import NamedTuple
+from typing import NamedTuple, TypedDict
 
 
 class IgnoreRule(NamedTuple):
     file_path: str
-    count: int
+    count: int  # type: ignore[assignment]
     ignore_all: bool = False
     is_directory: bool = False
 
 
+class CompileWarning(TypedDict):
+    file: str
+    line: str
+    column: str
+    message: str
+    option: str
+
+
 def parse_warning_ignore_file(file_path: str) -> set[IgnoreRule]:
     """
     Parses the warning ignore file and returns a set of IgnoreRules
     """
-    files_with_expected_warnings = set()
+    files_with_expected_warnings: set[IgnoreRule] = set()
     with Path(file_path).open(encoding="UTF-8") as ignore_rules_file:
         files_with_expected_warnings = set()
         for i, line in enumerate(ignore_rules_file):
@@ -46,7 +54,7 @@ def parse_warning_ignore_file(file_path: str) -> 
set[IgnoreRule]:
                         )
                         sys.exit(1)
                     if ignore_all:
-                        count = 0
+                        count = "0"
 
                     files_with_expected_warnings.add(
                         IgnoreRule(
@@ -61,7 +69,7 @@ def extract_warnings_from_compiler_output(
     compiler_output: str,
     compiler_output_type: str,
     path_prefix: str = "",
-) -> list[dict]:
+) -> list[CompileWarning]:
     """
     Extracts warnings from the compiler output based on compiler
     output type. Removes path prefix from file paths if provided.
@@ -78,8 +86,12 @@ def extract_warnings_from_compiler_output(
             r"(?P<file>.*):(?P<line>\d+):(?P<column>\d+): warning: "
             r"(?P<message>.*) (?P<option>\[-[^\]]+\])$"
         )
+    else:
+        raise RuntimeError(
+            f"Unsupported compiler output type: {compiler_output_type}",
+        )
     compiled_regex = re.compile(regex_pattern)
-    compiler_warnings = []
+    compiler_warnings: list[CompileWarning] = []
     for i, line in enumerate(compiler_output.splitlines(), start=1):
         if match := compiled_regex.match(line):
             try:
@@ -100,7 +112,9 @@ def extract_warnings_from_compiler_output(
     return compiler_warnings
 
 
-def get_warnings_by_file(warnings: list[dict]) -> dict[str, list[dict]]:
+def get_warnings_by_file(
+    warnings: list[CompileWarning],
+) -> dict[str, list[CompileWarning]]:
     """
     Returns a dictionary where the key is the file and the data is the
     warnings in that file. Does not include duplicate warnings for a
@@ -138,7 +152,7 @@ def is_file_ignored(
 
 def get_unexpected_warnings(
     ignore_rules: set[IgnoreRule],
-    files_with_warnings: set[IgnoreRule],
+    files_with_warnings: dict[str, list[CompileWarning]],
 ) -> int:
     """
     Returns failure status if warnings discovered in list of warnings
@@ -180,7 +194,7 @@ def get_unexpected_warnings(
 
 def get_unexpected_improvements(
     ignore_rules: set[IgnoreRule],
-    files_with_warnings: set[IgnoreRule],
+    files_with_warnings: dict[str, list[CompileWarning]],
 ) -> int:
     """
     Returns failure status if the number of warnings for a file is greater
diff --git a/Tools/build/mypy.ini b/Tools/build/mypy.ini
index 2abb21e51f1cf8..331bada6f47d2e 100644
--- a/Tools/build/mypy.ini
+++ b/Tools/build/mypy.ini
@@ -4,6 +4,7 @@
 # .github/workflows/mypy.yml
 files =
     Tools/build/check_extension_modules.py,
+    Tools/build/check_warnings.py,
     Tools/build/compute-changes.py,
     Tools/build/deepfreeze.py,
     Tools/build/generate-build-details.py,

_______________________________________________
Python-checkins mailing list -- [email protected]
To unsubscribe send an email to [email protected]
https://mail.python.org/mailman3//lists/python-checkins.python.org
Member address: [email protected]

Reply via email to