class Dothash::Hash
Public Class Methods
with_dots(hash, prefix = nil)
click to toggle source
# File lib/dothash/hash.rb, line 22 def self.with_dots(hash, prefix = nil) raise ArgumentError, "You should pass only Hash here" unless hash.is_a? ::Hash hash.each_with_object({}) do |(key, value), memo| new_key = [prefix, key].compact.join(".") memo.merge! with_dots_deeper(value, new_key) end end
without_dots(hash)
click to toggle source
# File lib/dothash/hash.rb, line 42 def self.without_dots(hash) hash.each_with_object({}) do |(key, value), memo| key_parts = key.to_s.split(".") new_key = key_parts.shift.to_sym if key_parts.empty? memo[new_key] = value else deep_merge!(memo, new_key => without_dots(key_parts.join(".") => value)) end end end
Private Class Methods
deep_merge!(first, second)
click to toggle source
# File lib/dothash/hash.rb, line 54 def self.deep_merge!(first, second) merger = proc do |_key, v1, v2| if v1.is_a?(::Hash) && v2.is_a?(::Hash) v1.merge(v2, &merger) else v2 end end first.merge!(second.to_h, &merger) end
with_dots_deeper(value, new_key)
click to toggle source
# File lib/dothash/hash.rb, line 30 def self.with_dots_deeper(value, new_key) if value.is_a?(::Hash) with_dots(value, new_key) elsif value.is_a? ::Array value.each_with_object({}).with_index do |(avalue, memo), index| memo.merge! with_dots({ index => avalue }, new_key) end else { new_key => value } end end