From 991c00af95ac3cdb197b0d04e7349d801d6c951d Mon Sep 17 00:00:00 2001 From: Deniz Turgut Date: Mon, 12 Oct 2020 14:50:42 +0300 Subject: [PATCH] resolve packages for legacy plugins Updated legacy plugin loader to handle pakcages if the PLUGINS entry contains `.`. Also adds a test for it. --- pelican/plugins/_utils.py | 5 +++++ .../normal_submodule_plugin/__init__.py | 0 .../subpackage/__init__.py | 0 .../subpackage/subpackage.py | 5 +++++ .../normal_submodule_plugin/subplugin.py | 5 +++++ pelican/tests/test_plugins.py | 15 +++++++++++++++ 6 files changed, 30 insertions(+) create mode 100644 pelican/tests/dummy_plugins/normal_plugin/normal_submodule_plugin/__init__.py create mode 100644 pelican/tests/dummy_plugins/normal_plugin/normal_submodule_plugin/subpackage/__init__.py create mode 100644 pelican/tests/dummy_plugins/normal_plugin/normal_submodule_plugin/subpackage/subpackage.py create mode 100644 pelican/tests/dummy_plugins/normal_plugin/normal_submodule_plugin/subplugin.py diff --git a/pelican/plugins/_utils.py b/pelican/plugins/_utils.py index 78c19e54..4e6ec3c5 100644 --- a/pelican/plugins/_utils.py +++ b/pelican/plugins/_utils.py @@ -40,6 +40,11 @@ def list_plugins(ns_pkg=None): def load_legacy_plugin(plugin, plugin_paths): + if '.' in plugin: + # it is in a package, try to resolve package first + package, _, _ = plugin.rpartition('.') + load_legacy_plugin(package, plugin_paths) + # Try to find plugin in PLUGIN_PATHS spec = importlib.machinery.PathFinder.find_spec(plugin, plugin_paths) if spec is None: diff --git a/pelican/tests/dummy_plugins/normal_plugin/normal_submodule_plugin/__init__.py b/pelican/tests/dummy_plugins/normal_plugin/normal_submodule_plugin/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/pelican/tests/dummy_plugins/normal_plugin/normal_submodule_plugin/subpackage/__init__.py b/pelican/tests/dummy_plugins/normal_plugin/normal_submodule_plugin/subpackage/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/pelican/tests/dummy_plugins/normal_plugin/normal_submodule_plugin/subpackage/subpackage.py b/pelican/tests/dummy_plugins/normal_plugin/normal_submodule_plugin/subpackage/subpackage.py new file mode 100644 index 00000000..ddb0eeca --- /dev/null +++ b/pelican/tests/dummy_plugins/normal_plugin/normal_submodule_plugin/subpackage/subpackage.py @@ -0,0 +1,5 @@ +NAME = 'normal subpackage plugin' + + +def register(): + pass diff --git a/pelican/tests/dummy_plugins/normal_plugin/normal_submodule_plugin/subplugin.py b/pelican/tests/dummy_plugins/normal_plugin/normal_submodule_plugin/subplugin.py new file mode 100644 index 00000000..377c788b --- /dev/null +++ b/pelican/tests/dummy_plugins/normal_plugin/normal_submodule_plugin/subplugin.py @@ -0,0 +1,5 @@ +NAME = 'normal submodule plugin' + + +def register(): + pass diff --git a/pelican/tests/test_plugins.py b/pelican/tests/test_plugins.py index 730aa6d5..06940884 100644 --- a/pelican/tests/test_plugins.py +++ b/pelican/tests/test_plugins.py @@ -116,6 +116,21 @@ class PluginTest(unittest.TestCase): {'normal plugin'}, get_plugin_names(plugins)) + # normal submodule/subpackage plugins + SETTINGS = { + 'PLUGINS': [ + 'normal_submodule_plugin.subplugin', + 'normal_submodule_plugin.subpackage.subpackage', + ], + 'PLUGIN_PATHS': [self._NORMAL_PLUGIN_FOLDER] + } + plugins = load_plugins(SETTINGS) + self.assertEqual(len(plugins), 2, plugins) + self.assertEqual( + {'normal submodule plugin', + 'normal subpackage plugin'}, + get_plugin_names(plugins)) + # namespace plugin short SETTINGS = { 'PLUGINS': ['ns_plugin']