Sha256: 598bea854c74545098704afdee38244d221830c02034e049d67f2aef827e01cf

Contents?: true

Size: 1.99 KB

Versions: 52

Compression:

Stored size: 1.99 KB

Contents

# Hash#deep_merge
# From: http://pastie.textmate.org/pastes/30372, Elliott Hird
# Source: http://gemjack.com/gems/tartan-0.1.1/classes/Hash.html
# This file contains extensions to Ruby and other useful snippits of code.
# Time to extend Hash with some recursive merging magic.


class Hash

  # Merges self with another hash, recursively.
  # 
  # This code was lovingly stolen from some random gem:
  # http://gemjack.com/gems/tartan-0.1.1/classes/Hash.html
  # 
  # Thanks to whoever made it.

  def deep_merge(hash)
    target = dup
    
    hash.keys.each do |key|
      if hash[key].is_a? Hash and self[key].is_a? Hash
        target[key] = target[key].deep_merge(hash[key])
        next
      end
      
      target[key] = hash[key]
    end
    
    target
  end


  # From: http://www.gemtacular.com/gemdocs/cerberus-0.2.2/doc/classes/Hash.html
  # File lib/cerberus/utils.rb, line 42

  def deep_merge!(second)
    second.each_pair do |k,v|
      if self[k].is_a?(Hash) and second[k].is_a?(Hash)
        self[k].deep_merge!(second[k])
      else
        self[k] = second[k]
      end
    end
  end


#-----------------
        
   # cf. http://subtech.g.hatena.ne.jp/cho45/20061122
   def deep_merge2(other)
      deep_proc = Proc.new { |k, s, o|
         if s.kind_of?(Hash) && o.kind_of?(Hash)
            next s.merge(o, &deep_proc)
         end
         next o
      }
      merge(other, &deep_proc)
   end


   def deep_merge3(second)

      # From: http://www.ruby-forum.com/topic/142809
      # Author: Stefan Rusterholz

      merger = proc { |key,v1,v2| Hash === v1 && Hash === v2 ? v1.merge(v2, &merger) : v2 }
      self.merge(second, &merger)

   end


   def keep_merge(hash)
      target = dup
      hash.keys.each do |key|
         if hash[key].is_a? Hash and self[key].is_a? Hash
            target[key] = target[key].keep_merge(hash[key])
            next
         end
         #target[key] = hash[key]
         target.update(hash) { |key, *values| values.flatten.uniq }
      end
      target
   end

end

Version data entries

52 entries across 52 versions & 1 rubygems

Version Path
rtt-0.0.6 lib/extensions/hash.rb
rtt-0.0.5 lib/extensions/hash.rb
rtt-0.0.4 lib/extensions/hash.rb
rtt-0.0.3 lib/extensions/hash.rb
rtt-0.0.0.53 lib/extensions/hash.rb
rtt-0.0.0.52 lib/extensions/hash.rb
rtt-0.0.0.51 lib/extensions/hash.rb
rtt-0.0.0.50 lib/extensions/hash.rb
rtt-0.0.0.49 lib/extensions/hash.rb
rtt-0.0.0.48 lib/extensions/hash.rb
rtt-0.0.0.47 lib/rtt/hash_extensions.rb
rtt-0.0.0.46 lib/rtt/hash_extensions.rb
rtt-0.0.0.45 lib/rtt/hash_extensions.rb
rtt-0.0.0.44 lib/rtt/hash_extensions.rb
rtt-0.0.0.43 lib/rtt/hash_extensions.rb
rtt-0.0.0.42 lib/rtt/hash_extensions.rb
rtt-0.0.0.41 lib/rtt/hash_extensions.rb
rtt-0.0.0.39 lib/rtt/hash_extensions.rb
rtt-0.0.0.38 lib/rtt/hash_extensions.rb
rtt-0.0.0.37 lib/rtt/hash_extensions.rb