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