1
0
Fork 0
mirror of https://github.com/rails/rails.git synced 2022-11-09 12:12:34 -05:00

Add config.action_controller.include behavior to plugins.

This commit is contained in:
José Valim 2009-12-27 13:31:36 +01:00
parent 75ba102a80
commit 7e8b7f46bf
3 changed files with 53 additions and 1 deletions

View file

@ -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

View file

@ -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 = []

View file

@ -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