94 lines
2.8 KiB
Python
94 lines
2.8 KiB
Python
from stripe._requestor_options import RequestorOptions
|
|
from typing import Mapping, Optional, Dict, Tuple, Any
|
|
from typing_extensions import NotRequired, TypedDict, TYPE_CHECKING
|
|
|
|
if TYPE_CHECKING:
|
|
from stripe._stripe_context import StripeContext
|
|
|
|
|
|
class RequestOptions(TypedDict):
|
|
api_key: NotRequired["str|None"]
|
|
stripe_version: NotRequired["str|None"]
|
|
stripe_account: NotRequired["str|None"]
|
|
stripe_context: NotRequired["str | StripeContext | None"]
|
|
max_network_retries: NotRequired["int|None"]
|
|
idempotency_key: NotRequired["str|None"]
|
|
content_type: NotRequired["str|None"]
|
|
headers: NotRequired["Mapping[str, str]|None"]
|
|
|
|
|
|
def merge_options(
|
|
requestor: RequestorOptions,
|
|
request: Optional[RequestOptions],
|
|
) -> RequestOptions:
|
|
"""
|
|
Merge a client and request object, giving precedence to the values from
|
|
the request object.
|
|
"""
|
|
if request is None:
|
|
return {
|
|
"api_key": requestor.api_key,
|
|
"stripe_account": requestor.stripe_account,
|
|
"stripe_context": requestor.stripe_context,
|
|
"stripe_version": requestor.stripe_version,
|
|
"max_network_retries": requestor.max_network_retries,
|
|
"idempotency_key": None,
|
|
"content_type": None,
|
|
"headers": None,
|
|
}
|
|
|
|
return {
|
|
"api_key": request.get("api_key") or requestor.api_key,
|
|
"stripe_account": request.get("stripe_account")
|
|
or requestor.stripe_account,
|
|
"stripe_context": request.get("stripe_context")
|
|
or requestor.stripe_context,
|
|
"stripe_version": request.get("stripe_version")
|
|
or requestor.stripe_version,
|
|
"max_network_retries": request.get("max_network_retries")
|
|
if request.get("max_network_retries") is not None
|
|
else requestor.max_network_retries,
|
|
"idempotency_key": request.get("idempotency_key"),
|
|
"content_type": request.get("content_type"),
|
|
"headers": request.get("headers"),
|
|
}
|
|
|
|
|
|
PERSISTENT_OPTIONS_KEYS = {
|
|
"api_key",
|
|
"stripe_version",
|
|
"stripe_account",
|
|
"stripe_context",
|
|
}
|
|
"""
|
|
These are the keys in RequestOptions that should persist across requests made
|
|
by the same requestor.
|
|
"""
|
|
|
|
|
|
def extract_options_from_dict(
|
|
d: Optional[Mapping[str, Any]],
|
|
) -> Tuple[RequestOptions, Dict[str, Any]]:
|
|
"""
|
|
Extracts a RequestOptions object from a dict, and returns a tuple of
|
|
the RequestOptions object and the remaining dict.
|
|
"""
|
|
if not d:
|
|
return {}, {}
|
|
options: RequestOptions = {}
|
|
d_copy = dict(d)
|
|
for key in [
|
|
"api_key",
|
|
"stripe_version",
|
|
"stripe_account",
|
|
"stripe_context",
|
|
"max_network_retries",
|
|
"idempotency_key",
|
|
"content_type",
|
|
"headers",
|
|
]:
|
|
if key in d_copy:
|
|
options[key] = d_copy.pop(key)
|
|
|
|
return options, d_copy
|