From bf4e3f94d625dd6b7fffcd7cfc1cbe867e266254 Mon Sep 17 00:00:00 2001 From: Gregor Schmidt Date: Tue, 26 Jan 2010 12:02:31 +0100 Subject: [PATCH] Adding custom yaml (de-)serialization for OrderedHash (#3608) --- activesupport/lib/active_support/ordered_hash.rb | 8 ++++++++ activesupport/test/ordered_hash_test.rb | 15 +++++++++++++++ 2 files changed, 23 insertions(+), 0 deletions(-) diff --git a/activesupport/lib/active_support/ordered_hash.rb b/activesupport/lib/active_support/ordered_hash.rb index b492648..3aaccc7 100644 --- a/activesupport/lib/active_support/ordered_hash.rb +++ b/activesupport/lib/active_support/ordered_hash.rb @@ -131,11 +131,19 @@ module ActiveSupport "#" end + def to_yaml_type + "!ActiveSupport,2010/orderedHash" + end + private def sync_keys! @keys.delete_if {|k| !has_key?(k)} end end + + YAML.add_domain_type("ActiveSupport,2010", "orderedHash") do |type, val| + OrderedHash[val.to_a] + end end end diff --git a/activesupport/test/ordered_hash_test.rb b/activesupport/test/ordered_hash_test.rb index 1521279..72f2afd 100644 --- a/activesupport/test/ordered_hash_test.rb +++ b/activesupport/test/ordered_hash_test.rb @@ -198,4 +198,19 @@ class OrderedHashTest < Test::Unit::TestCase assert_same original, @ordered_hash assert_equal @other_ordered_hash.keys, @ordered_hash.keys end + + def test_each_after_yaml_serialization + values = [] + @deserialized_ordered_hash = YAML::load(YAML::dump(@ordered_hash)) + + @deserialized_ordered_hash.each {|key, value| values << value} + assert_equal @values, values + end + + def test_order_after_yaml_serialization + @deserialized_ordered_hash = YAML::load(YAML::dump(@ordered_hash)) + + assert_equal @keys, @deserialized_ordered_hash.keys + assert_equal @values, @deserialized_ordered_hash.values + end end -- 1.6.0.2