Skip to content

Commit 613a63b

Browse files
committed
[Authlib] Improve utility functions
1 parent ed2cc33 commit 613a63b

10 files changed

Lines changed: 106 additions & 38 deletions

File tree

stubs/Authlib/authlib/common/encoding.pyi

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,10 +16,10 @@ def to_unicode(x: None, charset: str = "utf-8", errors: str = "strict") -> None:
1616
@overload
1717
def to_unicode(x: object, charset: str = "utf-8", errors: str = "strict") -> str: ...
1818

19-
def to_native(x: str | bytes, encoding: str = "ascii") -> str: ...
19+
def to_native(x: str | bytes | bytearray, encoding: str = "ascii") -> str: ...
2020
def json_loads(s: str | bytes | bytearray) -> Any: ... # returns json.loads()
2121
def json_dumps(data: Any, ensure_ascii: bool = False) -> str: ... # data pass to json.dumps()
22-
def urlsafe_b64decode(s: bytes) -> bytes: ...
22+
def urlsafe_b64decode(s: bytes | bytearray) -> bytes: ...
2323
def urlsafe_b64encode(s: ReadableBuffer) -> bytes: ...
2424
def base64_to_int(s: str | bytes | float | Iterable[SupportsIndex] | SupportsIndex | SupportsBytes | ReadableBuffer) -> int: ...
2525
def int_to_base64(num: int) -> str: ...
Lines changed: 10 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,24 @@
1+
from collections.abc import Iterable
12
from re import Pattern
2-
from typing import Final, TypeAlias, overload
3+
from typing import Final, overload
34

45
always_safe: Final[str]
56
urlencoded: Final[set[str]]
67
INVALID_HEX_PATTERN: Final[Pattern[str]]
78

8-
_ExplodedQueryString: TypeAlias = list[tuple[str, str]]
9-
10-
def url_encode(params: _ExplodedQueryString) -> str: ...
11-
def url_decode(query: str) -> _ExplodedQueryString: ...
12-
def add_params_to_qs(query: str, params: _ExplodedQueryString | dict[str, str]) -> str: ...
13-
def add_params_to_uri(uri: str, params: _ExplodedQueryString, fragment: bool = False) -> str: ...
14-
def quote(s: str, safe: bytes = b"/") -> str: ...
9+
def url_encode(params: Iterable[tuple[str, str]]) -> str: ...
10+
def url_decode(query: str) -> list[tuple[str, str]]: ...
11+
def add_params_to_qs(query: str, params: Iterable[tuple[str, str]] | dict[str, str]) -> str: ...
12+
def add_params_to_uri(uri: str, params: Iterable[tuple[str, str]] | dict[str, str], fragment: bool = False) -> str: ...
13+
def quote(s: str | bytes | float, safe: bytes = b"/") -> str: ...
1514
def unquote(s: str | bytes) -> str: ...
16-
def quote_url(s: str) -> str: ...
15+
def quote_url(s: str | bytes | float) -> str: ...
1716

1817
@overload
1918
def extract_params(raw: None) -> None: ...
2019
@overload
21-
def extract_params(raw: dict[str, str]) -> _ExplodedQueryString: ...
20+
def extract_params(raw: dict[str, str]) -> list[tuple[str, str]]: ...
2221
@overload
23-
def extract_params(raw: _ExplodedQueryString | tuple[tuple[str, str], ...] | str) -> _ExplodedQueryString | None: ...
22+
def extract_params(raw: list[tuple[str, str]] | tuple[tuple[str, str], ...] | str) -> list[tuple[str, str]] | None: ...
2423

2524
def is_valid_url(url: str, fragments_allowed: bool = True) -> bool: ...
Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,18 @@
11
from _typeshed import Incomplete
2-
from typing import Final
2+
from collections.abc import AsyncIterable, Iterable, Mapping, MutableMapping, Sequence
3+
from typing import Final, TypeAlias
34

45
HTTPX_CLIENT_KWARGS: Final[list[str]]
56

6-
def extract_client_kwargs(kwargs) -> dict[str, Incomplete]: ...
7-
def build_request(url, headers, body, initial_request): ...
7+
_Request: TypeAlias = Incomplete # actual type is httpx.Request
8+
_URL: TypeAlias = Incomplete # actual type is httpx.URL
9+
_Headers: TypeAlias = MutableMapping[str, str] # actual type is httpx.Headers
10+
_HeaderTypes: TypeAlias = ( # actual type is httpx._types.HeaderTypes
11+
_Headers | Mapping[str, str] | Mapping[bytes, bytes] | Sequence[tuple[str, str]] | Sequence[tuple[bytes, bytes]]
12+
)
13+
_RequestContent: TypeAlias = str | bytes | Iterable[bytes] | AsyncIterable[bytes] # actual type is httpx._types.RequestContent
14+
15+
def extract_client_kwargs(kwargs: dict[str, Incomplete]) -> dict[str, Incomplete]: ...
16+
def build_request(
17+
url: _URL | str, headers: _HeaderTypes | None, body: _RequestContent, initial_request: _Request
18+
) -> _Request: ...
Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,10 @@
1-
def prepare_headers(oauth_params, headers=None, realm=None): ...
2-
def prepare_form_encoded_body(oauth_params, body) -> str: ...
3-
def prepare_request_uri_query(oauth_params, uri): ...
1+
from collections.abc import Iterable
2+
from typing import TypeVar
3+
4+
_K = TypeVar("_K")
5+
6+
def prepare_headers(
7+
oauth_params: Iterable[tuple[str, str]], headers: dict[str, _K] | None = None, realm=None
8+
) -> dict[str, _K | str]: ...
9+
def prepare_form_encoded_body(oauth_params: Iterable[tuple[str, str]], body: Iterable[tuple[str, str]]) -> str: ...
10+
def prepare_request_uri_query(oauth_params: Iterable[tuple[str, str]], uri: str) -> str: ...
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
1-
def escape(s) -> str: ...
1+
def escape(s: str | bytes | float) -> str: ...
22
def unescape(s: str | bytes) -> str: ...
Lines changed: 21 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,22 @@
1-
from _typeshed import Incomplete
1+
from collections.abc import Collection, Sequence
22

3-
def prepare_grant_uri(uri, client_id, response_type, redirect_uri=None, scope=None, state=None, **kwargs): ...
4-
def prepare_token_request(grant_type, body: str = "", redirect_uri=None, **kwargs) -> str: ...
5-
def parse_authorization_code_response(uri, state=None) -> dict[Incomplete, Incomplete]: ...
6-
def parse_implicit_response(uri, state=None) -> dict[Incomplete, Incomplete]: ...
3+
def prepare_grant_uri(
4+
uri: str,
5+
client_id: str,
6+
response_type: str,
7+
redirect_uri: str | None = None,
8+
scope: Collection[str] | str | None = None,
9+
state: str | None = None,
10+
**kwargs: str | Sequence[str | None] | None,
11+
): ...
12+
def prepare_token_request(
13+
grant_type: str,
14+
body: str = "",
15+
redirect_uri: str | None = None,
16+
*,
17+
scope: Collection[str] | str | None = None,
18+
code: str | None = None,
19+
**kwargs: str | None,
20+
) -> str: ...
21+
def parse_authorization_code_response(uri: str, state: str | None = None) -> dict[str, str]: ...
22+
def parse_implicit_response(uri: str, state: str | None = None) -> dict[str, str]: ...
Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,14 @@
11
from collections.abc import Collection
2+
from typing import overload
23

3-
def list_to_scope(scope: Collection[str] | str | None) -> str: ...
4-
def scope_to_list(scope: Collection[str] | str | None) -> list[str]: ...
5-
def extract_basic_authorization(headers: dict[str, str]) -> tuple[str, str]: ...
4+
@overload
5+
def list_to_scope(scope: str | Collection[str]) -> str: ...
6+
@overload
7+
def list_to_scope(scope: None) -> None: ...
8+
9+
@overload
10+
def scope_to_list(scope: str | Collection[str]) -> list[str]: ...
11+
@overload
12+
def scope_to_list(scope: None) -> None: ...
13+
14+
def extract_basic_authorization(headers: dict[str, str]) -> tuple[str, str] | tuple[str, None] | tuple[None, None]: ...
Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,14 @@
1-
from _typeshed import Incomplete
1+
from typing import Literal, TypeVar
22

3-
def add_to_uri(token, uri) -> str: ...
4-
def add_to_headers(token, headers=None): ...
5-
def add_to_body(token, body=None) -> str: ...
6-
def add_bearer_token(token, uri, headers, body, placement: str = "header") -> tuple[Incomplete, Incomplete, Incomplete]: ...
3+
_K = TypeVar("_K")
4+
5+
def add_to_uri(token: str, uri: str) -> str: ...
6+
def add_to_headers(token: str, headers: dict[str, _K] | None = None) -> dict[str, _K | str]: ...
7+
def add_to_body(token: str, body: str | None = None) -> str: ...
8+
def add_bearer_token(
9+
token: str,
10+
uri: str,
11+
headers: dict[str, _K],
12+
body: str,
13+
placement: Literal["uri", "url", "query", "header", "headers", "body"] = "header",
14+
) -> tuple[str, dict[str, _K | str], str]: ...
Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1,7 @@
1-
def prepare_revoke_token_request(token, token_type_hint=None, body=None, headers=None): ...
1+
from typing import TypeVar
2+
3+
_K = TypeVar("_K")
4+
5+
def prepare_revoke_token_request(
6+
token: str, token_type_hint: str | None = None, body: str | None = None, headers: dict[str, _K] | None = None
7+
) -> tuple[str, dict[str, _K | str]]: ...

stubs/Authlib/authlib/oidc/core/grants/util.pyi

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,11 @@
1+
from _typeshed import ReadableBuffer
2+
from collections.abc import Collection, Iterable
3+
from typing import Literal, SupportsBytes, SupportsIndex, overload
4+
15
from authlib.oidc.core import UserInfo
26

3-
def is_openid_scope(scope: str | None) -> bool: ...
4-
def validate_request_prompt(grant, redirect_uri, redirect_fragment: bool = False): ...
7+
def is_openid_scope(scope: Collection[str] | str | None) -> bool: ...
8+
def validate_request_prompt(grant, redirect_uri: str, redirect_fragment: bool = False): ...
59
def validate_nonce(request, exists_nonce, required: bool = False): ...
610
def generate_id_token(
711
token: dict[str, str | int],
@@ -15,7 +19,15 @@ def generate_id_token(
1519
auth_time: int | None = None,
1620
acr: str | None = None,
1721
amr: list[str] | None = None,
18-
code: str | None = None,
22+
code: str | bytes | float | Iterable[SupportsIndex] | SupportsIndex | SupportsBytes | ReadableBuffer | None = None,
1923
kid: str | None = None,
2024
) -> str: ...
21-
def create_response_mode_response(redirect_uri, params, response_mode): ...
25+
26+
@overload
27+
def create_response_mode_response(
28+
redirect_uri: str, params: Iterable[tuple[str, str]], response_mode: Literal["form_post"]
29+
) -> tuple[Literal[200], str, list[tuple[str, str]]]: ...
30+
@overload # `params` can accept dict in another mode
31+
def create_response_mode_response(
32+
redirect_uri: str, params: Iterable[tuple[str, str]] | dict[str, str], response_mode: Literal["query", "fragment"]
33+
) -> tuple[Literal[302], str, list[tuple[str, str]]]: ...

0 commit comments

Comments
 (0)