/
helpers.rb
80 lines (70 loc) · 2.57 KB
/
helpers.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
module I18n
module Backend
module Helpers
SEPARATOR_ESCAPE_CHAR = "\001"
# Return a new hash with all keys and nested keys converted to symbols.
def deep_symbolize_keys(hash)
hash.inject({}) { |result, (key, value)|
value = deep_symbolize_keys(value) if value.is_a?(Hash)
result[(key.to_sym rescue key) || key] = value
result
}
end
# Flatten keys for nested Hashes by chaining up keys using the separator
# >> { "a" => { "b" => { "c" => "d", "e" => "f" }, "g" => "h" }, "i" => "j"}.wind
# => { "a.b.c" => "d", "a.b.e" => "f", "a.g" => "h", "i" => "j" }
def wind_keys(hash, separator = nil, subtree = false, prev_key = nil, result = {}, orig_hash=hash)
separator ||= I18n.default_separator
hash.each_pair do |key, value|
key = escape_default_separator(key, separator)
curr_key = [prev_key, key].compact.join(separator)
if value.is_a?(Symbol)
value = hash_lookup(orig_hash, value, separator) ||
hash_lookup(hash, value, separator)
end
if value.is_a?(Hash)
result[curr_key] = value if subtree
wind_keys(value, separator, subtree, curr_key, result, orig_hash)
else
result[curr_key] = value
end
end
result
end
def escape_default_separator(key, separator=nil)
key.to_s.tr(separator || I18n.default_separator, SEPARATOR_ESCAPE_CHAR)
end
def hash_lookup(hash, keys, separator = ".")
keys.to_s.split(separator).inject(hash) do |result, key|
key = key.to_sym
if result.respond_to?(:has_key?) and result.has_key?(key)
result[key]
else
return nil
end
end
end
# Expand keys chained by the the given separator through nested Hashes
# >> { "a.b.c" => "d", "a.b.e" => "f", "a.g" => "h", "i" => "j" }.unwind
# => { "a" => { "b" => { "c" => "d", "e" => "f" }, "g" => "h" }, "i" => "j"}
def unwind_keys(hash, separator = ".")
result = {}
hash.each do |key, value|
keys = key.split(separator)
curr = result
curr = curr[keys.shift] ||= {} while keys.size > 1
curr[keys.shift] = value
end
result
end
# # Flatten the given array once
# def flatten_once(array)
# result = []
# for element in array # a little faster than each
# result.push(*element)
# end
# result
# end
end
end
end