Mercurial > public > mercurial-scm > hg-stable
comparison mercurial/interfaces/modules.py @ 51974:fa7059f031a9
interfaces: introduce and use a protocol class for the `base85` module
See f2832de2a46c for details when this was done for the `bdiff` module.
It looks like PEP-688 removed the special casing of `bytes` being a standin
for any type of `ByteString`, and defines a `typing.Buffer` class (with a
backport in `typing_extensions` for Python prior to 3.12). There's been a lot
of churn in this area with pytype, but recent versions of pytype and PyCharm
recognize this, and e.g. have `mercurial.node.hex()` defined as:
from typing_extensions import Buffer
def hex(data: Buffer, sep: str | bytes = ..., bytes_per_sep: int = ...) -> bytes
This covers `bytes`, `bytearray`, and `memoryview` by default. Both of the C
functions here use `y#` to parse the arguments, which means the arg is a
byte-like object[2], so the args would appear to be better typed as `Buffer`.
However, pytype has a bug that prevents using this from `typing_extensions`[3],
and mypy complained `Unsupported left operand type for + ("memoryview")` in the
pure module on line 37 (meaning it's only a subset of `Buffer`). So hold off on
changing any of that for now.
[1] https://peps.python.org/pep-0688/#no-special-meaning-for-bytes
[2] https://docs.python.org/3/glossary.html#term-bytes-like-object
[3] https://github.com/google/pytype/issues/1772
author | Matt Harbison <matt_harbison@yahoo.com> |
---|---|
date | Fri, 04 Oct 2024 23:21:41 -0400 |
parents | 09f3a6790e56 |
children | 54d9f496f07a |
comparison
equal
deleted
inserted
replaced
51973:936f85b243a8 | 51974:fa7059f031a9 |
---|---|
21 | 21 |
22 BDiffBlocksFnc = Callable[[bytes, bytes], List[BDiffBlock]] | 22 BDiffBlocksFnc = Callable[[bytes, bytes], List[BDiffBlock]] |
23 """The signature of `bdiff.blocks()` and `bdiff.xdiffblocks()`.""" | 23 """The signature of `bdiff.blocks()` and `bdiff.xdiffblocks()`.""" |
24 | 24 |
25 | 25 |
26 class Base85(Protocol): | |
27 """A Protocol class for the various base85 module implementations.""" | |
28 | |
29 def b85encode(self, text: bytes, pad: bool = False) -> bytes: | |
30 """encode text in base85 format""" | |
31 | |
32 def b85decode(self, text: bytes) -> bytes: | |
33 """decode base85-encoded text""" | |
34 | |
35 | |
26 class BDiff(Protocol): | 36 class BDiff(Protocol): |
27 """A Protocol class for the various bdiff module implementations.""" | 37 """A Protocol class for the various bdiff module implementations.""" |
28 | 38 |
29 def splitnewlines(self, text: bytes) -> List[bytes]: | 39 def splitnewlines(self, text: bytes) -> List[bytes]: |
30 """like str.splitlines, but only split on newlines.""" | 40 """like str.splitlines, but only split on newlines.""" |