diff piecrust/plugins/base.py @ 1:aaa8fb7c8918

Re-arranged modules to reduce dependencies to builtin stuff. Added `init` command.
author Ludovic Chabant <ludovic@chabant.com>
date Sun, 22 Dec 2013 08:00:24 -0800
parents piecrust/plugins.py@a212a3f2e3ee
children f485ba500df3
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/piecrust/plugins/base.py	Sun Dec 22 08:00:24 2013 -0800
@@ -0,0 +1,113 @@
+import os
+
+
+class PieCrustPlugin(object):
+    def getFormatters(self):
+        return []
+
+    def getTemplateEngines(self):
+        return []
+
+    def getDataProviders(self):
+        return []
+
+    def getFileSystems(self):
+        return []
+
+    def getProcessors(self):
+        return []
+
+    def getImporters(self):
+        return []
+
+    def getCommands(self):
+        return []
+
+    def getRepositories(self):
+        return []
+
+    def getBakerAssistants(self):
+        return []
+
+    def initialize(self, app):
+        pass
+
+
+class PluginLoader(object):
+    def __init__(self, app):
+        self.app = app
+        self._plugins = None
+        self._pluginsMeta = None
+        self._componentCache = {}
+
+    @property
+    def plugins(self):
+        self._ensureLoaded()
+        return self._plugins
+
+    def getFormatters(self):
+        return self._getPluginComponents('getFormatters', True,
+                order_key=lambda f: f.priority)
+
+    def getTemplateEngines(self):
+        return self._getPluginComponents('getTemplateEngines', True)
+
+    def getDataProviders(self):
+        return self._getPluginComponents('getDataProviders')
+
+    def getFileSystems(self):
+        return self._getPluginComponents('getFileSystems')
+
+    def getProcessors(self):
+        return self._getPluginComponents('getProcessors', True,
+                order_key=lambda p: p.priority)
+
+    def getImporters(self):
+        return self._getPluginComponents('getImporters')
+
+    def getCommands(self):
+        return self._getPluginComponents('getCommands')
+
+    def getRepositories(self):
+        return self._getPluginComponents('getRepositories', True)
+
+    def getBakerAssistants(self):
+        return self._getPluginComponents('getBakerAssistants')
+
+    def _ensureLoaded(self):
+        if self._plugins is not None:
+            return
+
+        from piecrust.plugins.builtin import BuiltInPlugin
+        self._plugins = [BuiltInPlugin()]
+        self._pluginsMeta = {self._plugins[0].name: False}
+
+        for d in self.app.plugins_dirs:
+            _, dirs, __ = next(os.walk(d))
+            for dd in dirs:
+                self._loadPlugin(os.path.join(d, dd))
+
+        for plugin in self._plugins:
+            plugin.initialize(self.app)
+
+    def _loadPlugin(self, plugin_dir):
+        pass
+
+    def _getPluginComponents(self, name, initialize=False, order_cmp=None, order_key=None):
+        if name in self._componentCache:
+            return self._componentCache[name]
+
+        all_components = []
+        for plugin in self.plugins:
+            plugin_components = getattr(plugin, name)()
+            all_components += plugin_components
+            if initialize:
+                for comp in plugin_components:
+                    comp.initialize(self.app)
+
+        if order_cmp is not None or order_key is not None:
+            all_components.sort(cmp=order_cmp, key=order_key)
+
+        self._componentCache[name] = all_components
+        return all_components
+