diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index ae039b4..cf9555f 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -5,7 +5,7 @@ class ApplicationController < ActionController::Base before_filter :setup_multitenancy before_filter :detect_stuff_by_domain - before_filter :init_noosfero_plugins_controller_filters + before_filter :init_noosfero_plugins before_filter :allow_cross_domain_access def allow_cross_domain_access @@ -132,23 +132,9 @@ class ApplicationController < ActionController::Base include Noosfero::Plugin::HotSpot - # This is a generic method that initialize any possible filter defined by a - # plugin to the current controller being initialized. - def init_noosfero_plugins_controller_filters - plugins.each do |plugin| - filters = plugin.send(self.class.name.underscore + '_filters') - filters = [filters] if !filters.kind_of?(Array) - controller_filters = self.class._process_action_callbacks.map {|c| c.filter.to_sym } - filters.each do |plugin_filter| - filter_method = (plugin.class.name.underscore.gsub('/','_') + '_' + plugin_filter[:method_name]).to_sym - unless controller_filters.include?(filter_method) - self.class.send(plugin_filter[:type], filter_method.to_sym, (plugin_filter[:options] || {})) - self.class.send(:define_method, filter_method) do - instance_eval(&plugin_filter[:block]) if environment.plugin_enabled?(plugin.class) - end - end - end - end + # FIXME this filter just loads @plugins to children controllers and helpers + def init_noosfero_plugins + plugins end def render_not_found(path = nil) diff --git a/config/environment.rb b/config/environment.rb index 22e8939..6c4084c 100644 --- a/config/environment.rb +++ b/config/environment.rb @@ -39,4 +39,3 @@ if !['test', 'cucumber'].include?(ENV['RAILS_ENV']) end Noosfero::Application.initialize! -Noosfero::Plugin.initialize! diff --git a/config/initializers/plugins.rb b/config/initializers/plugins.rb index df05799..6e6ef6f 100644 --- a/config/initializers/plugins.rb +++ b/config/initializers/plugins.rb @@ -5,4 +5,4 @@ require 'noosfero/plugin/active_record' require 'noosfero/plugin/mailer_base' require 'noosfero/plugin/settings' require 'noosfero/plugin/spammable' -Noosfero::Plugin.init_system if $NOOSFERO_LOAD_PLUGINS +Noosfero::Plugin.initialize! diff --git a/lib/noosfero/plugin.rb b/lib/noosfero/plugin.rb index 3f74564..7a28ea2 100644 --- a/lib/noosfero/plugin.rb +++ b/lib/noosfero/plugin.rb @@ -20,8 +20,9 @@ class Noosfero::Plugin return if !should_load enabled.each do |plugin_dir| plugin_name = File.basename(plugin_dir) - load_plugin(plugin_name) + plugin = load_plugin(plugin_name) load_plugin_extensions(plugin_dir) + load_plugin_filters(plugin) end end @@ -76,6 +77,25 @@ class Noosfero::Plugin (plugin_name.to_s.camelize + 'Plugin').constantize end + # This is a generic method that initialize any possible filter defined by a + # plugin to a specific controller + def load_plugin_filters(plugin) + plugin_methods = plugin.instance_methods.select {|m| m.to_s.end_with?('_filters')} + plugin_methods.each do |plugin_method| + controller_class = plugin_method.to_s.gsub('_filters', '').camelize.constantize + filters = plugin.new.send(plugin_method) + filters = [filters] if !filters.kind_of?(Array) + + filters.each do |plugin_filter| + filter_method = (plugin.name.underscore.gsub('/','_') + '_' + plugin_filter[:method_name]).to_sym + controller_class.send(plugin_filter[:type], filter_method, (plugin_filter[:options] || {})) + controller_class.send(:define_method, filter_method) do + instance_eval(&plugin_filter[:block]) if environment.plugin_enabled?(plugin) + end + end + end + end + def load_plugin_extensions(dir) Rails.configuration.to_prepare do Dir[File.join(dir, 'lib', 'ext', '*.rb')].each {|file| require_dependency file } diff --git a/lib/tasks/plugins.rake b/lib/tasks/plugins.rake index 757c0e4..f5cf813 100644 --- a/lib/tasks/plugins.rake +++ b/lib/tasks/plugins.rake @@ -5,7 +5,7 @@ class ActiveRecord::Migrator alias_method :orig_initialize, :initialize def initialize *args orig_initialize *args - @migrations_path = "{db/migrate,config/plugins/*/db/migrate}" + @migrations_paths = ["db/migrate", "config/plugins/*/db/migrate"] end end diff --git a/test/functional/application_controller_test.rb b/test/functional/application_controller_test.rb index 6c3df3d..3ede4e3 100644 --- a/test/functional/application_controller_test.rb +++ b/test/functional/application_controller_test.rb @@ -507,6 +507,7 @@ class ApplicationControllerTest < ActionController::TestCase end end + Noosfero::Plugin.load_plugin_filters(FilterPlugin) Noosfero::Plugin::Manager.any_instance.stubs(:enabled_plugins).returns([FilterPlugin.new]) get :index @@ -525,6 +526,7 @@ class ApplicationControllerTest < ActionController::TestCase end end + Noosfero::Plugin.load_plugin_filters(OtherFilterPlugin) environment1 = fast_create(Environment, :name => 'test environment') environment1.enable_plugin(OtherFilterPlugin.name) environment2 = fast_create(Environment, :name => 'other test environment') -- libgit2 0.21.2