Extract ActiveSupport::TypedArray class to ensure an array is all of the same type [#673 state:resolved]
This commit is contained in:
parent
bc5896e708
commit
2681685450
@ -1,5 +1,5 @@
|
||||
module ActionView #:nodoc:
|
||||
class PathSet < Array #:nodoc:
|
||||
class PathSet < ActiveSupport::TypedArray #:nodoc:
|
||||
def self.type_cast(obj)
|
||||
if obj.is_a?(String)
|
||||
if Base.warn_cache_misses && defined?(Rails) && Rails.initialized?
|
||||
@ -25,7 +25,7 @@ def self.eager_load_templates?
|
||||
end
|
||||
|
||||
attr_reader :path, :paths
|
||||
delegate :to_s, :to_str, :inspect, :to => :path
|
||||
delegate :to_s, :to_str, :hash, :inspect, :to => :path
|
||||
|
||||
def initialize(path)
|
||||
raise ArgumentError, "path already is a Path class" if path.is_a?(Path)
|
||||
@ -38,6 +38,10 @@ def ==(path)
|
||||
to_str == path.to_str
|
||||
end
|
||||
|
||||
def eql?(path)
|
||||
to_str == path.to_str
|
||||
end
|
||||
|
||||
def [](path)
|
||||
@paths[path]
|
||||
end
|
||||
@ -67,28 +71,10 @@ def templates_in_path
|
||||
end
|
||||
end
|
||||
|
||||
def initialize(*args)
|
||||
super(*args).map! { |obj| self.class.type_cast(obj) }
|
||||
end
|
||||
|
||||
def reload!
|
||||
each { |path| path.reload! }
|
||||
end
|
||||
|
||||
def <<(obj)
|
||||
super(self.class.type_cast(obj))
|
||||
end
|
||||
|
||||
def push(*objs)
|
||||
delete_paths!(objs)
|
||||
super(*objs.map { |obj| self.class.type_cast(obj) })
|
||||
end
|
||||
|
||||
def unshift(*objs)
|
||||
delete_paths!(objs)
|
||||
super(*objs.map { |obj| self.class.type_cast(obj) })
|
||||
end
|
||||
|
||||
def [](template_path)
|
||||
each do |path|
|
||||
if template = path[template_path]
|
||||
@ -97,10 +83,5 @@ def [](template_path)
|
||||
end
|
||||
nil
|
||||
end
|
||||
|
||||
private
|
||||
def delete_paths!(paths)
|
||||
paths.each { |p1| delete_if { |p2| p1.to_s == p2.to_s } }
|
||||
end
|
||||
end
|
||||
end
|
||||
|
@ -54,10 +54,7 @@ def test_controller_appends_view_path_correctly
|
||||
assert_equal [FIXTURE_LOAD_PATH, 'foo', 'bar', 'baz'], @controller.view_paths
|
||||
|
||||
@controller.append_view_path(FIXTURE_LOAD_PATH)
|
||||
assert_equal ['foo', 'bar', 'baz', FIXTURE_LOAD_PATH], @controller.view_paths
|
||||
|
||||
@controller.append_view_path([FIXTURE_LOAD_PATH])
|
||||
assert_equal ['foo', 'bar', 'baz', FIXTURE_LOAD_PATH], @controller.view_paths
|
||||
assert_equal [FIXTURE_LOAD_PATH, 'foo', 'bar', 'baz', FIXTURE_LOAD_PATH], @controller.view_paths
|
||||
end
|
||||
|
||||
def test_controller_prepends_view_path_correctly
|
||||
@ -68,10 +65,7 @@ def test_controller_prepends_view_path_correctly
|
||||
assert_equal ['foo', 'bar', 'baz', FIXTURE_LOAD_PATH], @controller.view_paths
|
||||
|
||||
@controller.prepend_view_path(FIXTURE_LOAD_PATH)
|
||||
assert_equal [FIXTURE_LOAD_PATH, 'foo', 'bar', 'baz'], @controller.view_paths
|
||||
|
||||
@controller.prepend_view_path([FIXTURE_LOAD_PATH])
|
||||
assert_equal [FIXTURE_LOAD_PATH, 'foo', 'bar', 'baz'], @controller.view_paths
|
||||
assert_equal [FIXTURE_LOAD_PATH, 'foo', 'bar', 'baz', FIXTURE_LOAD_PATH], @controller.view_paths
|
||||
end
|
||||
|
||||
def test_template_appends_view_path_correctly
|
||||
|
@ -39,6 +39,7 @@
|
||||
require 'active_support/dependencies'
|
||||
require 'active_support/deprecation'
|
||||
|
||||
require 'active_support/typed_array'
|
||||
require 'active_support/ordered_hash'
|
||||
require 'active_support/ordered_options'
|
||||
require 'active_support/option_merger'
|
||||
|
31
activesupport/lib/active_support/typed_array.rb
Normal file
31
activesupport/lib/active_support/typed_array.rb
Normal file
@ -0,0 +1,31 @@
|
||||
module ActiveSupport
|
||||
class TypedArray < Array
|
||||
def self.type_cast(obj)
|
||||
obj
|
||||
end
|
||||
|
||||
def initialize(*args)
|
||||
super(*args).map! { |obj| self.class.type_cast(obj) }
|
||||
end
|
||||
|
||||
def <<(obj)
|
||||
super(self.class.type_cast(obj))
|
||||
end
|
||||
|
||||
def concat(array)
|
||||
super(array.map! { |obj| self.class.type_cast(obj) })
|
||||
end
|
||||
|
||||
def insert(index, obj)
|
||||
super(index, self.class.type_cast(obj))
|
||||
end
|
||||
|
||||
def push(*objs)
|
||||
super(*objs.map { |obj| self.class.type_cast(obj) })
|
||||
end
|
||||
|
||||
def unshift(*objs)
|
||||
super(*objs.map { |obj| self.class.type_cast(obj) })
|
||||
end
|
||||
end
|
||||
end
|
51
activesupport/test/typed_array_test.rb
Normal file
51
activesupport/test/typed_array_test.rb
Normal file
@ -0,0 +1,51 @@
|
||||
require 'abstract_unit'
|
||||
|
||||
class TypedArrayTest < Test::Unit::TestCase
|
||||
class StringArray < ActiveSupport::TypedArray
|
||||
def self.type_cast(obj)
|
||||
obj.to_s
|
||||
end
|
||||
end
|
||||
|
||||
def setup
|
||||
@array = StringArray.new
|
||||
end
|
||||
|
||||
def test_string_array_initialize
|
||||
assert_equal ["1", "2", "3"], StringArray.new([1, "2", :"3"])
|
||||
end
|
||||
|
||||
def test_string_array_append
|
||||
@array << 1
|
||||
@array << "2"
|
||||
@array << :"3"
|
||||
assert_equal ["1", "2", "3"], @array
|
||||
end
|
||||
|
||||
def test_string_array_concat
|
||||
@array.concat([1, "2"])
|
||||
@array.concat([:"3"])
|
||||
assert_equal ["1", "2", "3"], @array
|
||||
end
|
||||
|
||||
def test_string_array_insert
|
||||
@array.insert(0, 1)
|
||||
@array.insert(1, "2")
|
||||
@array.insert(2, :"3")
|
||||
assert_equal ["1", "2", "3"], @array
|
||||
end
|
||||
|
||||
def test_string_array_push
|
||||
@array.push(1)
|
||||
@array.push("2")
|
||||
@array.push(:"3")
|
||||
assert_equal ["1", "2", "3"], @array
|
||||
end
|
||||
|
||||
def test_string_array_unshift
|
||||
@array.unshift(:"3")
|
||||
@array.unshift("2")
|
||||
@array.unshift(1)
|
||||
assert_equal ["1", "2", "3"], @array
|
||||
end
|
||||
end
|
Loading…
Reference in New Issue
Block a user