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 |