-
Notifications
You must be signed in to change notification settings - Fork 4
/
transform.rb
117 lines (100 loc) · 2.53 KB
/
transform.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
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
module Tacokit
class Transform
include Tacokit::Utils
def serialize_params(params)
normalize_request_params(params)
end
def serialize(body)
serialize_body(body)
end
def deserialize(body)
deserialize_body(body)
end
private
def normalize_request_params(params)
(params || {}).reject { |_k, v| v.nil? }.each_with_object({}) do |(key, value), norm|
norm[key] = normalize_param_value(value)
end
end
def normalize_param_value(value)
case value
when Array
value.map { |v| camel_path(v) }.join(",")
when /\,/
normalize_param_value(value.split(","))
else
camel_path(value)
end
end
def serialize_body(body)
case body
when Hash
serialize_hash(body)
else
body
end
end
def serialize_hash(body)
flatten_nested_keys(camelize_keys(body))
end
def camelize_keys(body)
deep_transform_keys(body) { |key| camelize_key(key) }
end
def camelize_key(key)
k = key.to_s
k = k.gsub(%r{([a-zA-Z_]+?)_id(s\b|\b)?$}, "id_\\1\\2")
k = k.gsub(%r{(#{camelize_special_cases.keys.join("|")})}) { |m| camelize_special_cases.fetch(m) }
camelize(k, :lower)
end
# Converts
# "prefs" => { "voting" => "members" }
# to
# "prefs/voting" => "members
#
def flatten_nested_keys(body)
options = {}
body.each do |key, value|
next unless value.is_a?(Hash)
value = flatten_nested_keys(value.dup)
value.each do |nested_key, nested_value|
options["#{key}/#{nested_key}"] = nested_value
end
body.delete(key)
end
body.merge(options)
end
def deserialize_body(body)
case body
when Hash
deserialize_hash(body)
when Array
deserialize_array(body)
else
body
end
end
def deserialize_array(body)
body.map { |data| deserialize_body(data) }
end
def deserialize_hash(body)
deep_transform_keys(body) do |key|
underscore_key(key)
end
end
def underscore_key(key)
k = key.to_s
k = k.gsub(%r{(#{pluralize_special_cases.join("|")})}, "\\1s")
k = underscore(k)
k.gsub(%r{^id_([a-zA-Z_]+?)(s\b|\b)$}, "\\1_id\\2")
end
def pluralize_special_cases
%w[ idBoardsPinned idPremOrgsAdmin ]
end
def camelize_special_cases
{
"callback_url" => "callbackURL",
"checklist_source_id" => "idChecklistSource"
}
end
end
end