gh-133403: Type Tools/build/update_file.py and check it with mypy (#133404)

This commit is contained in:
sobolevn 2025-05-07 22:11:04 +03:00 committed by GitHub
parent a054af6edd
commit 50b52cba2d
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 26 additions and 4 deletions

View file

@ -1,7 +1,9 @@
[mypy]
files =
Tools/build/compute-changes.py,
Tools/build/generate_sbom.py
Tools/build/generate_sbom.py,
Tools/build/update_file.py
pretty = True
# Make sure Python can still be built
@ -10,6 +12,8 @@ python_version = 3.10
# ...And be strict:
strict = True
strict_bytes = True
local_partial_types = True
extra_checks = True
enable_error_code = ignore-without-code,redundant-expr,truthy-bool,possibly-undefined
warn_unreachable = True

View file

@ -6,14 +6,27 @@ This avoids wholesale rebuilds when a code (re)generation phase does not
actually change the in-tree generated code.
"""
from __future__ import annotations
import contextlib
import os
import os.path
import sys
TYPE_CHECKING = False
if TYPE_CHECKING:
import typing
from collections.abc import Iterator
from io import TextIOWrapper
_Outcome: typing.TypeAlias = typing.Literal['created', 'updated', 'same']
@contextlib.contextmanager
def updating_file_with_tmpfile(filename, tmpfile=None):
def updating_file_with_tmpfile(
filename: str,
tmpfile: str | None = None,
) -> Iterator[tuple[TextIOWrapper, TextIOWrapper]]:
"""A context manager for updating a file via a temp file.
The context manager provides two open files: the source file open
@ -46,13 +59,18 @@ def updating_file_with_tmpfile(filename, tmpfile=None):
update_file_with_tmpfile(filename, tmpfile)
def update_file_with_tmpfile(filename, tmpfile, *, create=False):
def update_file_with_tmpfile(
filename: str,
tmpfile: str,
*,
create: bool = False,
) -> _Outcome:
try:
targetfile = open(filename, 'rb')
except FileNotFoundError:
if not create:
raise # re-raise
outcome = 'created'
outcome: _Outcome = 'created'
os.replace(tmpfile, filename)
else:
with targetfile: