Skip to content

Commit 0104531

Browse files
authored
Improve oauthlib.common (#13744)
1 parent d26a889 commit 0104531

File tree

4 files changed

+118
-96
lines changed

4 files changed

+118
-96
lines changed
Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,7 @@
1-
def set_debug(debug_val) -> None: ...
2-
def get_debug(): ...
1+
from typing import Final
2+
3+
__author__: Final[str]
4+
__version__: Final[str]
5+
6+
def set_debug(debug_val: bool) -> None: ...
7+
def get_debug() -> bool: ...

stubs/oauthlib/oauthlib/common.pyi

Lines changed: 65 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -1,64 +1,81 @@
1-
from _typeshed import Incomplete
2-
from typing import Any
1+
import re
2+
from _typeshed import Incomplete, SupportsLenAndGetItem
3+
from collections.abc import Iterable, Mapping
4+
from logging import Logger
5+
from typing import Any, Final, Literal, TypeVar, overload
6+
from typing_extensions import TypeAlias
37

4-
UNICODE_ASCII_CHARACTER_SET: str
5-
CLIENT_ID_CHARACTER_SET: str
6-
SANITIZE_PATTERN: Any
7-
INVALID_HEX_PATTERN: Any
8-
always_safe: str
9-
log: Any
8+
_T = TypeVar("_T")
9+
_V = TypeVar("_V")
1010

11-
def quote(s, safe: bytes = b"/"): ...
12-
def unquote(s): ...
13-
def urlencode(params): ...
14-
def encode_params_utf8(params): ...
15-
def decode_params_utf8(params): ...
11+
_HTTPMethod: TypeAlias = Literal["CONNECT", "DELETE", "GET", "HEAD", "OPTIONS", "PATCH", "POST", "PUT", "TRACE"]
1612

17-
urlencoded: Any
13+
UNICODE_ASCII_CHARACTER_SET: Final[str]
14+
CLIENT_ID_CHARACTER_SET: Final[str]
15+
SANITIZE_PATTERN: Final[re.Pattern[str]]
16+
INVALID_HEX_PATTERN: Final[re.Pattern[str]]
17+
always_safe: Final[str]
18+
log: Logger
1819

19-
def urldecode(query): ...
20-
def extract_params(raw): ...
21-
def generate_nonce(): ...
22-
def generate_timestamp(): ...
23-
def generate_token(length: int = 30, chars=...): ...
24-
def generate_signed_token(private_pem, request): ...
20+
def quote(s: str | bytes, safe: bytes = b"/") -> str: ...
21+
def unquote(s: str | bytes) -> str: ...
22+
def urlencode(params: Iterable[tuple[str | bytes, str | bytes]]) -> str: ...
23+
def encode_params_utf8(params: Iterable[tuple[str | bytes, str | bytes]]) -> list[tuple[bytes, bytes]]: ...
24+
def decode_params_utf8(params: Iterable[tuple[str | bytes, str | bytes]]) -> list[tuple[str, str]]: ...
25+
26+
urlencoded: Final[set[str]]
27+
28+
def urldecode(query: str | bytes) -> list[tuple[str, str]]: ...
29+
def extract_params(raw: str | bytes | dict[str, str] | Iterable[tuple[str, str]]) -> list[tuple[str, str]] | None: ...
30+
def generate_nonce() -> str: ...
31+
def generate_timestamp() -> str: ...
32+
def generate_token(length: int = 30, chars: SupportsLenAndGetItem[str] = ...) -> str: ...
33+
def generate_signed_token(private_pem: str, request: Request) -> str: ...
2534
def verify_signed_token(public_pem, token): ...
26-
def generate_client_id(length: int = 30, chars=...): ...
27-
def add_params_to_qs(query, params): ...
28-
def add_params_to_uri(uri, params, fragment: bool = False): ...
29-
def safe_string_equals(a, b): ...
30-
def to_unicode(data, encoding: str = "UTF-8"): ...
35+
def generate_client_id(length: int = 30, chars: SupportsLenAndGetItem[str] = ...) -> str: ...
36+
def add_params_to_qs(query: str, params: dict[str, str] | Iterable[tuple[str, str]]) -> str: ...
37+
def add_params_to_uri(uri: str, params: dict[str, str] | Iterable[tuple[str, str]], fragment: bool = False) -> str: ...
38+
def safe_string_equals(a: str, b: str) -> bool: ...
39+
@overload
40+
def to_unicode(data: str | bytes, encoding: str = "UTF-8") -> str: ...
41+
@overload
42+
def to_unicode(data: Mapping[str, _V] | Mapping[bytes, _V], encoding: str = "UTF-8") -> dict[str, _V]: ...
43+
@overload
44+
def to_unicode(data: _T, encoding: str = "UTF-8") -> _T: ...
3145

32-
class CaseInsensitiveDict(dict[Any, Any]):
33-
proxy: Any
34-
def __init__(self, data) -> None: ...
35-
def __contains__(self, k): ...
36-
def __delitem__(self, k) -> None: ...
37-
def __getitem__(self, k): ...
38-
def get(self, k, default: Incomplete | None = None): ...
39-
def __setitem__(self, k, v) -> None: ...
46+
class CaseInsensitiveDict(dict[str, Incomplete]):
47+
proxy: dict[str, str]
48+
def __init__(self, data: dict[str, Incomplete]) -> None: ...
49+
@overload
50+
def __contains__(self, k: str) -> bool: ...
51+
@overload
52+
def __contains__(self, k: object) -> bool: ...
53+
def __delitem__(self, k: str) -> None: ...
54+
def __getitem__(self, k: str): ...
55+
def get(self, k: str, default: Incomplete | None = None) -> Incomplete | None: ...
56+
def __setitem__(self, k: str, v) -> None: ...
4057
def update(self, *args, **kwargs) -> None: ...
4158

4259
class Request:
43-
uri: Any
44-
http_method: Any
45-
headers: Any
46-
body: Any
47-
decoded_body: Any
48-
oauth_params: Any
49-
validator_log: Any
60+
uri: str
61+
http_method: _HTTPMethod
62+
headers: CaseInsensitiveDict
63+
body: str | dict[str, str] | list[tuple[str, str]] | None
64+
decoded_body: list[tuple[str, str]] | None
65+
oauth_params: list[str]
66+
validator_log: dict[str, Any] # value type depends on the key
5067
def __init__(
5168
self,
52-
uri,
53-
http_method: str = "GET",
54-
body: Incomplete | None = None,
55-
headers: Incomplete | None = None,
69+
uri: str,
70+
http_method: _HTTPMethod = "GET",
71+
body: str | dict[str, str] | list[tuple[str, str]] | None = None,
72+
headers: Mapping[str, str] | None = None,
5673
encoding: str = "utf-8",
5774
): ...
58-
def __getattr__(self, name: str): ...
75+
def __getattr__(self, name: str) -> str | None: ... # or raises AttributeError if attribute is not found
5976
@property
60-
def uri_query(self): ...
77+
def uri_query(self) -> str: ...
6178
@property
62-
def uri_query_params(self): ...
79+
def uri_query_params(self) -> list[tuple[str, str]]: ...
6380
@property
64-
def duplicate_params(self): ...
81+
def duplicate_params(self) -> list[str]: ...
Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,14 @@
1-
from _typeshed import Incomplete
21
from typing import Any
32

43
signals_available: bool
54

65
class Namespace:
7-
def signal(self, name, doc: Incomplete | None = None): ...
6+
def signal(self, name: str, doc: str | None = None) -> _FakeSignal: ...
87

98
class _FakeSignal:
10-
name: Any
9+
name: str
1110
__doc__: Any
12-
def __init__(self, name, doc: Incomplete | None = None) -> None: ...
11+
def __init__(self, name: str, doc: str | None = None) -> None: ...
1312
send: Any
1413
connect: Any
1514
disconnect: Any
@@ -18,4 +17,4 @@ class _FakeSignal:
1817
temporarily_connected_to: Any
1918
connected_to: Any
2019

21-
scope_changed: Any
20+
scope_changed: _FakeSignal
Lines changed: 42 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -1,43 +1,44 @@
1-
from typing import Any
1+
import re
2+
from typing import Final
23

3-
DIGIT: str
4-
ALPHA: str
5-
HEXDIG: str
6-
pct_encoded: Any
7-
unreserved: Any
8-
gen_delims: str
9-
sub_delims: str
10-
pchar: Any
11-
reserved: Any
12-
scheme: Any
13-
dec_octet: Any
14-
IPv4address: Any
15-
IPv6address: str
16-
IPvFuture: Any
17-
IP_literal: Any
18-
reg_name: Any
19-
userinfo: Any
20-
host: Any
21-
port: Any
22-
authority: Any
23-
segment: Any
24-
segment_nz: Any
25-
segment_nz_nc: Any
26-
path_abempty: Any
27-
path_absolute: Any
28-
path_noscheme: Any
29-
path_rootless: Any
30-
path_empty: str
31-
path: Any
32-
query: Any
33-
fragment: Any
34-
hier_part: Any
35-
relative_part: Any
36-
relative_ref: Any
37-
URI: Any
38-
URI_reference: Any
39-
absolute_URI: Any
4+
DIGIT: Final[str]
5+
ALPHA: Final[str]
6+
HEXDIG: Final[str]
7+
pct_encoded: Final[str]
8+
unreserved: Final[str]
9+
gen_delims: Final[str]
10+
sub_delims: Final[str]
11+
pchar: Final[str]
12+
reserved: Final[str]
13+
scheme: Final[str]
14+
dec_octet: Final[str]
15+
IPv4address: Final[str]
16+
IPv6address: Final[str]
17+
IPvFuture: Final[str]
18+
IP_literal: Final[str]
19+
reg_name: Final[str]
20+
userinfo: Final[str]
21+
host: Final[str]
22+
port: Final[str]
23+
authority: Final[str]
24+
segment: Final[str]
25+
segment_nz: Final[str]
26+
segment_nz_nc: Final[str]
27+
path_abempty: Final[str]
28+
path_absolute: Final[str]
29+
path_noscheme: Final[str]
30+
path_rootless: Final[str]
31+
path_empty: Final[str]
32+
path: Final[str]
33+
query: Final[str]
34+
fragment: Final[str]
35+
hier_part: Final[str]
36+
relative_part: Final[str]
37+
relative_ref: Final[str]
38+
URI: Final[str]
39+
URI_reference: Final[str]
40+
absolute_URI: Final[str]
4041

41-
def is_uri(uri): ...
42-
def is_uri_reference(uri): ...
43-
def is_absolute_uri(uri): ...
42+
def is_uri(uri: str) -> re.Match[str] | None: ...
43+
def is_uri_reference(uri: str) -> re.Match[str] | None: ...
44+
def is_absolute_uri(uri: str) -> re.Match[str] | None: ...

0 commit comments

Comments
 (0)