mirror of
				https://github.com/ets-labs/python-dependency-injector.git
				synced 2025-11-04 09:57:37 +03:00 
			
		
		
		
	Add implementation and typing stubs
This commit is contained in:
		
							parent
							
								
									e0b0a1e968
								
							
						
					
					
						commit
						a948ff37b7
					
				
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| 
						 | 
				
			
			@ -44,7 +44,7 @@ class Container:
 | 
			
		|||
    def init_resources(self) -> Optional[Awaitable]: ...
 | 
			
		||||
    def shutdown_resources(self) -> Optional[Awaitable]: ...
 | 
			
		||||
    def apply_container_providers_overridings(self) -> None: ...
 | 
			
		||||
    def reset_singletons(self) -> None: ...
 | 
			
		||||
    def reset_singletons(self) -> SingletonResettingContext: ...
 | 
			
		||||
    def check_dependencies(self) -> None: ...
 | 
			
		||||
    @overload
 | 
			
		||||
    def resolve_provider_name(self, provider: Provider) -> str: ...
 | 
			
		||||
| 
						 | 
				
			
			@ -72,6 +72,11 @@ class DeclarativeContainer(Container):
 | 
			
		|||
    def __init__(self, **overriding_providers: Union[Provider, Any]) -> None: ...
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class SingletonResettingContext:
 | 
			
		||||
    def __init__(self, container: Container): ...
 | 
			
		||||
    def __enter__(self) -> None: ...
 | 
			
		||||
    def __exit__(self, *_: Any) -> None: ...
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def override(container: Type[C]) -> _Callable[[Type[C_Overriding]], Type[C_Overriding]]: ...
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -304,6 +304,7 @@ class DynamicContainer(Container):
 | 
			
		|||
        """Reset container singletons."""
 | 
			
		||||
        for provider in self.traverse(types=[providers.BaseSingleton]):
 | 
			
		||||
            provider.reset()
 | 
			
		||||
        return SingletonResetContext(self)
 | 
			
		||||
 | 
			
		||||
    def check_dependencies(self):
 | 
			
		||||
        """Check if container dependencies are defined.
 | 
			
		||||
| 
						 | 
				
			
			@ -639,6 +640,18 @@ class DeclarativeContainer(Container):
 | 
			
		|||
            provider.reset_override()
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class SingletonResetContext:
 | 
			
		||||
 | 
			
		||||
    def __init__(self, container):
 | 
			
		||||
        self._container = container
 | 
			
		||||
 | 
			
		||||
    def __enter__(self):
 | 
			
		||||
        ...
 | 
			
		||||
 | 
			
		||||
    def __exit__(self, *_):
 | 
			
		||||
        self._container.reset_singletons()
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def override(object container):
 | 
			
		||||
    """:py:class:`DeclarativeContainer` overriding decorator.
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| 
						 | 
				
			
			@ -54,11 +54,6 @@ cdef class DependenciesContainer(Object):
 | 
			
		|||
    cpdef object _override_providers(self, object container)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
cdef class OverridingContext(object):
 | 
			
		||||
    cdef Provider __overridden
 | 
			
		||||
    cdef Provider __overriding
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
# Callable providers
 | 
			
		||||
cdef class Callable(Provider):
 | 
			
		||||
    cdef object __provides
 | 
			
		||||
| 
						 | 
				
			
			@ -292,6 +287,23 @@ cpdef tuple parse_named_injections(dict kwargs)
 | 
			
		|||
 | 
			
		||||
 | 
			
		||||
# Utils
 | 
			
		||||
cdef class OverridingContext(object):
 | 
			
		||||
    cdef Provider __overridden
 | 
			
		||||
    cdef Provider __overriding
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
cdef class BaseSingletonResetContext(object):
 | 
			
		||||
    cdef object __singleton
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
cdef class SingletonResetContext(BaseSingletonResetContext):
 | 
			
		||||
    pass
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
cdef class SingletonFullResetContext(BaseSingletonResetContext):
 | 
			
		||||
    pass
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
cdef object CLASS_TYPES
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -40,12 +40,6 @@ T = TypeVar('T')
 | 
			
		|||
TT = TypeVar('TT')
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class OverridingContext:
 | 
			
		||||
    def __init__(self, overridden: Provider, overriding: Provider): ...
 | 
			
		||||
    def __enter__(self) -> Provider: ...
 | 
			
		||||
    def __exit__(self, *_: Any) -> None: ...
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class Provider(Generic[T]):
 | 
			
		||||
    def __init__(self) -> None: ...
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -293,8 +287,8 @@ class BaseSingleton(Provider[T]):
 | 
			
		|||
    def add_attributes(self, **kwargs: Injection) -> BaseSingleton[T]: ...
 | 
			
		||||
    def set_attributes(self, **kwargs: Injection) -> BaseSingleton[T]: ...
 | 
			
		||||
    def clear_attributes(self) -> BaseSingleton[T]: ...
 | 
			
		||||
    def reset(self) -> None: ...
 | 
			
		||||
    def full_reset(self) -> None: ...
 | 
			
		||||
    def reset(self) -> SingletonResetContext: ...
 | 
			
		||||
    def full_reset(self) -> SingletonFullResetContext: ...
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class Singleton(BaseSingleton[T]): ...
 | 
			
		||||
| 
						 | 
				
			
			@ -414,6 +408,29 @@ class MethodCaller(Provider, ProvidedInstanceFluentInterface):
 | 
			
		|||
    def __init__(self, provider: Provider, *args: Injection, **kwargs: Injection) -> None: ...
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class OverridingContext:
 | 
			
		||||
    def __init__(self, overridden: Provider, overriding: Provider): ...
 | 
			
		||||
    def __enter__(self) -> Provider: ...
 | 
			
		||||
    def __exit__(self, *_: Any) -> None: ...
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class BaseSingletonResetContext:
 | 
			
		||||
    def __init__(self, provider: Provider): ...
 | 
			
		||||
    def __enter__(self) -> None: ...
 | 
			
		||||
    def __exit__(self, *_: Any) -> None: ...
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class SingletonResetContext(BaseSingletonResetContext):
 | 
			
		||||
    ...
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class SingletonFullResetContext(BaseSingletonResetContext):
 | 
			
		||||
    ...
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
CHILD_PROVIDERS: Tuple[Provider]
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def is_provider(instance: Any) -> bool: ...
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -444,6 +461,3 @@ if pydantic:
 | 
			
		|||
    PydanticSettings = pydantic.BaseSettings
 | 
			
		||||
else:
 | 
			
		||||
    PydanticSettings = Any
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
CHILD_PROVIDERS: Tuple[Provider]
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -990,42 +990,6 @@ cdef class DependenciesContainer(Object):
 | 
			
		|||
            provider.override(dependency_provider)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
cdef class OverridingContext(object):
 | 
			
		||||
    """Provider overriding context.
 | 
			
		||||
 | 
			
		||||
    :py:class:`OverridingContext` is used by :py:meth:`Provider.override` for
 | 
			
		||||
    implementing ``with`` contexts. When :py:class:`OverridingContext` is
 | 
			
		||||
    closed, overriding that was created in this context is dropped also.
 | 
			
		||||
 | 
			
		||||
    .. code-block:: python
 | 
			
		||||
 | 
			
		||||
        with provider.override(another_provider):
 | 
			
		||||
            assert provider.overridden
 | 
			
		||||
        assert not provider.overridden
 | 
			
		||||
    """
 | 
			
		||||
 | 
			
		||||
    def __init__(self, Provider overridden, Provider overriding):
 | 
			
		||||
        """Initializer.
 | 
			
		||||
 | 
			
		||||
        :param overridden: Overridden provider.
 | 
			
		||||
        :type overridden: :py:class:`Provider`
 | 
			
		||||
 | 
			
		||||
        :param overriding: Overriding provider.
 | 
			
		||||
        :type overriding: :py:class:`Provider`
 | 
			
		||||
        """
 | 
			
		||||
        self.__overridden = overridden
 | 
			
		||||
        self.__overriding = overriding
 | 
			
		||||
        super(OverridingContext, self).__init__()
 | 
			
		||||
 | 
			
		||||
    def __enter__(self):
 | 
			
		||||
        """Do nothing."""
 | 
			
		||||
        return self.__overriding
 | 
			
		||||
 | 
			
		||||
    def __exit__(self, *_):
 | 
			
		||||
        """Exit overriding context."""
 | 
			
		||||
        self.__overridden.reset_last_overriding()
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
cdef class Callable(Provider):
 | 
			
		||||
    r"""Callable provider calls wrapped callable on every call.
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -2632,11 +2596,12 @@ cdef class BaseSingleton(Provider):
 | 
			
		|||
    def full_reset(self):
 | 
			
		||||
        """Reset cached instance in current and all underlying singletons, if any.
 | 
			
		||||
 | 
			
		||||
        :rtype: None
 | 
			
		||||
        :rtype: :py:class:`SingletonFullResetContext`
 | 
			
		||||
        """
 | 
			
		||||
        self.reset()
 | 
			
		||||
        for provider in self.traverse(types=[BaseSingleton]):
 | 
			
		||||
            provider.reset()
 | 
			
		||||
        return SingletonFullResetContext(self)
 | 
			
		||||
 | 
			
		||||
    @property
 | 
			
		||||
    def related(self):
 | 
			
		||||
| 
						 | 
				
			
			@ -2707,6 +2672,7 @@ cdef class Singleton(BaseSingleton):
 | 
			
		|||
        if __is_future_or_coroutine(self.__storage):
 | 
			
		||||
            asyncio.ensure_future(self.__storage).cancel()
 | 
			
		||||
        self.__storage = None
 | 
			
		||||
        return SingletonResetContext(self)
 | 
			
		||||
 | 
			
		||||
    cpdef object _provide(self, tuple args, dict kwargs):
 | 
			
		||||
        """Return single instance."""
 | 
			
		||||
| 
						 | 
				
			
			@ -2775,6 +2741,7 @@ cdef class ThreadSafeSingleton(BaseSingleton):
 | 
			
		|||
            if __is_future_or_coroutine(self.__storage):
 | 
			
		||||
                asyncio.ensure_future(self.__storage).cancel()
 | 
			
		||||
            self.__storage = None
 | 
			
		||||
        return SingletonResetContext(self)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    cpdef object _provide(self, tuple args, dict kwargs):
 | 
			
		||||
| 
						 | 
				
			
			@ -2856,6 +2823,7 @@ cdef class ThreadLocalSingleton(BaseSingleton):
 | 
			
		|||
        if __is_future_or_coroutine(self.__storage.instance):
 | 
			
		||||
            asyncio.ensure_future(self.__storage.instance).cancel()
 | 
			
		||||
        del self.__storage.instance
 | 
			
		||||
        return SingletonResetContext(self)
 | 
			
		||||
 | 
			
		||||
    cpdef object _provide(self, tuple args, dict kwargs):
 | 
			
		||||
        """Return single instance."""
 | 
			
		||||
| 
						 | 
				
			
			@ -4188,6 +4156,67 @@ cpdef tuple parse_named_injections(dict kwargs):
 | 
			
		|||
    return tuple(injections)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
cdef class OverridingContext(object):
 | 
			
		||||
    """Provider overriding context.
 | 
			
		||||
 | 
			
		||||
    :py:class:`OverridingContext` is used by :py:meth:`Provider.override` for
 | 
			
		||||
    implementing ``with`` contexts. When :py:class:`OverridingContext` is
 | 
			
		||||
    closed, overriding that was created in this context is dropped also.
 | 
			
		||||
 | 
			
		||||
    .. code-block:: python
 | 
			
		||||
 | 
			
		||||
        with provider.override(another_provider):
 | 
			
		||||
            assert provider.overridden
 | 
			
		||||
        assert not provider.overridden
 | 
			
		||||
    """
 | 
			
		||||
 | 
			
		||||
    def __init__(self, Provider overridden, Provider overriding):
 | 
			
		||||
        """Initializer.
 | 
			
		||||
 | 
			
		||||
        :param overridden: Overridden provider.
 | 
			
		||||
        :type overridden: :py:class:`Provider`
 | 
			
		||||
 | 
			
		||||
        :param overriding: Overriding provider.
 | 
			
		||||
        :type overriding: :py:class:`Provider`
 | 
			
		||||
        """
 | 
			
		||||
        self.__overridden = overridden
 | 
			
		||||
        self.__overriding = overriding
 | 
			
		||||
        super(OverridingContext, self).__init__()
 | 
			
		||||
 | 
			
		||||
    def __enter__(self):
 | 
			
		||||
        """Do nothing."""
 | 
			
		||||
        return self.__overriding
 | 
			
		||||
 | 
			
		||||
    def __exit__(self, *_):
 | 
			
		||||
        """Exit overriding context."""
 | 
			
		||||
        self.__overridden.reset_last_overriding()
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
cdef class BaseSingletonResetContext(object):
 | 
			
		||||
 | 
			
		||||
    def __init__(self, Provider provider):
 | 
			
		||||
        self.__singleton = provider
 | 
			
		||||
        super().__init__()
 | 
			
		||||
 | 
			
		||||
    def __enter__(self):
 | 
			
		||||
        return self.__singleton
 | 
			
		||||
 | 
			
		||||
    def __exit__(self, *_):
 | 
			
		||||
        raise NotImplementedError()
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
cdef class SingletonResetContext(BaseSingletonResetContext):
 | 
			
		||||
 | 
			
		||||
    def __exit__(self, *_):
 | 
			
		||||
        return self.__singleton.reset()
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
cdef class SingletonFullResetContext(BaseSingletonResetContext):
 | 
			
		||||
 | 
			
		||||
    def __exit__(self, *_):
 | 
			
		||||
        return self.__singleton.full_reset()
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
CHILD_PROVIDERS = (Dependency, DependenciesContainer, Container)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue
	
	Block a user