Browse Source

add typing for dependency_overrides_provider

pull/14615/head
Evgeny Bokshitsky 7 months ago
parent
commit
eb5b08b83d
  1. 8
      fastapi/dependencies/utils.py
  2. 12
      fastapi/routing.py
  3. 5
      fastapi/types.py

8
fastapi/dependencies/utils.py

@ -49,7 +49,7 @@ from fastapi.dependencies.models import Dependant
from fastapi.exceptions import DependencyScopeError from fastapi.exceptions import DependencyScopeError
from fastapi.logger import logger from fastapi.logger import logger
from fastapi.security.oauth2 import SecurityScopes from fastapi.security.oauth2 import SecurityScopes
from fastapi.types import DependencyCacheKey from fastapi.types import DependencyCacheKey, DependencyOverridesProvider
from fastapi.utils import create_model_field, get_path_param_names from fastapi.utils import create_model_field, get_path_param_names
from pydantic import BaseModel from pydantic import BaseModel
from pydantic.fields import FieldInfo from pydantic.fields import FieldInfo
@ -567,7 +567,7 @@ async def solve_dependencies(
body: Optional[Union[dict[str, Any], FormData]] = None, body: Optional[Union[dict[str, Any], FormData]] = None,
background_tasks: Optional[StarletteBackgroundTasks] = None, background_tasks: Optional[StarletteBackgroundTasks] = None,
response: Optional[Response] = None, response: Optional[Response] = None,
dependency_overrides_provider: Optional[Any] = None, dependency_overrides_provider: Optional[DependencyOverridesProvider] = None,
dependency_cache: Optional[dict[DependencyCacheKey, Any]] = None, dependency_cache: Optional[dict[DependencyCacheKey, Any]] = None,
# TODO: remove this parameter later, no longer used, not removing it yet as some # TODO: remove this parameter later, no longer used, not removing it yet as some
# people might be monkey patching this function (although that's not supported) # people might be monkey patching this function (although that's not supported)
@ -599,9 +599,7 @@ async def solve_dependencies(
and dependency_overrides_provider.dependency_overrides and dependency_overrides_provider.dependency_overrides
): ):
original_call = sub_dependant.call original_call = sub_dependant.call
call = getattr( call = dependency_overrides_provider.dependency_overrides.get(original_call, original_call)
dependency_overrides_provider, "dependency_overrides", {}
).get(original_call, original_call)
use_path: str = sub_dependant.path # type: ignore use_path: str = sub_dependant.path # type: ignore
use_sub_dependant = get_dependant( use_sub_dependant = get_dependant(
path=use_path, path=use_path,

12
fastapi/routing.py

@ -48,7 +48,7 @@ from fastapi.exceptions import (
ResponseValidationError, ResponseValidationError,
WebSocketRequestValidationError, WebSocketRequestValidationError,
) )
from fastapi.types import DecoratedCallable, IncEx from fastapi.types import DecoratedCallable, IncEx, DependencyOverridesProvider
from fastapi.utils import ( from fastapi.utils import (
create_cloned_field, create_cloned_field,
create_model_field, create_model_field,
@ -257,7 +257,7 @@ def get_request_handler(
response_model_exclude_unset: bool = False, response_model_exclude_unset: bool = False,
response_model_exclude_defaults: bool = False, response_model_exclude_defaults: bool = False,
response_model_exclude_none: bool = False, response_model_exclude_none: bool = False,
dependency_overrides_provider: Optional[Any] = None, dependency_overrides_provider: Optional[DependencyOverridesProvider] = None,
embed_body_fields: bool = False, embed_body_fields: bool = False,
) -> Callable[[Request], Coroutine[Any, Any, Response]]: ) -> Callable[[Request], Coroutine[Any, Any, Response]]:
assert dependant.call is not None, "dependant.call must be a function" assert dependant.call is not None, "dependant.call must be a function"
@ -405,7 +405,7 @@ def get_request_handler(
def get_websocket_app( def get_websocket_app(
dependant: Dependant, dependant: Dependant,
dependency_overrides_provider: Optional[Any] = None, dependency_overrides_provider: Optional[DependencyOverridesProvider] = None,
embed_body_fields: bool = False, embed_body_fields: bool = False,
) -> Callable[[WebSocket], Coroutine[Any, Any, Any]]: ) -> Callable[[WebSocket], Coroutine[Any, Any, Any]]:
async def app(websocket: WebSocket) -> None: async def app(websocket: WebSocket) -> None:
@ -448,7 +448,7 @@ class APIWebSocketRoute(routing.WebSocketRoute):
*, *,
name: Optional[str] = None, name: Optional[str] = None,
dependencies: Optional[Sequence[params.Depends]] = None, dependencies: Optional[Sequence[params.Depends]] = None,
dependency_overrides_provider: Optional[Any] = None, dependency_overrides_provider: Optional[DependencyOverridesProvider] = None,
) -> None: ) -> None:
self.path = path self.path = path
self.endpoint = endpoint self.endpoint = endpoint
@ -510,7 +510,7 @@ class APIRoute(routing.Route):
response_class: Union[type[Response], DefaultPlaceholder] = Default( response_class: Union[type[Response], DefaultPlaceholder] = Default(
JSONResponse JSONResponse
), ),
dependency_overrides_provider: Optional[Any] = None, dependency_overrides_provider: Optional[DependencyOverridesProvider] = None,
callbacks: Optional[list[BaseRoute]] = None, callbacks: Optional[list[BaseRoute]] = None,
openapi_extra: Optional[dict[str, Any]] = None, openapi_extra: Optional[dict[str, Any]] = None,
generate_unique_id_function: Union[ generate_unique_id_function: Union[
@ -800,7 +800,7 @@ class APIRouter(routing.Router):
), ),
] = None, ] = None,
dependency_overrides_provider: Annotated[ dependency_overrides_provider: Annotated[
Optional[Any], Optional[DependencyOverridesProvider],
Doc( Doc(
""" """
Only used internally by FastAPI to handle dependency overrides. Only used internally by FastAPI to handle dependency overrides.

5
fastapi/types.py

@ -1,6 +1,6 @@
import types import types
from enum import Enum from enum import Enum
from typing import Any, Callable, Optional, TypeVar, Union from typing import Any, Callable, Optional, TypeVar, Union, Protocol
from pydantic import BaseModel from pydantic import BaseModel
@ -9,3 +9,6 @@ UnionType = getattr(types, "UnionType", Union)
ModelNameMap = dict[Union[type[BaseModel], type[Enum]], str] ModelNameMap = dict[Union[type[BaseModel], type[Enum]], str]
IncEx = Union[set[int], set[str], dict[int, Any], dict[str, Any]] IncEx = Union[set[int], set[str], dict[int, Any], dict[str, Any]]
DependencyCacheKey = tuple[Optional[Callable[..., Any]], tuple[str, ...], str] DependencyCacheKey = tuple[Optional[Callable[..., Any]], tuple[str, ...], str]
class DependencyOverridesProvider(Protocol):
dependency_overrides: dict[Callable[..., Any], Any]

Loading…
Cancel
Save