refactor: rework plugin init and renaming in settings

This commit is contained in:
Frederik Ring 2021-01-03 20:54:38 +01:00
commit 4dcb7dde10
3 changed files with 23 additions and 24 deletions

View file

@ -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"""

View file

@ -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)

View file

@ -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')