forked from fastapi/fastapi
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
♻️ Refactor and simplify dependencies data structures with dataclasses (
- Loading branch information
Showing
2 changed files
with
28 additions
and
49 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,58 +1,37 @@ | ||
from typing import Any, Callable, List, Optional, Sequence | ||
from dataclasses import dataclass, field | ||
from typing import Any, Callable, List, Optional, Sequence, Tuple | ||
|
||
from fastapi._compat import ModelField | ||
from fastapi.security.base import SecurityBase | ||
|
||
|
||
@dataclass | ||
class SecurityRequirement: | ||
def __init__( | ||
self, security_scheme: SecurityBase, scopes: Optional[Sequence[str]] = None | ||
): | ||
self.security_scheme = security_scheme | ||
self.scopes = scopes | ||
security_scheme: SecurityBase | ||
scopes: Optional[Sequence[str]] = None | ||
|
||
|
||
@dataclass | ||
class Dependant: | ||
def __init__( | ||
self, | ||
*, | ||
path_params: Optional[List[ModelField]] = None, | ||
query_params: Optional[List[ModelField]] = None, | ||
header_params: Optional[List[ModelField]] = None, | ||
cookie_params: Optional[List[ModelField]] = None, | ||
body_params: Optional[List[ModelField]] = None, | ||
dependencies: Optional[List["Dependant"]] = None, | ||
security_schemes: Optional[List[SecurityRequirement]] = None, | ||
name: Optional[str] = None, | ||
call: Optional[Callable[..., Any]] = None, | ||
request_param_name: Optional[str] = None, | ||
websocket_param_name: Optional[str] = None, | ||
http_connection_param_name: Optional[str] = None, | ||
response_param_name: Optional[str] = None, | ||
background_tasks_param_name: Optional[str] = None, | ||
security_scopes_param_name: Optional[str] = None, | ||
security_scopes: Optional[List[str]] = None, | ||
use_cache: bool = True, | ||
path: Optional[str] = None, | ||
) -> None: | ||
self.path_params = path_params or [] | ||
self.query_params = query_params or [] | ||
self.header_params = header_params or [] | ||
self.cookie_params = cookie_params or [] | ||
self.body_params = body_params or [] | ||
self.dependencies = dependencies or [] | ||
self.security_requirements = security_schemes or [] | ||
self.request_param_name = request_param_name | ||
self.websocket_param_name = websocket_param_name | ||
self.http_connection_param_name = http_connection_param_name | ||
self.response_param_name = response_param_name | ||
self.background_tasks_param_name = background_tasks_param_name | ||
self.security_scopes = security_scopes | ||
self.security_scopes_param_name = security_scopes_param_name | ||
self.name = name | ||
self.call = call | ||
self.use_cache = use_cache | ||
# Store the path to be able to re-generate a dependable from it in overrides | ||
self.path = path | ||
# Save the cache key at creation to optimize performance | ||
path_params: List[ModelField] = field(default_factory=list) | ||
query_params: List[ModelField] = field(default_factory=list) | ||
header_params: List[ModelField] = field(default_factory=list) | ||
cookie_params: List[ModelField] = field(default_factory=list) | ||
body_params: List[ModelField] = field(default_factory=list) | ||
dependencies: List["Dependant"] = field(default_factory=list) | ||
security_requirements: List[SecurityRequirement] = field(default_factory=list) | ||
name: Optional[str] = None | ||
call: Optional[Callable[..., Any]] = None | ||
request_param_name: Optional[str] = None | ||
websocket_param_name: Optional[str] = None | ||
http_connection_param_name: Optional[str] = None | ||
response_param_name: Optional[str] = None | ||
background_tasks_param_name: Optional[str] = None | ||
security_scopes_param_name: Optional[str] = None | ||
security_scopes: Optional[List[str]] = None | ||
use_cache: bool = True | ||
path: Optional[str] = None | ||
cache_key: Tuple[Optional[Callable[..., Any]], Tuple[str, ...]] = field(init=False) | ||
|
||
def __post_init__(self) -> None: | ||
self.cache_key = (self.call, tuple(sorted(set(self.security_scopes or [])))) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters