diff --git a/lib/noosfero/plugin.rb b/lib/noosfero/plugin.rb index 0defe3b..be7e6d7 100644 --- a/lib/noosfero/plugin.rb +++ b/lib/noosfero/plugin.rb @@ -12,11 +12,20 @@ class Noosfero::Plugin end def init_system - Dir.glob(File.join(Rails.root, 'config', 'plugins', '*')).select do |entry| + 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') + end + enabled_plugins.select do |entry| File.directory?(entry) end.each do |dir| 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) + end [ ActiveSupport::Dependencies.load_paths, $:].each do |path| path << File.join(dir, 'models') path << File.join(dir, 'lib') diff --git a/lib/noosfero/plugin/routes.rb b/lib/noosfero/plugin/routes.rb index 6f0af82..3a51c5d 100644 --- a/lib/noosfero/plugin/routes.rb +++ b/lib/noosfero/plugin/routes.rb @@ -1,8 +1,26 @@ -Dir.glob(File.join(Rails.root, 'config', 'plugins', '*', 'controllers')) do |dir| - plugin_name = File.basename(File.dirname(dir)) +plugins_root = Rails.env.test? ? 'plugins' : File.join('config', 'plugins') + +Dir.glob(File.join(Rails.root, plugins_root, '*', 'controllers')) do |controllers_dir| + prefixes_by_folder = {'public' => 'plugin', + 'profile' => 'profile/:profile/plugin', + 'myprofile' => 'myprofile/:profile/plugin', + 'admin' => 'admin/plugin'} + + controllers_by_folder = prefixes_by_folder.keys.inject({}) do |hash, folder| + hash.merge!({folder => Dir.glob(File.join(controllers_dir, folder, '*')).map {|full_names| File.basename(full_names).gsub(/_controller.rb$/,'')}}) + end + + plugin_name = File.basename(File.dirname(controllers_dir)) + + controllers_by_folder.each do |folder, controllers| + controllers.each do |controller| + controller_name = controller.gsub("#{plugin_name}_plugin_",'') + map.connect "#{prefixes_by_folder[folder]}/#{plugin_name}/#{controller_name}/:action/:id", :controller => controller + end + end + map.connect 'plugin/' + plugin_name + '/:action/:id', :controller => plugin_name + '_plugin' map.connect 'profile/:profile/plugins/' + plugin_name + '/:action/:id', :controller => plugin_name + '_plugin_profile' map.connect 'myprofile/:profile/plugin/' + plugin_name + '/:action/:id', :controller => plugin_name + '_plugin_myprofile' map.connect 'admin/plugin/' + plugin_name + '/:action/:id', :controller => plugin_name + '_plugin_admin' end - diff --git a/test/integration/routing_test.rb b/test/integration/routing_test.rb index 79f899c..1a26aa2 100644 --- a/test/integration/routing_test.rb +++ b/test/integration/routing_test.rb @@ -221,4 +221,11 @@ class RoutingTest < ActionController::IntegrationTest assert_routing('/chat/avatar/chemical-brothers', :controller => 'chat', :action => 'avatar', :id => 'chemical-brothers') end + def test_plugins_generic_routes + assert_routing('/plugin/foo/public_bar/play/1', {:controller => 'foo_plugin_public_bar', :action => 'play', :id => '1'}) + assert_routing('/profile/test/plugin/foo/profile_bar/play/1', {:controller => 'foo_plugin_profile_bar', :action => 'play', :id => '1', :profile => 'test'}) + assert_routing('/myprofile/test/plugin/foo/myprofile_bar/play/1', {:controller => 'foo_plugin_myprofile_bar', :action => 'play', :id => '1', :profile => 'test'}) + assert_routing('/admin/plugin/foo/admin_bar/play/1', {:controller => 'foo_plugin_admin_bar', :action => 'play', :id => '1'}) + end + end -- libgit2 0.21.2