]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
[3.13] gh-133403: Type `Tools/build/update_file.py` and check it with `mypy` (GH...
authorsobolevn <mail@sobolevn.me>
Thu, 8 May 2025 06:59:04 +0000 (09:59 +0300)
committerGitHub <noreply@github.com>
Thu, 8 May 2025 06:59:04 +0000 (06:59 +0000)
(cherry picked from commit 50b52cba2d13a1854bc835412ac3f3c0ad42b5ba)

Tools/build/mypy.ini
Tools/build/update_file.py

index 0e5d6e874a72e576c63dbb76e6fecbd9aacccd9a..db546c6fb3481c621e248d14b47ec2cb11c6d8c2 100644 (file)
@@ -1,5 +1,9 @@
 [mypy]
-files = Tools/build/generate_sbom.py
+files =
+    Tools/build/compute-changes.py,
+    Tools/build/generate_sbom.py,
+    Tools/build/update_file.py
+
 pretty = True
 
 # Make sure Python can still be built
@@ -8,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
index b4182c1d0cb63889d445395765ce8c549ab8e220..b4a5fb6e778ae8c14dc9c740ae49aaf1fd62b6af 100644 (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: