From 49846f85864f4b59d5593c30ee3c59b584d2975d Mon Sep 17 00:00:00 2001 From: Joshua Peek Date: Wed, 14 May 2008 12:48:37 -0500 Subject: [PATCH] Create a seperate file for ActiveSupport::OrderedHash. --- activesupport/lib/active_support.rb | 1 + .../lib/active_support/ordered_hash.rb | 43 ++++++++++++++++++ .../lib/active_support/ordered_options.rb | 44 ------------------ activesupport/test/ordered_hash_test.rb | 45 +++++++++++++++++++ activesupport/test/ordered_options_test.rb | 44 ------------------ 5 files changed, 89 insertions(+), 88 deletions(-) create mode 100644 activesupport/lib/active_support/ordered_hash.rb create mode 100644 activesupport/test/ordered_hash_test.rb diff --git a/activesupport/lib/active_support.rb b/activesupport/lib/active_support.rb index 4d2f873a8d..e4cb145c98 100644 --- a/activesupport/lib/active_support.rb +++ b/activesupport/lib/active_support.rb @@ -39,6 +39,7 @@ require 'active_support/dependencies' require 'active_support/deprecation' +require 'active_support/ordered_hash' require 'active_support/ordered_options' require 'active_support/option_merger' diff --git a/activesupport/lib/active_support/ordered_hash.rb b/activesupport/lib/active_support/ordered_hash.rb new file mode 100644 index 0000000000..6993621ef9 --- /dev/null +++ b/activesupport/lib/active_support/ordered_hash.rb @@ -0,0 +1,43 @@ +# OrderedHash is namespaced to prevent conflicts with other implementations +module ActiveSupport + # Hash is ordered in Ruby 1.9! + if RUBY_VERSION >= '1.9' + OrderedHash = ::Hash + else + class OrderedHash < Array #:nodoc: + def []=(key, value) + if pair = assoc(key) + pair.pop + pair << value + else + self << [key, value] + end + end + + def [](key) + pair = assoc(key) + pair ? pair.last : nil + end + + def delete(key) + pair = assoc(key) + pair ? array_index = index(pair) : nil + array_index ? delete_at(array_index).last : nil + end + + def keys + collect { |key, value| key } + end + + def values + collect { |key, value| value } + end + + def to_hash + returning({}) do |hash| + each { |array| hash[array[0]] = array[1] } + end + end + end + end +end diff --git a/activesupport/lib/active_support/ordered_options.rb b/activesupport/lib/active_support/ordered_options.rb index 3172f62f0d..306376e9ae 100644 --- a/activesupport/lib/active_support/ordered_options.rb +++ b/activesupport/lib/active_support/ordered_options.rb @@ -1,47 +1,3 @@ -# OrderedHash is namespaced to prevent conflicts with other implementations -module ActiveSupport - # Hash is ordered in Ruby 1.9! - if RUBY_VERSION >= '1.9' - OrderedHash = ::Hash - else - class OrderedHash < Array #:nodoc: - def []=(key, value) - if pair = assoc(key) - pair.pop - pair << value - else - self << [key, value] - end - end - - def [](key) - pair = assoc(key) - pair ? pair.last : nil - end - - def delete(key) - pair = assoc(key) - pair ? array_index = index(pair) : nil - array_index ? delete_at(array_index).last : nil - end - - def keys - collect { |key, value| key } - end - - def values - collect { |key, value| value } - end - - def to_hash - returning({}) do |hash| - each { |array| hash[array[0]] = array[1] } - end - end - end - end -end - class OrderedOptions < ActiveSupport::OrderedHash #:nodoc: def []=(key, value) super(key.to_sym, value) diff --git a/activesupport/test/ordered_hash_test.rb b/activesupport/test/ordered_hash_test.rb new file mode 100644 index 0000000000..14be48724e --- /dev/null +++ b/activesupport/test/ordered_hash_test.rb @@ -0,0 +1,45 @@ +require 'abstract_unit' + +class OrderedHashTest < Test::Unit::TestCase + def setup + @keys = %w( blue green red pink orange ) + @values = %w( 000099 009900 aa0000 cc0066 cc6633 ) + @ordered_hash = ActiveSupport::OrderedHash.new + + @keys.each_with_index do |key, index| + @ordered_hash[key] = @values[index] + end + end + + def test_order + assert_equal @keys, @ordered_hash.keys + assert_equal @values, @ordered_hash.values + end + + def test_access + assert @keys.zip(@values).all? { |k, v| @ordered_hash[k] == v } + end + + def test_assignment + key, value = 'purple', '5422a8' + + @ordered_hash[key] = value + assert_equal @keys.length + 1, @ordered_hash.length + assert_equal key, @ordered_hash.keys.last + assert_equal value, @ordered_hash.values.last + assert_equal value, @ordered_hash[key] + end + + def test_delete + key, value = 'white', 'ffffff' + bad_key = 'black' + + @ordered_hash[key] = value + assert_equal @keys.length + 1, @ordered_hash.length + + assert_equal value, @ordered_hash.delete(key) + assert_equal @keys.length, @ordered_hash.length + + assert_nil @ordered_hash.delete(bad_key) + end +end diff --git a/activesupport/test/ordered_options_test.rb b/activesupport/test/ordered_options_test.rb index 3d537a0ae4..fb7a58d0b0 100644 --- a/activesupport/test/ordered_options_test.rb +++ b/activesupport/test/ordered_options_test.rb @@ -1,49 +1,5 @@ require 'abstract_unit' -class OrderedHashTest < Test::Unit::TestCase - def setup - @keys = %w( blue green red pink orange ) - @values = %w( 000099 009900 aa0000 cc0066 cc6633 ) - @ordered_hash = ActiveSupport::OrderedHash.new - - @keys.each_with_index do |key, index| - @ordered_hash[key] = @values[index] - end - end - - def test_order - assert_equal @keys, @ordered_hash.keys - assert_equal @values, @ordered_hash.values - end - - def test_access - assert @keys.zip(@values).all? { |k, v| @ordered_hash[k] == v } - end - - def test_assignment - key, value = 'purple', '5422a8' - - @ordered_hash[key] = value - assert_equal @keys.length + 1, @ordered_hash.length - assert_equal key, @ordered_hash.keys.last - assert_equal value, @ordered_hash.values.last - assert_equal value, @ordered_hash[key] - end - - def test_delete - key, value = 'white', 'ffffff' - bad_key = 'black' - - @ordered_hash[key] = value - assert_equal @keys.length + 1, @ordered_hash.length - - assert_equal value, @ordered_hash.delete(key) - assert_equal @keys.length, @ordered_hash.length - - assert_nil @ordered_hash.delete(bad_key) - end -end - class OrderedOptionsTest < Test::Unit::TestCase def test_usage a = OrderedOptions.new -- GitLab