From 5980204a6b44ded7a2b037b69ef1f362f29a5daf Mon Sep 17 00:00:00 2001 From: Adam Burdett Date: Wed, 20 Jan 2021 01:54:21 -0700 Subject: [PATCH 1/2] feat: permissive plugin loading Signed-off-by: Adam Burdett --- aries_cloudagent/core/plugin_registry.py | 5 +++++ aries_cloudagent/core/tests/test_plugin_registry.py | 7 +++++++ 2 files changed, 12 insertions(+) diff --git a/aries_cloudagent/core/plugin_registry.py b/aries_cloudagent/core/plugin_registry.py index b3c40c6188..96c426c254 100644 --- a/aries_cloudagent/core/plugin_registry.py +++ b/aries_cloudagent/core/plugin_registry.py @@ -130,6 +130,11 @@ def register_plugin(self, module_name: str) -> ModuleType: LOGGER.error(f"Module doesn't exist: {module_name}") return None + # Any plugin with a setup method is considered valid. + if hasattr(mod, "setup"): + self._plugins[module_name] = mod + return mod + # Make an exception for non-protocol modules # that contain admin routes and for old-style protocol # modules without version support diff --git a/aries_cloudagent/core/tests/test_plugin_registry.py b/aries_cloudagent/core/tests/test_plugin_registry.py index 929b60cef6..349bdb919a 100644 --- a/aries_cloudagent/core/tests/test_plugin_registry.py +++ b/aries_cloudagent/core/tests/test_plugin_registry.py @@ -449,6 +449,13 @@ async def test_register_plugin_no_versions(self): ] assert self.registry.register_plugin("dummy") is None + async def test_register_plugin_has_setup(self): + with async_mock.patch.object( + ClassLoader, "load_module", async_mock.MagicMock(return_value = {"setup":"valid"}) + ) as load_module: + self.registry.register_plugin("dummy") + assert self.registry._plugins["dummy"] == {"setup":"valid"} + async def test_register_definitions_malformed(self): with async_mock.patch.object( ClassLoader, "load_module", async_mock.MagicMock() From c8ccdba41aabdebca9aafede8e1c82e510ce4b72 Mon Sep 17 00:00:00 2001 From: Daniel Bluhm Date: Tue, 13 Apr 2021 13:54:30 -0400 Subject: [PATCH 2/2] test: fix plugin loading tests Signed-off-by: Daniel Bluhm --- .../core/tests/test_plugin_registry.py | 23 +++++++++++++------ 1 file changed, 16 insertions(+), 7 deletions(-) diff --git a/aries_cloudagent/core/tests/test_plugin_registry.py b/aries_cloudagent/core/tests/test_plugin_registry.py index 349bdb919a..cde60cce0e 100644 --- a/aries_cloudagent/core/tests/test_plugin_registry.py +++ b/aries_cloudagent/core/tests/test_plugin_registry.py @@ -430,7 +430,7 @@ async def test_register_plugin_no_definition(self): ClassLoader, "load_module", async_mock.MagicMock() ) as load_module: load_module.side_effect = [ - async_mock.MagicMock(), # module + {}, # module None, # routes None, # message types None, # definition @@ -442,7 +442,7 @@ async def test_register_plugin_no_versions(self): ClassLoader, "load_module", async_mock.MagicMock() ) as load_module: load_module.side_effect = [ - async_mock.MagicMock(), # module + {}, # module None, # routes None, # message types "str-has-no-versions-attr", # definition without versions attr @@ -450,18 +450,27 @@ async def test_register_plugin_no_versions(self): assert self.registry.register_plugin("dummy") is None async def test_register_plugin_has_setup(self): + class MODULE: + setup = "present" + + obj = MODULE() with async_mock.patch.object( - ClassLoader, "load_module", async_mock.MagicMock(return_value = {"setup":"valid"}) + ClassLoader, "load_module", async_mock.MagicMock() ) as load_module: - self.registry.register_plugin("dummy") - assert self.registry._plugins["dummy"] == {"setup":"valid"} - + load_module.side_effect = [ + obj, # module + None, # routes + None, # message types + None, # definition without versions attr + ] + assert self.registry.register_plugin("dummy") == obj + async def test_register_definitions_malformed(self): with async_mock.patch.object( ClassLoader, "load_module", async_mock.MagicMock() ) as load_module: load_module.side_effect = [ - async_mock.MagicMock(), # module + {}, # module None, # routes None, # message types async_mock.MagicMock(versions="not-a-list"),