From 4dcb7dde1010c51d6b05c494f1d6933237a26ca3 Mon Sep 17 00:00:00 2001 From: Frederik Ring Date: Sun, 3 Jan 2021 20:54:38 +0100 Subject: [PATCH] refactor: rework plugin init and renaming in settings --- pelican/__init__.py | 15 ++++++++------- pelican/plugins/_utils.py | 17 +++++++++-------- pelican/tests/test_plugins.py | 15 ++++++--------- 3 files changed, 23 insertions(+), 24 deletions(-) diff --git a/pelican/__init__.py b/pelican/__init__.py index e91e634d..1982f413 100644 --- a/pelican/__init__.py +++ b/pelican/__init__.py @@ -20,7 +20,7 @@ from pelican.generators import (ArticlesGenerator, # noqa: I100 PagesGenerator, SourceFileGenerator, StaticGenerator, TemplatePagesGenerator) from pelican.plugins import signals -from pelican.plugins._utils import load_plugins, stringify_plugins +from pelican.plugins._utils import get_plugin_name, load_plugins from pelican.readers import Readers from pelican.server import ComplexHTTPRequestHandler, RootedHTTPServer from pelican.settings import coerce_overrides, read_settings @@ -65,17 +65,18 @@ class Pelican: sys.path.insert(0, '') def init_plugins(self): - self.plugins = load_plugins(self.settings) - for plugin in self.plugins: - logger.debug('Registering plugin `%s`', plugin.__name__) + self.plugins = [] + for plugin in load_plugins(self.settings): + name = get_plugin_name(plugin) + logger.debug('Registering plugin `%s`', name) try: plugin.register() + self.plugins.append(plugin) except Exception as e: logger.error('Cannot register plugin `%s`\n%s', - plugin.__name__, e) + name, e) - if 'PLUGINS' in self.settings and self.settings['PLUGINS'] is not None: - self.settings['PLUGINS'] = stringify_plugins(self.settings['PLUGINS']) + self.settings['PLUGINS'] = [get_plugin_name(p) for p in self.plugins] def run(self): """Run the generators and return""" diff --git a/pelican/plugins/_utils.py b/pelican/plugins/_utils.py index 563246e6..364a1e45 100644 --- a/pelican/plugins/_utils.py +++ b/pelican/plugins/_utils.py @@ -110,20 +110,21 @@ def load_plugins(settings): return plugins -def stringify_plugins(plugins): +def get_plugin_name(plugin): """ Plugins can be passed as module objects, however this breaks caching as - module objects cannot be pickled. To work around this, we stringify all - plugin definitions post-initialization. + module objects cannot be pickled. To work around this, all plugins are + stringified post-initialization. """ - return [_stringify_plugin(p) for p in plugins] - - -def _stringify_plugin(plugin): if isinstance(plugin, str): return plugin if inspect.isclass(plugin): return plugin.__name__ - return plugin.__class__.__qualname__ + try: + return plugin.__class__.__qualname__ + except AttributeError: + pass + + return str(plugin) diff --git a/pelican/tests/test_plugins.py b/pelican/tests/test_plugins.py index 7842d677..27e17aa1 100644 --- a/pelican/tests/test_plugins.py +++ b/pelican/tests/test_plugins.py @@ -1,8 +1,8 @@ import os from contextlib import contextmanager -from pelican.plugins._utils import (get_namespace_plugins, load_plugins, - stringify_plugins) +from pelican.plugins._utils import (get_namespace_plugins, get_plugin_name, + load_plugins) from pelican.tests.support import NoopPlugin, unittest @@ -174,10 +174,7 @@ class PluginTest(unittest.TestCase): {'normal plugin', 'namespace plugin'}, get_plugin_names(plugins)) - def test_stringify_plugins(self): - result = stringify_plugins(['string_plugin', NoopPlugin()]) - # Plugins are converted to string references - self.assertCountEqual( - ['string_plugin', 'NoopPlugin'], - result - ) + def test_get_plugin_name(self): + self.assertEqual(get_plugin_name('string_plugin'), 'string_plugin') + self.assertEqual(get_plugin_name(NoopPlugin), 'NoopPlugin') + self.assertEqual(get_plugin_name(NoopPlugin()), 'NoopPlugin')