From b79e6474c979de0d8cbdfa0f8c5129cada8b74eb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9s=20Dur=C3=A1n?= Date: Tue, 14 Jan 2025 13:28:25 +0100 Subject: [PATCH 1/2] make attribute error handling more precise --- src/pypendency/loaders/py_loader.py | 4 +++- tests/loaders/test_py_loader.py | 4 ++++ .../test_di_with_generic_attribute_error.py | 12 ++++++++++++ 3 files changed, 19 insertions(+), 1 deletion(-) create mode 100644 tests/resources/test_di_with_generic_attribute_error.py diff --git a/src/pypendency/loaders/py_loader.py b/src/pypendency/loaders/py_loader.py index e984c9d..e61ff8a 100644 --- a/src/pypendency/loaders/py_loader.py +++ b/src/pypendency/loaders/py_loader.py @@ -32,7 +32,9 @@ def __load_module(self, resource: str, module: PythonLoadableModuleType) -> None try: module.load(self.__container_builder) except AttributeError as e: - raise exceptions.MissingLoaderMethod(resource) from e + if "has no attribute 'load'" in str(e): + raise exceptions.MissingLoaderMethod(resource) from e + raise e def load_by_module_name(self, resource: str) -> None: package = locate(resource) diff --git a/tests/loaders/test_py_loader.py b/tests/loaders/test_py_loader.py index b883cc5..fbc0740 100644 --- a/tests/loaders/test_py_loader.py +++ b/tests/loaders/test_py_loader.py @@ -44,6 +44,10 @@ def test_load_by_module_name_fails_for_loader_without_load_method(self): with self.assertRaises(exceptions.MissingLoaderMethod): self.loader.load_by_module_name("tests.resources.test_di_no_load_method") + def test_load_by_module_name_fails_for_module_with_generic_attribute_error(self): + with self.assertRaises(AttributeError): + self.loader.load_by_module_name("tests.resources.test_di_with_generic_attribute_error") + def test_load_by_module_name_works_as_expected(self): self.loader.load_by_module_name("tests.resources.test_di") c = self._container_builder.get("example.C") diff --git a/tests/resources/test_di_with_generic_attribute_error.py b/tests/resources/test_di_with_generic_attribute_error.py new file mode 100644 index 0000000..c3712b4 --- /dev/null +++ b/tests/resources/test_di_with_generic_attribute_error.py @@ -0,0 +1,12 @@ +from pypendency.argument import Argument +from pypendency.builder import ContainerBuilder +from pypendency.definition import Definition + + +def load(container_builder: ContainerBuilder): + container_builder.set_definition( + Definition('example.A', 'tests.resources.class_a.A') + ) + + x = 42 + x.append("This will cause an AttributeError") From f666db69f917c1226983e9bb2bbc1a6f10a1f581 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9s=20Dur=C3=A1n?= Date: Tue, 1 Apr 2025 11:56:49 +0200 Subject: [PATCH 2/2] simplify code and make check more resilient --- src/pypendency/loaders/py_loader.py | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/src/pypendency/loaders/py_loader.py b/src/pypendency/loaders/py_loader.py index e61ff8a..5655364 100644 --- a/src/pypendency/loaders/py_loader.py +++ b/src/pypendency/loaders/py_loader.py @@ -29,12 +29,10 @@ def __load_by_absolute_path(self, resource: str) -> None: self.__load_module(resource, module) def __load_module(self, resource: str, module: PythonLoadableModuleType) -> None: - try: - module.load(self.__container_builder) - except AttributeError as e: - if "has no attribute 'load'" in str(e): - raise exceptions.MissingLoaderMethod(resource) from e - raise e + if not hasattr(module, "load"): + raise exceptions.MissingLoaderMethod(resource) + + module.load(self.__container_builder) def load_by_module_name(self, resource: str) -> None: package = locate(resource)