Commit b90b8b84af93e776c4e3d0ba21580ad02965a11c
1 parent
d1d530b1
Exists in
master
and in
28 other branches
[macro-support-review] Refactoring broken parse_content and creating pipeline manager method
Showing
4 changed files
with
79 additions
and
2 deletions
Show diff stats
app/helpers/application_helper.rb
... | ... | @@ -1407,6 +1407,9 @@ module ApplicationHelper |
1407 | 1407 | def filter_html(html, source) |
1408 | 1408 | if @plugins |
1409 | 1409 | html = convert_macro(html, source) |
1410 | + #TODO This parse should be done through the macro infra, but since there | |
1411 | + # are old things that do not support it we are keeping this hot spot. | |
1412 | + html = @plugins.pipeline(:parse_content, html, source).first | |
1410 | 1413 | end |
1411 | 1414 | html |
1412 | 1415 | end | ... | ... |
lib/noosfero/plugin.rb
... | ... | @@ -252,8 +252,8 @@ class Noosfero::Plugin |
252 | 252 | |
253 | 253 | # -> Parse and possibly make changes of content (article, block, etc) during HTML rendering |
254 | 254 | # returns = content as string after parser and changes |
255 | - def parse_content(args) | |
256 | - args | |
255 | + def parse_content(html, source) | |
256 | + [html, source] | |
257 | 257 | end |
258 | 258 | |
259 | 259 | # -> Adds links to the admin panel | ... | ... |
lib/noosfero/plugin/manager.rb
... | ... | @@ -53,6 +53,17 @@ class Noosfero::Plugin::Manager |
53 | 53 | result |
54 | 54 | end |
55 | 55 | |
56 | + | |
57 | + def pipeline(event, *args) | |
58 | + each do |plugin| | |
59 | + result = plugin.send(event, *args) | |
60 | + result = result.kind_of?(Array) ? result : [result] | |
61 | + raise ArgumentError, "Pipeline broken by #{plugin.class.name} on #{event} with #{result.length} arguments instead of #{args.length}." if result.length != args.length | |
62 | + args = result | |
63 | + end | |
64 | + args.length < 2 ? args.first : args | |
65 | + end | |
66 | + | |
56 | 67 | def parse_macro(macro_name, macro, source = nil) |
57 | 68 | macro_instance = enabled_macros[macro_name] || default_macro |
58 | 69 | macro_instance.convert(macro, source) | ... | ... |
test/unit/plugin_manager_test.rb
... | ... | @@ -194,4 +194,67 @@ class PluginManagerTest < ActiveSupport::TestCase |
194 | 194 | assert_equal 'My name is Macro2!', manager.parse_macro(Plugin1::Macro2.identifier, macro) |
195 | 195 | end |
196 | 196 | |
197 | + should 'dispatch event in a pipeline sequence' do | |
198 | + class Plugin1 < Noosfero::Plugin | |
199 | + def transform(v1, v2) | |
200 | + v = 2 | |
201 | + [v1 * v, v2 * v] | |
202 | + end | |
203 | + end | |
204 | + | |
205 | + class Plugin2 < Noosfero::Plugin | |
206 | + def transform(v1, v2) | |
207 | + v = 5 | |
208 | + [v1 * v, v2 * v] | |
209 | + end | |
210 | + end | |
211 | + | |
212 | + environment.enable_plugin(Plugin1) | |
213 | + environment.enable_plugin(Plugin2) | |
214 | + | |
215 | + assert_equal [10, 20], manager.pipeline(:transform, 1, 2) | |
216 | + end | |
217 | + | |
218 | + should 'be able to pipeline with single arguments' do | |
219 | + class Plugin1 < Noosfero::Plugin | |
220 | + def transform(value) | |
221 | + value * 2 | |
222 | + end | |
223 | + end | |
224 | + | |
225 | + class Plugin2 < Noosfero::Plugin | |
226 | + def transform(value) | |
227 | + value * 5 | |
228 | + end | |
229 | + end | |
230 | + | |
231 | + environment.enable_plugin(Plugin1) | |
232 | + environment.enable_plugin(Plugin2) | |
233 | + | |
234 | + assert_equal 10, manager.pipeline(:transform, 1) | |
235 | + end | |
236 | + | |
237 | + should 'raise if pipeline is broken' do | |
238 | + class Plugin1 < Noosfero::Plugin | |
239 | + def transform(v1, v2) | |
240 | + v = 2 | |
241 | + [v1 * v, v2 * v] | |
242 | + end | |
243 | + end | |
244 | + | |
245 | + class Plugin2 < Noosfero::Plugin | |
246 | + def transform(v1, v2) | |
247 | + v = 5 | |
248 | + [v1 * v, v2 * v, 666] | |
249 | + end | |
250 | + end | |
251 | + | |
252 | + environment.enable_plugin(Plugin1) | |
253 | + environment.enable_plugin(Plugin2) | |
254 | + | |
255 | + assert_raise ArgumentError do | |
256 | + manager.pipeline(:transform, 1, 2) | |
257 | + end | |
258 | + end | |
259 | + | |
197 | 260 | end | ... | ... |