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:
parent
75ba102a80
commit
7e8b7f46bf
3 changed files with 53 additions and 1 deletions
|
@ -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
|
||||
|
|
|
@ -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 = []
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in a new issue