Skip to content

Commit

Permalink
Extract ActiveSupport::TypedArray class to ensure an array is all of …
Browse files Browse the repository at this point in the history
…the same type [#673 state:resolved]
  • Loading branch information
josh committed Jul 22, 2008
1 parent bc5896e commit 2681685
Show file tree
Hide file tree
Showing 5 changed files with 91 additions and 33 deletions.
31 changes: 6 additions & 25 deletions actionpack/lib/action_view/paths.rb
@@ -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?
Expand All @@ -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)
Expand All @@ -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
Expand Down Expand Up @@ -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]
Expand All @@ -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
10 changes: 2 additions & 8 deletions actionpack/test/controller/view_paths_test.rb
Expand Up @@ -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
Expand All @@ -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
Expand Down
1 change: 1 addition & 0 deletions activesupport/lib/active_support.rb
Expand Up @@ -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'
Expand Down
31 changes: 31 additions & 0 deletions activesupport/lib/active_support/typed_array.rb
@@ -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 changes: 51 additions & 0 deletions activesupport/test/typed_array_test.rb
@@ -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

0 comments on commit 2681685

Please sign in to comment.