Make module dependency DSL opt in

This commit is contained in:
Joshua Peek 2009-05-07 10:29:22 -05:00
parent 783deae99a
commit 2854535b02
14 changed files with 64 additions and 52 deletions

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

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