--- /dev/null
+import io
+import sys
+from _typeshed import Self, StrPath
+from os import PathLike
+from types import TracebackType
+from typing import IO, Any, Callable, Iterable, Iterator, Protocol, Sequence, Tuple, Type, overload
+from typing_extensions import Literal
+
+_DateTuple = Tuple[int, int, int, int, int, int]
+_ReadWriteMode = Literal["r", "w"]
+_ReadWriteBinaryMode = Literal["r", "w", "rb", "wb"]
+_ZipFileMode = Literal["r", "w", "x", "a"]
+
+class BadZipFile(Exception): ...
+
+BadZipfile = BadZipFile
+error = BadZipfile
+
+class LargeZipFile(Exception): ...
+
+class _ZipStream(Protocol):
+ def read(self, __n: int) -> bytes: ...
+ # The following methods are optional:
+ # def seekable(self) -> bool: ...
+ # def tell(self) -> int: ...
+ # def seek(self, __n: int) -> object: ...
+
+class _ClosableZipStream(_ZipStream, Protocol):
+ def close(self) -> object: ...
+
+class ZipExtFile(io.BufferedIOBase):
+ MAX_N: int
+ MIN_READ_SIZE: int
+
+ if sys.version_info >= (3, 7):
+ MAX_SEEK_READ: int
+
+ newlines: list[bytes] | None
+ mode: _ReadWriteMode
+ name: str
+ if sys.version_info >= (3, 7):
+ @overload
+ def __init__(
+ self,
+ fileobj: _ClosableZipStream,
+ mode: _ReadWriteMode,
+ zipinfo: ZipInfo,
+ pwd: bytes | None,
+ close_fileobj: Literal[True],
+ ) -> None: ...
+ @overload
+ def __init__(
+ self,
+ fileobj: _ClosableZipStream,
+ mode: _ReadWriteMode,
+ zipinfo: ZipInfo,
+ pwd: bytes | None = ...,
+ *,
+ close_fileobj: Literal[True],
+ ) -> None: ...
+ @overload
+ def __init__(
+ self,
+ fileobj: _ZipStream,
+ mode: _ReadWriteMode,
+ zipinfo: ZipInfo,
+ pwd: bytes | None = ...,
+ close_fileobj: Literal[False] = ...,
+ ) -> None: ...
+ else:
+ @overload
+ def __init__(
+ self,
+ fileobj: _ClosableZipStream,
+ mode: _ReadWriteMode,
+ zipinfo: ZipInfo,
+ decrypter: Callable[[Sequence[int]], bytes] | None,
+ close_fileobj: Literal[True],
+ ) -> None: ...
+ @overload
+ def __init__(
+ self,
+ fileobj: _ClosableZipStream,
+ mode: _ReadWriteMode,
+ zipinfo: ZipInfo,
+ decrypter: Callable[[Sequence[int]], bytes] | None = ...,
+ *,
+ close_fileobj: Literal[True],
+ ) -> None: ...
+ @overload
+ def __init__(
+ self,
+ fileobj: _ZipStream,
+ mode: _ReadWriteMode,
+ zipinfo: ZipInfo,
+ decrypter: Callable[[Sequence[int]], bytes] | None = ...,
+ close_fileobj: Literal[False] = ...,
+ ) -> None: ...
+ def read(self, n: int | None = ...) -> bytes: ...
+ def readline(self, limit: int = ...) -> bytes: ... # type: ignore
+ def __repr__(self) -> str: ...
+ def peek(self, n: int = ...) -> bytes: ...
+ def read1(self, n: int | None) -> bytes: ... # type: ignore
+ if sys.version_info >= (3, 7):
+ def seek(self, offset: int, whence: int = ...) -> int: ...
+
+class _Writer(Protocol):
+ def write(self, __s: str) -> object: ...
+
+class ZipFile:
+ filename: str | None
+ debug: int
+ comment: bytes
+ filelist: list[ZipInfo]
+ fp: IO[bytes] | None
+ NameToInfo: dict[str, ZipInfo]
+ start_dir: int # undocumented
+ compression: int # undocumented
+ compresslevel: int | None # undocumented
+ mode: _ZipFileMode # undocumented
+ pwd: str | None # undocumented
+ if sys.version_info >= (3, 8):
+ def __init__(
+ self,
+ file: StrPath | IO[bytes],
+ mode: _ZipFileMode = ...,
+ compression: int = ...,
+ allowZip64: bool = ...,
+ compresslevel: int | None = ...,
+ *,
+ strict_timestamps: bool = ...,
+ ) -> None: ...
+ elif sys.version_info >= (3, 7):
+ def __init__(
+ self,
+ file: StrPath | IO[bytes],
+ mode: _ZipFileMode = ...,
+ compression: int = ...,
+ allowZip64: bool = ...,
+ compresslevel: int | None = ...,
+ ) -> None: ...
+ else:
+ def __init__(
+ self, file: StrPath | IO[bytes], mode: _ZipFileMode = ..., compression: int = ..., allowZip64: bool = ...
+ ) -> None: ...
+ def __enter__(self: Self) -> Self: ...
+ def __exit__(
+ self, exc_type: Type[BaseException] | None, exc_val: BaseException | None, exc_tb: TracebackType | None
+ ) -> None: ...
+ def close(self) -> None: ...
+ def getinfo(self, name: str) -> ZipInfo: ...
+ def infolist(self) -> list[ZipInfo]: ...
+ def namelist(self) -> list[str]: ...
+ def open(
+ self, name: str | ZipInfo, mode: _ReadWriteMode = ..., pwd: bytes | None = ..., *, force_zip64: bool = ...
+ ) -> IO[bytes]: ...
+ def extract(self, member: str | ZipInfo, path: StrPath | None = ..., pwd: bytes | None = ...) -> str: ...
+ def extractall(
+ self, path: StrPath | None = ..., members: Iterable[str | ZipInfo] | None = ..., pwd: bytes | None = ...
+ ) -> None: ...
+ def printdir(self, file: _Writer | None = ...) -> None: ...
+ def setpassword(self, pwd: bytes) -> None: ...
+ def read(self, name: str | ZipInfo, pwd: bytes | None = ...) -> bytes: ...
+ def testzip(self) -> str | None: ...
+ if sys.version_info >= (3, 7):
+ def write(
+ self,
+ filename: StrPath,
+ arcname: StrPath | None = ...,
+ compress_type: int | None = ...,
+ compresslevel: int | None = ...,
+ ) -> None: ...
+ else:
+ def write(self, filename: StrPath, arcname: StrPath | None = ..., compress_type: int | None = ...) -> None: ...
+ if sys.version_info >= (3, 7):
+ def writestr(
+ self,
+ zinfo_or_arcname: str | ZipInfo,
+ data: bytes | str,
+ compress_type: int | None = ...,
+ compresslevel: int | None = ...,
+ ) -> None: ...
+ else:
+ def writestr(self, zinfo_or_arcname: str | ZipInfo, data: bytes | str, compress_type: int | None = ...) -> None: ...
+
+class PyZipFile(ZipFile):
+ def __init__(
+ self, file: str | IO[bytes], mode: _ZipFileMode = ..., compression: int = ..., allowZip64: bool = ..., optimize: int = ...
+ ) -> None: ...
+ def writepy(self, pathname: str, basename: str = ..., filterfunc: Callable[[str], bool] | None = ...) -> None: ...
+
+class ZipInfo:
+ filename: str
+ date_time: _DateTuple
+ compress_type: int
+ comment: bytes
+ extra: bytes
+ create_system: int
+ create_version: int
+ extract_version: int
+ reserved: int
+ flag_bits: int
+ volume: int
+ internal_attr: int
+ external_attr: int
+ header_offset: int
+ CRC: int
+ compress_size: int
+ file_size: int
+ orig_filename: str # undocumented
+ def __init__(self, filename: str = ..., date_time: _DateTuple = ...) -> None: ...
+ if sys.version_info >= (3, 8):
+ @classmethod
+ def from_file(cls, filename: StrPath, arcname: StrPath | None = ..., *, strict_timestamps: bool = ...) -> ZipInfo: ...
+ else:
+ @classmethod
+ def from_file(cls, filename: StrPath, arcname: StrPath | None = ...) -> ZipInfo: ...
+ def is_dir(self) -> bool: ...
+ def FileHeader(self, zip64: bool | None = ...) -> bytes: ...
+
+class _PathOpenProtocol(Protocol):
+ def __call__(self, mode: _ReadWriteMode = ..., pwd: bytes | None = ..., *, force_zip64: bool = ...) -> IO[bytes]: ...
+
+if sys.version_info >= (3, 8):
+ class Path:
+ @property
+ def name(self) -> str: ...
+ @property
+ def parent(self) -> PathLike[str]: ... # undocumented
+ if sys.version_info >= (3, 10):
+ @property
+ def filename(self) -> PathLike[str]: ... # undocumented
+ def __init__(self, root: ZipFile | StrPath | IO[bytes], at: str = ...) -> None: ...
+ if sys.version_info >= (3, 9):
+ def open(self, mode: _ReadWriteBinaryMode = ..., *args: Any, pwd: bytes | None = ..., **kwargs: Any) -> IO[bytes]: ...
+ else:
+ @property
+ def open(self) -> _PathOpenProtocol: ...
+ def iterdir(self) -> Iterator[Path]: ...
+ def is_dir(self) -> bool: ...
+ def is_file(self) -> bool: ...
+ def exists(self) -> bool: ...
+ def read_text(
+ self,
+ encoding: str | None = ...,
+ errors: str | None = ...,
+ newline: str | None = ...,
+ line_buffering: bool = ...,
+ write_through: bool = ...,
+ ) -> str: ...
+ def read_bytes(self) -> bytes: ...
+ if sys.version_info >= (3, 10):
+ def joinpath(self, *other: StrPath) -> Path: ...
+ else:
+ def joinpath(self, add: StrPath) -> Path: ... # undocumented
+ def __truediv__(self, add: StrPath) -> Path: ...
+
+def is_zipfile(filename: StrPath | IO[bytes]) -> bool: ...
+
+ZIP_STORED: int
+ZIP_DEFLATED: int
+ZIP64_LIMIT: int
+ZIP_FILECOUNT_LIMIT: int
+ZIP_MAX_COMMENT: int
+ZIP_BZIP2: int
+ZIP_LZMA: int