From de9842bdbbfa59de3e0680b9b312ac1460b0af91 Mon Sep 17 00:00:00 2001 From: Antonio Terceiro Date: Thu, 27 Dec 2012 11:22:23 -0300 Subject: [PATCH] Adapt Noosfero plugin system to Rails 3 --- config/application.rb | 7 +++++-- config/environment.rb | 1 + lib/noosfero/plugin.rb | 99 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++---------------------------------- 3 files changed, 71 insertions(+), 36 deletions(-) diff --git a/config/application.rb b/config/application.rb index 7eedef9..b538ab9 100644 --- a/config/application.rb +++ b/config/application.rb @@ -14,6 +14,8 @@ if defined?(Bundler) # Bundler.require(:default, :assets, Rails.env) end +require 'noosfero/plugin' + module Noosfero class Application < Rails::Application @@ -39,9 +41,8 @@ module Noosfero makemo ] if $PROGRAM_NAME =~ /rake$/ && (ignore_rake_commands.include?(ARGV.first)) - $NOOSFERO_LOAD_PLUGINS = false + Noosfero::Plugin.should_load = false else - $NOOSFERO_LOAD_PLUGINS = true config.active_record.observers = :article_sweeper, :role_assignment_sweeper, :friendship_sweeper, :category_sweeper, :block_sweeper end @@ -104,5 +105,7 @@ module Noosfero config.autoload_paths += Dir["#{config.root}/app/controllers/**/"] + Noosfero::Plugin.setup(config) + end end diff --git a/config/environment.rb b/config/environment.rb index bdd181d..ff96097 100644 --- a/config/environment.rb +++ b/config/environment.rb @@ -39,3 +39,4 @@ if !['test', 'cucumber'].include?(ENV['RAILS_ENV']) end Noosfero::Application.initialize! +Noosfero::Plugin.initialize! diff --git a/lib/noosfero/plugin.rb b/lib/noosfero/plugin.rb index 60cf038..e7b7c84 100644 --- a/lib/noosfero/plugin.rb +++ b/lib/noosfero/plugin.rb @@ -1,5 +1,4 @@ require 'noosfero' -include ActionView::Helpers::AssetTagHelper class Noosfero::Plugin @@ -7,47 +6,73 @@ class Noosfero::Plugin class << self - def klass(dir) - (dir.to_s.camelize + 'Plugin').constantize # load the plugin + attr_writer :should_load + + def should_load + @should_load.nil? && true || @boot end - def init_system - enabled_plugins = Dir.glob(File.join(Rails.root, 'config', 'plugins', '*')) - if Rails.env.test? && !enabled_plugins.include?(File.join(Rails.root, 'config', 'plugins', 'foo')) - enabled_plugins << File.join(Rails.root, 'plugins', 'foo') + def initialize! + return if !should_load + enabled.each do |plugin_dir| + plugin_name = File.basename(plugin_dir) + load_plugin(plugin_name) end - enabled_plugins.select do |entry| - File.directory?(entry) - end.each do |dir| - plugin_name = File.basename(dir) - - plugin_dependencies_ok = true - plugin_dependencies_file = File.join(dir, 'dependencies.rb') - if File.exists?(plugin_dependencies_file) - begin - require plugin_dependencies_file - rescue LoadError => ex - plugin_dependencies_ok = false - $stderr.puts "W: Noosfero plugin #{plugin_name} failed to load (#{ex})" - end + end + + def setup(config) + return if !should_load + enabled.each do |dir| + setup_plugin(dir, config) + end + end + + def setup_plugin(dir, config) + plugin_name = File.basename(dir) + + plugin_dependencies_ok = true + plugin_dependencies_file = File.join(dir, 'dependencies.rb') + if File.exists?(plugin_dependencies_file) + begin + require plugin_dependencies_file + rescue LoadError => ex + plugin_dependencies_ok = false + $stderr.puts "W: Noosfero plugin #{plugin_name}: failed to load dependencies (#{ex})" + end + end + + if plugin_dependencies_ok + %w[ + controllers + controllers/public + controllers/profile + controllers/myprofile + controllers/admin + ].each do |folder| + config.autoload_paths << File.join(dir, folder) + end + [ config.autoload_paths, $:].each do |path| + path << File.join(dir, 'models') + path << File.join(dir, 'lib') end + end + end - if plugin_dependencies_ok - Rails.configuration.controller_paths << File.join(dir, 'controllers') - ActiveSupport::Dependencies.load_paths << File.join(dir, 'controllers') - controllers_folders = %w[public profile myprofile admin] - controllers_folders.each do |folder| - Rails.configuration.controller_paths << File.join(dir, 'controllers', folder) - ActiveSupport::Dependencies.load_paths << File.join(dir, 'controllers', folder) + def load_plugin(dir) + (dir.to_s.camelize + 'Plugin').constantize + end + + def enabled + @enabled ||= + begin + plugins = Dir.glob(File.join(Rails.root, 'config', 'plugins', '*')) + if Rails.env.test? && !plugins.include?(File.join(Rails.root, 'config', 'plugins', 'foo')) + plugins << File.join(Rails.root, 'plugins', 'foo') end - [ ActiveSupport::Dependencies.load_paths, $:].each do |path| - path << File.join(dir, 'models') - path << File.join(dir, 'lib') + plugins.select do |entry| + File.directory?(entry) end - - klass(plugin_name) end - end end def all @@ -390,3 +415,9 @@ class Noosfero::Plugin end end + +require 'noosfero/plugin/hot_spot' +require 'noosfero/plugin/manager' +require 'noosfero/plugin/active_record' +require 'noosfero/plugin/mailer_base' +require 'noosfero/plugin/settings' -- libgit2 0.21.2