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