Commit f5c2a127d2e2de8bd51b558ed9a48098365584ad

Authored by Rodrigo Souto
1 parent 83c8889e

hotspot: refactor profile_image_link hotspot

   * The first_impl method was already implemented as dispatch_first
     (which was probably incorporated after this request was done). But
     I utilized the idea proposed here to use the default value for the
     hotspot instead of nil.
   * I changed the hotspot to pass all the parameters passed to the
     method since it might be useful for the plugins in the future.

(ActionItem2666)
app/helpers/application_helper.rb
... ... @@ -558,7 +558,7 @@ module ApplicationHelper
558 558 # displays a link to the profile homepage with its image (as generated by
559 559 # #profile_image) and its name below it.
560 560 def profile_image_link( profile, size=:portrait, tag='li', extra_info = nil )
561   - if content = @plugins.first_impl(:profile_image_link, profile)
  561 + if content = @plugins.dispatch_first(:profile_image_link, profile, size, tag, extra_info)
562 562 return instance_eval(&content)
563 563 end
564 564 name = profile.short_name
... ...
lib/noosfero/plugin.rb
... ... @@ -152,7 +152,7 @@ class Noosfero::Plugin
152 152  
153 153 # Here the developer may specify the events to which the plugins can
154 154 # register and must return true or false. The default value must be false.
155   - # Must also explicitly defined its returning variables.
  155 + # Must also explicitly define its returning variables.
156 156  
157 157 # -> If true, noosfero will include plugin_dir/public/style.css into
158 158 # application
... ... @@ -172,7 +172,7 @@ class Noosfero::Plugin
172 172 # -> Customize profile block design and behavior
173 173 # (overwrites profile_image_link function)
174 174 # returns = lambda block that creates html code.
175   - def profile_image_link profile
  175 + def profile_image_link(profile, size, tag, extra_info)
176 176 nil
177 177 end
178 178  
... ...
lib/noosfero/plugin/manager.rb
... ... @@ -31,32 +31,23 @@ class Noosfero::Plugin::Manager
31 31 map { |plugin| plugin.send(event, *args) }.compact
32 32 end
33 33  
34   - # return first implementation of a specific hotspot
35   - def first_impl(event, *args)
36   - default = Noosfero::Plugin.new.send(event, *args)
37   - impl = default
38   - each do |plugin|
39   - impl = plugin.send(event, *args)
40   - break if impl != default
41   - end
42   - impl
43   - end
44   -
45 34 alias :dispatch_scopes :dispatch_without_flatten
46 35  
47 36 def dispatch_first(event, *args)
48   - result = nil
  37 + default = Noosfero::Plugin.new.send(event, *args)
  38 + result = default
49 39 each do |plugin|
50 40 result = plugin.send(event, *args)
51   - break if result.present?
  41 + break if result != default
52 42 end
53 43 result
54 44 end
55 45  
56 46 def fetch_first_plugin(event, *args)
  47 + default = Noosfero::Plugin.new.send(event, *args)
57 48 result = nil
58 49 each do |plugin|
59   - if plugin.send(event, *args)
  50 + if plugin.send(event, *args) != default
60 51 result = plugin.class
61 52 break
62 53 end
... ...
test/unit/plugin_manager_test.rb
... ... @@ -61,6 +61,10 @@ class PluginManagerTest < ActiveSupport::TestCase
61 61 end
62 62  
63 63 should 'dispatch_first method returns the first plugin response if there is many plugins to responde the event' do
  64 + class Noosfero::Plugin
  65 + def random_event
  66 + end
  67 + end
64 68  
65 69 class Plugin1 < Noosfero::Plugin
66 70 def random_event
... ...