Skip to content

Commit 371b6e9

Browse files
authored
Use __future__.annotations (#3068)
* Switch to new typing style * lint
1 parent 4f6edf3 commit 371b6e9

25 files changed

+623
-624
lines changed

httpx/_api.py

Lines changed: 85 additions & 83 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
from __future__ import annotations
2+
13
import typing
24
from contextlib import contextmanager
35

@@ -25,20 +27,20 @@ def request(
2527
method: str,
2628
url: URLTypes,
2729
*,
28-
params: typing.Optional[QueryParamTypes] = None,
29-
content: typing.Optional[RequestContent] = None,
30-
data: typing.Optional[RequestData] = None,
31-
files: typing.Optional[RequestFiles] = None,
32-
json: typing.Optional[typing.Any] = None,
33-
headers: typing.Optional[HeaderTypes] = None,
34-
cookies: typing.Optional[CookieTypes] = None,
35-
auth: typing.Optional[AuthTypes] = None,
36-
proxy: typing.Optional[ProxyTypes] = None,
37-
proxies: typing.Optional[ProxiesTypes] = None,
30+
params: QueryParamTypes | None = None,
31+
content: RequestContent | None = None,
32+
data: RequestData | None = None,
33+
files: RequestFiles | None = None,
34+
json: typing.Any | None = None,
35+
headers: HeaderTypes | None = None,
36+
cookies: CookieTypes | None = None,
37+
auth: AuthTypes | None = None,
38+
proxy: ProxyTypes | None = None,
39+
proxies: ProxiesTypes | None = None,
3840
timeout: TimeoutTypes = DEFAULT_TIMEOUT_CONFIG,
3941
follow_redirects: bool = False,
4042
verify: VerifyTypes = True,
41-
cert: typing.Optional[CertTypes] = None,
43+
cert: CertTypes | None = None,
4244
trust_env: bool = True,
4345
) -> Response:
4446
"""
@@ -120,20 +122,20 @@ def stream(
120122
method: str,
121123
url: URLTypes,
122124
*,
123-
params: typing.Optional[QueryParamTypes] = None,
124-
content: typing.Optional[RequestContent] = None,
125-
data: typing.Optional[RequestData] = None,
126-
files: typing.Optional[RequestFiles] = None,
127-
json: typing.Optional[typing.Any] = None,
128-
headers: typing.Optional[HeaderTypes] = None,
129-
cookies: typing.Optional[CookieTypes] = None,
130-
auth: typing.Optional[AuthTypes] = None,
131-
proxy: typing.Optional[ProxyTypes] = None,
132-
proxies: typing.Optional[ProxiesTypes] = None,
125+
params: QueryParamTypes | None = None,
126+
content: RequestContent | None = None,
127+
data: RequestData | None = None,
128+
files: RequestFiles | None = None,
129+
json: typing.Any | None = None,
130+
headers: HeaderTypes | None = None,
131+
cookies: CookieTypes | None = None,
132+
auth: AuthTypes | None = None,
133+
proxy: ProxyTypes | None = None,
134+
proxies: ProxiesTypes | None = None,
133135
timeout: TimeoutTypes = DEFAULT_TIMEOUT_CONFIG,
134136
follow_redirects: bool = False,
135137
verify: VerifyTypes = True,
136-
cert: typing.Optional[CertTypes] = None,
138+
cert: CertTypes | None = None,
137139
trust_env: bool = True,
138140
) -> typing.Iterator[Response]:
139141
"""
@@ -173,14 +175,14 @@ def stream(
173175
def get(
174176
url: URLTypes,
175177
*,
176-
params: typing.Optional[QueryParamTypes] = None,
177-
headers: typing.Optional[HeaderTypes] = None,
178-
cookies: typing.Optional[CookieTypes] = None,
179-
auth: typing.Optional[AuthTypes] = None,
180-
proxy: typing.Optional[ProxyTypes] = None,
181-
proxies: typing.Optional[ProxiesTypes] = None,
178+
params: QueryParamTypes | None = None,
179+
headers: HeaderTypes | None = None,
180+
cookies: CookieTypes | None = None,
181+
auth: AuthTypes | None = None,
182+
proxy: ProxyTypes | None = None,
183+
proxies: ProxiesTypes | None = None,
182184
follow_redirects: bool = False,
183-
cert: typing.Optional[CertTypes] = None,
185+
cert: CertTypes | None = None,
184186
verify: VerifyTypes = True,
185187
timeout: TimeoutTypes = DEFAULT_TIMEOUT_CONFIG,
186188
trust_env: bool = True,
@@ -213,14 +215,14 @@ def get(
213215
def options(
214216
url: URLTypes,
215217
*,
216-
params: typing.Optional[QueryParamTypes] = None,
217-
headers: typing.Optional[HeaderTypes] = None,
218-
cookies: typing.Optional[CookieTypes] = None,
219-
auth: typing.Optional[AuthTypes] = None,
220-
proxy: typing.Optional[ProxyTypes] = None,
221-
proxies: typing.Optional[ProxiesTypes] = None,
218+
params: QueryParamTypes | None = None,
219+
headers: HeaderTypes | None = None,
220+
cookies: CookieTypes | None = None,
221+
auth: AuthTypes | None = None,
222+
proxy: ProxyTypes | None = None,
223+
proxies: ProxiesTypes | None = None,
222224
follow_redirects: bool = False,
223-
cert: typing.Optional[CertTypes] = None,
225+
cert: CertTypes | None = None,
224226
verify: VerifyTypes = True,
225227
timeout: TimeoutTypes = DEFAULT_TIMEOUT_CONFIG,
226228
trust_env: bool = True,
@@ -253,14 +255,14 @@ def options(
253255
def head(
254256
url: URLTypes,
255257
*,
256-
params: typing.Optional[QueryParamTypes] = None,
257-
headers: typing.Optional[HeaderTypes] = None,
258-
cookies: typing.Optional[CookieTypes] = None,
259-
auth: typing.Optional[AuthTypes] = None,
260-
proxy: typing.Optional[ProxyTypes] = None,
261-
proxies: typing.Optional[ProxiesTypes] = None,
258+
params: QueryParamTypes | None = None,
259+
headers: HeaderTypes | None = None,
260+
cookies: CookieTypes | None = None,
261+
auth: AuthTypes | None = None,
262+
proxy: ProxyTypes | None = None,
263+
proxies: ProxiesTypes | None = None,
262264
follow_redirects: bool = False,
263-
cert: typing.Optional[CertTypes] = None,
265+
cert: CertTypes | None = None,
264266
verify: VerifyTypes = True,
265267
timeout: TimeoutTypes = DEFAULT_TIMEOUT_CONFIG,
266268
trust_env: bool = True,
@@ -293,18 +295,18 @@ def head(
293295
def post(
294296
url: URLTypes,
295297
*,
296-
content: typing.Optional[RequestContent] = None,
297-
data: typing.Optional[RequestData] = None,
298-
files: typing.Optional[RequestFiles] = None,
299-
json: typing.Optional[typing.Any] = None,
300-
params: typing.Optional[QueryParamTypes] = None,
301-
headers: typing.Optional[HeaderTypes] = None,
302-
cookies: typing.Optional[CookieTypes] = None,
303-
auth: typing.Optional[AuthTypes] = None,
304-
proxy: typing.Optional[ProxyTypes] = None,
305-
proxies: typing.Optional[ProxiesTypes] = None,
298+
content: RequestContent | None = None,
299+
data: RequestData | None = None,
300+
files: RequestFiles | None = None,
301+
json: typing.Any | None = None,
302+
params: QueryParamTypes | None = None,
303+
headers: HeaderTypes | None = None,
304+
cookies: CookieTypes | None = None,
305+
auth: AuthTypes | None = None,
306+
proxy: ProxyTypes | None = None,
307+
proxies: ProxiesTypes | None = None,
306308
follow_redirects: bool = False,
307-
cert: typing.Optional[CertTypes] = None,
309+
cert: CertTypes | None = None,
308310
verify: VerifyTypes = True,
309311
timeout: TimeoutTypes = DEFAULT_TIMEOUT_CONFIG,
310312
trust_env: bool = True,
@@ -338,18 +340,18 @@ def post(
338340
def put(
339341
url: URLTypes,
340342
*,
341-
content: typing.Optional[RequestContent] = None,
342-
data: typing.Optional[RequestData] = None,
343-
files: typing.Optional[RequestFiles] = None,
344-
json: typing.Optional[typing.Any] = None,
345-
params: typing.Optional[QueryParamTypes] = None,
346-
headers: typing.Optional[HeaderTypes] = None,
347-
cookies: typing.Optional[CookieTypes] = None,
348-
auth: typing.Optional[AuthTypes] = None,
349-
proxy: typing.Optional[ProxyTypes] = None,
350-
proxies: typing.Optional[ProxiesTypes] = None,
343+
content: RequestContent | None = None,
344+
data: RequestData | None = None,
345+
files: RequestFiles | None = None,
346+
json: typing.Any | None = None,
347+
params: QueryParamTypes | None = None,
348+
headers: HeaderTypes | None = None,
349+
cookies: CookieTypes | None = None,
350+
auth: AuthTypes | None = None,
351+
proxy: ProxyTypes | None = None,
352+
proxies: ProxiesTypes | None = None,
351353
follow_redirects: bool = False,
352-
cert: typing.Optional[CertTypes] = None,
354+
cert: CertTypes | None = None,
353355
verify: VerifyTypes = True,
354356
timeout: TimeoutTypes = DEFAULT_TIMEOUT_CONFIG,
355357
trust_env: bool = True,
@@ -383,18 +385,18 @@ def put(
383385
def patch(
384386
url: URLTypes,
385387
*,
386-
content: typing.Optional[RequestContent] = None,
387-
data: typing.Optional[RequestData] = None,
388-
files: typing.Optional[RequestFiles] = None,
389-
json: typing.Optional[typing.Any] = None,
390-
params: typing.Optional[QueryParamTypes] = None,
391-
headers: typing.Optional[HeaderTypes] = None,
392-
cookies: typing.Optional[CookieTypes] = None,
393-
auth: typing.Optional[AuthTypes] = None,
394-
proxy: typing.Optional[ProxyTypes] = None,
395-
proxies: typing.Optional[ProxiesTypes] = None,
388+
content: RequestContent | None = None,
389+
data: RequestData | None = None,
390+
files: RequestFiles | None = None,
391+
json: typing.Any | None = None,
392+
params: QueryParamTypes | None = None,
393+
headers: HeaderTypes | None = None,
394+
cookies: CookieTypes | None = None,
395+
auth: AuthTypes | None = None,
396+
proxy: ProxyTypes | None = None,
397+
proxies: ProxiesTypes | None = None,
396398
follow_redirects: bool = False,
397-
cert: typing.Optional[CertTypes] = None,
399+
cert: CertTypes | None = None,
398400
verify: VerifyTypes = True,
399401
timeout: TimeoutTypes = DEFAULT_TIMEOUT_CONFIG,
400402
trust_env: bool = True,
@@ -428,14 +430,14 @@ def patch(
428430
def delete(
429431
url: URLTypes,
430432
*,
431-
params: typing.Optional[QueryParamTypes] = None,
432-
headers: typing.Optional[HeaderTypes] = None,
433-
cookies: typing.Optional[CookieTypes] = None,
434-
auth: typing.Optional[AuthTypes] = None,
435-
proxy: typing.Optional[ProxyTypes] = None,
436-
proxies: typing.Optional[ProxiesTypes] = None,
433+
params: QueryParamTypes | None = None,
434+
headers: HeaderTypes | None = None,
435+
cookies: CookieTypes | None = None,
436+
auth: AuthTypes | None = None,
437+
proxy: ProxyTypes | None = None,
438+
proxies: ProxiesTypes | None = None,
437439
follow_redirects: bool = False,
438-
cert: typing.Optional[CertTypes] = None,
440+
cert: CertTypes | None = None,
439441
verify: VerifyTypes = True,
440442
timeout: TimeoutTypes = DEFAULT_TIMEOUT_CONFIG,
441443
trust_env: bool = True,

httpx/_auth.py

Lines changed: 16 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
from __future__ import annotations
2+
13
import hashlib
24
import os
35
import re
@@ -124,18 +126,14 @@ class BasicAuth(Auth):
124126
and uses HTTP Basic authentication.
125127
"""
126128

127-
def __init__(
128-
self, username: typing.Union[str, bytes], password: typing.Union[str, bytes]
129-
) -> None:
129+
def __init__(self, username: str | bytes, password: str | bytes) -> None:
130130
self._auth_header = self._build_auth_header(username, password)
131131

132132
def auth_flow(self, request: Request) -> typing.Generator[Request, Response, None]:
133133
request.headers["Authorization"] = self._auth_header
134134
yield request
135135

136-
def _build_auth_header(
137-
self, username: typing.Union[str, bytes], password: typing.Union[str, bytes]
138-
) -> str:
136+
def _build_auth_header(self, username: str | bytes, password: str | bytes) -> str:
139137
userpass = b":".join((to_bytes(username), to_bytes(password)))
140138
token = b64encode(userpass).decode()
141139
return f"Basic {token}"
@@ -146,7 +144,7 @@ class NetRCAuth(Auth):
146144
Use a 'netrc' file to lookup basic auth credentials based on the url host.
147145
"""
148146

149-
def __init__(self, file: typing.Optional[str] = None) -> None:
147+
def __init__(self, file: str | None = None) -> None:
150148
# Lazily import 'netrc'.
151149
# There's no need for us to load this module unless 'NetRCAuth' is being used.
152150
import netrc
@@ -165,16 +163,14 @@ def auth_flow(self, request: Request) -> typing.Generator[Request, Response, Non
165163
)
166164
yield request
167165

168-
def _build_auth_header(
169-
self, username: typing.Union[str, bytes], password: typing.Union[str, bytes]
170-
) -> str:
166+
def _build_auth_header(self, username: str | bytes, password: str | bytes) -> str:
171167
userpass = b":".join((to_bytes(username), to_bytes(password)))
172168
token = b64encode(userpass).decode()
173169
return f"Basic {token}"
174170

175171

176172
class DigestAuth(Auth):
177-
_ALGORITHM_TO_HASH_FUNCTION: typing.Dict[str, typing.Callable[[bytes], "_Hash"]] = {
173+
_ALGORITHM_TO_HASH_FUNCTION: dict[str, typing.Callable[[bytes], _Hash]] = {
178174
"MD5": hashlib.md5,
179175
"MD5-SESS": hashlib.md5,
180176
"SHA": hashlib.sha1,
@@ -185,12 +181,10 @@ class DigestAuth(Auth):
185181
"SHA-512-SESS": hashlib.sha512,
186182
}
187183

188-
def __init__(
189-
self, username: typing.Union[str, bytes], password: typing.Union[str, bytes]
190-
) -> None:
184+
def __init__(self, username: str | bytes, password: str | bytes) -> None:
191185
self._username = to_bytes(username)
192186
self._password = to_bytes(password)
193-
self._last_challenge: typing.Optional[_DigestAuthChallenge] = None
187+
self._last_challenge: _DigestAuthChallenge | None = None
194188
self._nonce_count = 1
195189

196190
def auth_flow(self, request: Request) -> typing.Generator[Request, Response, None]:
@@ -226,7 +220,7 @@ def auth_flow(self, request: Request) -> typing.Generator[Request, Response, Non
226220

227221
def _parse_challenge(
228222
self, request: Request, response: Response, auth_header: str
229-
) -> "_DigestAuthChallenge":
223+
) -> _DigestAuthChallenge:
230224
"""
231225
Returns a challenge from a Digest WWW-Authenticate header.
232226
These take the form of:
@@ -237,7 +231,7 @@ def _parse_challenge(
237231
# This method should only ever have been called with a Digest auth header.
238232
assert scheme.lower() == "digest"
239233

240-
header_dict: typing.Dict[str, str] = {}
234+
header_dict: dict[str, str] = {}
241235
for field in parse_http_list(fields):
242236
key, value = field.strip().split("=", 1)
243237
header_dict[key] = unquote(value)
@@ -256,7 +250,7 @@ def _parse_challenge(
256250
raise ProtocolError(message, request=request) from exc
257251

258252
def _build_auth_header(
259-
self, request: Request, challenge: "_DigestAuthChallenge"
253+
self, request: Request, challenge: _DigestAuthChallenge
260254
) -> str:
261255
hash_func = self._ALGORITHM_TO_HASH_FUNCTION[challenge.algorithm.upper()]
262256

@@ -311,7 +305,7 @@ def _get_client_nonce(self, nonce_count: int, nonce: bytes) -> bytes:
311305

312306
return hashlib.sha1(s).hexdigest()[:16].encode()
313307

314-
def _get_header_value(self, header_fields: typing.Dict[str, bytes]) -> str:
308+
def _get_header_value(self, header_fields: dict[str, bytes]) -> str:
315309
NON_QUOTED_FIELDS = ("algorithm", "qop", "nc")
316310
QUOTED_TEMPLATE = '{}="{}"'
317311
NON_QUOTED_TEMPLATE = "{}={}"
@@ -329,9 +323,7 @@ def _get_header_value(self, header_fields: typing.Dict[str, bytes]) -> str:
329323

330324
return header_value
331325

332-
def _resolve_qop(
333-
self, qop: typing.Optional[bytes], request: Request
334-
) -> typing.Optional[bytes]:
326+
def _resolve_qop(self, qop: bytes | None, request: Request) -> bytes | None:
335327
if qop is None:
336328
return None
337329
qops = re.split(b", ?", qop)
@@ -349,5 +341,5 @@ class _DigestAuthChallenge(typing.NamedTuple):
349341
realm: bytes
350342
nonce: bytes
351343
algorithm: str
352-
opaque: typing.Optional[bytes]
353-
qop: typing.Optional[bytes]
344+
opaque: bytes | None
345+
qop: bytes | None

0 commit comments

Comments
 (0)