annotate piecrust/plugins/base.py @ 1134:986ecdaa2a36

url: New `url` command to get the URL of a page from its path.
author Ludovic Chabant <ludovic@chabant.com>
date Mon, 23 Apr 2018 21:37:27 -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