diff options
author | Josh Owens <joshua.owens@gmail.com> | 2008-07-16 19:31:37 -0500 |
---|---|---|
committer | Joshua Peek <josh@joshpeek.com> | 2008-07-16 19:31:37 -0500 |
commit | 396f9df8916b71f83aad8d56559cf55fc8501679 (patch) | |
tree | 05361067dd4c91f048493939fa8dbda442ec52e4 /activesupport | |
parent | 7ae2105d57d3c08bebde44bd72093dd43c48d613 (diff) | |
download | rails-396f9df8916b71f83aad8d56559cf55fc8501679.tar.gz rails-396f9df8916b71f83aad8d56559cf55fc8501679.tar.bz2 rails-396f9df8916b71f83aad8d56559cf55fc8501679.zip |
Hash#slice supports an array of keys [#613 state:resolved]
Signed-off-by: Joshua Peek <josh@joshpeek.com>
Diffstat (limited to 'activesupport')
-rw-r--r-- | activesupport/lib/active_support/core_ext/hash/slice.rb | 1 | ||||
-rw-r--r-- | activesupport/test/core_ext/hash_ext_test.rb | 56 |
2 files changed, 36 insertions, 21 deletions
diff --git a/activesupport/lib/active_support/core_ext/hash/slice.rb b/activesupport/lib/active_support/core_ext/hash/slice.rb index be4dec6e53..d3837d2e54 100644 --- a/activesupport/lib/active_support/core_ext/hash/slice.rb +++ b/activesupport/lib/active_support/core_ext/hash/slice.rb @@ -12,6 +12,7 @@ module ActiveSupport #:nodoc: module Slice # Returns a new hash with only the given keys. def slice(*keys) + keys.flatten! keys = keys.map! { |key| convert_key(key) } if respond_to?(:convert_key) hash = {} keys.each { |k| hash[k] = self[k] if has_key?(k) } diff --git a/activesupport/test/core_ext/hash_ext_test.rb b/activesupport/test/core_ext/hash_ext_test.rb index 69028a123f..26e65075eb 100644 --- a/activesupport/test/core_ext/hash_ext_test.rb +++ b/activesupport/test/core_ext/hash_ext_test.rb @@ -282,6 +282,20 @@ class HashExtTest < Test::Unit::TestCase assert_equal expected, original end + # This is needed for something like hash.slice!(hash.keys.sort_by {rand} [0..4]) + def test_slice_with_array_keys + original = { :a => 'x', :b => 'y', :c => 10 } + expected = { :a => 'x', :b => 'y' } + + # Should return a new hash with only the given keys, when given an array of keys. + assert_equal expected, original.slice([:a, :b]) + assert_not_equal expected, original + + # Should replace the hash with only the given keys, when given an array of keys. + assert_equal expected, original.slice!([:a, :b]) + assert_equal expected, original + end + def test_indifferent_slice original = { :a => 'x', :b => 'y', :c => 10 }.with_indifferent_access expected = { :a => 'x', :b => 'y' }.with_indifferent_access @@ -469,12 +483,12 @@ class HashToXmlTest < Test::Unit::TestCase EOT expected_topic_hash = { - :title => nil, + :title => nil, :id => nil, :approved => nil, :written_on => nil, :viewed_at => nil, - :content => nil, + :content => nil, :parent_id => nil }.stringify_keys @@ -552,7 +566,7 @@ class HashToXmlTest < Test::Unit::TestCase assert_equal expected_topic_hash, Hash.from_xml(topic_xml)["rsp"]["photos"]["photo"] end - + def test_empty_array_from_xml blog_xml = <<-XML <blog> @@ -650,13 +664,13 @@ class HashToXmlTest < Test::Unit::TestCase assert_equal expected_bacon_hash, Hash.from_xml(bacon_xml)["bacon"] end - + def test_type_trickles_through_when_unknown product_xml = <<-EOT <product> <weight type="double">0.5</weight> <image type="ProductImage"><filename>image.gif</filename></image> - + </product> EOT @@ -665,7 +679,7 @@ class HashToXmlTest < Test::Unit::TestCase :image => {'type' => 'ProductImage', 'filename' => 'image.gif' }, }.stringify_keys - assert_equal expected_product_hash, Hash.from_xml(product_xml)["product"] + assert_equal expected_product_hash, Hash.from_xml(product_xml)["product"] end def test_should_use_default_value_for_unknown_key @@ -699,41 +713,41 @@ class HashToXmlTest < Test::Unit::TestCase assert_equal expected, hash.to_xml(@xml_options) end end - - def test_empty_string_works_for_typecast_xml_value + + def test_empty_string_works_for_typecast_xml_value assert_nothing_raised do Hash.send!(:typecast_xml_value, "") end end - + def test_escaping_to_xml - hash = { - :bare_string => 'First & Last Name', + hash = { + :bare_string => 'First & Last Name', :pre_escaped_string => 'First & Last Name' }.stringify_keys - + expected_xml = '<person><bare-string>First & Last Name</bare-string><pre-escaped-string>First &amp; Last Name</pre-escaped-string></person>' assert_equal expected_xml, hash.to_xml(@xml_options) end - + def test_unescaping_from_xml xml_string = '<person><bare-string>First & Last Name</bare-string><pre-escaped-string>First &amp; Last Name</pre-escaped-string></person>' - expected_hash = { - :bare_string => 'First & Last Name', + expected_hash = { + :bare_string => 'First & Last Name', :pre_escaped_string => 'First & Last Name' }.stringify_keys assert_equal expected_hash, Hash.from_xml(xml_string)['person'] end - + def test_roundtrip_to_xml_from_xml - hash = { - :bare_string => 'First & Last Name', + hash = { + :bare_string => 'First & Last Name', :pre_escaped_string => 'First & Last Name' }.stringify_keys assert_equal hash, Hash.from_xml(hash.to_xml(@xml_options))['person'] end - + def test_datetime_xml_type_with_utc_time alert_xml = <<-XML <alert> @@ -744,7 +758,7 @@ class HashToXmlTest < Test::Unit::TestCase assert alert_at.utc? assert_equal Time.utc(2008, 2, 10, 15, 30, 45), alert_at end - + def test_datetime_xml_type_with_non_utc_time alert_xml = <<-XML <alert> @@ -755,7 +769,7 @@ class HashToXmlTest < Test::Unit::TestCase assert alert_at.utc? assert_equal Time.utc(2008, 2, 10, 15, 30, 45), alert_at end - + def test_datetime_xml_type_with_far_future_date alert_xml = <<-XML <alert> |