comparison piecrust/plugins/base.py @ 303:5dbab01daaba

plugins: First pass for a working plugin loader functionality.
author Ludovic Chabant <ludovic@chabant.com>
date Thu, 19 Mar 2015 18:30:38 -0700
parents 343d08ef5668
children 9ae23409d6e9
comparison
equal deleted inserted replaced
302:103abb08755e 303:5dbab01daaba
1 import os 1 import logging
2 import importlib
3
4
5 logger = logging.getLogger(__name__)
2 6
3 7
4 class PieCrustPlugin(object): 8 class PieCrustPlugin(object):
5 def getFormatters(self): 9 def getFormatters(self):
6 return [] 10 return []
92 96
93 from piecrust.plugins.builtin import BuiltInPlugin 97 from piecrust.plugins.builtin import BuiltInPlugin
94 self._plugins = [BuiltInPlugin()] 98 self._plugins = [BuiltInPlugin()]
95 self._pluginsMeta = {self._plugins[0].name: False} 99 self._pluginsMeta = {self._plugins[0].name: False}
96 100
97 for d in self.app.plugins_dirs: 101 for p in self.app.config.get('site/plugins'):
98 _, dirs, __ = next(os.walk(d)) 102 self._loadPlugin(p)
99 for dd in dirs:
100 self._loadPlugin(os.path.join(d, dd))
101 103
102 for plugin in self._plugins: 104 for plugin in self._plugins:
103 plugin.initialize(self.app) 105 plugin.initialize(self.app)
104 106
105 def _loadPlugin(self, plugin_dir): 107 def _loadPlugin(self, plugin_name):
106 pass 108 try:
109 mod = importlib.import_module(plugin_name)
110 except ImportError:
111 logger.error("Failed to load plugin '%s'.")
112 return
113
114 plugin_class = getattr(mod, '__piecrust_plugin__', None)
115 if plugin_class is None:
116 logger.error("Plugin '%s' doesn't specify any "
117 "`__piecrust_plugin__` class." % plugin_name)
118 return
119
120 try:
121 plugin = plugin_class()
122 except Exception as ex:
123 logger.error("Failed to create plugin '%s': %s" %
124 (plugin_name, ex))
125 return
126
127 self._plugins.append(plugin)
107 128
108 def _getPluginComponents(self, name, initialize=False, order_key=None): 129 def _getPluginComponents(self, name, initialize=False, order_key=None):
109 if name in self._componentCache: 130 if name in self._componentCache:
110 return self._componentCache[name] 131 return self._componentCache[name]
111 132