Skip to content

Commit

Permalink
Add depends_on, use, and setup to abstract up ideas about module inhe…
Browse files Browse the repository at this point in the history
…ritance.
  • Loading branch information
wycats committed Apr 7, 2009
1 parent 9c8eaf8 commit c1aa5b0
Show file tree
Hide file tree
Showing 15 changed files with 82 additions and 73 deletions.
9 changes: 3 additions & 6 deletions actionpack/lib/action_controller/abstract/callbacks.rb
@@ -1,11 +1,8 @@
module AbstractController
module Callbacks
def self.included(klass)
klass.class_eval do
include ActiveSupport::NewCallbacks
define_callbacks :process_action
extend ClassMethods
end
setup do
include ActiveSupport::NewCallbacks
define_callbacks :process_action
end

def process_action
Expand Down
23 changes: 12 additions & 11 deletions actionpack/lib/action_controller/abstract/helpers.rb
@@ -1,17 +1,18 @@
module AbstractController
module Helpers

def self.included(klass)
klass.class_eval do
extend ClassMethods
unless self < ::AbstractController::Renderer
raise "You need to include AbstractController::Renderer before including " \
"AbstractController::Helpers"
end
extlib_inheritable_accessor :master_helper_module
self.master_helper_module = Module.new
end
depends_on Renderer

setup do
extlib_inheritable_accessor :master_helper_module
self.master_helper_module = Module.new
end

# def self.included(klass)
# klass.class_eval do
# extlib_inheritable_accessor :master_helper_module
# self.master_helper_module = Module.new
# end
# end

def _action_view
@_action_view ||= begin
Expand Down
17 changes: 8 additions & 9 deletions actionpack/lib/action_controller/abstract/layouts.rb
@@ -1,25 +1,24 @@
module AbstractController
module Layouts

def self.included(base)
base.extend ClassMethods
end

depends_on Renderer

module ClassMethods
def layout(layout)
unless [String, Symbol, FalseClass, NilClass].include?(layout.class)
raise ArgumentError, "Layouts must be specified as a String, Symbol, false, or nil"
end

@layout = layout || false # Converts nil to false
@_layout = layout || false # Converts nil to false
_write_layout_method
end

def _write_layout_method
case @layout
case @_layout
when String
self.class_eval %{def _layout() #{@layout.inspect} end}
self.class_eval %{def _layout() #{@_layout.inspect} end}
when Symbol
self.class_eval %{def _layout() #{@layout} end}
self.class_eval %{def _layout() #{@_layout} end}
when false
self.class_eval %{def _layout() end}
else
Expand All @@ -43,7 +42,7 @@ def _render_template(template, options)
private

def _layout() end # This will be overwritten

def _layout_for_option(name)
case name
when String then _layout_for_name(name)
Expand Down
4 changes: 2 additions & 2 deletions actionpack/lib/action_controller/abstract/logger.rb
@@ -1,7 +1,7 @@
module AbstractController
module Logger
def self.included(klass)
klass.cattr_accessor :logger
setup do
cattr_accessor :logger
end
end
end
20 changes: 8 additions & 12 deletions actionpack/lib/action_controller/abstract/renderer.rb
Expand Up @@ -2,20 +2,16 @@

module AbstractController
module Renderer
depends_on AbstractController::Logger

def self.included(klass)
klass.class_eval do
extend ClassMethods

attr_internal :formats

extlib_inheritable_accessor :_view_paths

self._view_paths ||= ActionView::PathSet.new
include AbstractController::Logger
end
setup do
attr_internal :formats

extlib_inheritable_accessor :_view_paths

self._view_paths ||= ActionView::PathSet.new
end

def _action_view
@_action_view ||= ActionView::Base.new(self.class.view_paths, {}, self)
end
Expand Down
9 changes: 3 additions & 6 deletions actionpack/lib/action_controller/new_base/hide_actions.rb
@@ -1,11 +1,8 @@
module ActionController
module HideActions
def self.included(klass)
klass.class_eval do
extend ClassMethods
extlib_inheritable_accessor :hidden_actions
self.hidden_actions ||= Set.new
end
setup do
extlib_inheritable_accessor :hidden_actions
self.hidden_actions ||= Set.new
end

def action_methods() self.class.action_names end
Expand Down
3 changes: 3 additions & 0 deletions actionpack/lib/action_controller/new_base/layouts.rb
@@ -1,5 +1,8 @@
module ActionController
module Layouts
depends_on ActionController::Renderer
depends_on AbstractController::Layouts

def render_to_string(options)
if !options.key?(:text) || options.key?(:layout)
options[:_layout] = options.key?(:layout) ? _layout_for_option(options[:layout]) : _default_layout
Expand Down
11 changes: 1 addition & 10 deletions actionpack/lib/action_controller/new_base/renderer.rb
@@ -1,15 +1,6 @@
module ActionController
module Renderer

# def self.included(klass)
# klass.extend ClassMethods
# end
#
# module ClassMethods
# def prefix
# @prefix ||= name.underscore
# end
# end
depends_on AbstractController::Renderer

def initialize(*)
self.formats = [:html]
Expand Down
Expand Up @@ -27,7 +27,7 @@ class TestBasic < ActiveSupport::TestCase
# Test Render mixin
# ====
class RenderingController < AbstractController::Base
include Renderer
use Renderer

def _prefix() end

Expand Down Expand Up @@ -116,7 +116,7 @@ class TestPrefixedViews < ActiveSupport::TestCase
# ====
# self._layout is used when defined
class WithLayouts < PrefixedViews
include Layouts
use Layouts

private
def self.layout(formats)
Expand Down
2 changes: 1 addition & 1 deletion actionpack/test/abstract_controller/callbacks_test.rb
Expand Up @@ -4,7 +4,7 @@ module AbstractController
module Testing

class ControllerWithCallbacks < AbstractController::Base
include AbstractController::Callbacks
use AbstractController::Callbacks
end

class Callback1 < ControllerWithCallbacks
Expand Down
4 changes: 2 additions & 2 deletions actionpack/test/abstract_controller/helper_test.rb
Expand Up @@ -4,8 +4,8 @@ module AbstractController
module Testing

class ControllerWithHelpers < AbstractController::Base
include Renderer
include Helpers
use Renderer
use Helpers

def render(string)
super(:_template_name => string)
Expand Down
4 changes: 2 additions & 2 deletions actionpack/test/abstract_controller/layouts_test.rb
Expand Up @@ -5,8 +5,8 @@ module Layouts

# Base controller for these tests
class Base < AbstractController::Base
include AbstractController::Renderer
include AbstractController::Layouts
use AbstractController::Renderer
use AbstractController::Layouts

self.view_paths = [ActionView::FixtureTemplate::FixturePath.new(
"layouts/hello.erb" => "With String <%= yield %>",
Expand Down
18 changes: 8 additions & 10 deletions actionpack/test/new_base/test_helper.rb
Expand Up @@ -26,16 +26,14 @@

module ActionController
class Base2 < AbstractBase
include AbstractController::Callbacks
include AbstractController::Renderer
include AbstractController::Helpers
include AbstractController::Layouts
include AbstractController::Logger

include ActionController::HideActions
include ActionController::UrlFor
include ActionController::Layouts
include ActionController::Renderer
use AbstractController::Callbacks
use AbstractController::Helpers
use AbstractController::Logger

use ActionController::HideActions
use ActionController::UrlFor
use ActionController::Renderer
use ActionController::Layouts

def self.inherited(klass)
::ActionController::Base2.subclasses << klass.to_s
Expand Down
1 change: 1 addition & 0 deletions activesupport/lib/active_support/core_ext/module.rb
Expand Up @@ -8,6 +8,7 @@
require 'active_support/core_ext/module/aliasing'
require 'active_support/core_ext/module/model_naming'
require 'active_support/core_ext/module/synchronization'
require 'active_support/core_ext/module/setup'

module ActiveSupport
module CoreExtensions
Expand Down
26 changes: 26 additions & 0 deletions activesupport/lib/active_support/core_ext/module/setup.rb
@@ -0,0 +1,26 @@
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

3 comments on commit c1aa5b0

@Manfred
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hey cool, where are the tests for core_ext/module/setup?

@mynyml
Copy link
Contributor

@mynyml mynyml commented on c1aa5b0 Apr 14, 2009

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

nice addition

@wycats
Copy link
Member Author

@wycats wycats commented on c1aa5b0 Apr 16, 2009

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Manfred: Good catch. Josh wants to move these into private methods of ActionController, but it makes sense to have some tests testing the core functionality.

Please sign in to comment.