From d8b37553e37f3b2768d0a74f5163fc1df92b3b33 Mon Sep 17 00:00:00 2001 From: Mike Salvatore Date: Fri, 5 Aug 2022 11:37:07 -0400 Subject: [PATCH 1/3] Common: Rename UnregisteredTypeError to UnresolvableDependencyError When calling `resolve()`, dependencies may be resolved as conventions, instances, or types. `UnregisteredTypeError` is overly specific and, in some cases, inaccurate. It makes more sense for `resolve()` to raise an `UnresolvableDependencyError` if it is unable to resolve a dependency. --- monkey/common/__init__.py | 2 +- monkey/common/di_container.py | 6 +++--- monkey/tests/common/stub_di_container.py | 6 +++--- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/monkey/common/__init__.py b/monkey/common/__init__.py index c10545c7f..fd9232730 100644 --- a/monkey/common/__init__.py +++ b/monkey/common/__init__.py @@ -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 diff --git a/monkey/common/di_container.py b/monkey/common/di_container.py index 9220864c3..b7b6b5e79 100644 --- a/monkey/common/di_container.py +++ b/monkey/common/di_container.py @@ -6,7 +6,7 @@ from common.utils.code_utils import del_key T = TypeVar("T") -class UnregisteredTypeError(ValueError): +class UnresolvableDependencyError(ValueError): pass @@ -109,7 +109,7 @@ class DIContainer: """ try: return self._resolve_type(type_) - except UnregisteredTypeError: + except UnresolvableDependencyError: pass args = self.resolve_dependencies(type_) @@ -153,7 +153,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)}"' ) diff --git a/monkey/tests/common/stub_di_container.py b/monkey/tests/common/stub_di_container.py index bed434145..5d9f6847f 100644 --- a/monkey/tests/common/stub_di_container.py +++ b/monkey/tests/common/stub_di_container.py @@ -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() From 345633b1e32ee63a215250901a0fe7fe914a8d1c Mon Sep 17 00:00:00 2001 From: Mike Salvatore Date: Fri, 5 Aug 2022 11:43:15 -0400 Subject: [PATCH 2/3] Common: Document exceptions for DIContainer --- monkey/common/di_container.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/monkey/common/di_container.py b/monkey/common/di_container.py index b7b6b5e79..744e813d8 100644 --- a/monkey/common/di_container.py +++ b/monkey/common/di_container.py @@ -31,6 +31,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 +55,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,6 +108,7 @@ 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: return self._resolve_type(type_) @@ -125,6 +128,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 = [] From b2d32697e3defe439d6f5fc877a197d1b6d8e690 Mon Sep 17 00:00:00 2001 From: Mike Salvatore Date: Mon, 8 Aug 2022 07:00:49 -0400 Subject: [PATCH 3/3] Common: Use suppress (not pass) in DIContainer.resolve() --- monkey/common/di_container.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/monkey/common/di_container.py b/monkey/common/di_container.py index 744e813d8..b07367962 100644 --- a/monkey/common/di_container.py +++ b/monkey/common/di_container.py @@ -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 @@ -110,10 +111,8 @@ class DIContainer: :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 UnresolvableDependencyError: - pass args = self.resolve_dependencies(type_) return type_(*args)