Mercurial > piecrust2
annotate piecrust/plugins/base.py @ 828:bca06fc064c0
Use assetor provided by page source when paginating
author | Ben Artin <ben@artins.org> |
---|---|
date | Sun, 01 Jan 2017 19:32:19 -0500 |
parents | bf9f4e55f751 |
children | 7d83b9484b98 |
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 | 6 |
7 | |
8 class PieCrustPlugin(object): | |
9 def getFormatters(self): | |
10 return [] | |
11 | |
12 def getTemplateEngines(self): | |
13 return [] | |
14 | |
15 def getDataProviders(self): | |
16 return [] | |
17 | |
18 def getProcessors(self): | |
19 return [] | |
20 | |
21 def getImporters(self): | |
22 return [] | |
23 | |
24 def getCommands(self): | |
25 return [] | |
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 | 30 def getBakerAssistants(self): |
31 return [] | |
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 |
711
ab5c6a8ae90a
bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
613
diff
changeset
|
36 def getPageGenerators(self): |
ab5c6a8ae90a
bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
613
diff
changeset
|
37 return [] |
ab5c6a8ae90a
bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
613
diff
changeset
|
38 |
613
e2e955a3bb25
publish: Add publish command.
Ludovic Chabant <ludovic@chabant.com>
parents:
413
diff
changeset
|
39 def getPublishers(self): |
e2e955a3bb25
publish: Add publish command.
Ludovic Chabant <ludovic@chabant.com>
parents:
413
diff
changeset
|
40 return [] |
e2e955a3bb25
publish: Add publish command.
Ludovic Chabant <ludovic@chabant.com>
parents:
413
diff
changeset
|
41 |
0 | 42 def initialize(self, app): |
43 pass | |
44 | |
45 | |
46 class PluginLoader(object): | |
47 def __init__(self, app): | |
48 self.app = app | |
49 self._plugins = None | |
50 self._componentCache = {} | |
51 | |
52 @property | |
53 def plugins(self): | |
54 self._ensureLoaded() | |
55 return self._plugins | |
56 | |
57 def getFormatters(self): | |
312
10bb8e8600f5
plugins: Remove unused API endpoints.
Ludovic Chabant <ludovic@chabant.com>
parents:
306
diff
changeset
|
58 return self._getPluginComponents( |
413
eacf0a3afd0c
internal: Register performance timers for plugin components.
Ludovic Chabant <ludovic@chabant.com>
parents:
312
diff
changeset
|
59 'getFormatters', |
eacf0a3afd0c
internal: Register performance timers for plugin components.
Ludovic Chabant <ludovic@chabant.com>
parents:
312
diff
changeset
|
60 initialize=True, register_timer=True, |
eacf0a3afd0c
internal: Register performance timers for plugin components.
Ludovic Chabant <ludovic@chabant.com>
parents:
312
diff
changeset
|
61 order_key=lambda f: f.priority) |
0 | 62 |
63 def getTemplateEngines(self): | |
413
eacf0a3afd0c
internal: Register performance timers for plugin components.
Ludovic Chabant <ludovic@chabant.com>
parents:
312
diff
changeset
|
64 return self._getPluginComponents( |
eacf0a3afd0c
internal: Register performance timers for plugin components.
Ludovic Chabant <ludovic@chabant.com>
parents:
312
diff
changeset
|
65 'getTemplateEngines', |
803
bf9f4e55f751
rendering: Separate performance timers for renering segments and layouts.
Ludovic Chabant <ludovic@chabant.com>
parents:
711
diff
changeset
|
66 initialize=True, register_timer=True, |
bf9f4e55f751
rendering: Separate performance timers for renering segments and layouts.
Ludovic Chabant <ludovic@chabant.com>
parents:
711
diff
changeset
|
67 register_timer_suffixes=['_segment', '_layout']) |
0 | 68 |
69 def getDataProviders(self): | |
70 return self._getPluginComponents('getDataProviders') | |
71 | |
72 def getProcessors(self): | |
312
10bb8e8600f5
plugins: Remove unused API endpoints.
Ludovic Chabant <ludovic@chabant.com>
parents:
306
diff
changeset
|
73 return self._getPluginComponents( |
413
eacf0a3afd0c
internal: Register performance timers for plugin components.
Ludovic Chabant <ludovic@chabant.com>
parents:
312
diff
changeset
|
74 'getProcessors', |
eacf0a3afd0c
internal: Register performance timers for plugin components.
Ludovic Chabant <ludovic@chabant.com>
parents:
312
diff
changeset
|
75 initialize=True, register_timer=True, |
eacf0a3afd0c
internal: Register performance timers for plugin components.
Ludovic Chabant <ludovic@chabant.com>
parents:
312
diff
changeset
|
76 order_key=lambda p: p.priority) |
0 | 77 |
78 def getImporters(self): | |
79 return self._getPluginComponents('getImporters') | |
80 | |
81 def getCommands(self): | |
82 return self._getPluginComponents('getCommands') | |
83 | |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
1
diff
changeset
|
84 def getCommandExtensions(self): |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
1
diff
changeset
|
85 return self._getPluginComponents('getCommandExtensions') |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
1
diff
changeset
|
86 |
0 | 87 def getBakerAssistants(self): |
88 return self._getPluginComponents('getBakerAssistants') | |
89 | |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
1
diff
changeset
|
90 def getSources(self): |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
1
diff
changeset
|
91 return self._getPluginComponents('getSources') |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
1
diff
changeset
|
92 |
711
ab5c6a8ae90a
bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
613
diff
changeset
|
93 def getPageGenerators(self): |
ab5c6a8ae90a
bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
613
diff
changeset
|
94 return self._getPluginComponents('getPageGenerators') |
ab5c6a8ae90a
bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
613
diff
changeset
|
95 |
613
e2e955a3bb25
publish: Add publish command.
Ludovic Chabant <ludovic@chabant.com>
parents:
413
diff
changeset
|
96 def getPublishers(self): |
e2e955a3bb25
publish: Add publish command.
Ludovic Chabant <ludovic@chabant.com>
parents:
413
diff
changeset
|
97 return self._getPluginComponents('getPublishers') |
e2e955a3bb25
publish: Add publish command.
Ludovic Chabant <ludovic@chabant.com>
parents:
413
diff
changeset
|
98 |
0 | 99 def _ensureLoaded(self): |
100 if self._plugins is not None: | |
101 return | |
102 | |
1
aaa8fb7c8918
Re-arranged modules to reduce dependencies to builtin stuff.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
103 from piecrust.plugins.builtin import BuiltInPlugin |
0 | 104 self._plugins = [BuiltInPlugin()] |
105 | |
306
7122976bc751
plugins: Fix crash for sites that don't specify a `site/plugins` setting.
Ludovic Chabant <ludovic@chabant.com>
parents:
305
diff
changeset
|
106 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
|
107 if to_install: |
413
eacf0a3afd0c
internal: Register performance timers for plugin components.
Ludovic Chabant <ludovic@chabant.com>
parents:
312
diff
changeset
|
108 for name in to_install: |
eacf0a3afd0c
internal: Register performance timers for plugin components.
Ludovic Chabant <ludovic@chabant.com>
parents:
312
diff
changeset
|
109 plugin = self._loadPlugin(name) |
eacf0a3afd0c
internal: Register performance timers for plugin components.
Ludovic Chabant <ludovic@chabant.com>
parents:
312
diff
changeset
|
110 self._plugins.append(plugin) |
0 | 111 |
112 for plugin in self._plugins: | |
113 plugin.initialize(self.app) | |
114 | |
303
5dbab01daaba
plugins: First pass for a working plugin loader functionality.
Ludovic Chabant <ludovic@chabant.com>
parents:
7
diff
changeset
|
115 def _loadPlugin(self, plugin_name): |
5dbab01daaba
plugins: First pass for a working plugin loader functionality.
Ludovic Chabant <ludovic@chabant.com>
parents:
7
diff
changeset
|
116 try: |
305
9ae23409d6e9
plugins: Change how plugins are loaded. Add a `plugins` command.
Ludovic Chabant <ludovic@chabant.com>
parents:
303
diff
changeset
|
117 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
|
118 except ImportError as ex: |
9ae23409d6e9
plugins: Change how plugins are loaded. Add a `plugins` command.
Ludovic Chabant <ludovic@chabant.com>
parents:
303
diff
changeset
|
119 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
|
120 logger.error(ex) |
303
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 |
5dbab01daaba
plugins: First pass for a working plugin loader functionality.
Ludovic Chabant <ludovic@chabant.com>
parents:
7
diff
changeset
|
123 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
|
124 if plugin_class is None: |
5dbab01daaba
plugins: First pass for a working plugin loader functionality.
Ludovic Chabant <ludovic@chabant.com>
parents:
7
diff
changeset
|
125 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
|
126 "`__piecrust_plugin__` class." % plugin_name) |
5dbab01daaba
plugins: First pass for a working plugin loader functionality.
Ludovic Chabant <ludovic@chabant.com>
parents:
7
diff
changeset
|
127 return |
5dbab01daaba
plugins: First pass for a working plugin loader functionality.
Ludovic Chabant <ludovic@chabant.com>
parents:
7
diff
changeset
|
128 |
5dbab01daaba
plugins: First pass for a working plugin loader functionality.
Ludovic Chabant <ludovic@chabant.com>
parents:
7
diff
changeset
|
129 try: |
5dbab01daaba
plugins: First pass for a working plugin loader functionality.
Ludovic Chabant <ludovic@chabant.com>
parents:
7
diff
changeset
|
130 plugin = plugin_class() |
5dbab01daaba
plugins: First pass for a working plugin loader functionality.
Ludovic Chabant <ludovic@chabant.com>
parents:
7
diff
changeset
|
131 except Exception as ex: |
5dbab01daaba
plugins: First pass for a working plugin loader functionality.
Ludovic Chabant <ludovic@chabant.com>
parents:
7
diff
changeset
|
132 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
|
133 (plugin_name, ex)) |
5dbab01daaba
plugins: First pass for a working plugin loader functionality.
Ludovic Chabant <ludovic@chabant.com>
parents:
7
diff
changeset
|
134 return |
5dbab01daaba
plugins: First pass for a working plugin loader functionality.
Ludovic Chabant <ludovic@chabant.com>
parents:
7
diff
changeset
|
135 |
413
eacf0a3afd0c
internal: Register performance timers for plugin components.
Ludovic Chabant <ludovic@chabant.com>
parents:
312
diff
changeset
|
136 return plugin |
0 | 137 |
413
eacf0a3afd0c
internal: Register performance timers for plugin components.
Ludovic Chabant <ludovic@chabant.com>
parents:
312
diff
changeset
|
138 def _getPluginComponents(self, name, *, |
803
bf9f4e55f751
rendering: Separate performance timers for renering segments and layouts.
Ludovic Chabant <ludovic@chabant.com>
parents:
711
diff
changeset
|
139 initialize=False, |
bf9f4e55f751
rendering: Separate performance timers for renering segments and layouts.
Ludovic Chabant <ludovic@chabant.com>
parents:
711
diff
changeset
|
140 register_timer=False, |
bf9f4e55f751
rendering: Separate performance timers for renering segments and layouts.
Ludovic Chabant <ludovic@chabant.com>
parents:
711
diff
changeset
|
141 register_timer_suffixes=None, |
413
eacf0a3afd0c
internal: Register performance timers for plugin components.
Ludovic Chabant <ludovic@chabant.com>
parents:
312
diff
changeset
|
142 order_key=None): |
0 | 143 if name in self._componentCache: |
144 return self._componentCache[name] | |
145 | |
146 all_components = [] | |
147 for plugin in self.plugins: | |
148 plugin_components = getattr(plugin, name)() | |
149 all_components += plugin_components | |
413
eacf0a3afd0c
internal: Register performance timers for plugin components.
Ludovic Chabant <ludovic@chabant.com>
parents:
312
diff
changeset
|
150 |
0 | 151 if initialize: |
152 for comp in plugin_components: | |
153 comp.initialize(self.app) | |
154 | |
413
eacf0a3afd0c
internal: Register performance timers for plugin components.
Ludovic Chabant <ludovic@chabant.com>
parents:
312
diff
changeset
|
155 if register_timer: |
eacf0a3afd0c
internal: Register performance timers for plugin components.
Ludovic Chabant <ludovic@chabant.com>
parents:
312
diff
changeset
|
156 for comp in plugin_components: |
803
bf9f4e55f751
rendering: Separate performance timers for renering segments and layouts.
Ludovic Chabant <ludovic@chabant.com>
parents:
711
diff
changeset
|
157 if not register_timer_suffixes: |
bf9f4e55f751
rendering: Separate performance timers for renering segments and layouts.
Ludovic Chabant <ludovic@chabant.com>
parents:
711
diff
changeset
|
158 self.app.env.registerTimer(comp.__class__.__name__) |
bf9f4e55f751
rendering: Separate performance timers for renering segments and layouts.
Ludovic Chabant <ludovic@chabant.com>
parents:
711
diff
changeset
|
159 else: |
bf9f4e55f751
rendering: Separate performance timers for renering segments and layouts.
Ludovic Chabant <ludovic@chabant.com>
parents:
711
diff
changeset
|
160 for s in register_timer_suffixes: |
bf9f4e55f751
rendering: Separate performance timers for renering segments and layouts.
Ludovic Chabant <ludovic@chabant.com>
parents:
711
diff
changeset
|
161 self.app.env.registerTimer( |
bf9f4e55f751
rendering: Separate performance timers for renering segments and layouts.
Ludovic Chabant <ludovic@chabant.com>
parents:
711
diff
changeset
|
162 comp.__class__.__name__ + s) |
413
eacf0a3afd0c
internal: Register performance timers for plugin components.
Ludovic Chabant <ludovic@chabant.com>
parents:
312
diff
changeset
|
163 |
7
343d08ef5668
More PieCrust 3 fixes, and a couple of miscellaneous bug fixes.
Ludovic Chabant <ludovic@chabant.com>
parents:
3
diff
changeset
|
164 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
|
165 all_components.sort(key=order_key) |
0 | 166 |
167 self._componentCache[name] = all_components | |
168 return all_components | |
169 |