From 43fc8bc2dda8932b76546b8dd75d4b9485593870 Mon Sep 17 00:00:00 2001 From: Jim Myhrberg Date: Sat, 12 Mar 2011 22:21:15 +0000 Subject: [PATCH] updated Hash extensions and specs --- lib/redistat/core_ext/hash.rb | 26 ++++++++++++++------------ spec/core_ext/hash_spec.rb | 22 ++++++++++++++++------ 2 files changed, 30 insertions(+), 18 deletions(-) diff --git a/lib/redistat/core_ext/hash.rb b/lib/redistat/core_ext/hash.rb index 0cc5390..398e6e2 100644 --- a/lib/redistat/core_ext/hash.rb +++ b/lib/redistat/core_ext/hash.rb @@ -1,21 +1,23 @@ class Hash def merge_and_incr(hash) - raise ArgumentError unless hash.is_a?(Hash) - hash.each do |key, value| - if value.is_a?(Numeric) - self.set_or_incr(key, value) - else - self[key] = value - end - end + self.clone.merge_and_incr!(hash) end - def set_or_incr(key, value) - return self unless value.is_a?(Numeric) - self[key] = 0 unless self.has_key?(key) - self[key] += value if self[key].is_a?(Numeric) + def merge_and_incr!(hash) + raise ArgumentError unless hash.is_a?(Hash) + hash.each do |key, value| + self[key] = value unless self.set_or_incr(key, value) + end self end + def set_or_incr(key, value) + return false unless value.is_a?(Numeric) + self[key] = 0 unless self.has_key?(key) + return false unless self[key].is_a?(Numeric) + self[key] += value + true + end + end diff --git a/spec/core_ext/hash_spec.rb b/spec/core_ext/hash_spec.rb index fad64cc..c838dc2 100644 --- a/spec/core_ext/hash_spec.rb +++ b/spec/core_ext/hash_spec.rb @@ -4,17 +4,27 @@ describe Hash do it "should #set_or_incr values" do hash = {:count => 1} - hash.set_or_incr(:sum, 3) + hash.set_or_incr(:sum, 3).should be_true hash.should == {:count => 1, :sum => 3} - hash.set_or_incr(:count, 4) + hash.set_or_incr(:count, 4).should be_true hash.should == {:count => 5, :sum => 3} + hash.set_or_incr(:count, 'test').should be_false + hash.set_or_incr(:view, 'test').should be_false + hash.should == {:count => 5, :sum => 3} + hash[:view] = 'test' + hash.set_or_incr(:view, 3).should be_false end it "should #merge_and_incr hashes" do - hash = {:count => 1, :city => 'hell', :sum => 3, :name => 'john'} - new_hash = {:count => 3, :city => 'slum', :views => 2} - hash.merge_and_incr(new_hash) - hash.should == {:count => 4, :sum => 3, :views => 2, :city => 'slum', :name => 'john'} + hash = { :count => 1, :city => 'hell', :sum => 3, :name => 'john' } + + new_hash = { :count => 3, :city => 'slum', :views => 2 } + hash.clone.merge_and_incr(new_hash).should == { :count => 4, :city => 'slum', :views => 2, + :sum => 3, :name => 'john' } + + new_hash = { :count => 'six', :city => 'slum', :views => 2, :time => 'late' } + hash.clone.merge_and_incr(new_hash).should == { :count => 'six', :city => 'slum', :views => 2, + :sum => 3, :name => 'john', :time => 'late' } end end