aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJosé Valim <jose.valim@gmail.com>2009-12-27 13:31:36 +0100
committerJosé Valim <jose.valim@gmail.com>2009-12-27 13:31:36 +0100
commit7e8b7f46bfc086a36db996420fbee93348c5268e (patch)
tree7c4e309b378ce6a3d39c60785efc603619e25ac8
parent75ba102a80965b2612df0253d1278581a88b8d66 (diff)
downloadrails-7e8b7f46bfc086a36db996420fbee93348c5268e.tar.gz
rails-7e8b7f46bfc086a36db996420fbee93348c5268e.tar.bz2
rails-7e8b7f46bfc086a36db996420fbee93348c5268e.zip
Add config.action_controller.include behavior to plugins.
-rw-r--r--railties/lib/rails/configuration.rb20
-rw-r--r--railties/lib/rails/plugin.rb18
-rw-r--r--railties/test/plugins/configuration_test.rb16
3 files changed, 53 insertions, 1 deletions
diff --git a/railties/lib/rails/configuration.rb b/railties/lib/rails/configuration.rb
index 086f67a419..cb321536d2 100644
--- a/railties/lib/rails/configuration.rb
+++ b/railties/lib/rails/configuration.rb
@@ -1,6 +1,24 @@
require 'active_support/ordered_options'
module Rails
+ # Create a Plugin::Options from ActiveSuppot::OrderedOptions,
+ # which support the following syntax:
+ #
+ # controller.action_controller.include FooBar
+ #
+ class Plugin::Options < ActiveSupport::OrderedOptions #:nodoc:
+ attr_reader :includes
+
+ def initialize(*args)
+ @includes = []
+ super
+ end
+
+ def include(*args)
+ @includes.concat(args)
+ end
+ end
+
# Temporarily separate the plugin configuration class from the main
# configuration class while this bit is being cleaned up.
class Plugin::Configuration
@@ -16,7 +34,7 @@ module Rails
@options = base.options.dup
@middleware = base.middleware.dup
else
- @options = Hash.new { |h,k| h[k] = ActiveSupport::OrderedOptions.new }
+ @options = Hash.new { |h,k| h[k] = Rails::Plugin::Options.new }
@middleware = ActionDispatch::MiddlewareStack.new
end
end
diff --git a/railties/lib/rails/plugin.rb b/railties/lib/rails/plugin.rb
index 0699affea7..aa325c6f76 100644
--- a/railties/lib/rails/plugin.rb
+++ b/railties/lib/rails/plugin.rb
@@ -25,6 +25,24 @@ module Rails
Configuration.default
end
+ # Creates an initializer which includes all given modules to the given class.
+ #
+ # module Rails
+ # class ActionController < Rails::Plugin
+ # plugin_name :action_controller
+ # include_modules_in "ActionController::Base"
+ # end
+ # end
+ #
+ def self.include_modules_in(klass, from=plugin_name)
+ self.initializer :"#{from}.include_modules" do |app|
+ klass = klass.constantize if klass.is_a?(String)
+ app.config.send(from).includes.each do |mod|
+ klass.send(:include, mod.is_a?(String) ? mod.constantize : mod)
+ end
+ end
+ end
+
class Vendored < Plugin
def self.all(list, paths)
plugins = []
diff --git a/railties/test/plugins/configuration_test.rb b/railties/test/plugins/configuration_test.rb
index 5786316d1d..0843d05577 100644
--- a/railties/test/plugins/configuration_test.rb
+++ b/railties/test/plugins/configuration_test.rb
@@ -8,6 +8,10 @@ module PluginsTest
require "rails"
end
+ module Bar; end
+ module Baz; end
+ module All; end
+
test "config is available to plugins" do
class Foo < Rails::Plugin ; end
assert_nil Foo.config.action_controller.foo
@@ -24,6 +28,18 @@ module PluginsTest
assert_equal "hello", AppTemplate::Application.config.foo.greetings
end
+ test "plugin configurations allow modules to be given" do
+ class Foo < Rails::Plugin ; config.foo.include(Bar, Baz) ; end
+ assert_equal [Bar, Baz], Foo.config.foo.includes
+ end
+
+ test "plugin includes given modules in given class" do
+ class Foo < Rails::Plugin ; config.foo.include(Bar, "PluginsTest::ConfigurationTest::Baz") ; include_modules_in All ; end
+ Foo.new.run_initializers(Foo)
+ assert All.ancestors.include?(Bar)
+ assert All.ancestors.include?(Baz)
+ end
+
test "plugin config merges are deep" do
class Foo < Rails::Plugin ; config.foo.greetings = 'hello' ; end
class MyApp < Rails::Application