From 6d6894e1efa6e83d58f574bf447a4e3ffb7ed322 Mon Sep 17 00:00:00 2001 From: Sebastian Rittau Date: Tue, 23 Oct 2018 13:43:53 +0200 Subject: [PATCH] Annotate werkzeug wrap_file() and FileWrapper (#2519) * Add FileWrapper protocol to wsgiref.types * Annotate werkzeug's wrap_file and FileWrapper * Remove empty line at end of file * Fix _Readable protocols --- stdlib/2and3/wsgiref/types.pyi | 6 ++++++ third_party/2and3/werkzeug/wsgi.pyi | 25 ++++++++++++++----------- 2 files changed, 20 insertions(+), 11 deletions(-) diff --git a/stdlib/2and3/wsgiref/types.pyi b/stdlib/2and3/wsgiref/types.pyi index 808c68034..39a913eea 100644 --- a/stdlib/2and3/wsgiref/types.pyi +++ b/stdlib/2and3/wsgiref/types.pyi @@ -36,3 +36,9 @@ class ErrorStream(Protocol): def flush(self) -> None: ... def write(self, s: str) -> None: ... def writelines(self, seq: List[str]) -> None: ... + +class _Readable(Protocol): + def read(self, size: int = ...) -> bytes: ... +# Optional file wrapper in wsgi.file_wrapper +class FileWrapper(Protocol): + def __call__(self, file: _Readable, block_size: int = ...) -> Iterable[bytes]: ... diff --git a/third_party/2and3/werkzeug/wsgi.pyi b/third_party/2and3/werkzeug/wsgi.pyi index 5adc153cc..ef342afd6 100644 --- a/third_party/2and3/werkzeug/wsgi.pyi +++ b/third_party/2and3/werkzeug/wsgi.pyi @@ -1,4 +1,4 @@ -from typing import Any, Optional +from typing import Any, Optional, Protocol, Iterable from wsgiref.types import WSGIEnvironment, InputStream def responder(f): ... @@ -40,18 +40,21 @@ class ClosingIterator: def __next__(self): ... def close(self): ... -def wrap_file(environ, file, buffer_size=8192): ... +class _Readable(Protocol): + def read(self, size: int = ...) -> bytes: ... + +def wrap_file(environ: WSGIEnvironment, file: _Readable, buffer_size: int = ...) -> Iterable[bytes]: ... class FileWrapper: - file = ... # type: Any - buffer_size = ... # type: Any - def __init__(self, file, buffer_size=8192): ... - def close(self): ... - def seekable(self): ... - def seek(self, *args): ... - def tell(self): ... - def __iter__(self): ... - def __next__(self): ... + file: _Readable + buffer_size: int + def __init__(self, file: _Readable, buffer_size: int = ...) -> None: ... + def close(self) -> None: ... + def seekable(self) -> bool: ... + def seek(self, offset: int, whence: int = ...) -> None: ... + def tell(self) -> Optional[int]: ... + def __iter__(self) -> FileWrapper: ... + def __next__(self) -> bytes: ... class _RangeWrapper: iterable = ... # type: Any