From b900133ab44e86c5bf07b734bce16a69cc816a35 Mon Sep 17 00:00:00 2001 From: yanyongyu Date: Tue, 21 Dec 2021 11:18:34 +0800 Subject: [PATCH] :bug: fix duplicate plugin check --- nonebot/plugin/manager.py | 12 +++++++++++- tests/test_init.py | 12 +++++++++--- 2 files changed, 20 insertions(+), 4 deletions(-) diff --git a/nonebot/plugin/manager.py b/nonebot/plugin/manager.py index e029efde..23597eb1 100644 --- a/nonebot/plugin/manager.py +++ b/nonebot/plugin/manager.py @@ -53,6 +53,15 @@ class PluginManager: # get all previous ready to load plugins previous_plugins = self._previous_plugins() searched_plugins: Dict[str, Path] = {} + third_party_plugins: Set[str] = set() + + for plugin in self.plugins: + name = plugin.rsplit(".", 1)[-1] if "." in plugin else plugin + if name in third_party_plugins or name in previous_plugins: + raise RuntimeError( + f"Plugin already exists: {name}! Check your plugin name" + ) + third_party_plugins.add(plugin) for module_info in pkgutil.iter_modules(self.search_path): if module_info.name.startswith("_"): @@ -60,6 +69,7 @@ class PluginManager: if ( module_info.name in searched_plugins.keys() or module_info.name in previous_plugins + or module_info.name in third_party_plugins ): raise RuntimeError( f"Plugin already exists: {module_info.name}! Check your plugin name" @@ -74,7 +84,7 @@ class PluginManager: self.searched_plugins = searched_plugins - return self.plugins | set(self.searched_plugins.keys()) + return third_party_plugins | set(self.searched_plugins.keys()) def load_plugin(self, name) -> Optional[Plugin]: try: diff --git a/tests/test_init.py b/tests/test_init.py index 3ab17710..2018fb75 100644 --- a/tests/test_init.py +++ b/tests/test_init.py @@ -83,7 +83,13 @@ async def test_load_plugin(load_plugin: Set["Plugin"]): plugin for plugin in nonebot.get_loaded_plugins() if not plugin.parent_plugin ) assert loaded_plugins == load_plugin - plugin = nonebot.get_plugin("param_depend") + plugin = nonebot.get_plugin("export") assert plugin - assert plugin.module_name == "plugins.param.param_depend" - assert "plugins.param.param_depend" in sys.modules + assert plugin.module_name == "plugins.export" + assert "plugins.export" in sys.modules + + try: + nonebot.load_plugin("plugins.export") + assert False + except RuntimeError: + assert True