提交 7e8b7f46 编写于 作者: J José Valim

Add config.action_controller.include behavior to plugins.

上级 75ba102a
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 @@ def initialize(base = nil)
@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
......
......@@ -25,6 +25,24 @@ def self.config
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 = []
......
......@@ -8,6 +8,10 @@ def setup
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 @@ class Foo < Rails::Plugin ; config.foo.greetings = "hello" ; end
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
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册