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,6 +1407,9 @@ module ApplicationHelper | ||
1407 | def filter_html(html, source) | 1407 | def filter_html(html, source) |
1408 | if @plugins | 1408 | if @plugins |
1409 | html = convert_macro(html, source) | 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 | end | 1413 | end |
1411 | html | 1414 | html |
1412 | end | 1415 | end |
lib/noosfero/plugin.rb
@@ -252,8 +252,8 @@ class Noosfero::Plugin | @@ -252,8 +252,8 @@ class Noosfero::Plugin | ||
252 | 252 | ||
253 | # -> Parse and possibly make changes of content (article, block, etc) during HTML rendering | 253 | # -> Parse and possibly make changes of content (article, block, etc) during HTML rendering |
254 | # returns = content as string after parser and changes | 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 | end | 257 | end |
258 | 258 | ||
259 | # -> Adds links to the admin panel | 259 | # -> Adds links to the admin panel |
lib/noosfero/plugin/manager.rb
@@ -53,6 +53,17 @@ class Noosfero::Plugin::Manager | @@ -53,6 +53,17 @@ class Noosfero::Plugin::Manager | ||
53 | result | 53 | result |
54 | end | 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 | def parse_macro(macro_name, macro, source = nil) | 67 | def parse_macro(macro_name, macro, source = nil) |
57 | macro_instance = enabled_macros[macro_name] || default_macro | 68 | macro_instance = enabled_macros[macro_name] || default_macro |
58 | macro_instance.convert(macro, source) | 69 | macro_instance.convert(macro, source) |
test/unit/plugin_manager_test.rb
@@ -194,4 +194,67 @@ class PluginManagerTest < ActiveSupport::TestCase | @@ -194,4 +194,67 @@ class PluginManagerTest < ActiveSupport::TestCase | ||
194 | assert_equal 'My name is Macro2!', manager.parse_macro(Plugin1::Macro2.identifier, macro) | 194 | assert_equal 'My name is Macro2!', manager.parse_macro(Plugin1::Macro2.identifier, macro) |
195 | end | 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 | end | 260 | end |