[noosfero/noosfero][master] plugins: only call event on plugin if it is defined

Bráulio Bhavamitra gitlab at gitlab.com
Sat Mar 28 09:46:20 BRT 2015


Bráulio Bhavamitra pushed to master at Noosfero / noosfero


Commits:
da84575e by Braulio Bhavamitra at 2015-03-28T09:46:13Z
plugins: only call event on plugin if it is defined

This allow proper use of default values defined in Noosfero::Plugin
abstract class.

- - - - -


2 changed files:

- lib/noosfero/plugin/manager.rb
- test/unit/plugin_manager_test.rb


Changes:

=====================================
lib/noosfero/plugin/manager.rb
=====================================
--- a/lib/noosfero/plugin/manager.rb
+++ b/lib/noosfero/plugin/manager.rb
@@ -20,15 +20,15 @@ class Noosfero::Plugin::Manager
   # return [1,0,1,2,3]
   #
   def dispatch(event, *args)
-    dispatch_without_flatten(event, *args).flatten
+    flat_map{ |plugin| result_for plugin, event, *args }.compact
   end
 
   def fetch_plugins(event, *args)
-    map { |plugin| plugin.class if plugin.send(event, *args) }.compact.flatten
+    map { |plugin| plugin.class if result_for plugin, event, *args }.compact.flatten
   end
 
   def dispatch_without_flatten(event, *args)
-    map { |plugin| plugin.send(event, *args) }.compact
+    map { |plugin| result_for plugin, event, *args }.compact
   end
 
   alias :dispatch_scopes :dispatch_without_flatten
@@ -37,9 +37,14 @@ class Noosfero::Plugin::Manager
     Noosfero::Plugin.new.send event, *args
   end
 
+  def result_for plugin, event, *args
+    method = plugin.method event
+    method.call *args if method.owner != Noosfero::Plugin
+  end
+
   def dispatch_first(event, *args)
     each do |plugin|
-      result = plugin.send(event, *args)
+      result = result_for plugin, event, *args
       return result if result.present?
     end
     default_for event, *args
@@ -47,7 +52,7 @@ class Noosfero::Plugin::Manager
 
   def fetch_first_plugin(event, *args)
     each do |plugin|
-      result = plugin.send event, *args
+      result = result_for plugin, event, *args
       return plugin.class if result.present?
     end
     nil
@@ -55,7 +60,7 @@ class Noosfero::Plugin::Manager
 
   def pipeline(event, *args)
     each do |plugin|
-      result = plugin.send(event, *args)
+      result = result_for plugin, event, *args
       result = result.kind_of?(Array) ? result : [result]
       raise ArgumentError, "Pipeline broken by #{plugin.class.name} on #{event} with #{result.length} arguments instead of #{args.length}." if result.length != args.length
       args = result
@@ -64,7 +69,7 @@ class Noosfero::Plugin::Manager
   end
 
   def filter(property, data)
-    inject(data) {|data, plugin| data = plugin.send(property, data)}
+    inject(data){ |data, plugin| data = plugin.send(property, data) }
   end
 
   def parse_macro(macro_name, macro, source = nil)

=====================================
test/unit/plugin_manager_test.rb
=====================================
--- a/test/unit/plugin_manager_test.rb
+++ b/test/unit/plugin_manager_test.rb
@@ -304,4 +304,31 @@ class PluginManagerTest < ActiveSupport::TestCase
     @manager.dispatch_first :find_by_contents, :products, environment.products, 'product'
   end
 
+  should 'not event if it is not defined by plugin' do
+    class Noosfero::Plugin
+      def never_call
+        nil
+      end
+    end
+    class Plugin1 < Noosfero::Plugin
+      def never_call
+        'defined'
+      end
+    end
+    class Plugin2 < Noosfero::Plugin
+    end
+    Noosfero::Plugin.stubs(:all).returns(['PluginManagerTest::Plugin1', 'PluginManagerTest::Plugin2'])
+    environment.enable_plugin(Plugin1)
+    environment.enable_plugin(Plugin2)
+    plugin1 = @manager.enabled_plugins.detect{ |p| p.is_a? Plugin1 }
+    plugin2 = @manager.enabled_plugins.detect{ |p| p.is_a? Plugin2 }
+
+    assert_equal Plugin1, Plugin1.new.method(:never_call).owner
+    assert_equal Noosfero::Plugin, Plugin2.new.method(:never_call).owner
+    # expects never can't be used as it defines the method
+    @manager.expects(:result_for).with(plugin1, :never_call).returns(Plugin1.new.never_call)
+    @manager.expects(:result_for).with(plugin2, :never_call).returns(nil)
+    @manager.dispatch :never_call
+  end
+
 end


View it on GitLab: https://gitlab.com/noosfero/noosfero/commit/da84575ee29154fa4f24c9acdfce9ec16a7acb5b
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://listas.softwarelivre.org/pipermail/noosfero-dev/attachments/20150328/da8e79e3/attachment-0001.html>


More information about the Noosfero-dev mailing list