mirror of
				https://github.com/ets-labs/python-dependency-injector.git
				synced 2025-11-04 18:07:44 +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