From: Adrian Garcia Badaracco <1755071+adriangb@users.noreply.github.com> Date: Tue, 13 Sep 2022 14:24:01 +0000 (-0500) Subject: add basic type annotation for RequestExtensions and RequestData (#2367) X-Git-Tag: 0.23.1~23 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=8152c4facd0f71e0f376287e41a0810a60fec9c6;p=thirdparty%2Fhttpx.git add basic type annotation for RequestExtensions and RequestData (#2367) --- diff --git a/httpx/_client.py b/httpx/_client.py index 730ab4a5..722735c1 100644 --- a/httpx/_client.py +++ b/httpx/_client.py @@ -38,6 +38,7 @@ from ._types import ( QueryParamTypes, RequestContent, RequestData, + RequestExtensions, RequestFiles, SyncByteStream, TimeoutTypes, @@ -328,7 +329,7 @@ class BaseClient: headers: typing.Optional[HeaderTypes] = None, cookies: typing.Optional[CookieTypes] = None, timeout: typing.Union[TimeoutTypes, UseClientDefault] = USE_CLIENT_DEFAULT, - extensions: typing.Optional[dict] = None, + extensions: typing.Optional[RequestExtensions] = None, ) -> Request: """ Build and return a request instance. @@ -773,7 +774,7 @@ class Client(BaseClient): auth: typing.Union[AuthTypes, UseClientDefault, None] = USE_CLIENT_DEFAULT, follow_redirects: typing.Union[bool, UseClientDefault] = USE_CLIENT_DEFAULT, timeout: typing.Union[TimeoutTypes, UseClientDefault] = USE_CLIENT_DEFAULT, - extensions: typing.Optional[dict] = None, + extensions: typing.Optional[RequestExtensions] = None, ) -> Response: """ Build and send a request. @@ -830,7 +831,7 @@ class Client(BaseClient): auth: typing.Union[AuthTypes, UseClientDefault, None] = USE_CLIENT_DEFAULT, follow_redirects: typing.Union[bool, UseClientDefault] = USE_CLIENT_DEFAULT, timeout: typing.Union[TimeoutTypes, UseClientDefault] = USE_CLIENT_DEFAULT, - extensions: typing.Optional[dict] = None, + extensions: typing.Optional[RequestExtensions] = None, ) -> typing.Iterator[Response]: """ Alternative to `httpx.request()` that streams the response body @@ -1029,7 +1030,7 @@ class Client(BaseClient): auth: typing.Union[AuthTypes, UseClientDefault] = USE_CLIENT_DEFAULT, follow_redirects: typing.Union[bool, UseClientDefault] = USE_CLIENT_DEFAULT, timeout: typing.Union[TimeoutTypes, UseClientDefault] = USE_CLIENT_DEFAULT, - extensions: typing.Optional[dict] = None, + extensions: typing.Optional[RequestExtensions] = None, ) -> Response: """ Send a `GET` request. @@ -1058,7 +1059,7 @@ class Client(BaseClient): auth: typing.Union[AuthTypes, UseClientDefault] = USE_CLIENT_DEFAULT, follow_redirects: typing.Union[bool, UseClientDefault] = USE_CLIENT_DEFAULT, timeout: typing.Union[TimeoutTypes, UseClientDefault] = USE_CLIENT_DEFAULT, - extensions: typing.Optional[dict] = None, + extensions: typing.Optional[RequestExtensions] = None, ) -> Response: """ Send an `OPTIONS` request. @@ -1087,7 +1088,7 @@ class Client(BaseClient): auth: typing.Union[AuthTypes, UseClientDefault] = USE_CLIENT_DEFAULT, follow_redirects: typing.Union[bool, UseClientDefault] = USE_CLIENT_DEFAULT, timeout: typing.Union[TimeoutTypes, UseClientDefault] = USE_CLIENT_DEFAULT, - extensions: typing.Optional[dict] = None, + extensions: typing.Optional[RequestExtensions] = None, ) -> Response: """ Send a `HEAD` request. @@ -1120,7 +1121,7 @@ class Client(BaseClient): auth: typing.Union[AuthTypes, UseClientDefault] = USE_CLIENT_DEFAULT, follow_redirects: typing.Union[bool, UseClientDefault] = USE_CLIENT_DEFAULT, timeout: typing.Union[TimeoutTypes, UseClientDefault] = USE_CLIENT_DEFAULT, - extensions: typing.Optional[dict] = None, + extensions: typing.Optional[RequestExtensions] = None, ) -> Response: """ Send a `POST` request. @@ -1157,7 +1158,7 @@ class Client(BaseClient): auth: typing.Union[AuthTypes, UseClientDefault] = USE_CLIENT_DEFAULT, follow_redirects: typing.Union[bool, UseClientDefault] = USE_CLIENT_DEFAULT, timeout: typing.Union[TimeoutTypes, UseClientDefault] = USE_CLIENT_DEFAULT, - extensions: typing.Optional[dict] = None, + extensions: typing.Optional[RequestExtensions] = None, ) -> Response: """ Send a `PUT` request. @@ -1194,7 +1195,7 @@ class Client(BaseClient): auth: typing.Union[AuthTypes, UseClientDefault] = USE_CLIENT_DEFAULT, follow_redirects: typing.Union[bool, UseClientDefault] = USE_CLIENT_DEFAULT, timeout: typing.Union[TimeoutTypes, UseClientDefault] = USE_CLIENT_DEFAULT, - extensions: typing.Optional[dict] = None, + extensions: typing.Optional[RequestExtensions] = None, ) -> Response: """ Send a `PATCH` request. @@ -1227,7 +1228,7 @@ class Client(BaseClient): auth: typing.Union[AuthTypes, UseClientDefault] = USE_CLIENT_DEFAULT, follow_redirects: typing.Union[bool, UseClientDefault] = USE_CLIENT_DEFAULT, timeout: typing.Union[TimeoutTypes, UseClientDefault] = USE_CLIENT_DEFAULT, - extensions: typing.Optional[dict] = None, + extensions: typing.Optional[RequestExtensions] = None, ) -> Response: """ Send a `DELETE` request. @@ -1493,7 +1494,7 @@ class AsyncClient(BaseClient): auth: typing.Union[AuthTypes, UseClientDefault, None] = USE_CLIENT_DEFAULT, follow_redirects: typing.Union[bool, UseClientDefault] = USE_CLIENT_DEFAULT, timeout: typing.Union[TimeoutTypes, UseClientDefault] = USE_CLIENT_DEFAULT, - extensions: typing.Optional[dict] = None, + extensions: typing.Optional[RequestExtensions] = None, ) -> Response: """ Build and send a request. @@ -1542,7 +1543,7 @@ class AsyncClient(BaseClient): auth: typing.Union[AuthTypes, UseClientDefault] = USE_CLIENT_DEFAULT, follow_redirects: typing.Union[bool, UseClientDefault] = USE_CLIENT_DEFAULT, timeout: typing.Union[TimeoutTypes, UseClientDefault] = USE_CLIENT_DEFAULT, - extensions: typing.Optional[dict] = None, + extensions: typing.Optional[RequestExtensions] = None, ) -> typing.AsyncIterator[Response]: """ Alternative to `httpx.request()` that streams the response body @@ -1741,7 +1742,7 @@ class AsyncClient(BaseClient): auth: typing.Union[AuthTypes, UseClientDefault, None] = USE_CLIENT_DEFAULT, follow_redirects: typing.Union[bool, UseClientDefault] = USE_CLIENT_DEFAULT, timeout: typing.Union[TimeoutTypes, UseClientDefault] = USE_CLIENT_DEFAULT, - extensions: typing.Optional[dict] = None, + extensions: typing.Optional[RequestExtensions] = None, ) -> Response: """ Send a `GET` request. @@ -1770,7 +1771,7 @@ class AsyncClient(BaseClient): auth: typing.Union[AuthTypes, UseClientDefault] = USE_CLIENT_DEFAULT, follow_redirects: typing.Union[bool, UseClientDefault] = USE_CLIENT_DEFAULT, timeout: typing.Union[TimeoutTypes, UseClientDefault] = USE_CLIENT_DEFAULT, - extensions: typing.Optional[dict] = None, + extensions: typing.Optional[RequestExtensions] = None, ) -> Response: """ Send an `OPTIONS` request. @@ -1799,7 +1800,7 @@ class AsyncClient(BaseClient): auth: typing.Union[AuthTypes, UseClientDefault] = USE_CLIENT_DEFAULT, follow_redirects: typing.Union[bool, UseClientDefault] = USE_CLIENT_DEFAULT, timeout: typing.Union[TimeoutTypes, UseClientDefault] = USE_CLIENT_DEFAULT, - extensions: typing.Optional[dict] = None, + extensions: typing.Optional[RequestExtensions] = None, ) -> Response: """ Send a `HEAD` request. @@ -1832,7 +1833,7 @@ class AsyncClient(BaseClient): auth: typing.Union[AuthTypes, UseClientDefault] = USE_CLIENT_DEFAULT, follow_redirects: typing.Union[bool, UseClientDefault] = USE_CLIENT_DEFAULT, timeout: typing.Union[TimeoutTypes, UseClientDefault] = USE_CLIENT_DEFAULT, - extensions: typing.Optional[dict] = None, + extensions: typing.Optional[RequestExtensions] = None, ) -> Response: """ Send a `POST` request. @@ -1869,7 +1870,7 @@ class AsyncClient(BaseClient): auth: typing.Union[AuthTypes, UseClientDefault] = USE_CLIENT_DEFAULT, follow_redirects: typing.Union[bool, UseClientDefault] = USE_CLIENT_DEFAULT, timeout: typing.Union[TimeoutTypes, UseClientDefault] = USE_CLIENT_DEFAULT, - extensions: typing.Optional[dict] = None, + extensions: typing.Optional[RequestExtensions] = None, ) -> Response: """ Send a `PUT` request. @@ -1906,7 +1907,7 @@ class AsyncClient(BaseClient): auth: typing.Union[AuthTypes, UseClientDefault] = USE_CLIENT_DEFAULT, follow_redirects: typing.Union[bool, UseClientDefault] = USE_CLIENT_DEFAULT, timeout: typing.Union[TimeoutTypes, UseClientDefault] = USE_CLIENT_DEFAULT, - extensions: typing.Optional[dict] = None, + extensions: typing.Optional[RequestExtensions] = None, ) -> Response: """ Send a `PATCH` request. @@ -1939,7 +1940,7 @@ class AsyncClient(BaseClient): auth: typing.Union[AuthTypes, UseClientDefault] = USE_CLIENT_DEFAULT, follow_redirects: typing.Union[bool, UseClientDefault] = USE_CLIENT_DEFAULT, timeout: typing.Union[TimeoutTypes, UseClientDefault] = USE_CLIENT_DEFAULT, - extensions: typing.Optional[dict] = None, + extensions: typing.Optional[RequestExtensions] = None, ) -> Response: """ Send a `DELETE` request. diff --git a/httpx/_content.py b/httpx/_content.py index eb7a7aef..1f149a19 100644 --- a/httpx/_content.py +++ b/httpx/_content.py @@ -8,6 +8,7 @@ from typing import ( Dict, Iterable, Iterator, + Mapping, Optional, Tuple, Union, @@ -134,7 +135,7 @@ def encode_content( def encode_urlencoded_data( - data: dict, + data: RequestData, ) -> Tuple[Dict[str, str], ByteStream]: plain_data = [] for key, value in data.items(): @@ -150,7 +151,7 @@ def encode_urlencoded_data( def encode_multipart_data( - data: dict, files: RequestFiles, boundary: Optional[bytes] + data: RequestData, files: RequestFiles, boundary: Optional[bytes] ) -> Tuple[Dict[str, str], MultipartStream]: multipart = MultipartStream(data=data, files=files, boundary=boundary) headers = multipart.get_headers() @@ -192,7 +193,7 @@ def encode_request( Handles encoding the given `content`, `data`, `files`, and `json`, returning a two-tuple of (, ). """ - if data is not None and not isinstance(data, dict): + if data is not None and not isinstance(data, Mapping): # type: ignore # We prefer to separate `content=` # for raw request content, and `data=
` for url encoded or # multipart form content. diff --git a/httpx/_main.py b/httpx/_main.py index ebcb6521..24f1e558 100644 --- a/httpx/_main.py +++ b/httpx/_main.py @@ -197,7 +197,9 @@ def format_certificate(cert: dict) -> str: # pragma: nocover return "\n".join(lines) -def trace(name: str, info: dict, verbose: bool = False) -> None: +def trace( + name: str, info: typing.Mapping[str, typing.Any], verbose: bool = False +) -> None: console = rich.console.Console() if name == "connection.connect_tcp.started" and verbose: host = info["host"] diff --git a/httpx/_models.py b/httpx/_models.py index 84739f74..5d8a51b3 100644 --- a/httpx/_models.py +++ b/httpx/_models.py @@ -35,8 +35,10 @@ from ._types import ( QueryParamTypes, RequestContent, RequestData, + RequestExtensions, RequestFiles, ResponseContent, + ResponseExtensions, SyncByteStream, ) from ._urls import URL @@ -316,7 +318,7 @@ class Request: files: typing.Optional[RequestFiles] = None, json: typing.Optional[typing.Any] = None, stream: typing.Union[SyncByteStream, AsyncByteStream, None] = None, - extensions: typing.Optional[dict] = None, + extensions: typing.Optional[RequestExtensions] = None, ): self.method = ( method.decode("ascii").upper() @@ -452,7 +454,7 @@ class Response: json: typing.Any = None, stream: typing.Union[SyncByteStream, AsyncByteStream, None] = None, request: typing.Optional[Request] = None, - extensions: typing.Optional[dict] = None, + extensions: typing.Optional[ResponseExtensions] = None, history: typing.Optional[typing.List["Response"]] = None, default_encoding: typing.Union[str, typing.Callable[[bytes], str]] = "utf-8", ): diff --git a/httpx/_multipart.py b/httpx/_multipart.py index 087448f9..03296497 100644 --- a/httpx/_multipart.py +++ b/httpx/_multipart.py @@ -8,6 +8,7 @@ from ._types import ( AsyncByteStream, FileContent, FileTypes, + RequestData, RequestFiles, SyncByteStream, ) @@ -190,7 +191,10 @@ class MultipartStream(SyncByteStream, AsyncByteStream): """ def __init__( - self, data: dict, files: RequestFiles, boundary: typing.Optional[bytes] = None + self, + data: RequestData, + files: RequestFiles, + boundary: typing.Optional[bytes] = None, ) -> None: if boundary is None: boundary = binascii.hexlify(os.urandom(16)) @@ -202,7 +206,7 @@ class MultipartStream(SyncByteStream, AsyncByteStream): self.fields = list(self._iter_fields(data, files)) def _iter_fields( - self, data: dict, files: RequestFiles + self, data: RequestData, files: RequestFiles ) -> typing.Iterator[typing.Union[FileField, DataField]]: for name, value in data.items(): if isinstance(value, (tuple, list)): diff --git a/httpx/_types.py b/httpx/_types.py index 8a50314b..e015844b 100644 --- a/httpx/_types.py +++ b/httpx/_types.py @@ -7,6 +7,7 @@ from http.cookiejar import CookieJar from typing import ( IO, TYPE_CHECKING, + Any, AsyncIterable, AsyncIterator, Callable, @@ -75,8 +76,9 @@ AuthTypes = Union[ RequestContent = Union[str, bytes, Iterable[bytes], AsyncIterable[bytes]] ResponseContent = Union[str, bytes, Iterable[bytes], AsyncIterable[bytes]] +ResponseExtensions = Dict[str, Any] -RequestData = dict +RequestData = Mapping[str, Any] FileContent = Union[IO[bytes], bytes] FileTypes = Union[ @@ -91,6 +93,8 @@ FileTypes = Union[ ] RequestFiles = Union[Mapping[str, FileTypes], Sequence[Tuple[str, FileTypes]]] +RequestExtensions = Dict[str, Any] + class SyncByteStream: def __iter__(self) -> Iterator[bytes]: