Skip to content

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

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 3 commits into from
Aug 14, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 5 additions & 4 deletions .github/workflows/mypy.yml
Original file line number Diff line number Diff line change
Expand Up @@ -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/**"
Expand Down
32 changes: 23 additions & 9 deletions Tools/build/check_warnings.py
Original file line number Diff line number Diff line change
Expand Up @@ -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):
Expand All @@ -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(
Expand All @@ -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.
Expand All @@ -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:
Expand All @@ -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
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand Down
1 change: 1 addition & 0 deletions Tools/build/mypy.ini
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down
Loading