Merge pull request #2175 from guardicore/di-container-quality-improvements
Di container quality improvements
This commit is contained in:
commit
5e369f338a
|
@ -1,5 +1,5 @@
|
|||
"""
|
||||
Used for a common things between agent and island
|
||||
"""
|
||||
from .di_container import DIContainer, UnregisteredTypeError
|
||||
from .di_container import DIContainer, UnresolvableDependencyError
|
||||
from .operating_systems import OperatingSystems
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
import inspect
|
||||
from contextlib import suppress
|
||||
from typing import Any, Sequence, Type, TypeVar
|
||||
|
||||
from common.utils.code_utils import del_key
|
||||
|
@ -6,7 +7,7 @@ from common.utils.code_utils import del_key
|
|||
T = TypeVar("T")
|
||||
|
||||
|
||||
class UnregisteredTypeError(ValueError):
|
||||
class UnresolvableDependencyError(ValueError):
|
||||
pass
|
||||
|
||||
|
||||
|
@ -31,6 +32,7 @@ class DIContainer:
|
|||
|
||||
:param interface: An interface or abstract base class that other classes depend upon
|
||||
:param concrete_type: A `type` (class) that implements `interface`
|
||||
:raises TypeError: If `concrete_type` is not a class, or not a subclass of `interface`
|
||||
"""
|
||||
if not inspect.isclass(concrete_type):
|
||||
raise TypeError(
|
||||
|
@ -54,6 +56,7 @@ class DIContainer:
|
|||
|
||||
:param interface: An interface or abstract base class that other classes depend upon
|
||||
:param instance: An instance (object) of a `type` that implements `interface`
|
||||
:raises TypeError: If `instance` is not an instance of `interface`
|
||||
"""
|
||||
if not isinstance(instance, interface):
|
||||
raise TypeError(
|
||||
|
@ -106,11 +109,10 @@ class DIContainer:
|
|||
|
||||
:param **type_**: A `type` (class) to construct
|
||||
:return: An instance of **type_**
|
||||
:raises UnresolvableDependencyError: If any dependencies could not be successfully resolved
|
||||
"""
|
||||
try:
|
||||
with suppress(UnresolvableDependencyError):
|
||||
return self._resolve_type(type_)
|
||||
except UnregisteredTypeError:
|
||||
pass
|
||||
|
||||
args = self.resolve_dependencies(type_)
|
||||
return type_(*args)
|
||||
|
@ -125,6 +127,7 @@ class DIContainer:
|
|||
|
||||
:param **type_**: A type (class) to resolve dependencies for
|
||||
:return: An Sequence of dependencies to be injected into `type_`'s constructor
|
||||
:raises UnresolvableDependencyError: If any dependencies could not be successfully resolved
|
||||
"""
|
||||
args = []
|
||||
|
||||
|
@ -153,7 +156,7 @@ class DIContainer:
|
|||
elif type_ in self._instance_registry:
|
||||
return self._retrieve_registered_instance(type_)
|
||||
|
||||
raise UnregisteredTypeError(
|
||||
raise UnresolvableDependencyError(
|
||||
f'Failed to resolve unregistered type "{DIContainer._format_type_name(type)}"'
|
||||
)
|
||||
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
from typing import Any, Sequence, Type, TypeVar
|
||||
from unittest.mock import MagicMock
|
||||
|
||||
from common import DIContainer, UnregisteredTypeError
|
||||
from common import DIContainer, UnresolvableDependencyError
|
||||
|
||||
T = TypeVar("T")
|
||||
|
||||
|
@ -10,11 +10,11 @@ class StubDIContainer(DIContainer):
|
|||
def resolve(self, type_: Type[T]) -> T:
|
||||
try:
|
||||
return super().resolve(type_)
|
||||
except UnregisteredTypeError:
|
||||
except UnresolvableDependencyError:
|
||||
return MagicMock()
|
||||
|
||||
def resolve_dependencies(self, type_: Type[T]) -> Sequence[Any]:
|
||||
try:
|
||||
return super().resolve_dependencies(type_)
|
||||
except UnregisteredTypeError:
|
||||
except UnresolvableDependencyError:
|
||||
return MagicMock()
|
||||
|
|
Loading…
Reference in New Issue