typing: lock in the new type annotations detected with the pyupgrade changes
After the changes culminating in 70a75d379daf, pytype was able to detect these
types better (typically changing from something like `Generator[Any, Any, None]`
to `Generator[bytes, Any, None]`). Let's make these explicit so they don't
disappear because of other changes.
--- a/hgext/git/manifest.py Wed Jan 15 06:56:44 2025 +0100
+++ b/hgext/git/manifest.py Mon Jan 06 20:02:17 2025 -0500
@@ -277,7 +277,7 @@
) -> tuple[ByteString, ByteString]:
raise NotImplementedError # TODO: implement this
- def _walkonetree(self, tree, match, subdir):
+ def _walkonetree(self, tree, match, subdir) -> Iterator[bytes]:
for te in tree:
# TODO: can we prune dir walks with the matcher?
realname = subdir + pycompat.fsencode(te.name)
--- a/mercurial/bundle2.py Wed Jan 15 06:56:44 2025 +0100
+++ b/mercurial/bundle2.py Mon Jan 06 20:02:17 2025 -0500
@@ -186,6 +186,7 @@
if typing.TYPE_CHECKING:
from typing import (
Dict,
+ Iterator,
List,
Optional,
Tuple,
@@ -739,7 +740,7 @@
return part
# methods used to generate the bundle2 stream
- def getchunks(self):
+ def getchunks(self) -> Iterator[bytes]:
if self.ui.debugflag:
msg = [b'bundle2-output-bundle: "%s",' % self._magicstring]
if self._params:
--- a/mercurial/patch.py Wed Jan 15 06:56:44 2025 +0100
+++ b/mercurial/patch.py Mon Jan 06 20:02:17 2025 -0500
@@ -14,6 +14,7 @@
import os
import re
import shutil
+import typing
import zlib
from .i18n import _
@@ -44,6 +45,12 @@
stringutil,
)
+if typing.TYPE_CHECKING:
+ from typing import (
+ Any,
+ Iterator,
+ )
+
stringio = util.stringio
gitre = re.compile(br'diff --git a/(.*) b/(.*)')
@@ -2792,7 +2799,9 @@
nextisnewline = True
-def difflabel(func, *args, **kw):
+# TODO: first tuple element is likely bytes, but was being detected as bytes|int
+# so it needs investigation/more typing here.
+def difflabel(func, *args, **kw) -> Iterator[tuple[Any, bytes]]:
'''yields 2-tuples of (output, label) based on the output of func()'''
if kw.get('opts') and kw['opts'].worddiff:
dodiffhunk = diffsinglehunkinline
--- a/mercurial/streamclone.py Wed Jan 15 06:56:44 2025 +0100
+++ b/mercurial/streamclone.py Mon Jan 06 20:02:17 2025 -0500
@@ -12,7 +12,7 @@
import os
import struct
-from typing import Optional
+from typing import Iterator, Optional
from .i18n import _
from .interfaces import repository
@@ -308,7 +308,7 @@
return len(entries), total_bytes, emitrevlogdata()
-def generatev1wireproto(repo):
+def generatev1wireproto(repo) -> Iterator[bytes]:
"""Emit content for version 1 of streaming clone suitable for the wire.
This is the data output from ``generatev1()`` with 2 header lines. The
--- a/mercurial/utils/cborutil.py Wed Jan 15 06:56:44 2025 +0100
+++ b/mercurial/utils/cborutil.py Mon Jan 06 20:02:17 2025 -0500
@@ -8,7 +8,12 @@
from __future__ import annotations
import struct
+import typing
+if typing.TYPE_CHECKING:
+ from typing import (
+ Iterator,
+ )
# Very short very of RFC 7049...
#
@@ -131,7 +136,7 @@
yield encodelength(MAJOR_TYPE_NEGINT, abs(v) - 1)
-def streamencodearray(l):
+def streamencodearray(l) -> Iterator[bytes]:
"""Encode a known size iterable to an array."""
yield encodelength(MAJOR_TYPE_ARRAY, len(l))
@@ -140,7 +145,7 @@
yield from streamencode(i)
-def streamencodearrayfromiter(it):
+def streamencodearrayfromiter(it) -> Iterator[bytes]:
"""Encode an iterator of items to an indefinite length array."""
yield BEGIN_INDEFINITE_ARRAY
@@ -163,7 +168,7 @@
yield from streamencodearray(sorted(s, key=_mixedtypesortkey))
-def streamencodemap(d):
+def streamencodemap(d) -> Iterator[bytes]:
"""Encode dictionary to a generator.
Does not supporting indefinite length dictionaries.
@@ -175,7 +180,7 @@
yield from streamencode(value)
-def streamencodemapfromiter(it):
+def streamencodemapfromiter(it) -> Iterator[bytes]:
"""Given an iterable of (key, value), encode to an indefinite length map."""
yield BEGIN_INDEFINITE_MAP
--- a/mercurial/utils/stringutil.py Wed Jan 15 06:56:44 2025 +0100
+++ b/mercurial/utils/stringutil.py Mon Jan 06 20:02:17 2025 -0500
@@ -17,6 +17,7 @@
import typing
from typing import (
+ Iterator,
Optional,
overload,
)
@@ -72,7 +73,9 @@
return b''.join(pprintgen(o, bprefix=bprefix, indent=indent, level=level))
-def pprintgen(o, bprefix: bool = False, indent: int = 0, level: int = 0):
+def pprintgen(
+ o, bprefix: bool = False, indent: int = 0, level: int = 0
+) -> Iterator[bytes]:
"""Pretty print an object to a generator of atoms.
``bprefix`` is a flag influencing whether bytestrings are preferred with