From 5c751e9cfcd5cc2e59ba4e7a629b98c630d838f8 Mon Sep 17 00:00:00 2001 From: Jim Menard Date: Wed, 21 Jan 2009 10:53:26 -0500 Subject: [PATCH] Fixed OrderedHash key deletion. --- lib/mongo/util/ordered_hash.rb | 18 ++++++++++++++++++ tests/test_ordered_hash.rb | 17 +++++++++++++++++ 2 files changed, 35 insertions(+) diff --git a/lib/mongo/util/ordered_hash.rb b/lib/mongo/util/ordered_hash.rb index 2e05fc9..faaf4b7 100644 --- a/lib/mongo/util/ordered_hash.rb +++ b/lib/mongo/util/ordered_hash.rb @@ -63,6 +63,24 @@ class OrderedHash < Hash str << '}' end + def delete(key, &block) + @ordered_keys.delete(key) + super + end + + def delete_if(&block) + self.each { |k,v| + if yield k, v + delete(k) + end + } + end + + def clear + super + @ordered_keys = [] + end + end # Ruby before 1.9 end diff --git a/tests/test_ordered_hash.rb b/tests/test_ordered_hash.rb index 2641c1f..bcd2a5b 100644 --- a/tests/test_ordered_hash.rb +++ b/tests/test_ordered_hash.rb @@ -82,4 +82,21 @@ class OrderedHashTest < Test::Unit::TestCase assert_equal '{"c"=>1, "a"=>2, "z"=>3}', @oh.inspect end + def test_clear + @oh.clear + assert @oh.keys.empty? + end + + def test_delete + assert @oh.keys.include?('z') + @oh.delete('z') + assert !@oh.keys.include?('z') + end + + def test_delete_if + assert @oh.keys.include?('z') + @oh.delete_if { |k,v| k == 'z' } + assert !@oh.keys.include?('z') + end + end