From 219293affb523f8c6be9f89d5d3f5530353825ed Mon Sep 17 00:00:00 2001 From: Rogdham Date: Sat, 24 May 2025 11:44:08 +0200 Subject: [PATCH 01/14] Python 3.14: PEP-784 compression.zstd --- stdlib/@tests/stubtest_allowlists/py314.txt | 1 - stdlib/VERSIONS | 1 + stdlib/_zstd.pyi | 88 +++++++++++++++++ stdlib/compression/zstd/__init__.pyi | 89 +++++++++++++++++ stdlib/compression/zstd/_zstdfile.pyi | 102 ++++++++++++++++++++ 5 files changed, 280 insertions(+), 1 deletion(-) create mode 100644 stdlib/_zstd.pyi create mode 100644 stdlib/compression/zstd/__init__.pyi create mode 100644 stdlib/compression/zstd/_zstdfile.pyi diff --git a/stdlib/@tests/stubtest_allowlists/py314.txt b/stdlib/@tests/stubtest_allowlists/py314.txt index 6484bbcda731..235282c7ff70 100644 --- a/stdlib/@tests/stubtest_allowlists/py314.txt +++ b/stdlib/@tests/stubtest_allowlists/py314.txt @@ -26,7 +26,6 @@ compression.gzip.GzipFile.readinto compression.gzip.GzipFile.readinto1 compression.gzip.GzipFile.readinto1 compression.gzip.compress -compression.zstd ctypes.memoryview_at ctypes.py_object.__class_getitem__ ctypes.util.dllist diff --git a/stdlib/VERSIONS b/stdlib/VERSIONS index 1ecd8af64559..c86bbb314667 100644 --- a/stdlib/VERSIONS +++ b/stdlib/VERSIONS @@ -76,6 +76,7 @@ _warnings: 3.0- _weakref: 3.0- _weakrefset: 3.0- _winapi: 3.3- +_zstd: 3.14- abc: 3.0- aifc: 3.0-3.12 annotationlib: 3.14- diff --git a/stdlib/_zstd.pyi b/stdlib/_zstd.pyi new file mode 100644 index 000000000000..f22dc874141f --- /dev/null +++ b/stdlib/_zstd.pyi @@ -0,0 +1,88 @@ +from _typeshed import ReadableBuffer +from compression.zstd import _OptionsCompress, _OptionsDecompress +from typing import Any, Final, Literal, Self, final + +ZSTD_CLEVEL_DEFAULT: Final[int] +ZSTD_DStreamOutSize: Final[int] +ZSTD_btlazy2: Final[int] +ZSTD_btopt: Final[int] +ZSTD_btultra: Final[int] +ZSTD_btultra2: Final[int] +ZSTD_c_chainLog: Final[int] +ZSTD_c_checksumFlag: Final[int] +ZSTD_c_compressionLevel: Final[int] +ZSTD_c_contentSizeFlag: Final[int] +ZSTD_c_dictIDFlag: Final[int] +ZSTD_c_enableLongDistanceMatching: Final[int] +ZSTD_c_hashLog: Final[int] +ZSTD_c_jobSize: Final[int] +ZSTD_c_ldmBucketSizeLog: Final[int] +ZSTD_c_ldmHashLog: Final[int] +ZSTD_c_ldmHashRateLog: Final[int] +ZSTD_c_ldmMinMatch: Final[int] +ZSTD_c_minMatch: Final[int] +ZSTD_c_nbWorkers: Final[int] +ZSTD_c_overlapLog: Final[int] +ZSTD_c_searchLog: Final[int] +ZSTD_c_strategy: Final[int] +ZSTD_c_targetLength: Final[int] +ZSTD_c_windowLog: Final[int] +ZSTD_d_windowLogMax: Final[int] +ZSTD_dfast: Final[int] +ZSTD_fast: Final[int] +ZSTD_greedy: Final[int] +ZSTD_lazy: Final[int] +ZSTD_lazy2: Final[int] + +@final +class ZstdCompressor: + CONTINUE: Final = 0 + FLUSH_BLOCK: Final = 1 + FLUSH_FRAME: Final = 2 + def __init__( + self, level: int | None = ..., options: _OptionsCompress | None = ..., zstd_dict: ZstdDict | None = ... + ) -> None: ... + def compress(self, /, data: ReadableBuffer, mode: Literal[0, 1, 2] = ...) -> bytes: ... + def flush(self, /, mode: Literal[1, 2] = ...) -> bytes: ... + @property + def last_mode(self) -> Literal[0, 1, 2]: ... + +@final +class ZstdDecompressor: + def __init__(self, zstd_dict: ZstdDict | None = ..., options: _OptionsDecompress | None = ...) -> None: ... + def decompress(self, /, data: ReadableBuffer, max_length: int = ...) -> bytes: ... + @property + def eof(self) -> bool: ... + @property + def needs_input(self) -> bool: ... + @property + def unused_data(self) -> bytes: ... + +@final +class ZstdDict: + def __init__(self, dict_content: bytes, /, *, is_raw: bool = ...) -> None: ... + def __len__(self, /) -> int: ... + @property + def as_digested_dict(self) -> tuple[Self, int]: ... + @property + def as_prefix(self) -> tuple[Self, int]: ... + @property + def as_undigested_dict(self) -> tuple[Self, int]: ... + @property + def dict_content(self) -> bytes: ... + @property + def dict_id(self) -> int: ... + +class ZstdError(Exception): ... + +def finalize_dict( + custom_dict_bytes: bytes, samples_bytes: bytes, samples_sizes: tuple[int, ...], dict_size: int, compression_level: int, / +) -> bytes: ... +def get_frame_info(frame_buffer: ReadableBuffer) -> tuple[int, int]: ... +def get_frame_size(frame_buffer: ReadableBuffer) -> int: ... +def get_param_bounds(parameter: int, is_compress: bool) -> tuple[int, int]: ... +def set_parameter_types(c_parameter_type: type[Any], d_parameter_type: type[Any]) -> None: ... +def train_dict(samples_bytes: bytes, samples_sizes: tuple[int, ...], dict_size: int, /) -> bytes: ... + +zstd_version: Final[str] +zstd_version_number: Final[int] diff --git a/stdlib/compression/zstd/__init__.pyi b/stdlib/compression/zstd/__init__.pyi new file mode 100644 index 000000000000..505c685e4888 --- /dev/null +++ b/stdlib/compression/zstd/__init__.pyi @@ -0,0 +1,89 @@ +import enum +from _typeshed import ReadableBuffer +from collections.abc import Iterable, Mapping +from compression.zstd._zstdfile import ZstdFile, open +from typing import Final +from typing_extensions import TypeAlias + +import _zstd +from _zstd import ZstdCompressor, ZstdDecompressor, ZstdDict, ZstdError, get_frame_size, zstd_version + +_OptionsCompress: TypeAlias = Mapping[CompressionParameter, int] +_OptionsDecompress: TypeAlias = Mapping[DecompressionParameter, int] + +__all__ = ( + # compression.zstd + "COMPRESSION_LEVEL_DEFAULT", + "compress", + "CompressionParameter", + "decompress", + "DecompressionParameter", + "finalize_dict", + "get_frame_info", + "Strategy", + "train_dict", + # compression.zstd._zstdfile + "open", + "ZstdFile", + # _zstd + "get_frame_size", + "zstd_version", + "zstd_version_info", + "ZstdCompressor", + "ZstdDecompressor", + "ZstdDict", + "ZstdError", +) + +zstd_version_info: Final[tuple[int, int, int]] +COMPRESSION_LEVEL_DEFAULT: Final[int] + +class FrameInfo: + decompressed_size: int + dictionary_id: int + def __init__(self, decompressed_size: int, dictionary_id: int) -> None: ... + +def get_frame_info(frame_buffer: ReadableBuffer) -> FrameInfo: ... +def train_dict(samples: Iterable[ReadableBuffer], dict_size: int) -> ZstdDict: ... +def finalize_dict(zstd_dict: ZstdDict, /, samples: Iterable[ReadableBuffer], dict_size: int, level: int) -> ZstdDict: ... +def compress( + data: ReadableBuffer, level: int | None = ..., options: _OptionsCompress | None = ..., zstd_dict: ZstdDict | None = ... +) -> bytes: ... +def decompress(data: ReadableBuffer, zstd_dict: ZstdDict | None = ..., options: _OptionsDecompress | None = ...) -> bytes: ... + +class CompressionParameter(enum.IntEnum): + compression_level = _zstd.ZSTD_c_compressionLevel + window_log = _zstd.ZSTD_c_windowLog + hash_log = _zstd.ZSTD_c_hashLog + chain_log = _zstd.ZSTD_c_chainLog + search_log = _zstd.ZSTD_c_searchLog + min_match = _zstd.ZSTD_c_minMatch + target_length = _zstd.ZSTD_c_targetLength + strategy = _zstd.ZSTD_c_strategy + enable_long_distance_matching = _zstd.ZSTD_c_enableLongDistanceMatching + ldm_hash_log = _zstd.ZSTD_c_ldmHashLog + ldm_min_match = _zstd.ZSTD_c_ldmMinMatch + ldm_bucket_size_log = _zstd.ZSTD_c_ldmBucketSizeLog + ldm_hash_rate_log = _zstd.ZSTD_c_ldmHashRateLog + content_size_flag = _zstd.ZSTD_c_contentSizeFlag + checksum_flag = _zstd.ZSTD_c_checksumFlag + dict_id_flag = _zstd.ZSTD_c_dictIDFlag + nb_workers = _zstd.ZSTD_c_nbWorkers + job_size = _zstd.ZSTD_c_jobSize + overlap_log = _zstd.ZSTD_c_overlapLog + def bounds(self) -> tuple[int, int]: ... + +class DecompressionParameter(enum.IntEnum): + window_log_max = _zstd.ZSTD_d_windowLogMax + def bounds(self) -> tuple[int, int]: ... + +class Strategy(enum.IntEnum): + fast = _zstd.ZSTD_fast + dfast = _zstd.ZSTD_dfast + greedy = _zstd.ZSTD_greedy + lazy = _zstd.ZSTD_lazy + lazy2 = _zstd.ZSTD_lazy2 + btlazy2 = _zstd.ZSTD_btlazy2 + btopt = _zstd.ZSTD_btopt + btultra = _zstd.ZSTD_btultra + btultra2 = _zstd.ZSTD_btultra2 diff --git a/stdlib/compression/zstd/_zstdfile.pyi b/stdlib/compression/zstd/_zstdfile.pyi new file mode 100644 index 000000000000..f4d6819b6ba4 --- /dev/null +++ b/stdlib/compression/zstd/_zstdfile.pyi @@ -0,0 +1,102 @@ +from _typeshed import StrOrBytesPath +from compression._common import _streams +from compression.zstd import ZstdDict, _OptionsCompress, _OptionsDecompress +from typing import IO, Literal, TextIO, overload +from typing_extensions import TypeAlias + +from _zstd import ZstdCompressor + +__all__ = ("ZstdFile", "open") + +_ReadBinaryMode: TypeAlias = Literal["r", "rb"] +_WriteBinaryMode: TypeAlias = Literal["w", "wb", "x", "xb", "a", "ab"] +_ReadTextMode: TypeAlias = Literal["rt"] +_WriteTextMode: TypeAlias = Literal["wt", "xt", "at"] +_PathOrFileBinary: TypeAlias = StrOrBytesPath | IO[bytes] +_PathOrFileText: TypeAlias = StrOrBytesPath | IO[str] + +class ZstdFile(_streams.BaseStream): + FLUSH_BLOCK = ZstdCompressor.FLUSH_BLOCK + FLUSH_FRAME = ZstdCompressor.FLUSH_FRAME + + @overload + def __init__( + self, + file: _PathOrFileBinary, + /, + mode: _ReadBinaryMode = ..., + *, + level: None = ..., + options: _OptionsDecompress | None = ..., + zstd_dict: ZstdDict | None = ..., + ) -> None: ... + @overload + def __init__( + self, + file: _PathOrFileBinary, + /, + mode: _WriteBinaryMode, + *, + level: int | None = ..., + options: _OptionsCompress | None = ..., + zstd_dict: ZstdDict | None = ..., + ) -> None: ... + def flush(self, mode: Literal[1, 2] = ...) -> bytes: ... # type: ignore[override] + def peek(self, size: int = ..., /) -> bytes: ... + @property + def name(self) -> str | bytes: ... + @property + def mode(self) -> Literal["rb", "wb"]: ... + +@overload +def open( + file: _PathOrFileBinary, + /, + mode: _ReadBinaryMode = ..., + *, + level: None = ..., + options: _OptionsDecompress | None = ..., + zstd_dict: ZstdDict | None = ..., + encoding: str | None = ..., + errors: str | None = ..., + newline: str | None = ..., +) -> ZstdFile: ... +@overload +def open( + file: _PathOrFileBinary, + /, + mode: _WriteBinaryMode, + *, + level: int | None = ..., + options: _OptionsCompress | None = ..., + zstd_dict: ZstdDict | None = ..., + encoding: str | None = ..., + errors: str | None = ..., + newline: str | None = ..., +) -> ZstdFile: ... +@overload +def open( + file: _PathOrFileText, + /, + mode: _ReadTextMode, + *, + level: None = ..., + options: _OptionsDecompress | None = ..., + zstd_dict: ZstdDict | None = ..., + encoding: str | None = ..., + errors: str | None = ..., + newline: str | None = ..., +) -> TextIO: ... +@overload +def open( + file: _PathOrFileText, + /, + mode: _WriteTextMode, + *, + level: int | None = ..., + options: _OptionsCompress | None = ..., + zstd_dict: ZstdDict | None = ..., + encoding: str | None = ..., + errors: str | None = ..., + newline: str | None = ..., +) -> TextIO: ... From 3ad00fce2cc30fdeb3bffccabd3f207a9884e8e3 Mon Sep 17 00:00:00 2001 From: Rogdham Date: Sat, 24 May 2025 13:10:15 +0200 Subject: [PATCH 02/14] Fix Self import --- stdlib/_zstd.pyi | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/stdlib/_zstd.pyi b/stdlib/_zstd.pyi index f22dc874141f..174136a966bb 100644 --- a/stdlib/_zstd.pyi +++ b/stdlib/_zstd.pyi @@ -1,6 +1,7 @@ from _typeshed import ReadableBuffer from compression.zstd import _OptionsCompress, _OptionsDecompress -from typing import Any, Final, Literal, Self, final +from typing import Any, Final, Literal, final +from typing_extensions import Self ZSTD_CLEVEL_DEFAULT: Final[int] ZSTD_DStreamOutSize: Final[int] From a37a6482eb786eb4e0a2cd666041296f499b466c Mon Sep 17 00:00:00 2001 From: Rogdham Date: Sat, 24 May 2025 13:35:43 +0200 Subject: [PATCH 03/14] Add to allowlist for 3.14 beta2 --- stdlib/@tests/stubtest_allowlists/py314.txt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/stdlib/@tests/stubtest_allowlists/py314.txt b/stdlib/@tests/stubtest_allowlists/py314.txt index 235282c7ff70..e821fec64af1 100644 --- a/stdlib/@tests/stubtest_allowlists/py314.txt +++ b/stdlib/@tests/stubtest_allowlists/py314.txt @@ -82,6 +82,8 @@ turtle.poly turtle.save types.CodeType.co_branches types.FrameType.f_generator +zipfile.__all__ +zipfile.ZIP_ZSTANDARD # ========================= # New errors in Python 3.14 From ade5b6766736de28e98e63ba4b2f2a2f30d0ee33 Mon Sep 17 00:00:00 2001 From: Rogdham Date: Sat, 24 May 2025 13:54:37 +0200 Subject: [PATCH 04/14] Fix ZstdFile incompatibilities with parent class --- stdlib/compression/zstd/_zstdfile.pyi | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/stdlib/compression/zstd/_zstdfile.pyi b/stdlib/compression/zstd/_zstdfile.pyi index f4d6819b6ba4..8913b453bc90 100644 --- a/stdlib/compression/zstd/_zstdfile.pyi +++ b/stdlib/compression/zstd/_zstdfile.pyi @@ -1,4 +1,4 @@ -from _typeshed import StrOrBytesPath +from _typeshed import ReadableBuffer, StrOrBytesPath, WriteableBuffer from compression._common import _streams from compression.zstd import ZstdDict, _OptionsCompress, _OptionsDecompress from typing import IO, Literal, TextIO, overload @@ -41,8 +41,15 @@ class ZstdFile(_streams.BaseStream): options: _OptionsCompress | None = ..., zstd_dict: ZstdDict | None = ..., ) -> None: ... + def write(self, data: ReadableBuffer, /) -> int: ... def flush(self, mode: Literal[1, 2] = ...) -> bytes: ... # type: ignore[override] - def peek(self, size: int = ..., /) -> bytes: ... + def read(self, size: int | None = ...) -> bytes: ... + def read1(self, size: int | None = ...) -> bytes: ... + def readinto(self, b: WriteableBuffer) -> int: ... + def readinto1(self, b: WriteableBuffer) -> int: ... + def readline(self, size: int | None = ...) -> bytes: ... + def seek(self, offset: int, whence: int = ...) -> int: ... + def peek(self, size: int = ...) -> bytes: ... @property def name(self) -> str | bytes: ... @property From b29dd87395025d3695ce7999d05219065bccfc57 Mon Sep 17 00:00:00 2001 From: Rogdham Date: Sat, 24 May 2025 19:08:45 +0200 Subject: [PATCH 05/14] Use Mapping[int, int] for options --- stdlib/_zstd.pyi | 6 +++--- stdlib/compression/zstd/__init__.pyi | 8 ++------ stdlib/compression/zstd/_zstdfile.pyi | 15 ++++++++------- 3 files changed, 13 insertions(+), 16 deletions(-) diff --git a/stdlib/_zstd.pyi b/stdlib/_zstd.pyi index 174136a966bb..42f0310174c6 100644 --- a/stdlib/_zstd.pyi +++ b/stdlib/_zstd.pyi @@ -1,5 +1,5 @@ from _typeshed import ReadableBuffer -from compression.zstd import _OptionsCompress, _OptionsDecompress +from collections.abc import Mapping from typing import Any, Final, Literal, final from typing_extensions import Self @@ -41,7 +41,7 @@ class ZstdCompressor: FLUSH_BLOCK: Final = 1 FLUSH_FRAME: Final = 2 def __init__( - self, level: int | None = ..., options: _OptionsCompress | None = ..., zstd_dict: ZstdDict | None = ... + self, level: int | None = ..., options: Mapping[int, int] | None = ..., zstd_dict: ZstdDict | None = ... ) -> None: ... def compress(self, /, data: ReadableBuffer, mode: Literal[0, 1, 2] = ...) -> bytes: ... def flush(self, /, mode: Literal[1, 2] = ...) -> bytes: ... @@ -50,7 +50,7 @@ class ZstdCompressor: @final class ZstdDecompressor: - def __init__(self, zstd_dict: ZstdDict | None = ..., options: _OptionsDecompress | None = ...) -> None: ... + def __init__(self, zstd_dict: ZstdDict | None = ..., options: Mapping[int, int] | None = ...) -> None: ... def decompress(self, /, data: ReadableBuffer, max_length: int = ...) -> bytes: ... @property def eof(self) -> bool: ... diff --git a/stdlib/compression/zstd/__init__.pyi b/stdlib/compression/zstd/__init__.pyi index 505c685e4888..e7073689bc64 100644 --- a/stdlib/compression/zstd/__init__.pyi +++ b/stdlib/compression/zstd/__init__.pyi @@ -3,14 +3,10 @@ from _typeshed import ReadableBuffer from collections.abc import Iterable, Mapping from compression.zstd._zstdfile import ZstdFile, open from typing import Final -from typing_extensions import TypeAlias import _zstd from _zstd import ZstdCompressor, ZstdDecompressor, ZstdDict, ZstdError, get_frame_size, zstd_version -_OptionsCompress: TypeAlias = Mapping[CompressionParameter, int] -_OptionsDecompress: TypeAlias = Mapping[DecompressionParameter, int] - __all__ = ( # compression.zstd "COMPRESSION_LEVEL_DEFAULT", @@ -47,9 +43,9 @@ def get_frame_info(frame_buffer: ReadableBuffer) -> FrameInfo: ... def train_dict(samples: Iterable[ReadableBuffer], dict_size: int) -> ZstdDict: ... def finalize_dict(zstd_dict: ZstdDict, /, samples: Iterable[ReadableBuffer], dict_size: int, level: int) -> ZstdDict: ... def compress( - data: ReadableBuffer, level: int | None = ..., options: _OptionsCompress | None = ..., zstd_dict: ZstdDict | None = ... + data: ReadableBuffer, level: int | None = ..., options: Mapping[int, int] | None = ..., zstd_dict: ZstdDict | None = ... ) -> bytes: ... -def decompress(data: ReadableBuffer, zstd_dict: ZstdDict | None = ..., options: _OptionsDecompress | None = ...) -> bytes: ... +def decompress(data: ReadableBuffer, zstd_dict: ZstdDict | None = ..., options: Mapping[int, int] | None = ...) -> bytes: ... class CompressionParameter(enum.IntEnum): compression_level = _zstd.ZSTD_c_compressionLevel diff --git a/stdlib/compression/zstd/_zstdfile.pyi b/stdlib/compression/zstd/_zstdfile.pyi index 8913b453bc90..b132d68d3902 100644 --- a/stdlib/compression/zstd/_zstdfile.pyi +++ b/stdlib/compression/zstd/_zstdfile.pyi @@ -1,6 +1,7 @@ from _typeshed import ReadableBuffer, StrOrBytesPath, WriteableBuffer +from collections.abc import Mapping from compression._common import _streams -from compression.zstd import ZstdDict, _OptionsCompress, _OptionsDecompress +from compression.zstd import ZstdDict from typing import IO, Literal, TextIO, overload from typing_extensions import TypeAlias @@ -27,7 +28,7 @@ class ZstdFile(_streams.BaseStream): mode: _ReadBinaryMode = ..., *, level: None = ..., - options: _OptionsDecompress | None = ..., + options: Mapping[int, int] | None = ..., zstd_dict: ZstdDict | None = ..., ) -> None: ... @overload @@ -38,7 +39,7 @@ class ZstdFile(_streams.BaseStream): mode: _WriteBinaryMode, *, level: int | None = ..., - options: _OptionsCompress | None = ..., + options: Mapping[int, int] | None = ..., zstd_dict: ZstdDict | None = ..., ) -> None: ... def write(self, data: ReadableBuffer, /) -> int: ... @@ -62,7 +63,7 @@ def open( mode: _ReadBinaryMode = ..., *, level: None = ..., - options: _OptionsDecompress | None = ..., + options: Mapping[int, int] | None = ..., zstd_dict: ZstdDict | None = ..., encoding: str | None = ..., errors: str | None = ..., @@ -75,7 +76,7 @@ def open( mode: _WriteBinaryMode, *, level: int | None = ..., - options: _OptionsCompress | None = ..., + options: Mapping[int, int] | None = ..., zstd_dict: ZstdDict | None = ..., encoding: str | None = ..., errors: str | None = ..., @@ -88,7 +89,7 @@ def open( mode: _ReadTextMode, *, level: None = ..., - options: _OptionsDecompress | None = ..., + options: Mapping[int, int] | None = ..., zstd_dict: ZstdDict | None = ..., encoding: str | None = ..., errors: str | None = ..., @@ -101,7 +102,7 @@ def open( mode: _WriteTextMode, *, level: int | None = ..., - options: _OptionsCompress | None = ..., + options: Mapping[int, int] | None = ..., zstd_dict: ZstdDict | None = ..., encoding: str | None = ..., errors: str | None = ..., From 0f99105b58f36b5d9f03433332d1f74c9531ecb6 Mon Sep 17 00:00:00 2001 From: Rogdham Date: Sat, 24 May 2025 19:12:13 +0200 Subject: [PATCH 06/14] Use reference for ZstdCompressor CONTINUE/FLUSH_BLOCK/FLUSH_FRAME --- stdlib/_zstd.pyi | 20 +++++++++++++------- stdlib/compression/zstd/_zstdfile.pyi | 4 ++-- 2 files changed, 15 insertions(+), 9 deletions(-) diff --git a/stdlib/_zstd.pyi b/stdlib/_zstd.pyi index 42f0310174c6..76225e8736aa 100644 --- a/stdlib/_zstd.pyi +++ b/stdlib/_zstd.pyi @@ -1,7 +1,7 @@ from _typeshed import ReadableBuffer from collections.abc import Mapping from typing import Any, Final, Literal, final -from typing_extensions import Self +from typing_extensions import Self, TypeAlias ZSTD_CLEVEL_DEFAULT: Final[int] ZSTD_DStreamOutSize: Final[int] @@ -35,18 +35,24 @@ ZSTD_greedy: Final[int] ZSTD_lazy: Final[int] ZSTD_lazy2: Final[int] +_ZstdCompressorContinue: TypeAlias = Literal[0] +_ZstdCompressorFlushBlock: TypeAlias = Literal[1] +_ZstdCompressorFlushFrame: TypeAlias = Literal[2] + @final class ZstdCompressor: - CONTINUE: Final = 0 - FLUSH_BLOCK: Final = 1 - FLUSH_FRAME: Final = 2 + CONTINUE: Final[_ZstdCompressorContinue] = 0 + FLUSH_BLOCK: Final[_ZstdCompressorFlushBlock] = 1 + FLUSH_FRAME: Final[_ZstdCompressorFlushFrame] = 2 def __init__( self, level: int | None = ..., options: Mapping[int, int] | None = ..., zstd_dict: ZstdDict | None = ... ) -> None: ... - def compress(self, /, data: ReadableBuffer, mode: Literal[0, 1, 2] = ...) -> bytes: ... - def flush(self, /, mode: Literal[1, 2] = ...) -> bytes: ... + def compress( + self, /, data: ReadableBuffer, mode: _ZstdCompressorContinue | _ZstdCompressorFlushBlock | _ZstdCompressorFlushFrame = ... + ) -> bytes: ... + def flush(self, /, mode: _ZstdCompressorFlushBlock | _ZstdCompressorFlushFrame = ...) -> bytes: ... @property - def last_mode(self) -> Literal[0, 1, 2]: ... + def last_mode(self) -> _ZstdCompressorContinue | _ZstdCompressorFlushBlock | _ZstdCompressorFlushFrame: ... @final class ZstdDecompressor: diff --git a/stdlib/compression/zstd/_zstdfile.pyi b/stdlib/compression/zstd/_zstdfile.pyi index b132d68d3902..e7c5d5cef90b 100644 --- a/stdlib/compression/zstd/_zstdfile.pyi +++ b/stdlib/compression/zstd/_zstdfile.pyi @@ -5,7 +5,7 @@ from compression.zstd import ZstdDict from typing import IO, Literal, TextIO, overload from typing_extensions import TypeAlias -from _zstd import ZstdCompressor +from _zstd import ZstdCompressor, _ZstdCompressorFlushBlock, _ZstdCompressorFlushFrame __all__ = ("ZstdFile", "open") @@ -43,7 +43,7 @@ class ZstdFile(_streams.BaseStream): zstd_dict: ZstdDict | None = ..., ) -> None: ... def write(self, data: ReadableBuffer, /) -> int: ... - def flush(self, mode: Literal[1, 2] = ...) -> bytes: ... # type: ignore[override] + def flush(self, mode: _ZstdCompressorFlushBlock | _ZstdCompressorFlushFrame = ...) -> bytes: ... # type: ignore[override] def read(self, size: int | None = ...) -> bytes: ... def read1(self, size: int | None = ...) -> bytes: ... def readinto(self, b: WriteableBuffer) -> int: ... From f1e6f3df0818ce0b75107d84116a6c9b2826f0f3 Mon Sep 17 00:00:00 2001 From: Rogdham Date: Sat, 31 May 2025 09:26:30 +0200 Subject: [PATCH 07/14] Explicit parameter defaults --- stdlib/_zstd.pyi | 12 ++--- stdlib/compression/zstd/__init__.pyi | 4 +- stdlib/compression/zstd/_zstdfile.pyi | 76 +++++++++++++-------------- 3 files changed, 46 insertions(+), 46 deletions(-) diff --git a/stdlib/_zstd.pyi b/stdlib/_zstd.pyi index 76225e8736aa..04773b52abc3 100644 --- a/stdlib/_zstd.pyi +++ b/stdlib/_zstd.pyi @@ -45,19 +45,19 @@ class ZstdCompressor: FLUSH_BLOCK: Final[_ZstdCompressorFlushBlock] = 1 FLUSH_FRAME: Final[_ZstdCompressorFlushFrame] = 2 def __init__( - self, level: int | None = ..., options: Mapping[int, int] | None = ..., zstd_dict: ZstdDict | None = ... + self, level: int | None = None, options: Mapping[int, int] | None = None, zstd_dict: ZstdDict | None = None ) -> None: ... def compress( - self, /, data: ReadableBuffer, mode: _ZstdCompressorContinue | _ZstdCompressorFlushBlock | _ZstdCompressorFlushFrame = ... + self, /, data: ReadableBuffer, mode: _ZstdCompressorContinue | _ZstdCompressorFlushBlock | _ZstdCompressorFlushFrame = 0 ) -> bytes: ... - def flush(self, /, mode: _ZstdCompressorFlushBlock | _ZstdCompressorFlushFrame = ...) -> bytes: ... + def flush(self, /, mode: _ZstdCompressorFlushBlock | _ZstdCompressorFlushFrame = 2) -> bytes: ... @property def last_mode(self) -> _ZstdCompressorContinue | _ZstdCompressorFlushBlock | _ZstdCompressorFlushFrame: ... @final class ZstdDecompressor: - def __init__(self, zstd_dict: ZstdDict | None = ..., options: Mapping[int, int] | None = ...) -> None: ... - def decompress(self, /, data: ReadableBuffer, max_length: int = ...) -> bytes: ... + def __init__(self, zstd_dict: ZstdDict | None = None, options: Mapping[int, int] | None = None) -> None: ... + def decompress(self, /, data: ReadableBuffer, max_length: int = -1) -> bytes: ... @property def eof(self) -> bool: ... @property @@ -67,7 +67,7 @@ class ZstdDecompressor: @final class ZstdDict: - def __init__(self, dict_content: bytes, /, *, is_raw: bool = ...) -> None: ... + def __init__(self, dict_content: bytes, /, *, is_raw: bool = False) -> None: ... def __len__(self, /) -> int: ... @property def as_digested_dict(self) -> tuple[Self, int]: ... diff --git a/stdlib/compression/zstd/__init__.pyi b/stdlib/compression/zstd/__init__.pyi index e7073689bc64..dd1de9f7cdb8 100644 --- a/stdlib/compression/zstd/__init__.pyi +++ b/stdlib/compression/zstd/__init__.pyi @@ -43,9 +43,9 @@ def get_frame_info(frame_buffer: ReadableBuffer) -> FrameInfo: ... def train_dict(samples: Iterable[ReadableBuffer], dict_size: int) -> ZstdDict: ... def finalize_dict(zstd_dict: ZstdDict, /, samples: Iterable[ReadableBuffer], dict_size: int, level: int) -> ZstdDict: ... def compress( - data: ReadableBuffer, level: int | None = ..., options: Mapping[int, int] | None = ..., zstd_dict: ZstdDict | None = ... + data: ReadableBuffer, level: int | None = None, options: Mapping[int, int] | None = None, zstd_dict: ZstdDict | None = None ) -> bytes: ... -def decompress(data: ReadableBuffer, zstd_dict: ZstdDict | None = ..., options: Mapping[int, int] | None = ...) -> bytes: ... +def decompress(data: ReadableBuffer, zstd_dict: ZstdDict | None = None, options: Mapping[int, int] | None = None) -> bytes: ... class CompressionParameter(enum.IntEnum): compression_level = _zstd.ZSTD_c_compressionLevel diff --git a/stdlib/compression/zstd/_zstdfile.pyi b/stdlib/compression/zstd/_zstdfile.pyi index e7c5d5cef90b..1aa50f407c53 100644 --- a/stdlib/compression/zstd/_zstdfile.pyi +++ b/stdlib/compression/zstd/_zstdfile.pyi @@ -25,11 +25,11 @@ class ZstdFile(_streams.BaseStream): self, file: _PathOrFileBinary, /, - mode: _ReadBinaryMode = ..., + mode: _ReadBinaryMode = "r", *, - level: None = ..., - options: Mapping[int, int] | None = ..., - zstd_dict: ZstdDict | None = ..., + level: None = None, + options: Mapping[int, int] | None = None, + zstd_dict: ZstdDict | None = None, ) -> None: ... @overload def __init__( @@ -38,19 +38,19 @@ class ZstdFile(_streams.BaseStream): /, mode: _WriteBinaryMode, *, - level: int | None = ..., - options: Mapping[int, int] | None = ..., - zstd_dict: ZstdDict | None = ..., + level: int | None = None, + options: Mapping[int, int] | None = None, + zstd_dict: ZstdDict | None = None, ) -> None: ... def write(self, data: ReadableBuffer, /) -> int: ... - def flush(self, mode: _ZstdCompressorFlushBlock | _ZstdCompressorFlushFrame = ...) -> bytes: ... # type: ignore[override] - def read(self, size: int | None = ...) -> bytes: ... - def read1(self, size: int | None = ...) -> bytes: ... + def flush(self, mode: _ZstdCompressorFlushBlock | _ZstdCompressorFlushFrame = 1) -> bytes: ... # type: ignore[override] + def read(self, size: int | None = -1) -> bytes: ... + def read1(self, size: int | None = -1) -> bytes: ... def readinto(self, b: WriteableBuffer) -> int: ... def readinto1(self, b: WriteableBuffer) -> int: ... - def readline(self, size: int | None = ...) -> bytes: ... - def seek(self, offset: int, whence: int = ...) -> int: ... - def peek(self, size: int = ...) -> bytes: ... + def readline(self, size: int | None = -1) -> bytes: ... + def seek(self, offset: int, whence: int = 0) -> int: ... + def peek(self, size: int = -1) -> bytes: ... @property def name(self) -> str | bytes: ... @property @@ -60,14 +60,14 @@ class ZstdFile(_streams.BaseStream): def open( file: _PathOrFileBinary, /, - mode: _ReadBinaryMode = ..., + mode: _ReadBinaryMode = "rb", *, - level: None = ..., - options: Mapping[int, int] | None = ..., - zstd_dict: ZstdDict | None = ..., - encoding: str | None = ..., - errors: str | None = ..., - newline: str | None = ..., + level: None = None, + options: Mapping[int, int] | None = None, + zstd_dict: ZstdDict | None = None, + encoding: str | None = None, + errors: str | None = None, + newline: str | None = None, ) -> ZstdFile: ... @overload def open( @@ -75,12 +75,12 @@ def open( /, mode: _WriteBinaryMode, *, - level: int | None = ..., - options: Mapping[int, int] | None = ..., - zstd_dict: ZstdDict | None = ..., - encoding: str | None = ..., - errors: str | None = ..., - newline: str | None = ..., + level: int | None = None, + options: Mapping[int, int] | None = None, + zstd_dict: ZstdDict | None = None, + encoding: str | None = None, + errors: str | None = None, + newline: str | None = None, ) -> ZstdFile: ... @overload def open( @@ -88,12 +88,12 @@ def open( /, mode: _ReadTextMode, *, - level: None = ..., - options: Mapping[int, int] | None = ..., - zstd_dict: ZstdDict | None = ..., - encoding: str | None = ..., - errors: str | None = ..., - newline: str | None = ..., + level: None = None, + options: Mapping[int, int] | None = None, + zstd_dict: ZstdDict | None = None, + encoding: str | None = None, + errors: str | None = None, + newline: str | None = None, ) -> TextIO: ... @overload def open( @@ -101,10 +101,10 @@ def open( /, mode: _WriteTextMode, *, - level: int | None = ..., - options: Mapping[int, int] | None = ..., - zstd_dict: ZstdDict | None = ..., - encoding: str | None = ..., - errors: str | None = ..., - newline: str | None = ..., + level: int | None = None, + options: Mapping[int, int] | None = None, + zstd_dict: ZstdDict | None = None, + encoding: str | None = None, + errors: str | None = None, + newline: str | None = None, ) -> TextIO: ... From 28975a0675ec904fe7bb701f6ef0ea030da59bde Mon Sep 17 00:00:00 2001 From: Rogdham Date: Sat, 31 May 2025 17:26:39 +0200 Subject: [PATCH 08/14] Explicit constant values --- stdlib/_zstd.pyi | 62 ++++++++++++++-------------- stdlib/compression/zstd/__init__.pyi | 2 +- 2 files changed, 32 insertions(+), 32 deletions(-) diff --git a/stdlib/_zstd.pyi b/stdlib/_zstd.pyi index 04773b52abc3..0ae831b801a8 100644 --- a/stdlib/_zstd.pyi +++ b/stdlib/_zstd.pyi @@ -3,37 +3,37 @@ from collections.abc import Mapping from typing import Any, Final, Literal, final from typing_extensions import Self, TypeAlias -ZSTD_CLEVEL_DEFAULT: Final[int] -ZSTD_DStreamOutSize: Final[int] -ZSTD_btlazy2: Final[int] -ZSTD_btopt: Final[int] -ZSTD_btultra: Final[int] -ZSTD_btultra2: Final[int] -ZSTD_c_chainLog: Final[int] -ZSTD_c_checksumFlag: Final[int] -ZSTD_c_compressionLevel: Final[int] -ZSTD_c_contentSizeFlag: Final[int] -ZSTD_c_dictIDFlag: Final[int] -ZSTD_c_enableLongDistanceMatching: Final[int] -ZSTD_c_hashLog: Final[int] -ZSTD_c_jobSize: Final[int] -ZSTD_c_ldmBucketSizeLog: Final[int] -ZSTD_c_ldmHashLog: Final[int] -ZSTD_c_ldmHashRateLog: Final[int] -ZSTD_c_ldmMinMatch: Final[int] -ZSTD_c_minMatch: Final[int] -ZSTD_c_nbWorkers: Final[int] -ZSTD_c_overlapLog: Final[int] -ZSTD_c_searchLog: Final[int] -ZSTD_c_strategy: Final[int] -ZSTD_c_targetLength: Final[int] -ZSTD_c_windowLog: Final[int] -ZSTD_d_windowLogMax: Final[int] -ZSTD_dfast: Final[int] -ZSTD_fast: Final[int] -ZSTD_greedy: Final[int] -ZSTD_lazy: Final[int] -ZSTD_lazy2: Final[int] +ZSTD_CLEVEL_DEFAULT: Final = 3 +ZSTD_DStreamOutSize: Final = 131072 +ZSTD_btlazy2: Final = 6 +ZSTD_btopt: Final = 7 +ZSTD_btultra: Final = 8 +ZSTD_btultra2: Final = 9 +ZSTD_c_chainLog: Final = 103 +ZSTD_c_checksumFlag: Final = 201 +ZSTD_c_compressionLevel: Final = 100 +ZSTD_c_contentSizeFlag: Final = 200 +ZSTD_c_dictIDFlag: Final = 202 +ZSTD_c_enableLongDistanceMatching: Final = 160 +ZSTD_c_hashLog: Final = 102 +ZSTD_c_jobSize: Final = 401 +ZSTD_c_ldmBucketSizeLog: Final = 163 +ZSTD_c_ldmHashLog: Final = 161 +ZSTD_c_ldmHashRateLog: Final = 164 +ZSTD_c_ldmMinMatch: Final = 162 +ZSTD_c_minMatch: Final = 105 +ZSTD_c_nbWorkers: Final = 400 +ZSTD_c_overlapLog: Final = 402 +ZSTD_c_searchLog: Final = 104 +ZSTD_c_strategy: Final = 107 +ZSTD_c_targetLength: Final = 106 +ZSTD_c_windowLog: Final = 101 +ZSTD_d_windowLogMax: Final = 100 +ZSTD_dfast: Final = 2 +ZSTD_fast: Final = 1 +ZSTD_greedy: Final = 3 +ZSTD_lazy: Final = 4 +ZSTD_lazy2: Final = 5 _ZstdCompressorContinue: TypeAlias = Literal[0] _ZstdCompressorFlushBlock: TypeAlias = Literal[1] diff --git a/stdlib/compression/zstd/__init__.pyi b/stdlib/compression/zstd/__init__.pyi index dd1de9f7cdb8..0b83d365c201 100644 --- a/stdlib/compression/zstd/__init__.pyi +++ b/stdlib/compression/zstd/__init__.pyi @@ -32,7 +32,7 @@ __all__ = ( ) zstd_version_info: Final[tuple[int, int, int]] -COMPRESSION_LEVEL_DEFAULT: Final[int] +COMPRESSION_LEVEL_DEFAULT: Final = _zstd.ZSTD_CLEVEL_DEFAULT class FrameInfo: decompressed_size: int From c3cd99dba38b16d6e5b59c18dea5ab4b8e3a8132 Mon Sep 17 00:00:00 2001 From: Rogdham Date: Sat, 31 May 2025 17:28:23 +0200 Subject: [PATCH 09/14] Remove Any in set_parameter_types --- stdlib/_zstd.pyi | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/stdlib/_zstd.pyi b/stdlib/_zstd.pyi index 0ae831b801a8..081e851e181b 100644 --- a/stdlib/_zstd.pyi +++ b/stdlib/_zstd.pyi @@ -1,6 +1,7 @@ from _typeshed import ReadableBuffer from collections.abc import Mapping -from typing import Any, Final, Literal, final +from compression.zstd import CompressionParameter, DecompressionParameter +from typing import Final, Literal, final from typing_extensions import Self, TypeAlias ZSTD_CLEVEL_DEFAULT: Final = 3 @@ -88,7 +89,7 @@ def finalize_dict( def get_frame_info(frame_buffer: ReadableBuffer) -> tuple[int, int]: ... def get_frame_size(frame_buffer: ReadableBuffer) -> int: ... def get_param_bounds(parameter: int, is_compress: bool) -> tuple[int, int]: ... -def set_parameter_types(c_parameter_type: type[Any], d_parameter_type: type[Any]) -> None: ... +def set_parameter_types(c_parameter_type: type[CompressionParameter], d_parameter_type: type[DecompressionParameter]) -> None: ... def train_dict(samples_bytes: bytes, samples_sizes: tuple[int, ...], dict_size: int, /) -> bytes: ... zstd_version: Final[str] From 7177ce8afdc62ab58717b436f3f39af917fa6191 Mon Sep 17 00:00:00 2001 From: Rogdham Date: Sat, 31 May 2025 17:30:19 +0200 Subject: [PATCH 10/14] Change TextIO to TextIOWrapper --- stdlib/bz2.pyi | 11 ++++++----- stdlib/compression/zstd/_zstdfile.pyi | 7 ++++--- stdlib/lzma.pyi | 9 +++++---- 3 files changed, 15 insertions(+), 12 deletions(-) diff --git a/stdlib/bz2.pyi b/stdlib/bz2.pyi index 0f9d00fbc633..dce6187a2da1 100644 --- a/stdlib/bz2.pyi +++ b/stdlib/bz2.pyi @@ -2,7 +2,8 @@ import sys from _bz2 import BZ2Compressor as BZ2Compressor, BZ2Decompressor as BZ2Decompressor from _typeshed import ReadableBuffer, StrOrBytesPath, WriteableBuffer from collections.abc import Iterable -from typing import IO, Literal, Protocol, SupportsIndex, TextIO, overload +from io import TextIOWrapper +from typing import IO, Literal, Protocol, SupportsIndex, overload from typing_extensions import Self, TypeAlias if sys.version_info >= (3, 14): @@ -48,7 +49,7 @@ def open( encoding: str | None = None, errors: str | None = None, newline: str | None = None, -) -> TextIO: ... +) -> TextIOWrapper: ... @overload def open( filename: _WritableFileobj, @@ -66,7 +67,7 @@ def open( encoding: str | None = None, errors: str | None = None, newline: str | None = None, -) -> TextIO: ... +) -> TextIOWrapper: ... @overload def open( filename: StrOrBytesPath, @@ -84,7 +85,7 @@ def open( encoding: str | None = None, errors: str | None = None, newline: str | None = None, -) -> TextIO: ... +) -> TextIOWrapper: ... @overload def open( filename: StrOrBytesPath | _ReadableFileobj | _WritableFileobj, @@ -93,7 +94,7 @@ def open( encoding: str | None = None, errors: str | None = None, newline: str | None = None, -) -> BZ2File | TextIO: ... +) -> BZ2File | TextIOWrapper: ... class BZ2File(BaseStream, IO[bytes]): def __enter__(self) -> Self: ... diff --git a/stdlib/compression/zstd/_zstdfile.pyi b/stdlib/compression/zstd/_zstdfile.pyi index 1aa50f407c53..25b18304ccbb 100644 --- a/stdlib/compression/zstd/_zstdfile.pyi +++ b/stdlib/compression/zstd/_zstdfile.pyi @@ -2,7 +2,8 @@ from _typeshed import ReadableBuffer, StrOrBytesPath, WriteableBuffer from collections.abc import Mapping from compression._common import _streams from compression.zstd import ZstdDict -from typing import IO, Literal, TextIO, overload +from io import TextIOWrapper +from typing import IO, Literal, overload from typing_extensions import TypeAlias from _zstd import ZstdCompressor, _ZstdCompressorFlushBlock, _ZstdCompressorFlushFrame @@ -94,7 +95,7 @@ def open( encoding: str | None = None, errors: str | None = None, newline: str | None = None, -) -> TextIO: ... +) -> TextIOWrapper: ... @overload def open( file: _PathOrFileText, @@ -107,4 +108,4 @@ def open( encoding: str | None = None, errors: str | None = None, newline: str | None = None, -) -> TextIO: ... +) -> TextIOWrapper: ... diff --git a/stdlib/lzma.pyi b/stdlib/lzma.pyi index b066d222466b..b7ef607b75cb 100644 --- a/stdlib/lzma.pyi +++ b/stdlib/lzma.pyi @@ -35,7 +35,8 @@ from _lzma import ( is_check_supported as is_check_supported, ) from _typeshed import ReadableBuffer, StrOrBytesPath -from typing import IO, Literal, TextIO, overload +from io import TextIOWrapper +from typing import IO, Literal, overload from typing_extensions import Self, TypeAlias if sys.version_info >= (3, 14): @@ -144,7 +145,7 @@ def open( encoding: str | None = None, errors: str | None = None, newline: str | None = None, -) -> TextIO: ... +) -> TextIOWrapper: ... @overload def open( filename: StrOrBytesPath, @@ -157,7 +158,7 @@ def open( encoding: str | None = None, errors: str | None = None, newline: str | None = None, -) -> TextIO: ... +) -> TextIOWrapper: ... @overload def open( filename: _PathOrFile, @@ -170,7 +171,7 @@ def open( encoding: str | None = None, errors: str | None = None, newline: str | None = None, -) -> LZMAFile | TextIO: ... +) -> LZMAFile | TextIOWrapper: ... def compress( data: ReadableBuffer, format: int = 1, check: int = -1, preset: int | None = None, filters: _FilterChain | None = None ) -> bytes: ... From b93c89435d1662e21e3c6c20a0ba71a8f960ba69 Mon Sep 17 00:00:00 2001 From: Rogdham Date: Sat, 31 May 2025 17:45:07 +0200 Subject: [PATCH 11/14] Avoid IO in file argument --- stdlib/compression/_common/_streams.pyi | 3 ++- stdlib/compression/zstd/_zstdfile.pyi | 28 +++++++++++++++---------- 2 files changed, 19 insertions(+), 12 deletions(-) diff --git a/stdlib/compression/_common/_streams.pyi b/stdlib/compression/_common/_streams.pyi index 6303a9b1d460..b8463973ec67 100644 --- a/stdlib/compression/_common/_streams.pyi +++ b/stdlib/compression/_common/_streams.pyi @@ -1,10 +1,11 @@ from _typeshed import Incomplete, WriteableBuffer from collections.abc import Callable from io import DEFAULT_BUFFER_SIZE, BufferedIOBase, RawIOBase -from typing import Any, Protocol +from typing import Any, Protocol, type_check_only BUFFER_SIZE = DEFAULT_BUFFER_SIZE +@type_check_only class _Reader(Protocol): def read(self, n: int, /) -> bytes: ... def seekable(self) -> bool: ... diff --git a/stdlib/compression/zstd/_zstdfile.pyi b/stdlib/compression/zstd/_zstdfile.pyi index 25b18304ccbb..045b2d35acfe 100644 --- a/stdlib/compression/zstd/_zstdfile.pyi +++ b/stdlib/compression/zstd/_zstdfile.pyi @@ -1,9 +1,9 @@ -from _typeshed import ReadableBuffer, StrOrBytesPath, WriteableBuffer +from _typeshed import ReadableBuffer, StrOrBytesPath, SupportsWrite, WriteableBuffer from collections.abc import Mapping from compression._common import _streams from compression.zstd import ZstdDict -from io import TextIOWrapper -from typing import IO, Literal, overload +from io import TextIOWrapper, _WrappedBuffer +from typing import Literal, overload, type_check_only from typing_extensions import TypeAlias from _zstd import ZstdCompressor, _ZstdCompressorFlushBlock, _ZstdCompressorFlushFrame @@ -14,8 +14,14 @@ _ReadBinaryMode: TypeAlias = Literal["r", "rb"] _WriteBinaryMode: TypeAlias = Literal["w", "wb", "x", "xb", "a", "ab"] _ReadTextMode: TypeAlias = Literal["rt"] _WriteTextMode: TypeAlias = Literal["wt", "xt", "at"] -_PathOrFileBinary: TypeAlias = StrOrBytesPath | IO[bytes] -_PathOrFileText: TypeAlias = StrOrBytesPath | IO[str] + +@type_check_only +class _FileBinaryRead(_streams._Reader): + def close(self) -> None: ... + +@type_check_only +class _FileBinaryWrite(SupportsWrite[bytes]): + def close(self) -> None: ... class ZstdFile(_streams.BaseStream): FLUSH_BLOCK = ZstdCompressor.FLUSH_BLOCK @@ -24,7 +30,7 @@ class ZstdFile(_streams.BaseStream): @overload def __init__( self, - file: _PathOrFileBinary, + file: StrOrBytesPath | _FileBinaryRead, /, mode: _ReadBinaryMode = "r", *, @@ -35,7 +41,7 @@ class ZstdFile(_streams.BaseStream): @overload def __init__( self, - file: _PathOrFileBinary, + file: StrOrBytesPath | _FileBinaryWrite, /, mode: _WriteBinaryMode, *, @@ -59,7 +65,7 @@ class ZstdFile(_streams.BaseStream): @overload def open( - file: _PathOrFileBinary, + file: StrOrBytesPath | _FileBinaryRead, /, mode: _ReadBinaryMode = "rb", *, @@ -72,7 +78,7 @@ def open( ) -> ZstdFile: ... @overload def open( - file: _PathOrFileBinary, + file: StrOrBytesPath | _FileBinaryWrite, /, mode: _WriteBinaryMode, *, @@ -85,7 +91,7 @@ def open( ) -> ZstdFile: ... @overload def open( - file: _PathOrFileText, + file: StrOrBytesPath | _WrappedBuffer, /, mode: _ReadTextMode, *, @@ -98,7 +104,7 @@ def open( ) -> TextIOWrapper: ... @overload def open( - file: _PathOrFileText, + file: StrOrBytesPath | _WrappedBuffer, /, mode: _WriteTextMode, *, From fdd5bbef1b1db1a76dec6a36fd6eb6e5ff4759b8 Mon Sep 17 00:00:00 2001 From: Rogdham Date: Sat, 31 May 2025 17:51:00 +0200 Subject: [PATCH 12/14] Remove redundancy in ZstdCompressor contants types --- stdlib/_zstd.pyi | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/stdlib/_zstd.pyi b/stdlib/_zstd.pyi index 081e851e181b..0648d898448b 100644 --- a/stdlib/_zstd.pyi +++ b/stdlib/_zstd.pyi @@ -42,9 +42,9 @@ _ZstdCompressorFlushFrame: TypeAlias = Literal[2] @final class ZstdCompressor: - CONTINUE: Final[_ZstdCompressorContinue] = 0 - FLUSH_BLOCK: Final[_ZstdCompressorFlushBlock] = 1 - FLUSH_FRAME: Final[_ZstdCompressorFlushFrame] = 2 + CONTINUE: Final = 0 + FLUSH_BLOCK: Final = 1 + FLUSH_FRAME: Final = 2 def __init__( self, level: int | None = None, options: Mapping[int, int] | None = None, zstd_dict: ZstdDict | None = None ) -> None: ... From 9def477b2d9f6e3822aca3b18c53cf7befd63215 Mon Sep 17 00:00:00 2001 From: Rogdham Date: Sat, 31 May 2025 17:55:00 +0200 Subject: [PATCH 13/14] Add some more final/Final annotations --- stdlib/compression/zstd/__init__.pyi | 64 ++++++++++++++-------------- 1 file changed, 33 insertions(+), 31 deletions(-) diff --git a/stdlib/compression/zstd/__init__.pyi b/stdlib/compression/zstd/__init__.pyi index 0b83d365c201..3459a87bd754 100644 --- a/stdlib/compression/zstd/__init__.pyi +++ b/stdlib/compression/zstd/__init__.pyi @@ -2,7 +2,7 @@ import enum from _typeshed import ReadableBuffer from collections.abc import Iterable, Mapping from compression.zstd._zstdfile import ZstdFile, open -from typing import Final +from typing import Final, final import _zstd from _zstd import ZstdCompressor, ZstdDecompressor, ZstdDict, ZstdError, get_frame_size, zstd_version @@ -46,40 +46,42 @@ def compress( data: ReadableBuffer, level: int | None = None, options: Mapping[int, int] | None = None, zstd_dict: ZstdDict | None = None ) -> bytes: ... def decompress(data: ReadableBuffer, zstd_dict: ZstdDict | None = None, options: Mapping[int, int] | None = None) -> bytes: ... - +@final class CompressionParameter(enum.IntEnum): - compression_level = _zstd.ZSTD_c_compressionLevel - window_log = _zstd.ZSTD_c_windowLog - hash_log = _zstd.ZSTD_c_hashLog - chain_log = _zstd.ZSTD_c_chainLog - search_log = _zstd.ZSTD_c_searchLog - min_match = _zstd.ZSTD_c_minMatch - target_length = _zstd.ZSTD_c_targetLength - strategy = _zstd.ZSTD_c_strategy - enable_long_distance_matching = _zstd.ZSTD_c_enableLongDistanceMatching - ldm_hash_log = _zstd.ZSTD_c_ldmHashLog - ldm_min_match = _zstd.ZSTD_c_ldmMinMatch - ldm_bucket_size_log = _zstd.ZSTD_c_ldmBucketSizeLog - ldm_hash_rate_log = _zstd.ZSTD_c_ldmHashRateLog - content_size_flag = _zstd.ZSTD_c_contentSizeFlag - checksum_flag = _zstd.ZSTD_c_checksumFlag - dict_id_flag = _zstd.ZSTD_c_dictIDFlag - nb_workers = _zstd.ZSTD_c_nbWorkers - job_size = _zstd.ZSTD_c_jobSize - overlap_log = _zstd.ZSTD_c_overlapLog + compression_level: Final = _zstd.ZSTD_c_compressionLevel + window_log: Final = _zstd.ZSTD_c_windowLog + hash_log: Final = _zstd.ZSTD_c_hashLog + chain_log: Final = _zstd.ZSTD_c_chainLog + search_log: Final = _zstd.ZSTD_c_searchLog + min_match: Final = _zstd.ZSTD_c_minMatch + target_length: Final = _zstd.ZSTD_c_targetLength + strategy: Final = _zstd.ZSTD_c_strategy + enable_long_distance_matching: Final = _zstd.ZSTD_c_enableLongDistanceMatching + ldm_hash_log: Final = _zstd.ZSTD_c_ldmHashLog + ldm_min_match: Final = _zstd.ZSTD_c_ldmMinMatch + ldm_bucket_size_log: Final = _zstd.ZSTD_c_ldmBucketSizeLog + ldm_hash_rate_log: Final = _zstd.ZSTD_c_ldmHashRateLog + content_size_flag: Final = _zstd.ZSTD_c_contentSizeFlag + checksum_flag: Final = _zstd.ZSTD_c_checksumFlag + dict_id_flag: Final = _zstd.ZSTD_c_dictIDFlag + nb_workers: Final = _zstd.ZSTD_c_nbWorkers + job_size: Final = _zstd.ZSTD_c_jobSize + overlap_log: Final = _zstd.ZSTD_c_overlapLog def bounds(self) -> tuple[int, int]: ... +@final class DecompressionParameter(enum.IntEnum): - window_log_max = _zstd.ZSTD_d_windowLogMax + window_log_max: Final = _zstd.ZSTD_d_windowLogMax def bounds(self) -> tuple[int, int]: ... +@final class Strategy(enum.IntEnum): - fast = _zstd.ZSTD_fast - dfast = _zstd.ZSTD_dfast - greedy = _zstd.ZSTD_greedy - lazy = _zstd.ZSTD_lazy - lazy2 = _zstd.ZSTD_lazy2 - btlazy2 = _zstd.ZSTD_btlazy2 - btopt = _zstd.ZSTD_btopt - btultra = _zstd.ZSTD_btultra - btultra2 = _zstd.ZSTD_btultra2 + fast: Final = _zstd.ZSTD_fast + dfast: Final = _zstd.ZSTD_dfast + greedy: Final = _zstd.ZSTD_greedy + lazy: Final = _zstd.ZSTD_lazy + lazy2: Final = _zstd.ZSTD_lazy2 + btlazy2: Final = _zstd.ZSTD_btlazy2 + btopt: Final = _zstd.ZSTD_btopt + btultra: Final = _zstd.ZSTD_btultra + btultra2: Final = _zstd.ZSTD_btultra2 From 94c772957fb5d753e1c5566434c42618ec7651fd Mon Sep 17 00:00:00 2001 From: Rogdham Date: Sat, 31 May 2025 18:03:35 +0200 Subject: [PATCH 14/14] Remove Final from IntEnum members --- stdlib/compression/zstd/__init__.pyi | 58 ++++++++++++++-------------- 1 file changed, 29 insertions(+), 29 deletions(-) diff --git a/stdlib/compression/zstd/__init__.pyi b/stdlib/compression/zstd/__init__.pyi index 3459a87bd754..24a9633c488e 100644 --- a/stdlib/compression/zstd/__init__.pyi +++ b/stdlib/compression/zstd/__init__.pyi @@ -48,40 +48,40 @@ def compress( def decompress(data: ReadableBuffer, zstd_dict: ZstdDict | None = None, options: Mapping[int, int] | None = None) -> bytes: ... @final class CompressionParameter(enum.IntEnum): - compression_level: Final = _zstd.ZSTD_c_compressionLevel - window_log: Final = _zstd.ZSTD_c_windowLog - hash_log: Final = _zstd.ZSTD_c_hashLog - chain_log: Final = _zstd.ZSTD_c_chainLog - search_log: Final = _zstd.ZSTD_c_searchLog - min_match: Final = _zstd.ZSTD_c_minMatch - target_length: Final = _zstd.ZSTD_c_targetLength - strategy: Final = _zstd.ZSTD_c_strategy - enable_long_distance_matching: Final = _zstd.ZSTD_c_enableLongDistanceMatching - ldm_hash_log: Final = _zstd.ZSTD_c_ldmHashLog - ldm_min_match: Final = _zstd.ZSTD_c_ldmMinMatch - ldm_bucket_size_log: Final = _zstd.ZSTD_c_ldmBucketSizeLog - ldm_hash_rate_log: Final = _zstd.ZSTD_c_ldmHashRateLog - content_size_flag: Final = _zstd.ZSTD_c_contentSizeFlag - checksum_flag: Final = _zstd.ZSTD_c_checksumFlag - dict_id_flag: Final = _zstd.ZSTD_c_dictIDFlag - nb_workers: Final = _zstd.ZSTD_c_nbWorkers - job_size: Final = _zstd.ZSTD_c_jobSize - overlap_log: Final = _zstd.ZSTD_c_overlapLog + compression_level = _zstd.ZSTD_c_compressionLevel + window_log = _zstd.ZSTD_c_windowLog + hash_log = _zstd.ZSTD_c_hashLog + chain_log = _zstd.ZSTD_c_chainLog + search_log = _zstd.ZSTD_c_searchLog + min_match = _zstd.ZSTD_c_minMatch + target_length = _zstd.ZSTD_c_targetLength + strategy = _zstd.ZSTD_c_strategy + enable_long_distance_matching = _zstd.ZSTD_c_enableLongDistanceMatching + ldm_hash_log = _zstd.ZSTD_c_ldmHashLog + ldm_min_match = _zstd.ZSTD_c_ldmMinMatch + ldm_bucket_size_log = _zstd.ZSTD_c_ldmBucketSizeLog + ldm_hash_rate_log = _zstd.ZSTD_c_ldmHashRateLog + content_size_flag = _zstd.ZSTD_c_contentSizeFlag + checksum_flag = _zstd.ZSTD_c_checksumFlag + dict_id_flag = _zstd.ZSTD_c_dictIDFlag + nb_workers = _zstd.ZSTD_c_nbWorkers + job_size = _zstd.ZSTD_c_jobSize + overlap_log = _zstd.ZSTD_c_overlapLog def bounds(self) -> tuple[int, int]: ... @final class DecompressionParameter(enum.IntEnum): - window_log_max: Final = _zstd.ZSTD_d_windowLogMax + window_log_max = _zstd.ZSTD_d_windowLogMax def bounds(self) -> tuple[int, int]: ... @final class Strategy(enum.IntEnum): - fast: Final = _zstd.ZSTD_fast - dfast: Final = _zstd.ZSTD_dfast - greedy: Final = _zstd.ZSTD_greedy - lazy: Final = _zstd.ZSTD_lazy - lazy2: Final = _zstd.ZSTD_lazy2 - btlazy2: Final = _zstd.ZSTD_btlazy2 - btopt: Final = _zstd.ZSTD_btopt - btultra: Final = _zstd.ZSTD_btultra - btultra2: Final = _zstd.ZSTD_btultra2 + fast = _zstd.ZSTD_fast + dfast = _zstd.ZSTD_dfast + greedy = _zstd.ZSTD_greedy + lazy = _zstd.ZSTD_lazy + lazy2 = _zstd.ZSTD_lazy2 + btlazy2 = _zstd.ZSTD_btlazy2 + btopt = _zstd.ZSTD_btopt + btultra = _zstd.ZSTD_btultra + btultra2 = _zstd.ZSTD_btultra2