annotate piecrust/plugins/base.py @ 1145:e94737572542

serve: Fix an issue where false positive matches were rendered as the requested page. Now we try to render the page, but also try to detect for the most common "empty" pages.
author Ludovic Chabant <ludovic@chabant.com>
date Tue, 05 Jun 2018 22:08:51 -0700
parents 8af2ea1f5c34
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
8
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
9
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
10 class PieCrustPlugin(object):
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
11 def getFormatters(self):
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
12 return []
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
13
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
14 def getTemplateEngines(self):
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
15 return []
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
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
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
20 def getDataProviders(self):
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
21 return []
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
22
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
23 def getProcessors(self):
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
24 return []
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
25
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
26 def getImporters(self):
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
27 return []
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
28
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
29 def getCommands(self):
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
30 return []
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
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
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
35 def getBakerAssistants(self):
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
36 return []
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
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
1114
8af2ea1f5c34 tasks: Add new `tasks` command and infrastructure, with `mention` task.
Ludovic Chabant <ludovic@chabant.com>
parents: 1005
diff changeset
47 def getTaskRunners(self):
8af2ea1f5c34 tasks: Add new `tasks` command and infrastructure, with `mention` task.
Ludovic Chabant <ludovic@chabant.com>
parents: 1005
diff changeset
48 return []
8af2ea1f5c34 tasks: Add new `tasks` command and infrastructure, with `mention` task.
Ludovic Chabant <ludovic@chabant.com>
parents: 1005
diff changeset
49
0
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
50 def initialize(self, app):
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
51 pass
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
52
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
53
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
54 class PluginLoader(object):
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
55 def __init__(self, app):
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
56 self.app = app
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
57 self._plugins = None
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
58 self._componentCache = {}
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
59
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
60 @property
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
61 def plugins(self):
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
62 self._ensureLoaded()
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
63 return self._plugins
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 getFormatters(self):
312
10bb8e8600f5 plugins: Remove unused API endpoints.
Ludovic Chabant <ludovic@chabant.com>
parents: 306
diff changeset
66 return self._getPluginComponents(
852
4850f8c21b6e core: Start of the big refactor for PieCrust 3.0.
Ludovic Chabant <ludovic@chabant.com>
parents: 849
diff changeset
67 'getFormatters',
4850f8c21b6e core: Start of the big refactor for PieCrust 3.0.
Ludovic Chabant <ludovic@chabant.com>
parents: 849
diff changeset
68 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
69 order_key=lambda f: f.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 getTemplateEngines(self):
413
eacf0a3afd0c internal: Register performance timers for plugin components.
Ludovic Chabant <ludovic@chabant.com>
parents: 312
diff changeset
72 return self._getPluginComponents(
852
4850f8c21b6e core: Start of the big refactor for PieCrust 3.0.
Ludovic Chabant <ludovic@chabant.com>
parents: 849
diff changeset
73 'getTemplateEngines',
4850f8c21b6e core: Start of the big refactor for PieCrust 3.0.
Ludovic Chabant <ludovic@chabant.com>
parents: 849
diff changeset
74 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
75 register_timer_suffixes=['_segment', '_layout'])
0
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
76
849
8f8bbb2e70e1 templating: Template engines can now load extensions directly from plugins.
Ludovic Chabant <ludovic@chabant.com>
parents: 848
diff changeset
77 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
78 return self._getPluginComponents('getTemplateEngineExtensions',
8f8bbb2e70e1 templating: Template engines can now load extensions directly from plugins.
Ludovic Chabant <ludovic@chabant.com>
parents: 848
diff changeset
79 engine_name)
8f8bbb2e70e1 templating: Template engines can now load extensions directly from plugins.
Ludovic Chabant <ludovic@chabant.com>
parents: 848
diff changeset
80
0
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
81 def getDataProviders(self):
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
82 return self._getPluginComponents('getDataProviders')
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
83
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
84 def getProcessors(self):
312
10bb8e8600f5 plugins: Remove unused API endpoints.
Ludovic Chabant <ludovic@chabant.com>
parents: 306
diff changeset
85 return self._getPluginComponents(
852
4850f8c21b6e core: Start of the big refactor for PieCrust 3.0.
Ludovic Chabant <ludovic@chabant.com>
parents: 849
diff changeset
86 'getProcessors',
4850f8c21b6e core: Start of the big refactor for PieCrust 3.0.
Ludovic Chabant <ludovic@chabant.com>
parents: 849
diff changeset
87 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
88 order_key=lambda p: p.priority)
0
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
89
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
90 def getImporters(self):
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
91 return self._getPluginComponents('getImporters')
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
92
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
93 def getCommands(self):
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
94 return self._getPluginComponents('getCommands')
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
95
3
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
96 def getCommandExtensions(self):
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
97 return self._getPluginComponents('getCommandExtensions')
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
98
0
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
99 def getBakerAssistants(self):
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
100 return self._getPluginComponents('getBakerAssistants')
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
101
3
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
102 def getSources(self):
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
103 return self._getPluginComponents('getSources')
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
104
852
4850f8c21b6e core: Start of the big refactor for PieCrust 3.0.
Ludovic Chabant <ludovic@chabant.com>
parents: 849
diff changeset
105 def getPipelines(self):
4850f8c21b6e core: Start of the big refactor for PieCrust 3.0.
Ludovic Chabant <ludovic@chabant.com>
parents: 849
diff changeset
106 return self._getPluginComponents('getPipelines')
711
ab5c6a8ae90a bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents: 613
diff changeset
107
613
e2e955a3bb25 publish: Add publish command.
Ludovic Chabant <ludovic@chabant.com>
parents: 413
diff changeset
108 def getPublishers(self):
e2e955a3bb25 publish: Add publish command.
Ludovic Chabant <ludovic@chabant.com>
parents: 413
diff changeset
109 return self._getPluginComponents('getPublishers')
e2e955a3bb25 publish: Add publish command.
Ludovic Chabant <ludovic@chabant.com>
parents: 413
diff changeset
110
1114
8af2ea1f5c34 tasks: Add new `tasks` command and infrastructure, with `mention` task.
Ludovic Chabant <ludovic@chabant.com>
parents: 1005
diff changeset
111 def getTaskRunners(self):
8af2ea1f5c34 tasks: Add new `tasks` command and infrastructure, with `mention` task.
Ludovic Chabant <ludovic@chabant.com>
parents: 1005
diff changeset
112 return self._getPluginComponents('getTaskRunners')
8af2ea1f5c34 tasks: Add new `tasks` command and infrastructure, with `mention` task.
Ludovic Chabant <ludovic@chabant.com>
parents: 1005
diff changeset
113
0
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
114 def _ensureLoaded(self):
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
115 if self._plugins is not None:
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
116 return
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
117
1
aaa8fb7c8918 Re-arranged modules to reduce dependencies to builtin stuff.
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
118 from piecrust.plugins.builtin import BuiltInPlugin
0
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
119 self._plugins = [BuiltInPlugin()]
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
120
306
7122976bc751 plugins: Fix crash for sites that don't specify a `site/plugins` setting.
Ludovic Chabant <ludovic@chabant.com>
parents: 305
diff changeset
121 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
122 if to_install:
413
eacf0a3afd0c internal: Register performance timers for plugin components.
Ludovic Chabant <ludovic@chabant.com>
parents: 312
diff changeset
123 for name in to_install:
eacf0a3afd0c internal: Register performance timers for plugin components.
Ludovic Chabant <ludovic@chabant.com>
parents: 312
diff changeset
124 plugin = self._loadPlugin(name)
999
46025a1b5434 plugins: Support multiple customizable plugins directories.
Ludovic Chabant <ludovic@chabant.com>
parents: 849
diff changeset
125 if plugin is not None:
46025a1b5434 plugins: Support multiple customizable plugins directories.
Ludovic Chabant <ludovic@chabant.com>
parents: 849
diff changeset
126 self._plugins.append(plugin)
0
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
127
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
128 for plugin in self._plugins:
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
129 plugin.initialize(self.app)
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
130
303
5dbab01daaba plugins: First pass for a working plugin loader functionality.
Ludovic Chabant <ludovic@chabant.com>
parents: 7
diff changeset
131 def _loadPlugin(self, plugin_name):
848
7d83b9484b98 plugins: Add support for "ad-hoc" local plugins.
Ludovic Chabant <ludovic@chabant.com>
parents: 803
diff changeset
132 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
133 try:
848
7d83b9484b98 plugins: Add support for "ad-hoc" local plugins.
Ludovic Chabant <ludovic@chabant.com>
parents: 803
diff changeset
134 # Import from the current environment.
7d83b9484b98 plugins: Add support for "ad-hoc" local plugins.
Ludovic Chabant <ludovic@chabant.com>
parents: 803
diff changeset
135 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
136 except ImportError as ex:
848
7d83b9484b98 plugins: Add support for "ad-hoc" local plugins.
Ludovic Chabant <ludovic@chabant.com>
parents: 803
diff changeset
137 mod = None
7d83b9484b98 plugins: Add support for "ad-hoc" local plugins.
Ludovic Chabant <ludovic@chabant.com>
parents: 803
diff changeset
138
7d83b9484b98 plugins: Add support for "ad-hoc" local plugins.
Ludovic Chabant <ludovic@chabant.com>
parents: 803
diff changeset
139 if mod is None:
7d83b9484b98 plugins: Add support for "ad-hoc" local plugins.
Ludovic Chabant <ludovic@chabant.com>
parents: 803
diff changeset
140 # 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
141 for plugins_dir in self.app.plugins_dirs:
46025a1b5434 plugins: Support multiple customizable plugins directories.
Ludovic Chabant <ludovic@chabant.com>
parents: 849
diff changeset
142 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
143 if os.path.isfile(pfile):
1005
2e5c5d33d62c Merge changes.
Ludovic Chabant <ludovic@chabant.com>
parents: 984 999
diff changeset
144 if sys.version_info[1] >= 5:
2e5c5d33d62c Merge changes.
Ludovic Chabant <ludovic@chabant.com>
parents: 984 999
diff changeset
145 # Python 3.5+
2e5c5d33d62c Merge changes.
Ludovic Chabant <ludovic@chabant.com>
parents: 984 999
diff changeset
146 from importlib.util import (spec_from_file_location,
2e5c5d33d62c Merge changes.
Ludovic Chabant <ludovic@chabant.com>
parents: 984 999
diff changeset
147 module_from_spec)
2e5c5d33d62c Merge changes.
Ludovic Chabant <ludovic@chabant.com>
parents: 984 999
diff changeset
148 spec = spec_from_file_location(plugin_name, pfile)
2e5c5d33d62c Merge changes.
Ludovic Chabant <ludovic@chabant.com>
parents: 984 999
diff changeset
149 mod = module_from_spec(spec)
2e5c5d33d62c Merge changes.
Ludovic Chabant <ludovic@chabant.com>
parents: 984 999
diff changeset
150 spec.loader.exec_module(mod)
2e5c5d33d62c Merge changes.
Ludovic Chabant <ludovic@chabant.com>
parents: 984 999
diff changeset
151 sys.modules[mod_name] = mod
2e5c5d33d62c Merge changes.
Ludovic Chabant <ludovic@chabant.com>
parents: 984 999
diff changeset
152 else:
2e5c5d33d62c Merge changes.
Ludovic Chabant <ludovic@chabant.com>
parents: 984 999
diff changeset
153 # Python 3.4, 3.3.
2e5c5d33d62c Merge changes.
Ludovic Chabant <ludovic@chabant.com>
parents: 984 999
diff changeset
154 from importlib.machinery import SourceFileLoader
2e5c5d33d62c Merge changes.
Ludovic Chabant <ludovic@chabant.com>
parents: 984 999
diff changeset
155 mod = SourceFileLoader(
2e5c5d33d62c Merge changes.
Ludovic Chabant <ludovic@chabant.com>
parents: 984 999
diff changeset
156 plugin_name, pfile).load_module()
2e5c5d33d62c Merge changes.
Ludovic Chabant <ludovic@chabant.com>
parents: 984 999
diff changeset
157 sys.modules[mod_name] = mod
848
7d83b9484b98 plugins: Add support for "ad-hoc" local plugins.
Ludovic Chabant <ludovic@chabant.com>
parents: 803
diff changeset
158
7d83b9484b98 plugins: Add support for "ad-hoc" local plugins.
Ludovic Chabant <ludovic@chabant.com>
parents: 803
diff changeset
159 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
160 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
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 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
164 if plugin_class is None:
5dbab01daaba plugins: First pass for a working plugin loader functionality.
Ludovic Chabant <ludovic@chabant.com>
parents: 7
diff changeset
165 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
166 "`__piecrust_plugin__` class." % plugin_name)
5dbab01daaba plugins: First pass for a working plugin loader functionality.
Ludovic Chabant <ludovic@chabant.com>
parents: 7
diff changeset
167 return
5dbab01daaba plugins: First pass for a working plugin loader functionality.
Ludovic Chabant <ludovic@chabant.com>
parents: 7
diff changeset
168
5dbab01daaba plugins: First pass for a working plugin loader functionality.
Ludovic Chabant <ludovic@chabant.com>
parents: 7
diff changeset
169 try:
5dbab01daaba plugins: First pass for a working plugin loader functionality.
Ludovic Chabant <ludovic@chabant.com>
parents: 7
diff changeset
170 plugin = plugin_class()
5dbab01daaba plugins: First pass for a working plugin loader functionality.
Ludovic Chabant <ludovic@chabant.com>
parents: 7
diff changeset
171 except Exception as ex:
5dbab01daaba plugins: First pass for a working plugin loader functionality.
Ludovic Chabant <ludovic@chabant.com>
parents: 7
diff changeset
172 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
173 (plugin_name, ex))
5dbab01daaba plugins: First pass for a working plugin loader functionality.
Ludovic Chabant <ludovic@chabant.com>
parents: 7
diff changeset
174 return
5dbab01daaba plugins: First pass for a working plugin loader functionality.
Ludovic Chabant <ludovic@chabant.com>
parents: 7
diff changeset
175
413
eacf0a3afd0c internal: Register performance timers for plugin components.
Ludovic Chabant <ludovic@chabant.com>
parents: 312
diff changeset
176 return plugin
0
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
177
849
8f8bbb2e70e1 templating: Template engines can now load extensions directly from plugins.
Ludovic Chabant <ludovic@chabant.com>
parents: 848
diff changeset
178 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
179 initialize=False,
bf9f4e55f751 rendering: Separate performance timers for renering segments and layouts.
Ludovic Chabant <ludovic@chabant.com>
parents: 711
diff changeset
180 register_timer=False,
bf9f4e55f751 rendering: Separate performance timers for renering segments and layouts.
Ludovic Chabant <ludovic@chabant.com>
parents: 711
diff changeset
181 register_timer_suffixes=None,
413
eacf0a3afd0c internal: Register performance timers for plugin components.
Ludovic Chabant <ludovic@chabant.com>
parents: 312
diff changeset
182 order_key=None):
0
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
183 if name in self._componentCache:
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
184 return self._componentCache[name]
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
185
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
186 all_components = []
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
187 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
188 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
189 # 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
190 plugin_components = list(plugin_components)
0
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
191 all_components += plugin_components
413
eacf0a3afd0c internal: Register performance timers for plugin components.
Ludovic Chabant <ludovic@chabant.com>
parents: 312
diff changeset
192
0
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
193 if initialize:
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
194 for comp in plugin_components:
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
195 comp.initialize(self.app)
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
196
413
eacf0a3afd0c internal: Register performance timers for plugin components.
Ludovic Chabant <ludovic@chabant.com>
parents: 312
diff changeset
197 if register_timer:
eacf0a3afd0c internal: Register performance timers for plugin components.
Ludovic Chabant <ludovic@chabant.com>
parents: 312
diff changeset
198 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
199 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
200 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
201 comp.__class__.__name__)
803
bf9f4e55f751 rendering: Separate performance timers for renering segments and layouts.
Ludovic Chabant <ludovic@chabant.com>
parents: 711
diff changeset
202 else:
bf9f4e55f751 rendering: Separate performance timers for renering segments and layouts.
Ludovic Chabant <ludovic@chabant.com>
parents: 711
diff changeset
203 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
204 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
205 comp.__class__.__name__ + s)
413
eacf0a3afd0c internal: Register performance timers for plugin components.
Ludovic Chabant <ludovic@chabant.com>
parents: 312
diff changeset
206
7
343d08ef5668 More PieCrust 3 fixes, and a couple of miscellaneous bug fixes.
Ludovic Chabant <ludovic@chabant.com>
parents: 3
diff changeset
207 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
208 all_components.sort(key=order_key)
0
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
209
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
210 self._componentCache[name] = all_components
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
211 return all_components
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
212