extend ::Hash with #set_or_incr and #merge_and_incr methods

This commit is contained in:
2011-03-12 21:47:54 +00:00
parent 746d0fea8f
commit 0938781cd1
5 changed files with 48 additions and 12 deletions

View File

@@ -26,10 +26,7 @@ require 'redistat/scope'
require 'redistat/summary'
require 'redistat/version'
require 'redistat/core_ext/date'
require 'redistat/core_ext/time'
require 'redistat/core_ext/fixnum'
require 'redistat/core_ext/bignum'
require 'redistat/core_ext'
module Redistat

5
lib/redistat/core_ext.rb Normal file
View File

@@ -0,0 +1,5 @@
require 'redistat/core_ext/bignum'
require 'redistat/core_ext/date'
require 'redistat/core_ext/fixnum'
require 'redistat/core_ext/hash'
require 'redistat/core_ext/time'

View File

@@ -0,0 +1,21 @@
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
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)
self
end
end

View File

@@ -12,12 +12,5 @@ module Redistat
@till = options[:till] ||= nil
end
def set_or_incr(key, value)
self[key] = 0 if !self.has_key?(key)
self[key] += value
self
end
end
end
end

View File

@@ -0,0 +1,20 @@
require "spec_helper"
describe Hash do
it "should #set_or_incr values" do
hash = {:count => 1}
hash.set_or_incr(:sum, 3)
hash.should == {:count => 1, :sum => 3}
hash.set_or_incr(:count, 4)
hash.should == {:count => 5, :sum => 3}
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'}
end
end