| 30 | |
| 31 | @dataclass |
| 32 | class Dependant: |
| 33 | path_params: list[ModelField] = field(default_factory=list) |
| 34 | query_params: list[ModelField] = field(default_factory=list) |
| 35 | header_params: list[ModelField] = field(default_factory=list) |
| 36 | cookie_params: list[ModelField] = field(default_factory=list) |
| 37 | body_params: list[ModelField] = field(default_factory=list) |
| 38 | dependencies: list["Dependant"] = field(default_factory=list) |
| 39 | name: str | None = None |
| 40 | call: Callable[..., Any] | None = None |
| 41 | request_param_name: str | None = None |
| 42 | websocket_param_name: str | None = None |
| 43 | http_connection_param_name: str | None = None |
| 44 | response_param_name: str | None = None |
| 45 | background_tasks_param_name: str | None = None |
| 46 | security_scopes_param_name: str | None = None |
| 47 | own_oauth_scopes: list[str] | None = None |
| 48 | parent_oauth_scopes: list[str] | None = None |
| 49 | use_cache: bool = True |
| 50 | path: str | None = None |
| 51 | scope: Literal["function", "request"] | None = None |
| 52 | |
| 53 | @cached_property |
| 54 | def oauth_scopes(self) -> list[str]: |
| 55 | scopes = self.parent_oauth_scopes.copy() if self.parent_oauth_scopes else [] |
| 56 | # This doesn't use a set to preserve order, just in case |
| 57 | for scope in self.own_oauth_scopes or []: |
| 58 | if scope not in scopes: |
| 59 | scopes.append(scope) |
| 60 | return scopes |
| 61 | |
| 62 | @cached_property |
| 63 | def cache_key(self) -> DependencyCacheKey: |
| 64 | scopes_for_cache = ( |
| 65 | tuple(sorted(set(self.oauth_scopes or []))) if self._uses_scopes else () |
| 66 | ) |
| 67 | return ( |
| 68 | self.call, |
| 69 | scopes_for_cache, |
| 70 | self.computed_scope or "", |
| 71 | ) |
| 72 | |
| 73 | @cached_property |
| 74 | def _uses_scopes(self) -> bool: |
| 75 | if self.own_oauth_scopes: |
| 76 | return True |
| 77 | if self.security_scopes_param_name is not None: |
| 78 | return True |
| 79 | if self._is_security_scheme: |
| 80 | return True |
| 81 | for sub_dep in self.dependencies: |
| 82 | if sub_dep._uses_scopes: |
| 83 | return True |
| 84 | return False |
| 85 | |
| 86 | @cached_property |
| 87 | def _is_security_scheme(self) -> bool: |
| 88 | if self.call is None: |
| 89 | return False # pragma: no cover |
no outgoing calls
no test coverage detected
searching dependent graphs…