lib/hash_flatten.rb in hash_flatten-0.2.0 vs lib/hash_flatten.rb in hash_flatten-0.3.0

- old
+ new

@@ -1,7 +1,5 @@ -require 'hash_flatten/version' - module HashFlatten refine Hash do def destructure flattened = each_with_object({}) do |(k, v), n| if v.is_a? Hash @@ -19,26 +17,34 @@ flattened end end def structure - structured = each_with_object({}) do |(k, v), n| - if k.include? '.' - keys = k.split('.') - new_key = keys.pop + new_hash = decompose_keys - n[keys.join('.')] = n.fetch(keys.join('.'), {}).merge({ new_key.to_s => v }) - else - n[k.to_s] = v + new_hash.each do |k, v| + if v.is_a? Hash + new_value = v.structure + + new_hash[k] = new_value end end + end - structured + def decompose_keys + each_with_object({}) do |(k, v), new_hash| + key_parts = k.split('.') + top_level_key = key_parts.shift + tail = key_parts.join('.') - if structured.any? { |k, v| k.include? '.' } - structured.structure - else - structured + if tail.empty? + new_hash[top_level_key] = v + else + existing_value = new_hash.fetch(top_level_key, {}) + new_value = existing_value.merge({ tail => v }) + + new_hash[top_level_key] = new_value + end end end end end