mirror of
https://github.com/rails/rails.git
synced 2022-11-09 12:12:34 -05:00
Added AbstractController::Collector.
This commit is contained in:
parent
1ea84c38ea
commit
ddfc0725a0
4 changed files with 91 additions and 26 deletions
|
@ -10,6 +10,7 @@ module AbstractController
|
|||
|
||||
autoload :Base
|
||||
autoload :Callbacks
|
||||
autoload :Collector
|
||||
autoload :Helpers
|
||||
autoload :Layouts
|
||||
autoload :LocalizedCache
|
||||
|
|
30
actionpack/lib/abstract_controller/collector.rb
Normal file
30
actionpack/lib/abstract_controller/collector.rb
Normal file
|
@ -0,0 +1,30 @@
|
|||
module AbstractController
|
||||
module Collector
|
||||
def self.generate_method_for_mime(mime)
|
||||
sym = mime.is_a?(Symbol) ? mime : mime.to_sym
|
||||
const = sym.to_s.upcase
|
||||
class_eval <<-RUBY, __FILE__, __LINE__ + 1
|
||||
def #{sym}(*args, &block) # def html(*args, &block)
|
||||
custom(Mime::#{const}, *args, &block) # custom(Mime::HTML, *args, &block)
|
||||
end # end
|
||||
RUBY
|
||||
end
|
||||
|
||||
Mime::SET.each do |mime|
|
||||
generate_method_for_mime(mime)
|
||||
end
|
||||
|
||||
protected
|
||||
|
||||
def method_missing(symbol, &block)
|
||||
mime_constant = Mime.const_get(symbol.to_s.upcase)
|
||||
|
||||
if Mime::SET.include?(mime_constant)
|
||||
AbstractController::Collector.generate_method_for_mime(mime_constant)
|
||||
send(symbol, &block)
|
||||
else
|
||||
super
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
|
@ -1,3 +1,5 @@
|
|||
require 'abstract_controller/collector'
|
||||
|
||||
module ActionController #:nodoc:
|
||||
module MimeResponds #:nodoc:
|
||||
extend ActiveSupport::Concern
|
||||
|
@ -265,6 +267,7 @@ module ActionController #:nodoc:
|
|||
end
|
||||
|
||||
class Collector #:nodoc:
|
||||
include AbstractController::Collector
|
||||
attr_accessor :order
|
||||
|
||||
def initialize(&block)
|
||||
|
@ -289,32 +292,6 @@ module ActionController #:nodoc:
|
|||
def response_for(mime)
|
||||
@responses[mime] || @responses[Mime::ALL] || @default_response
|
||||
end
|
||||
|
||||
def self.generate_method_for_mime(mime)
|
||||
sym = mime.is_a?(Symbol) ? mime : mime.to_sym
|
||||
const = sym.to_s.upcase
|
||||
class_eval <<-RUBY, __FILE__, __LINE__ + 1
|
||||
def #{sym}(&block) # def html(&block)
|
||||
custom(Mime::#{const}, &block) # custom(Mime::HTML, &block)
|
||||
end # end
|
||||
RUBY
|
||||
end
|
||||
|
||||
Mime::SET.each do |mime|
|
||||
generate_method_for_mime(mime)
|
||||
end
|
||||
|
||||
def method_missing(symbol, &block)
|
||||
mime_constant = Mime.const_get(symbol.to_s.upcase)
|
||||
|
||||
if Mime::SET.include?(mime_constant)
|
||||
self.class.generate_method_for_mime(mime_constant)
|
||||
send(symbol, &block)
|
||||
else
|
||||
super
|
||||
end
|
||||
end
|
||||
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
57
actionpack/test/abstract/collector_test.rb
Normal file
57
actionpack/test/abstract/collector_test.rb
Normal file
|
@ -0,0 +1,57 @@
|
|||
require 'abstract_unit'
|
||||
|
||||
module AbstractController
|
||||
module Testing
|
||||
class MyCollector
|
||||
include Collector
|
||||
attr_accessor :responses
|
||||
|
||||
def initialize
|
||||
@responses = []
|
||||
end
|
||||
|
||||
def custom(mime, *args, &block)
|
||||
@responses << [mime, args, block]
|
||||
end
|
||||
end
|
||||
|
||||
class TestCollector < ActiveSupport::TestCase
|
||||
test "responds to default mime types" do
|
||||
collector = MyCollector.new
|
||||
assert_respond_to collector, :html
|
||||
assert_respond_to collector, :text
|
||||
end
|
||||
|
||||
test "does not respond to unknown mime types" do
|
||||
collector = MyCollector.new
|
||||
assert !collector.respond_to?(:unknown)
|
||||
end
|
||||
|
||||
test "register mime types on method missing" do
|
||||
AbstractController::Collector.send(:remove_method, :js)
|
||||
collector = MyCollector.new
|
||||
assert !collector.respond_to?(:js)
|
||||
collector.js
|
||||
assert_respond_to collector, :js
|
||||
end
|
||||
|
||||
test "does not register unknown mime types" do
|
||||
collector = MyCollector.new
|
||||
assert_raise NameError do
|
||||
collector.unknown
|
||||
end
|
||||
end
|
||||
|
||||
test "generated methods call custom with args received" do
|
||||
collector = MyCollector.new
|
||||
collector.html
|
||||
collector.text(:foo)
|
||||
collector.js(:bar) { :baz }
|
||||
assert_equal [Mime::HTML, [], nil], collector.responses[0]
|
||||
assert_equal [Mime::TEXT, [:foo], nil], collector.responses[1]
|
||||
assert_equal [Mime::JS, [:bar]], collector.responses[2][0,2]
|
||||
assert_equal :baz, collector.responses[2][2].call
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
Loading…
Reference in a new issue