annotate piecrust/plugins/base.py @ 550:6f216c1ab6b1

bake: Add a flag to know which record entries got collapsed from last run. This makes it possible to find entries for things that were actually baked during the current run, as opposed to skipped because they were "clean".
author Ludovic Chabant <ludovic@chabant.com>
date Tue, 04 Aug 2015 21:22:30 -0700
parents eacf0a3afd0c
children e2e955a3bb25
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
303
5dbab01daaba plugins: First pass for a working plugin loader functionality.
Ludovic Chabant <ludovic@chabant.com>
parents: 7
diff changeset
1 import logging
5dbab01daaba plugins: First pass for a working plugin loader functionality.
Ludovic Chabant <ludovic@chabant.com>
parents: 7
diff changeset
2 import importlib
5dbab01daaba plugins: First pass for a working plugin loader functionality.
Ludovic Chabant <ludovic@chabant.com>
parents: 7
diff changeset
3
5dbab01daaba plugins: First pass for a working plugin loader functionality.
Ludovic Chabant <ludovic@chabant.com>
parents: 7
diff changeset
4
5dbab01daaba plugins: First pass for a working plugin loader functionality.
Ludovic Chabant <ludovic@chabant.com>
parents: 7
diff changeset
5 logger = logging.getLogger(__name__)
0
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
6
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
7
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
8 class PieCrustPlugin(object):
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
9 def getFormatters(self):
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
10 return []
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
11
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
12 def getTemplateEngines(self):
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
13 return []
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
14
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
15 def getDataProviders(self):
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
16 return []
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
17
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
18 def getProcessors(self):
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
19 return []
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
20
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
21 def getImporters(self):
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
22 return []
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
23
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
24 def getCommands(self):
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
25 return []
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
26
3
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
27 def getCommandExtensions(self):
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
28 return []
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
29
0
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
30 def getBakerAssistants(self):
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
31 return []
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
32
3
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
33 def getSources(self):
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
34 return []
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
35
0
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
36 def initialize(self, app):
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
37 pass
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
38
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
39
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
40 class PluginLoader(object):
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
41 def __init__(self, app):
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
42 self.app = app
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
43 self._plugins = None
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
44 self._componentCache = {}
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
45
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
46 @property
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
47 def plugins(self):
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
48 self._ensureLoaded()
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
49 return self._plugins
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
50
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
51 def getFormatters(self):
312
10bb8e8600f5 plugins: Remove unused API endpoints.
Ludovic Chabant <ludovic@chabant.com>
parents: 306
diff changeset
52 return self._getPluginComponents(
413
eacf0a3afd0c internal: Register performance timers for plugin components.
Ludovic Chabant <ludovic@chabant.com>
parents: 312
diff changeset
53 'getFormatters',
eacf0a3afd0c internal: Register performance timers for plugin components.
Ludovic Chabant <ludovic@chabant.com>
parents: 312
diff changeset
54 initialize=True, register_timer=True,
eacf0a3afd0c internal: Register performance timers for plugin components.
Ludovic Chabant <ludovic@chabant.com>
parents: 312
diff changeset
55 order_key=lambda f: f.priority)
0
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
56
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
57 def getTemplateEngines(self):
413
eacf0a3afd0c internal: Register performance timers for plugin components.
Ludovic Chabant <ludovic@chabant.com>
parents: 312
diff changeset
58 return self._getPluginComponents(
eacf0a3afd0c internal: Register performance timers for plugin components.
Ludovic Chabant <ludovic@chabant.com>
parents: 312
diff changeset
59 'getTemplateEngines',
eacf0a3afd0c internal: Register performance timers for plugin components.
Ludovic Chabant <ludovic@chabant.com>
parents: 312
diff changeset
60 initialize=True, register_timer=True)
0
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
61
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
62 def getDataProviders(self):
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
63 return self._getPluginComponents('getDataProviders')
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
64
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
65 def getProcessors(self):
312
10bb8e8600f5 plugins: Remove unused API endpoints.
Ludovic Chabant <ludovic@chabant.com>
parents: 306
diff changeset
66 return self._getPluginComponents(
413
eacf0a3afd0c internal: Register performance timers for plugin components.
Ludovic Chabant <ludovic@chabant.com>
parents: 312
diff changeset
67 'getProcessors',
eacf0a3afd0c internal: Register performance timers for plugin components.
Ludovic Chabant <ludovic@chabant.com>
parents: 312
diff changeset
68 initialize=True, register_timer=True,
eacf0a3afd0c internal: Register performance timers for plugin components.
Ludovic Chabant <ludovic@chabant.com>
parents: 312
diff changeset
69 order_key=lambda p: p.priority)
0
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
70
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
71 def getImporters(self):
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
72 return self._getPluginComponents('getImporters')
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
73
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
74 def getCommands(self):
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
75 return self._getPluginComponents('getCommands')
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
76
3
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
77 def getCommandExtensions(self):
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
78 return self._getPluginComponents('getCommandExtensions')
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
79
0
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
80 def getBakerAssistants(self):
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
81 return self._getPluginComponents('getBakerAssistants')
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
82
3
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
83 def getSources(self):
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
84 return self._getPluginComponents('getSources')
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
85
0
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
86 def _ensureLoaded(self):
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
87 if self._plugins is not None:
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
88 return
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
89
1
aaa8fb7c8918 Re-arranged modules to reduce dependencies to builtin stuff.
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
90 from piecrust.plugins.builtin import BuiltInPlugin
0
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
91 self._plugins = [BuiltInPlugin()]
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
92
306
7122976bc751 plugins: Fix crash for sites that don't specify a `site/plugins` setting.
Ludovic Chabant <ludovic@chabant.com>
parents: 305
diff changeset
93 to_install = self.app.config.get('site/plugins')
7122976bc751 plugins: Fix crash for sites that don't specify a `site/plugins` setting.
Ludovic Chabant <ludovic@chabant.com>
parents: 305
diff changeset
94 if to_install:
413
eacf0a3afd0c internal: Register performance timers for plugin components.
Ludovic Chabant <ludovic@chabant.com>
parents: 312
diff changeset
95 for name in to_install:
eacf0a3afd0c internal: Register performance timers for plugin components.
Ludovic Chabant <ludovic@chabant.com>
parents: 312
diff changeset
96 plugin = self._loadPlugin(name)
eacf0a3afd0c internal: Register performance timers for plugin components.
Ludovic Chabant <ludovic@chabant.com>
parents: 312
diff changeset
97 self._plugins.append(plugin)
0
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
98
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
99 for plugin in self._plugins:
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
100 plugin.initialize(self.app)
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
101
303
5dbab01daaba plugins: First pass for a working plugin loader functionality.
Ludovic Chabant <ludovic@chabant.com>
parents: 7
diff changeset
102 def _loadPlugin(self, plugin_name):
5dbab01daaba plugins: First pass for a working plugin loader functionality.
Ludovic Chabant <ludovic@chabant.com>
parents: 7
diff changeset
103 try:
305
9ae23409d6e9 plugins: Change how plugins are loaded. Add a `plugins` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 303
diff changeset
104 mod = importlib.import_module('piecrust_' + plugin_name)
9ae23409d6e9 plugins: Change how plugins are loaded. Add a `plugins` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 303
diff changeset
105 except ImportError as ex:
9ae23409d6e9 plugins: Change how plugins are loaded. Add a `plugins` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 303
diff changeset
106 logger.error("Failed to load plugin '%s'." % plugin_name)
9ae23409d6e9 plugins: Change how plugins are loaded. Add a `plugins` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 303
diff changeset
107 logger.error(ex)
303
5dbab01daaba plugins: First pass for a working plugin loader functionality.
Ludovic Chabant <ludovic@chabant.com>
parents: 7
diff changeset
108 return
5dbab01daaba plugins: First pass for a working plugin loader functionality.
Ludovic Chabant <ludovic@chabant.com>
parents: 7
diff changeset
109
5dbab01daaba plugins: First pass for a working plugin loader functionality.
Ludovic Chabant <ludovic@chabant.com>
parents: 7
diff changeset
110 plugin_class = getattr(mod, '__piecrust_plugin__', None)
5dbab01daaba plugins: First pass for a working plugin loader functionality.
Ludovic Chabant <ludovic@chabant.com>
parents: 7
diff changeset
111 if plugin_class is None:
5dbab01daaba plugins: First pass for a working plugin loader functionality.
Ludovic Chabant <ludovic@chabant.com>
parents: 7
diff changeset
112 logger.error("Plugin '%s' doesn't specify any "
5dbab01daaba plugins: First pass for a working plugin loader functionality.
Ludovic Chabant <ludovic@chabant.com>
parents: 7
diff changeset
113 "`__piecrust_plugin__` class." % plugin_name)
5dbab01daaba plugins: First pass for a working plugin loader functionality.
Ludovic Chabant <ludovic@chabant.com>
parents: 7
diff changeset
114 return
5dbab01daaba plugins: First pass for a working plugin loader functionality.
Ludovic Chabant <ludovic@chabant.com>
parents: 7
diff changeset
115
5dbab01daaba plugins: First pass for a working plugin loader functionality.
Ludovic Chabant <ludovic@chabant.com>
parents: 7
diff changeset
116 try:
5dbab01daaba plugins: First pass for a working plugin loader functionality.
Ludovic Chabant <ludovic@chabant.com>
parents: 7
diff changeset
117 plugin = plugin_class()
5dbab01daaba plugins: First pass for a working plugin loader functionality.
Ludovic Chabant <ludovic@chabant.com>
parents: 7
diff changeset
118 except Exception as ex:
5dbab01daaba plugins: First pass for a working plugin loader functionality.
Ludovic Chabant <ludovic@chabant.com>
parents: 7
diff changeset
119 logger.error("Failed to create plugin '%s': %s" %
5dbab01daaba plugins: First pass for a working plugin loader functionality.
Ludovic Chabant <ludovic@chabant.com>
parents: 7
diff changeset
120 (plugin_name, ex))
5dbab01daaba plugins: First pass for a working plugin loader functionality.
Ludovic Chabant <ludovic@chabant.com>
parents: 7
diff changeset
121 return
5dbab01daaba plugins: First pass for a working plugin loader functionality.
Ludovic Chabant <ludovic@chabant.com>
parents: 7
diff changeset
122
413
eacf0a3afd0c internal: Register performance timers for plugin components.
Ludovic Chabant <ludovic@chabant.com>
parents: 312
diff changeset
123 return plugin
0
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
124
413
eacf0a3afd0c internal: Register performance timers for plugin components.
Ludovic Chabant <ludovic@chabant.com>
parents: 312
diff changeset
125 def _getPluginComponents(self, name, *,
eacf0a3afd0c internal: Register performance timers for plugin components.
Ludovic Chabant <ludovic@chabant.com>
parents: 312
diff changeset
126 initialize=False, register_timer=False,
eacf0a3afd0c internal: Register performance timers for plugin components.
Ludovic Chabant <ludovic@chabant.com>
parents: 312
diff changeset
127 order_key=None):
0
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
128 if name in self._componentCache:
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
129 return self._componentCache[name]
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
130
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
131 all_components = []
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
132 for plugin in self.plugins:
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
133 plugin_components = getattr(plugin, name)()
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
134 all_components += plugin_components
413
eacf0a3afd0c internal: Register performance timers for plugin components.
Ludovic Chabant <ludovic@chabant.com>
parents: 312
diff changeset
135
0
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
136 if initialize:
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
137 for comp in plugin_components:
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
138 comp.initialize(self.app)
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
139
413
eacf0a3afd0c internal: Register performance timers for plugin components.
Ludovic Chabant <ludovic@chabant.com>
parents: 312
diff changeset
140 if register_timer:
eacf0a3afd0c internal: Register performance timers for plugin components.
Ludovic Chabant <ludovic@chabant.com>
parents: 312
diff changeset
141 for comp in plugin_components:
eacf0a3afd0c internal: Register performance timers for plugin components.
Ludovic Chabant <ludovic@chabant.com>
parents: 312
diff changeset
142 self.app.env.registerTimer(comp.__class__.__name__)
eacf0a3afd0c internal: Register performance timers for plugin components.
Ludovic Chabant <ludovic@chabant.com>
parents: 312
diff changeset
143
7
343d08ef5668 More PieCrust 3 fixes, and a couple of miscellaneous bug fixes.
Ludovic Chabant <ludovic@chabant.com>
parents: 3
diff changeset
144 if order_key is not None:
343d08ef5668 More PieCrust 3 fixes, and a couple of miscellaneous bug fixes.
Ludovic Chabant <ludovic@chabant.com>
parents: 3
diff changeset
145 all_components.sort(key=order_key)
0
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
146
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
147 self._componentCache[name] = all_components
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
148 return all_components
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
149