lib/mpatch/hash.rb in mpatch-2.3.0 vs lib/mpatch/hash.rb in mpatch-2.4.0

- old
+ new

@@ -1,111 +1,120 @@ -module MPatch::Include - module Hash +module MPatch - # remove elements by keys, - # array of keys, - # hashTags, - # strings - def trim(*args) + module Include - args.each do |one_element| - case true + module Hash - when one_element.class <= ::Hash - begin - one_element.each do |key,value| - if self[key] == value - self.delete(key) + # remove elements by keys, + # array of keys, + # hashTags, + # strings + def trim(*args) + + args.each do |one_element| + case true + + when one_element.class <= ::Hash + begin + one_element.each do |key,value| + if self[key] == value + self.delete(key) + end end end - end - when one_element.class <= ::Array - begin - one_element.each do |one_key| - self.delete(one_key) + when one_element.class <= ::Array + begin + one_element.each do |one_key| + self.delete(one_key) + end end - end - when one_element.class <= ::Symbol, - one_element.class <= ::String - begin - self.delete(one_element) - end + when one_element.class <= ::Symbol, + one_element.class <= ::String + begin + self.delete(one_element) + end + end end + return self + end - return self - end + #pass single or array of keys, which will be removed, returning the remaining hash + def remove!(*keys) + keys.each{|key| self.delete(key) } + self + end - #pass single or array of keys, which will be removed, returning the remaining hash - def remove!(*keys) - keys.each{|key| self.delete(key) } - self - end + #non-destructive version + def remove(*keys) + self.dup.remove!(*keys) + end - #non-destructive version - def remove(*keys) - self.dup.remove!(*keys) - end + # Returns a new hash with +self+ and +other_hash+ merged recursively. + # + # h1 = {:x => {:y => [4,5,6]}, :z => [7,8,9]} + # h2 = {:x => {:y => [7,8,9]}, :z => "xyz"} + # + # h1.deep_merge(h2) #=> { :x => {:y => [7, 8, 9]}, :z => "xyz" } + # h2.deep_merge(h1) #=> { :x => {:y => [4, 5, 6]}, :z => [7, 8, 9] } + def deep_merge(other_hash) + dup.deep_merge!(other_hash) + end unless method_defined? :deep_merge - # Returns a new hash with +self+ and +other_hash+ merged recursively. - # - # h1 = {:x => {:y => [4,5,6]}, :z => [7,8,9]} - # h2 = {:x => {:y => [7,8,9]}, :z => "xyz"} - # - # h1.deep_merge(h2) #=> { :x => {:y => [7, 8, 9]}, :z => "xyz" } - # h2.deep_merge(h1) #=> { :x => {:y => [4, 5, 6]}, :z => [7, 8, 9] } - def deep_merge(other_hash) - dup.deep_merge!(other_hash) - end unless method_defined? :deep_merge + alias :+ :deep_merge - alias :+ :deep_merge + # Same as +deep_merge+, but modifies +self+. + def deep_merge!(other_hash) + other_hash.each_pair do |k,v| + tv = self[k] + self[k] = tv.is_a?(::Hash) && v.is_a?(::Hash) ? tv.deep_merge(v) : v + end + self + end unless method_defined? :deep_merge! - # Same as +deep_merge+, but modifies +self+. - def deep_merge!(other_hash) - other_hash.each_pair do |k,v| - tv = self[k] - self[k] = tv.is_a?(::Hash) && v.is_a?(::Hash) ? tv.deep_merge(v) : v - end - self - end unless method_defined? :deep_merge! + # return bool that does the sub hash all element include the hash who call this or not + def deep_include?(sub_hash) + sub_hash.keys.all? do |key| + self.has_key?(key) && if sub_hash[key].is_a?(::Hash) + self[key].is_a?(::Hash) && self[key].deep_include?(sub_hash[key]) + else + self[key] == sub_hash[key] + end + end + end unless method_defined? :deep_include? - # return bool that does the sub hash all element include the hash who call this or not - def deep_include?(sub_hash) - sub_hash.keys.all? do |key| - self.has_key?(key) && if sub_hash[key].is_a?(::Hash) - self[key].is_a?(::Hash) && self[key].deep_include?(sub_hash[key]) - else - self[key] == sub_hash[key] - end - end - end unless method_defined? :deep_include? + # map hash will work just alike map but instead of an array it will return a hash obj + # + # {:hello=> "world",:world => "hello"}.map_hash{|k,v| [ k , 123] } + # #> {:hello=>123, :world=>123} + # + # {:hello=> "world",:world => "hello"}.map_hash{|k,v| { k => 123 } } + # #> {:hello=>123, :world=>123} + # + def map_hash &block - # map hash will work just alike map but instead of an array it will return a hash obj - # - # {:hello=> "world",:world => "hello"}.map_hash{|k,v| [ k , 123] } - # #> {:hello=>123, :world=>123} - # - # {:hello=> "world",:world => "hello"}.map_hash{|k,v| { k => 123 } } - # #> {:hello=>123, :world=>123} - # - def map_hash &block + tmp_hash= self.class.new + map_hash_obj= self.map &block + map_hash_obj.each do |hash| - tmp_hash= self.class.new - map_hash_obj= self.map &block - map_hash_obj.each do |hash| + if hash.class <= ::Array + hash= self.class[*hash] + end - if hash.class <= ::Array - hash= self.class[*hash] + tmp_hash.deep_merge!(hash) + end - tmp_hash.deep_merge!(hash) - + return tmp_hash end - return tmp_hash end end + + require File.join 'mpatch','injector' + + end \ No newline at end of file