Improve FastAPI integration

This commit is contained in:
Roman Mogylatov 2020-11-17 23:44:32 -05:00
parent 262c035bc1
commit d37ae8e7db
2 changed files with 24 additions and 1 deletions

View File

@ -7,6 +7,10 @@ that were made in every particular version.
From version 0.7.6 *Dependency Injector* framework strictly From version 0.7.6 *Dependency Injector* framework strictly
follows `Semantic versioning`_ follows `Semantic versioning`_
Develop
-------
- Improve ``FastAPI`` integration: handle ``Depends(Provide[...])``.
4.4.0 4.4.0
----- -----
- Add ``@inject`` decorator. It helps to fix a number of wiring bugs and make wiring be more resilient. - Add ``@inject`` decorator. It helps to fix a number of wiring bugs and make wiring be more resilient.

View File

@ -27,6 +27,13 @@ else:
... ...
try:
from fastapi.params import Depends as FastAPIDepends
fastapi_installed = True
except ImportError:
fastapi_installed = False
from . import providers from . import providers
@ -320,10 +327,15 @@ def _fetch_reference_injections(
injections = {} injections = {}
closing = {} closing = {}
for parameter_name, parameter in signature.parameters.items(): for parameter_name, parameter in signature.parameters.items():
if not isinstance(parameter.default, _Marker): if not isinstance(parameter.default, _Marker) \
and not _is_fastapi_depends(parameter.default):
continue continue
marker = parameter.default marker = parameter.default
if _is_fastapi_depends(marker):
marker = marker.dependency
if isinstance(marker, Closing): if isinstance(marker, Closing):
marker = marker.provider marker = marker.provider
closing[parameter_name] = marker closing[parameter_name] = marker
@ -435,6 +447,10 @@ def _is_fastapi_default_arg_injection(injection, kwargs):
return injection in kwargs and isinstance(kwargs[injection], _Marker) return injection in kwargs and isinstance(kwargs[injection], _Marker)
def _is_fastapi_depends(param: Any) -> bool:
return fastapi_installed and isinstance(param, FastAPIDepends)
def _is_patched(fn): def _is_patched(fn):
return getattr(fn, '__wired__', False) is True return getattr(fn, '__wired__', False) is True
@ -459,6 +475,9 @@ class _Marker(Generic[T], metaclass=ClassGetItemMeta):
def __class_getitem__(cls, item) -> T: def __class_getitem__(cls, item) -> T:
return cls(item) return cls(item)
def __call__(self) -> T:
return self
class Provide(_Marker): class Provide(_Marker):
... ...