Mercurial > piecrust2
annotate piecrust/plugins/base.py @ 1005:2e5c5d33d62c
Merge changes.
author | Ludovic Chabant <ludovic@chabant.com> |
---|---|
date | Tue, 21 Nov 2017 22:07:12 -0800 |
parents | e7ca3c577305 46025a1b5434 |
children | 8af2ea1f5c34 |
rev | line source |
---|---|
848
7d83b9484b98
plugins: Add support for "ad-hoc" local plugins.
Ludovic Chabant <ludovic@chabant.com>
parents:
803
diff
changeset
|
1 import os.path |
7d83b9484b98
plugins: Add support for "ad-hoc" local plugins.
Ludovic Chabant <ludovic@chabant.com>
parents:
803
diff
changeset
|
2 import sys |
303
5dbab01daaba
plugins: First pass for a working plugin loader functionality.
Ludovic Chabant <ludovic@chabant.com>
parents:
7
diff
changeset
|
3 import logging |
5dbab01daaba
plugins: First pass for a working plugin loader functionality.
Ludovic Chabant <ludovic@chabant.com>
parents:
7
diff
changeset
|
4 import importlib |
5dbab01daaba
plugins: First pass for a working plugin loader functionality.
Ludovic Chabant <ludovic@chabant.com>
parents:
7
diff
changeset
|
5 |
5dbab01daaba
plugins: First pass for a working plugin loader functionality.
Ludovic Chabant <ludovic@chabant.com>
parents:
7
diff
changeset
|
6 |
5dbab01daaba
plugins: First pass for a working plugin loader functionality.
Ludovic Chabant <ludovic@chabant.com>
parents:
7
diff
changeset
|
7 logger = logging.getLogger(__name__) |
0 | 8 |
9 | |
10 class PieCrustPlugin(object): | |
11 def getFormatters(self): | |
12 return [] | |
13 | |
14 def getTemplateEngines(self): | |
15 return [] | |
16 | |
849
8f8bbb2e70e1
templating: Template engines can now load extensions directly from plugins.
Ludovic Chabant <ludovic@chabant.com>
parents:
848
diff
changeset
|
17 def getTemplateEngineExtensions(self, engine_name): |
8f8bbb2e70e1
templating: Template engines can now load extensions directly from plugins.
Ludovic Chabant <ludovic@chabant.com>
parents:
848
diff
changeset
|
18 return [] |
8f8bbb2e70e1
templating: Template engines can now load extensions directly from plugins.
Ludovic Chabant <ludovic@chabant.com>
parents:
848
diff
changeset
|
19 |
0 | 20 def getDataProviders(self): |
21 return [] | |
22 | |
23 def getProcessors(self): | |
24 return [] | |
25 | |
26 def getImporters(self): | |
27 return [] | |
28 | |
29 def getCommands(self): | |
30 return [] | |
31 | |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
1
diff
changeset
|
32 def getCommandExtensions(self): |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
1
diff
changeset
|
33 return [] |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
1
diff
changeset
|
34 |
0 | 35 def getBakerAssistants(self): |
36 return [] | |
37 | |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
1
diff
changeset
|
38 def getSources(self): |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
1
diff
changeset
|
39 return [] |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
1
diff
changeset
|
40 |
852
4850f8c21b6e
core: Start of the big refactor for PieCrust 3.0.
Ludovic Chabant <ludovic@chabant.com>
parents:
849
diff
changeset
|
41 def getPipelines(self): |
711
ab5c6a8ae90a
bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
613
diff
changeset
|
42 return [] |
ab5c6a8ae90a
bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
613
diff
changeset
|
43 |
613
e2e955a3bb25
publish: Add publish command.
Ludovic Chabant <ludovic@chabant.com>
parents:
413
diff
changeset
|
44 def getPublishers(self): |
e2e955a3bb25
publish: Add publish command.
Ludovic Chabant <ludovic@chabant.com>
parents:
413
diff
changeset
|
45 return [] |
e2e955a3bb25
publish: Add publish command.
Ludovic Chabant <ludovic@chabant.com>
parents:
413
diff
changeset
|
46 |
0 | 47 def initialize(self, app): |
48 pass | |
49 | |
50 | |
51 class PluginLoader(object): | |
52 def __init__(self, app): | |
53 self.app = app | |
54 self._plugins = None | |
55 self._componentCache = {} | |
56 | |
57 @property | |
58 def plugins(self): | |
59 self._ensureLoaded() | |
60 return self._plugins | |
61 | |
62 def getFormatters(self): | |
312
10bb8e8600f5
plugins: Remove unused API endpoints.
Ludovic Chabant <ludovic@chabant.com>
parents:
306
diff
changeset
|
63 return self._getPluginComponents( |
852
4850f8c21b6e
core: Start of the big refactor for PieCrust 3.0.
Ludovic Chabant <ludovic@chabant.com>
parents:
849
diff
changeset
|
64 'getFormatters', |
4850f8c21b6e
core: Start of the big refactor for PieCrust 3.0.
Ludovic Chabant <ludovic@chabant.com>
parents:
849
diff
changeset
|
65 initialize=True, register_timer=True, |
4850f8c21b6e
core: Start of the big refactor for PieCrust 3.0.
Ludovic Chabant <ludovic@chabant.com>
parents:
849
diff
changeset
|
66 order_key=lambda f: f.priority) |
0 | 67 |
68 def getTemplateEngines(self): | |
413
eacf0a3afd0c
internal: Register performance timers for plugin components.
Ludovic Chabant <ludovic@chabant.com>
parents:
312
diff
changeset
|
69 return self._getPluginComponents( |
852
4850f8c21b6e
core: Start of the big refactor for PieCrust 3.0.
Ludovic Chabant <ludovic@chabant.com>
parents:
849
diff
changeset
|
70 'getTemplateEngines', |
4850f8c21b6e
core: Start of the big refactor for PieCrust 3.0.
Ludovic Chabant <ludovic@chabant.com>
parents:
849
diff
changeset
|
71 initialize=True, register_timer=True, |
4850f8c21b6e
core: Start of the big refactor for PieCrust 3.0.
Ludovic Chabant <ludovic@chabant.com>
parents:
849
diff
changeset
|
72 register_timer_suffixes=['_segment', '_layout']) |
0 | 73 |
849
8f8bbb2e70e1
templating: Template engines can now load extensions directly from plugins.
Ludovic Chabant <ludovic@chabant.com>
parents:
848
diff
changeset
|
74 def getTemplateEngineExtensions(self, engine_name): |
8f8bbb2e70e1
templating: Template engines can now load extensions directly from plugins.
Ludovic Chabant <ludovic@chabant.com>
parents:
848
diff
changeset
|
75 return self._getPluginComponents('getTemplateEngineExtensions', |
8f8bbb2e70e1
templating: Template engines can now load extensions directly from plugins.
Ludovic Chabant <ludovic@chabant.com>
parents:
848
diff
changeset
|
76 engine_name) |
8f8bbb2e70e1
templating: Template engines can now load extensions directly from plugins.
Ludovic Chabant <ludovic@chabant.com>
parents:
848
diff
changeset
|
77 |
0 | 78 def getDataProviders(self): |
79 return self._getPluginComponents('getDataProviders') | |
80 | |
81 def getProcessors(self): | |
312
10bb8e8600f5
plugins: Remove unused API endpoints.
Ludovic Chabant <ludovic@chabant.com>
parents:
306
diff
changeset
|
82 return self._getPluginComponents( |
852
4850f8c21b6e
core: Start of the big refactor for PieCrust 3.0.
Ludovic Chabant <ludovic@chabant.com>
parents:
849
diff
changeset
|
83 'getProcessors', |
4850f8c21b6e
core: Start of the big refactor for PieCrust 3.0.
Ludovic Chabant <ludovic@chabant.com>
parents:
849
diff
changeset
|
84 initialize=True, register_timer=True, |
4850f8c21b6e
core: Start of the big refactor for PieCrust 3.0.
Ludovic Chabant <ludovic@chabant.com>
parents:
849
diff
changeset
|
85 order_key=lambda p: p.priority) |
0 | 86 |
87 def getImporters(self): | |
88 return self._getPluginComponents('getImporters') | |
89 | |
90 def getCommands(self): | |
91 return self._getPluginComponents('getCommands') | |
92 | |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
1
diff
changeset
|
93 def getCommandExtensions(self): |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
1
diff
changeset
|
94 return self._getPluginComponents('getCommandExtensions') |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
1
diff
changeset
|
95 |
0 | 96 def getBakerAssistants(self): |
97 return self._getPluginComponents('getBakerAssistants') | |
98 | |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
1
diff
changeset
|
99 def getSources(self): |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
1
diff
changeset
|
100 return self._getPluginComponents('getSources') |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
1
diff
changeset
|
101 |
852
4850f8c21b6e
core: Start of the big refactor for PieCrust 3.0.
Ludovic Chabant <ludovic@chabant.com>
parents:
849
diff
changeset
|
102 def getPipelines(self): |
4850f8c21b6e
core: Start of the big refactor for PieCrust 3.0.
Ludovic Chabant <ludovic@chabant.com>
parents:
849
diff
changeset
|
103 return self._getPluginComponents('getPipelines') |
711
ab5c6a8ae90a
bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
613
diff
changeset
|
104 |
613
e2e955a3bb25
publish: Add publish command.
Ludovic Chabant <ludovic@chabant.com>
parents:
413
diff
changeset
|
105 def getPublishers(self): |
e2e955a3bb25
publish: Add publish command.
Ludovic Chabant <ludovic@chabant.com>
parents:
413
diff
changeset
|
106 return self._getPluginComponents('getPublishers') |
e2e955a3bb25
publish: Add publish command.
Ludovic Chabant <ludovic@chabant.com>
parents:
413
diff
changeset
|
107 |
0 | 108 def _ensureLoaded(self): |
109 if self._plugins is not None: | |
110 return | |
111 | |
1
aaa8fb7c8918
Re-arranged modules to reduce dependencies to builtin stuff.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
112 from piecrust.plugins.builtin import BuiltInPlugin |
0 | 113 self._plugins = [BuiltInPlugin()] |
114 | |
306
7122976bc751
plugins: Fix crash for sites that don't specify a `site/plugins` setting.
Ludovic Chabant <ludovic@chabant.com>
parents:
305
diff
changeset
|
115 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
|
116 if to_install: |
413
eacf0a3afd0c
internal: Register performance timers for plugin components.
Ludovic Chabant <ludovic@chabant.com>
parents:
312
diff
changeset
|
117 for name in to_install: |
eacf0a3afd0c
internal: Register performance timers for plugin components.
Ludovic Chabant <ludovic@chabant.com>
parents:
312
diff
changeset
|
118 plugin = self._loadPlugin(name) |
999
46025a1b5434
plugins: Support multiple customizable plugins directories.
Ludovic Chabant <ludovic@chabant.com>
parents:
849
diff
changeset
|
119 if plugin is not None: |
46025a1b5434
plugins: Support multiple customizable plugins directories.
Ludovic Chabant <ludovic@chabant.com>
parents:
849
diff
changeset
|
120 self._plugins.append(plugin) |
0 | 121 |
122 for plugin in self._plugins: | |
123 plugin.initialize(self.app) | |
124 | |
303
5dbab01daaba
plugins: First pass for a working plugin loader functionality.
Ludovic Chabant <ludovic@chabant.com>
parents:
7
diff
changeset
|
125 def _loadPlugin(self, plugin_name): |
848
7d83b9484b98
plugins: Add support for "ad-hoc" local plugins.
Ludovic Chabant <ludovic@chabant.com>
parents:
803
diff
changeset
|
126 mod_name = 'piecrust_%s' % plugin_name |
303
5dbab01daaba
plugins: First pass for a working plugin loader functionality.
Ludovic Chabant <ludovic@chabant.com>
parents:
7
diff
changeset
|
127 try: |
848
7d83b9484b98
plugins: Add support for "ad-hoc" local plugins.
Ludovic Chabant <ludovic@chabant.com>
parents:
803
diff
changeset
|
128 # Import from the current environment. |
7d83b9484b98
plugins: Add support for "ad-hoc" local plugins.
Ludovic Chabant <ludovic@chabant.com>
parents:
803
diff
changeset
|
129 mod = importlib.import_module(mod_name) |
305
9ae23409d6e9
plugins: Change how plugins are loaded. Add a `plugins` command.
Ludovic Chabant <ludovic@chabant.com>
parents:
303
diff
changeset
|
130 except ImportError as ex: |
848
7d83b9484b98
plugins: Add support for "ad-hoc" local plugins.
Ludovic Chabant <ludovic@chabant.com>
parents:
803
diff
changeset
|
131 mod = None |
7d83b9484b98
plugins: Add support for "ad-hoc" local plugins.
Ludovic Chabant <ludovic@chabant.com>
parents:
803
diff
changeset
|
132 |
7d83b9484b98
plugins: Add support for "ad-hoc" local plugins.
Ludovic Chabant <ludovic@chabant.com>
parents:
803
diff
changeset
|
133 if mod is None: |
7d83b9484b98
plugins: Add support for "ad-hoc" local plugins.
Ludovic Chabant <ludovic@chabant.com>
parents:
803
diff
changeset
|
134 # Import as a loose Python file from the plugins dir. |
999
46025a1b5434
plugins: Support multiple customizable plugins directories.
Ludovic Chabant <ludovic@chabant.com>
parents:
849
diff
changeset
|
135 for plugins_dir in self.app.plugins_dirs: |
46025a1b5434
plugins: Support multiple customizable plugins directories.
Ludovic Chabant <ludovic@chabant.com>
parents:
849
diff
changeset
|
136 pfile = os.path.join(plugins_dir, plugin_name + '.py') |
46025a1b5434
plugins: Support multiple customizable plugins directories.
Ludovic Chabant <ludovic@chabant.com>
parents:
849
diff
changeset
|
137 if os.path.isfile(pfile): |
1005 | 138 if sys.version_info[1] >= 5: |
139 # Python 3.5+ | |
140 from importlib.util import (spec_from_file_location, | |
141 module_from_spec) | |
142 spec = spec_from_file_location(plugin_name, pfile) | |
143 mod = module_from_spec(spec) | |
144 spec.loader.exec_module(mod) | |
145 sys.modules[mod_name] = mod | |
146 else: | |
147 # Python 3.4, 3.3. | |
148 from importlib.machinery import SourceFileLoader | |
149 mod = SourceFileLoader( | |
150 plugin_name, pfile).load_module() | |
151 sys.modules[mod_name] = mod | |
848
7d83b9484b98
plugins: Add support for "ad-hoc" local plugins.
Ludovic Chabant <ludovic@chabant.com>
parents:
803
diff
changeset
|
152 |
7d83b9484b98
plugins: Add support for "ad-hoc" local plugins.
Ludovic Chabant <ludovic@chabant.com>
parents:
803
diff
changeset
|
153 if mod is None: |
305
9ae23409d6e9
plugins: Change how plugins are loaded. Add a `plugins` command.
Ludovic Chabant <ludovic@chabant.com>
parents:
303
diff
changeset
|
154 logger.error("Failed to load plugin '%s'." % plugin_name) |
303
5dbab01daaba
plugins: First pass for a working plugin loader functionality.
Ludovic Chabant <ludovic@chabant.com>
parents:
7
diff
changeset
|
155 return |
5dbab01daaba
plugins: First pass for a working plugin loader functionality.
Ludovic Chabant <ludovic@chabant.com>
parents:
7
diff
changeset
|
156 |
5dbab01daaba
plugins: First pass for a working plugin loader functionality.
Ludovic Chabant <ludovic@chabant.com>
parents:
7
diff
changeset
|
157 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
|
158 if plugin_class is None: |
5dbab01daaba
plugins: First pass for a working plugin loader functionality.
Ludovic Chabant <ludovic@chabant.com>
parents:
7
diff
changeset
|
159 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
|
160 "`__piecrust_plugin__` class." % plugin_name) |
5dbab01daaba
plugins: First pass for a working plugin loader functionality.
Ludovic Chabant <ludovic@chabant.com>
parents:
7
diff
changeset
|
161 return |
5dbab01daaba
plugins: First pass for a working plugin loader functionality.
Ludovic Chabant <ludovic@chabant.com>
parents:
7
diff
changeset
|
162 |
5dbab01daaba
plugins: First pass for a working plugin loader functionality.
Ludovic Chabant <ludovic@chabant.com>
parents:
7
diff
changeset
|
163 try: |
5dbab01daaba
plugins: First pass for a working plugin loader functionality.
Ludovic Chabant <ludovic@chabant.com>
parents:
7
diff
changeset
|
164 plugin = plugin_class() |
5dbab01daaba
plugins: First pass for a working plugin loader functionality.
Ludovic Chabant <ludovic@chabant.com>
parents:
7
diff
changeset
|
165 except Exception as ex: |
5dbab01daaba
plugins: First pass for a working plugin loader functionality.
Ludovic Chabant <ludovic@chabant.com>
parents:
7
diff
changeset
|
166 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
|
167 (plugin_name, ex)) |
5dbab01daaba
plugins: First pass for a working plugin loader functionality.
Ludovic Chabant <ludovic@chabant.com>
parents:
7
diff
changeset
|
168 return |
5dbab01daaba
plugins: First pass for a working plugin loader functionality.
Ludovic Chabant <ludovic@chabant.com>
parents:
7
diff
changeset
|
169 |
413
eacf0a3afd0c
internal: Register performance timers for plugin components.
Ludovic Chabant <ludovic@chabant.com>
parents:
312
diff
changeset
|
170 return plugin |
0 | 171 |
849
8f8bbb2e70e1
templating: Template engines can now load extensions directly from plugins.
Ludovic Chabant <ludovic@chabant.com>
parents:
848
diff
changeset
|
172 def _getPluginComponents(self, name, *args, |
803
bf9f4e55f751
rendering: Separate performance timers for renering segments and layouts.
Ludovic Chabant <ludovic@chabant.com>
parents:
711
diff
changeset
|
173 initialize=False, |
bf9f4e55f751
rendering: Separate performance timers for renering segments and layouts.
Ludovic Chabant <ludovic@chabant.com>
parents:
711
diff
changeset
|
174 register_timer=False, |
bf9f4e55f751
rendering: Separate performance timers for renering segments and layouts.
Ludovic Chabant <ludovic@chabant.com>
parents:
711
diff
changeset
|
175 register_timer_suffixes=None, |
413
eacf0a3afd0c
internal: Register performance timers for plugin components.
Ludovic Chabant <ludovic@chabant.com>
parents:
312
diff
changeset
|
176 order_key=None): |
0 | 177 if name in self._componentCache: |
178 return self._componentCache[name] | |
179 | |
180 all_components = [] | |
181 for plugin in self.plugins: | |
849
8f8bbb2e70e1
templating: Template engines can now load extensions directly from plugins.
Ludovic Chabant <ludovic@chabant.com>
parents:
848
diff
changeset
|
182 plugin_components = getattr(plugin, name)(*args) |
979
45ad976712ec
tests: Big push to get the tests to pass again.
Ludovic Chabant <ludovic@chabant.com>
parents:
910
diff
changeset
|
183 # Make sure it's a list in case it was an iterator. |
45ad976712ec
tests: Big push to get the tests to pass again.
Ludovic Chabant <ludovic@chabant.com>
parents:
910
diff
changeset
|
184 plugin_components = list(plugin_components) |
0 | 185 all_components += plugin_components |
413
eacf0a3afd0c
internal: Register performance timers for plugin components.
Ludovic Chabant <ludovic@chabant.com>
parents:
312
diff
changeset
|
186 |
0 | 187 if initialize: |
188 for comp in plugin_components: | |
189 comp.initialize(self.app) | |
190 | |
413
eacf0a3afd0c
internal: Register performance timers for plugin components.
Ludovic Chabant <ludovic@chabant.com>
parents:
312
diff
changeset
|
191 if register_timer: |
eacf0a3afd0c
internal: Register performance timers for plugin components.
Ludovic Chabant <ludovic@chabant.com>
parents:
312
diff
changeset
|
192 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
|
193 if not register_timer_suffixes: |
852
4850f8c21b6e
core: Start of the big refactor for PieCrust 3.0.
Ludovic Chabant <ludovic@chabant.com>
parents:
849
diff
changeset
|
194 self.app.env.stats.registerTimer( |
4850f8c21b6e
core: Start of the big refactor for PieCrust 3.0.
Ludovic Chabant <ludovic@chabant.com>
parents:
849
diff
changeset
|
195 comp.__class__.__name__) |
803
bf9f4e55f751
rendering: Separate performance timers for renering segments and layouts.
Ludovic Chabant <ludovic@chabant.com>
parents:
711
diff
changeset
|
196 else: |
bf9f4e55f751
rendering: Separate performance timers for renering segments and layouts.
Ludovic Chabant <ludovic@chabant.com>
parents:
711
diff
changeset
|
197 for s in register_timer_suffixes: |
852
4850f8c21b6e
core: Start of the big refactor for PieCrust 3.0.
Ludovic Chabant <ludovic@chabant.com>
parents:
849
diff
changeset
|
198 self.app.env.stats.registerTimer( |
803
bf9f4e55f751
rendering: Separate performance timers for renering segments and layouts.
Ludovic Chabant <ludovic@chabant.com>
parents:
711
diff
changeset
|
199 comp.__class__.__name__ + s) |
413
eacf0a3afd0c
internal: Register performance timers for plugin components.
Ludovic Chabant <ludovic@chabant.com>
parents:
312
diff
changeset
|
200 |
7
343d08ef5668
More PieCrust 3 fixes, and a couple of miscellaneous bug fixes.
Ludovic Chabant <ludovic@chabant.com>
parents:
3
diff
changeset
|
201 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
|
202 all_components.sort(key=order_key) |
0 | 203 |
204 self._componentCache[name] = all_components | |
205 return all_components | |
206 |