mirror of
https://github.com/ets-labs/python-dependency-injector.git
synced 2025-02-23 07:00:57 +03:00
Add support of async injections into wiring
This commit is contained in:
parent
9f6d2bb522
commit
7ae8041f0a
|
@ -1,5 +1,6 @@
|
||||||
"""Wiring module."""
|
"""Wiring module."""
|
||||||
|
|
||||||
|
import asyncio
|
||||||
import functools
|
import functools
|
||||||
import inspect
|
import inspect
|
||||||
import importlib
|
import importlib
|
||||||
|
@ -426,10 +427,20 @@ def _get_async_patched(fn):
|
||||||
@functools.wraps(fn)
|
@functools.wraps(fn)
|
||||||
async def _patched(*args, **kwargs):
|
async def _patched(*args, **kwargs):
|
||||||
to_inject = kwargs.copy()
|
to_inject = kwargs.copy()
|
||||||
|
to_inject_await = []
|
||||||
|
to_close_await = []
|
||||||
for injection, provider in _patched.__injections__.items():
|
for injection, provider in _patched.__injections__.items():
|
||||||
if injection not in kwargs \
|
if injection not in kwargs \
|
||||||
or _is_fastapi_default_arg_injection(injection, kwargs):
|
or _is_fastapi_default_arg_injection(injection, kwargs):
|
||||||
to_inject[injection] = provider()
|
provide = provider()
|
||||||
|
if inspect.isawaitable(provide):
|
||||||
|
to_inject_await.append((injection, provide))
|
||||||
|
else:
|
||||||
|
to_inject[injection] = provide
|
||||||
|
|
||||||
|
async_to_inject = await asyncio.gather(*[provide for _, provide in to_inject_await])
|
||||||
|
for provide, (injection, _) in zip(async_to_inject, to_inject_await):
|
||||||
|
to_inject[injection] = provide
|
||||||
|
|
||||||
result = await fn(*args, **to_inject)
|
result = await fn(*args, **to_inject)
|
||||||
|
|
||||||
|
@ -439,7 +450,11 @@ def _get_async_patched(fn):
|
||||||
continue
|
continue
|
||||||
if not isinstance(provider, providers.Resource):
|
if not isinstance(provider, providers.Resource):
|
||||||
continue
|
continue
|
||||||
provider.shutdown()
|
shutdown = provider.shutdown()
|
||||||
|
if inspect.isawaitable(shutdown):
|
||||||
|
to_close_await.append(shutdown)
|
||||||
|
|
||||||
|
await asyncio.gather(*to_close_await)
|
||||||
|
|
||||||
return result
|
return result
|
||||||
return _patched
|
return _patched
|
||||||
|
|
Loading…
Reference in New Issue
Block a user