summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJustin Mayer <entroP@gmail.com>2020-04-17 20:21:25 +0200
committerGitHub <noreply@github.com>2020-04-17 20:21:25 +0200
commit59462ad415ba7f2bcad7d6093c6c22895a1d0e41 (patch)
treea91dc6c2ca02c538c5957b052c008c47249ff24f
parentf610801ee8c67df5ed7e3223fe54a2578347b88e (diff)
parent46e1ec4f99be225d3f6f487de02832b97a26bc23 (diff)
downloadpelican-59462ad415ba7f2bcad7d6093c6c22895a1d0e41.tar.gz
Merge pull request #2730 from avaris/namespace-redux
Fix legacy plugin loading
-rw-r--r--pelican/plugins/_utils.py18
-rw-r--r--pelican/tests/dummy_plugins/normal_plugin/normal_plugin/__init__.py2
-rw-r--r--pelican/tests/dummy_plugins/normal_plugin/normal_plugin/submodule.py2
3 files changed, 21 insertions, 1 deletions
diff --git a/pelican/plugins/_utils.py b/pelican/plugins/_utils.py
index a3c9ee77..78c19e54 100644
--- a/pelican/plugins/_utils.py
+++ b/pelican/plugins/_utils.py
@@ -3,6 +3,7 @@ import importlib.machinery
import importlib.util
import logging
import pkgutil
+import sys
logger = logging.getLogger(__name__)
@@ -47,8 +48,23 @@ def load_legacy_plugin(plugin, plugin_paths):
if spec is None:
raise ImportError('Cannot import plugin `{}`'.format(plugin))
else:
+ # create module object from spec
mod = importlib.util.module_from_spec(spec)
- spec.loader.exec_module(mod)
+ # place it into sys.modules cache
+ # necessary if module imports itself at some point (e.g. packages)
+ sys.modules[spec.name] = mod
+ try:
+ # try to execute it inside module object
+ spec.loader.exec_module(mod)
+ except Exception: # problem with import
+ try:
+ # remove module from sys.modules since it can't be loaded
+ del sys.modules[spec.name]
+ except KeyError:
+ pass
+ raise
+
+ # if all went well, we have the plugin module
return mod
diff --git a/pelican/tests/dummy_plugins/normal_plugin/normal_plugin/__init__.py b/pelican/tests/dummy_plugins/normal_plugin/normal_plugin/__init__.py
index 15896087..5838a835 100644
--- a/pelican/tests/dummy_plugins/normal_plugin/normal_plugin/__init__.py
+++ b/pelican/tests/dummy_plugins/normal_plugin/normal_plugin/__init__.py
@@ -1,3 +1,5 @@
+from .submodule import noop # noqa: F401
+
NAME = 'normal plugin'
diff --git a/pelican/tests/dummy_plugins/normal_plugin/normal_plugin/submodule.py b/pelican/tests/dummy_plugins/normal_plugin/normal_plugin/submodule.py
new file mode 100644
index 00000000..ba9c8f94
--- /dev/null
+++ b/pelican/tests/dummy_plugins/normal_plugin/normal_plugin/submodule.py
@@ -0,0 +1,2 @@
+def noop():
+ pass