- "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/**"
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):
)
sys.exit(1)
if ignore_all:
- count = 0
+ count = "0"
files_with_expected_warnings.add(
IgnoreRule(
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.
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:
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
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
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