Make module dependency DSL opt in
This commit is contained in:
parent
783deae99a
commit
2854535b02
@ -1,5 +1,7 @@
|
||||
module AbstractController
|
||||
module Helpers
|
||||
extend ActiveSupport::DependencyModule
|
||||
|
||||
depends_on Renderer
|
||||
|
||||
setup do
|
||||
|
@ -1,5 +1,6 @@
|
||||
module AbstractController
|
||||
module Layouts
|
||||
extend ActiveSupport::DependencyModule
|
||||
|
||||
depends_on Renderer
|
||||
|
||||
|
@ -1,5 +1,7 @@
|
||||
module AbstractController
|
||||
module Logger
|
||||
extend ActiveSupport::DependencyModule
|
||||
|
||||
setup do
|
||||
cattr_accessor :logger
|
||||
end
|
||||
|
@ -2,6 +2,8 @@
|
||||
|
||||
module AbstractController
|
||||
module Renderer
|
||||
extend ActiveSupport::DependencyModule
|
||||
|
||||
depends_on AbstractController::Logger
|
||||
|
||||
setup do
|
||||
|
@ -1,5 +1,7 @@
|
||||
module ActionController
|
||||
module Layouts
|
||||
extend ActiveSupport::DependencyModule
|
||||
|
||||
depends_on ActionController::Renderer
|
||||
depends_on AbstractController::Layouts
|
||||
|
||||
|
@ -1,5 +1,7 @@
|
||||
module ActionController
|
||||
module Renderer
|
||||
extend ActiveSupport::DependencyModule
|
||||
|
||||
depends_on AbstractController::Renderer
|
||||
|
||||
def initialize(*)
|
||||
|
@ -4,7 +4,7 @@ module AbstractController
|
||||
module Testing
|
||||
|
||||
class ControllerWithCallbacks < AbstractController::Base
|
||||
use AbstractController::Callbacks
|
||||
include AbstractController::Callbacks
|
||||
end
|
||||
|
||||
class Callback1 < ControllerWithCallbacks
|
||||
|
@ -5,8 +5,8 @@ module Layouts
|
||||
|
||||
# Base controller for these tests
|
||||
class Base < AbstractController::Base
|
||||
use AbstractController::Renderer
|
||||
use AbstractController::Layouts
|
||||
include AbstractController::Renderer
|
||||
include AbstractController::Layouts
|
||||
|
||||
self.view_paths = [ActionView::FixtureTemplate::FixturePath.new(
|
||||
"layouts/hello.erb" => "With String <%= yield %>",
|
||||
|
@ -26,14 +26,14 @@
|
||||
|
||||
module ActionController
|
||||
class Base2 < AbstractBase
|
||||
use AbstractController::Callbacks
|
||||
use AbstractController::Helpers
|
||||
use AbstractController::Logger
|
||||
include AbstractController::Callbacks
|
||||
include AbstractController::Helpers
|
||||
include AbstractController::Logger
|
||||
|
||||
use ActionController::HideActions
|
||||
use ActionController::UrlFor
|
||||
use ActionController::Renderer
|
||||
use ActionController::Layouts
|
||||
include ActionController::HideActions
|
||||
include ActionController::UrlFor
|
||||
include ActionController::Renderer
|
||||
include ActionController::Layouts
|
||||
|
||||
def self.inherited(klass)
|
||||
::ActionController::Base2.subclasses << klass.to_s
|
||||
|
@ -34,6 +34,7 @@ def self.load_all!
|
||||
autoload :Callbacks, 'active_support/callbacks'
|
||||
autoload :NewCallbacks, 'active_support/new_callbacks'
|
||||
autoload :ConcurrentHash, 'active_support/concurrent_hash'
|
||||
autoload :DependencyModule, 'active_support/dependency_module'
|
||||
autoload :Deprecation, 'active_support/deprecation'
|
||||
autoload :Gzip, 'active_support/gzip'
|
||||
autoload :Inflector, 'active_support/inflector'
|
||||
|
@ -9,4 +9,3 @@
|
||||
require 'active_support/core_ext/module/loading'
|
||||
require 'active_support/core_ext/module/model_naming'
|
||||
require 'active_support/core_ext/module/synchronization'
|
||||
require 'active_support/core_ext/module/setup'
|
||||
|
@ -1,26 +0,0 @@
|
||||
class Module
|
||||
attr_accessor :_setup_block
|
||||
attr_accessor :_dependencies
|
||||
|
||||
def setup(&blk)
|
||||
@_setup_block = blk
|
||||
end
|
||||
|
||||
def use(mod)
|
||||
return if self < mod
|
||||
|
||||
(mod._dependencies || []).each do |dep|
|
||||
use dep
|
||||
end
|
||||
# raise "Circular dependencies" if self < mod
|
||||
include mod
|
||||
extend mod.const_get("ClassMethods") if mod.const_defined?("ClassMethods")
|
||||
class_eval(&mod._setup_block) if mod._setup_block
|
||||
end
|
||||
|
||||
def depends_on(mod)
|
||||
return if self < mod
|
||||
@_dependencies ||= []
|
||||
@_dependencies << mod
|
||||
end
|
||||
end
|
24
activesupport/lib/active_support/dependency_module.rb
Normal file
24
activesupport/lib/active_support/dependency_module.rb
Normal file
@ -0,0 +1,24 @@
|
||||
module ActiveSupport
|
||||
module DependencyModule
|
||||
def setup(&blk)
|
||||
@_setup_block = blk
|
||||
end
|
||||
|
||||
def append_features(base)
|
||||
return if base < self
|
||||
(@_dependencies ||= []).each { |dep| base.send(:include, dep) }
|
||||
super
|
||||
end
|
||||
|
||||
def included(base)
|
||||
base.extend const_get("ClassMethods") if const_defined?("ClassMethods")
|
||||
base.class_eval(&@_setup_block) if instance_variable_defined?("@_setup_block")
|
||||
end
|
||||
|
||||
def depends_on(mod)
|
||||
return if self < mod
|
||||
@_dependencies ||= []
|
||||
@_dependencies << mod
|
||||
end
|
||||
end
|
||||
end
|
@ -1,9 +1,10 @@
|
||||
require 'abstract_unit'
|
||||
require 'active_support/core/time'
|
||||
require 'active_support/core_ext/module/setup'
|
||||
require 'active_support/dependency_module'
|
||||
|
||||
class SetupTest < Test::Unit::TestCase
|
||||
class DependencyModuleTest < Test::Unit::TestCase
|
||||
module Baz
|
||||
extend ActiveSupport::DependencyModule
|
||||
|
||||
module ClassMethods
|
||||
def baz
|
||||
"baz"
|
||||
@ -28,6 +29,8 @@ def baz
|
||||
end
|
||||
|
||||
module Bar
|
||||
extend ActiveSupport::DependencyModule
|
||||
|
||||
depends_on Baz
|
||||
|
||||
def bar
|
||||
@ -44,31 +47,31 @@ def setup
|
||||
end
|
||||
|
||||
def test_module_is_included_normally
|
||||
@klass.use(Baz)
|
||||
@klass.send(:include, Baz)
|
||||
assert_equal "baz", @klass.new.baz
|
||||
assert_equal SetupTest::Baz, @klass.included_modules[0]
|
||||
assert_equal DependencyModuleTest::Baz, @klass.included_modules[0]
|
||||
|
||||
@klass.use(Baz)
|
||||
@klass.send(:include, Baz)
|
||||
assert_equal "baz", @klass.new.baz
|
||||
assert_equal SetupTest::Baz, @klass.included_modules[0]
|
||||
assert_equal DependencyModuleTest::Baz, @klass.included_modules[0]
|
||||
end
|
||||
|
||||
def test_class_methods_are_extended
|
||||
@klass.use(Baz)
|
||||
@klass.send(:include, Baz)
|
||||
assert_equal "baz", @klass.baz
|
||||
assert_equal SetupTest::Baz::ClassMethods, (class << @klass; self.included_modules; end)[0]
|
||||
assert_equal DependencyModuleTest::Baz::ClassMethods, (class << @klass; self.included_modules; end)[0]
|
||||
end
|
||||
|
||||
def test_setup_block_is_ran
|
||||
@klass.use(Baz)
|
||||
@klass.send(:include, Baz)
|
||||
assert_equal true, @klass.setup
|
||||
end
|
||||
|
||||
def test_modules_dependencies_are_met
|
||||
@klass.use(Bar)
|
||||
@klass.send(:include, Bar)
|
||||
assert_equal "bar", @klass.new.bar
|
||||
assert_equal "bar+baz", @klass.new.baz
|
||||
assert_equal "baz", @klass.baz
|
||||
assert_equal [SetupTest::Bar, SetupTest::Baz], @klass.included_modules[0..1]
|
||||
assert_equal [DependencyModuleTest::Bar, DependencyModuleTest::Baz], @klass.included_modules[0..1]
|
||||
end
|
||||
end
|
Loading…
Reference in New Issue
Block a user