snake-eyes 0.0.5 → 0.0.6
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +7 -7
- data/lib/snake-eyes/interface_changes.rb +65 -24
- data/lib/snake-eyes/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e864c134f12799380649a3f8e1ac71078a5da5f0
|
4
|
+
data.tar.gz: eeaeffe93ed1ab87c316167986230f6ce3a66409
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 8ce2f7325ff93e48f4eddb75beee3515ec16a94e3fc944fcbcb53a6ddd44e12925d31bdf8c43e4133329a915d36aec461325dcac586b5d37c252b58c6dfbdda8
|
7
|
+
data.tar.gz: ae13b1c19fe7b78909336fe32733443ddc0f486aea27359a223dd366fd6143544a4380a663c784d91b3b0d5877e741379b6e86bd63a5e1c8a5026cc2325953fb
|
data/README.md
CHANGED
@@ -6,7 +6,7 @@ Automatically convert between camel case APIs to snake case for your Rails code
|
|
6
6
|
|
7
7
|
🚧🚧🚧🚧🚧🚧🚧🚧🚧🚧🚧🚧🚧🚧🚧🚧🚧🚧🚧
|
8
8
|
|
9
|
-
If you are using a version below `0.0.4`, please upgrade to avoid [potentially logging sensitive user information](https://github.com/greena13/snake-eyes/issues/1)
|
9
|
+
If you are using a version below `0.0.4`, please upgrade to avoid [potentially logging sensitive user information](https://github.com/greena13/snake-eyes/issues/1)
|
10
10
|
|
11
11
|
## Installation
|
12
12
|
|
@@ -45,8 +45,8 @@ Once `snake_eyes_params` has been enabled for a controllor, `params` accepts an
|
|
45
45
|
# 'user' => {
|
46
46
|
# 'name' => 'John Smith',
|
47
47
|
# 'favouriteColor' => 'blue',
|
48
|
-
# 'address' => { '123 street' },
|
49
|
-
# 'billingAddress' => { '456 road' }
|
48
|
+
# 'address' => { line1: '123 street' },
|
49
|
+
# 'billingAddress' => { line1: '456 road' }
|
50
50
|
# }
|
51
51
|
#}
|
52
52
|
end
|
@@ -61,8 +61,8 @@ Once `snake_eyes_params` has been enabled for a controllor, `params` accepts an
|
|
61
61
|
# 'user_attributes' => {
|
62
62
|
# 'name' => 'John Smith',
|
63
63
|
# 'favourite_color' => 'blue',
|
64
|
-
# 'address_attributes' => { '123 street' },
|
65
|
-
# 'billing_address_attributes' => { '456 road' }
|
64
|
+
# 'address_attributes' => { line1: '123 street' },
|
65
|
+
# 'billing_address_attributes' => { line1: '456 road' }
|
66
66
|
# }
|
67
67
|
#}
|
68
68
|
end
|
@@ -82,8 +82,8 @@ To specify nested objects that should not have the `_attributes` suffix (but con
|
|
82
82
|
# 'user' => {
|
83
83
|
# 'name' => 'John Smith',
|
84
84
|
# 'favourite_color' => 'blue',
|
85
|
-
# 'address_attributes' => { '123 street' },
|
86
|
-
# 'billing_address_attributes' => { '456 road' }
|
85
|
+
# 'address_attributes' => { 'line1: 123 street' },
|
86
|
+
# 'billing_address_attributes' => { line1: '456 road' }
|
87
87
|
# }
|
88
88
|
#}
|
89
89
|
end
|
@@ -3,49 +3,82 @@ module SnakeEyes
|
|
3
3
|
def params(options = {})
|
4
4
|
validate_options(options)
|
5
5
|
|
6
|
-
|
6
|
+
original_params = super()
|
7
7
|
|
8
|
-
|
9
|
-
|
8
|
+
return original_params unless original_params.any?
|
9
|
+
|
10
|
+
# List of subtrees maintained to mark the depth-first traversal's position
|
11
|
+
# throughout the transformation of the original param's keys, whereby the
|
12
|
+
# last element is the traversal's current position and backtracking (going
|
13
|
+
# from child to parent) is achieved by popping off the last element.
|
14
|
+
|
15
|
+
original_params_sub_trees = [
|
16
|
+
original_params
|
10
17
|
]
|
11
18
|
|
12
|
-
|
19
|
+
# Convert the relatively flat format used to specify the nested attributes
|
20
|
+
# (easier for specification) into a series of nested objects (easier for
|
21
|
+
# look-ups)
|
22
|
+
|
23
|
+
nested_schema = build_nested_schema(options[:nested_attributes] || {})
|
24
|
+
|
25
|
+
@previous_params ||= { }
|
13
26
|
|
14
|
-
|
15
|
-
|
27
|
+
return @previous_params[nested_schema] if @previous_params[nested_schema]
|
28
|
+
|
29
|
+
# Similar to original_params_sub_trees, a list of subtrees used to maintain
|
30
|
+
# the traversal position of nested_schema. This is kept in sync with the
|
31
|
+
# traversal of original_params, to ensure the correct leaf of
|
32
|
+
# nested_schema is checked at each point in the traversal of original_params
|
33
|
+
|
34
|
+
nested_schema_sub_trees = [
|
35
|
+
nested_schema
|
16
36
|
]
|
17
37
|
|
18
|
-
transformed_params =
|
19
|
-
|
38
|
+
transformed_params = original_params.deep_transform_keys do |original_key|
|
39
|
+
# The matching leaf of nested_schema for this point in the traversal
|
40
|
+
nested_schema_sub_tree = nested_schema_sub_trees.last
|
20
41
|
|
21
|
-
|
42
|
+
# Append the '_attributes' suffix if the original params key has the
|
43
|
+
# same name and is nested in the same place as one mentioned in the
|
44
|
+
# nested_attributes option
|
45
|
+
|
46
|
+
transformed_key_base = original_key.underscore
|
22
47
|
|
23
48
|
transformed_key =
|
24
|
-
if
|
25
|
-
|
49
|
+
if nested_schema_sub_tree[transformed_key_base]
|
50
|
+
transformed_key_base + '_attributes'
|
26
51
|
else
|
27
|
-
|
52
|
+
transformed_key_base
|
28
53
|
end
|
29
54
|
|
30
|
-
|
31
|
-
|
32
|
-
|
55
|
+
# Synchronise the original params sub-tree with the current key being
|
56
|
+
# transformed. We can detect that the sub-tree is stale because the key
|
57
|
+
# being transformed does not appear amongst its own. When the sub-tree is
|
58
|
+
# indeed stale, move the position to its parent for the original params
|
59
|
+
# sub-tree and the nested schema sub-tree and repeat the check.
|
60
|
+
|
61
|
+
while original_params_sub_trees.length > 1 && original_params_sub_trees.last[original_key].nil?
|
62
|
+
original_params_sub_trees.pop
|
63
|
+
nested_schema_sub_trees.pop
|
33
64
|
end
|
34
65
|
|
35
|
-
|
66
|
+
original_params_sub_tree = original_params_sub_trees.last[transformed_key_base]
|
36
67
|
|
37
|
-
if
|
38
|
-
|
68
|
+
if original_params_sub_tree.kind_of?(Hash)
|
69
|
+
original_params_sub_trees.push(original_params_sub_tree)
|
39
70
|
|
40
|
-
|
41
|
-
|
71
|
+
nested_schema_sub_trees.push(
|
72
|
+
nested_schema_sub_tree[transformed_key_base] ||
|
73
|
+
nested_schema_sub_tree['_' + transformed_key_base] ||
|
74
|
+
{}
|
42
75
|
)
|
43
76
|
end
|
44
77
|
|
45
78
|
transformed_key
|
46
79
|
end
|
47
80
|
|
48
|
-
@snake_eyes_params = ActionController::Parameters.new(transformed_params)
|
81
|
+
@previous_params[nested_schema] = @snake_eyes_params = ActionController::Parameters.new(transformed_params)
|
49
82
|
|
50
83
|
log_snakized_params
|
51
84
|
|
@@ -62,26 +95,34 @@ module SnakeEyes
|
|
62
95
|
|
63
96
|
def log_snakized_params
|
64
97
|
if SnakeEyes.log_snake_eyes_parameters
|
98
|
+
|
65
99
|
ignored_params = ActionController::LogSubscriber::INTERNAL_PARAMS
|
66
100
|
filtered_params = request.send(:parameter_filter).filter(@snake_eyes_params.except(*ignored_params))
|
101
|
+
|
67
102
|
logger.info " SnakeEyes Parameters: #{filtered_params.inspect}"
|
68
103
|
end
|
69
104
|
end
|
70
105
|
|
71
|
-
def
|
106
|
+
def build_nested_schema(attributes_list = [])
|
72
107
|
|
73
108
|
if attributes_list.kind_of?(Array)
|
109
|
+
|
74
110
|
attributes_list.inject({}) do |memo, nested_attribute|
|
75
|
-
memo.merge(
|
111
|
+
memo.merge(build_nested_schema(nested_attribute))
|
76
112
|
end
|
113
|
+
|
77
114
|
elsif attributes_list.kind_of?(Hash)
|
115
|
+
|
78
116
|
attributes_list.inject({}) do |memo, key_and_value|
|
79
117
|
key, value = key_and_value
|
80
|
-
memo[key.to_s] =
|
118
|
+
memo[key.to_s] = build_nested_schema(value)
|
81
119
|
memo
|
82
120
|
end
|
121
|
+
|
83
122
|
else
|
123
|
+
|
84
124
|
{ attributes_list.to_s.underscore => {} }
|
125
|
+
|
85
126
|
end
|
86
127
|
|
87
128
|
end
|
data/lib/snake-eyes/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: snake-eyes
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.6
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Aleck Greenham
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-
|
11
|
+
date: 2017-07-26 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|