mirror of
				https://github.com/ets-labs/python-dependency-injector.git
				synced 2025-11-04 09:57:37 +03:00 
			
		
		
		
	Add async resources implementation
This commit is contained in:
		
							parent
							
								
									c8178cecda
								
							
						
					
					
						commit
						53ce5648af
					
				
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| 
						 | 
					@ -2699,6 +2699,10 @@ cdef class Resource(Provider):
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if self.__shutdowner:
 | 
					        if self.__shutdowner:
 | 
				
			||||||
            try:
 | 
					            try:
 | 
				
			||||||
 | 
					                if inspect.iscoroutinefunction(self.__shutdowner):
 | 
				
			||||||
 | 
					                    loop = asyncio.get_event_loop()
 | 
				
			||||||
 | 
					                    loop.run_until_complete(self.__shutdowner(self.__resource))
 | 
				
			||||||
 | 
					                else:
 | 
				
			||||||
                    self.__shutdowner(self.__resource)
 | 
					                    self.__shutdowner(self.__resource)
 | 
				
			||||||
            except StopIteration:
 | 
					            except StopIteration:
 | 
				
			||||||
                pass
 | 
					                pass
 | 
				
			||||||
| 
						 | 
					@ -2723,6 +2727,21 @@ cdef class Resource(Provider):
 | 
				
			||||||
                self.__kwargs_len,
 | 
					                self.__kwargs_len,
 | 
				
			||||||
            )
 | 
					            )
 | 
				
			||||||
            self.__shutdowner = initializer.shutdown
 | 
					            self.__shutdowner = initializer.shutdown
 | 
				
			||||||
 | 
					        elif self._is_async_resource_subclass(self.__initializer):
 | 
				
			||||||
 | 
					            loop = asyncio.get_event_loop()
 | 
				
			||||||
 | 
					            initializer = self.__initializer()
 | 
				
			||||||
 | 
					            self.__resource = loop.run_until_complete(
 | 
				
			||||||
 | 
					                __call(
 | 
				
			||||||
 | 
					                    initializer.init,
 | 
				
			||||||
 | 
					                    args,
 | 
				
			||||||
 | 
					                    self.__args,
 | 
				
			||||||
 | 
					                    self.__args_len,
 | 
				
			||||||
 | 
					                    kwargs,
 | 
				
			||||||
 | 
					                    self.__kwargs,
 | 
				
			||||||
 | 
					                    self.__kwargs_len,
 | 
				
			||||||
 | 
					                ),
 | 
				
			||||||
 | 
					            )
 | 
				
			||||||
 | 
					            self.__shutdowner = initializer.shutdown
 | 
				
			||||||
        elif inspect.isgeneratorfunction(self.__initializer):
 | 
					        elif inspect.isgeneratorfunction(self.__initializer):
 | 
				
			||||||
            initializer = __call(
 | 
					            initializer = __call(
 | 
				
			||||||
                self.__initializer,
 | 
					                self.__initializer,
 | 
				
			||||||
| 
						 | 
					@ -2735,6 +2754,31 @@ cdef class Resource(Provider):
 | 
				
			||||||
            )
 | 
					            )
 | 
				
			||||||
            self.__resource = next(initializer)
 | 
					            self.__resource = next(initializer)
 | 
				
			||||||
            self.__shutdowner = initializer.send
 | 
					            self.__shutdowner = initializer.send
 | 
				
			||||||
 | 
					        elif inspect.iscoroutinefunction(self.__initializer):
 | 
				
			||||||
 | 
					            loop = asyncio.get_event_loop()
 | 
				
			||||||
 | 
					            initializer = __call(
 | 
				
			||||||
 | 
					                self.__initializer,
 | 
				
			||||||
 | 
					                args,
 | 
				
			||||||
 | 
					                self.__args,
 | 
				
			||||||
 | 
					                self.__args_len,
 | 
				
			||||||
 | 
					                kwargs,
 | 
				
			||||||
 | 
					                self.__kwargs,
 | 
				
			||||||
 | 
					                self.__kwargs_len,
 | 
				
			||||||
 | 
					            )
 | 
				
			||||||
 | 
					            self.__resource = loop.run_until_complete(initializer)
 | 
				
			||||||
 | 
					        elif inspect.isasyncgenfunction(self.__initializer):
 | 
				
			||||||
 | 
					            loop = asyncio.get_event_loop()
 | 
				
			||||||
 | 
					            initializer = __call(
 | 
				
			||||||
 | 
					                self.__initializer,
 | 
				
			||||||
 | 
					                args,
 | 
				
			||||||
 | 
					                self.__args,
 | 
				
			||||||
 | 
					                self.__args_len,
 | 
				
			||||||
 | 
					                kwargs,
 | 
				
			||||||
 | 
					                self.__kwargs,
 | 
				
			||||||
 | 
					                self.__kwargs_len,
 | 
				
			||||||
 | 
					            )
 | 
				
			||||||
 | 
					            self.__resource = loop.run_until_complete(initializer.__anext__())
 | 
				
			||||||
 | 
					            self.__shutdowner = initializer.__anext__
 | 
				
			||||||
        elif callable(self.__initializer):
 | 
					        elif callable(self.__initializer):
 | 
				
			||||||
            self.__resource = __call(
 | 
					            self.__resource = __call(
 | 
				
			||||||
                self.__initializer,
 | 
					                self.__initializer,
 | 
				
			||||||
| 
						 | 
					@ -2756,10 +2800,19 @@ cdef class Resource(Provider):
 | 
				
			||||||
        if  sys.version_info < (3, 5):
 | 
					        if  sys.version_info < (3, 5):
 | 
				
			||||||
            return False
 | 
					            return False
 | 
				
			||||||
        if not isinstance(instance, CLASS_TYPES):
 | 
					        if not isinstance(instance, CLASS_TYPES):
 | 
				
			||||||
            return
 | 
					            return False
 | 
				
			||||||
        from . import resources
 | 
					        from . import resources
 | 
				
			||||||
        return issubclass(instance, resources.Resource)
 | 
					        return issubclass(instance, resources.Resource)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @staticmethod
 | 
				
			||||||
 | 
					    def _is_async_resource_subclass(instance):
 | 
				
			||||||
 | 
					        if  sys.version_info < (3, 5):
 | 
				
			||||||
 | 
					            return False
 | 
				
			||||||
 | 
					        if not isinstance(instance, CLASS_TYPES):
 | 
				
			||||||
 | 
					            return False
 | 
				
			||||||
 | 
					        from . import resources
 | 
				
			||||||
 | 
					        return issubclass(instance, resources.AsyncResource)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
cdef class Container(Provider):
 | 
					cdef class Container(Provider):
 | 
				
			||||||
    """Container provider provides an instance of declarative container.
 | 
					    """Container provider provides an instance of declarative container.
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -29,3 +29,14 @@ class Resource(Generic[T], metaclass=ResourceMeta):
 | 
				
			||||||
    @abc.abstractmethod
 | 
					    @abc.abstractmethod
 | 
				
			||||||
    def shutdown(self, resource: T) -> None:
 | 
					    def shutdown(self, resource: T) -> None:
 | 
				
			||||||
        ...
 | 
					        ...
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class AsyncResource(Generic[T], metaclass=ResourceMeta):
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @abc.abstractmethod
 | 
				
			||||||
 | 
					    async def init(self, *args, **kwargs) -> T:
 | 
				
			||||||
 | 
					        ...
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @abc.abstractmethod
 | 
				
			||||||
 | 
					    async def shutdown(self, resource: T) -> None:
 | 
				
			||||||
 | 
					        ...
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue
	
	Block a user