rails5-spec-converter 1.0.8 → 1.0.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/lib/rails5/spec_converter/text_transformer.rb +78 -35
- data/lib/rails5/spec_converter/version.rb +1 -1
- metadata +4 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d5bf0eb89b52036356b4302e4ac69ce3b55b7736
|
4
|
+
data.tar.gz: 5a1af9450f8b860194ef3fbf3a81248a1747219f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4eb378462e4741677c8f55eeaad228c4b8b028f7087bddc7240e47fa851c37c0fe7e1a4a868d64d6660fa8c7149934783a2194b939dbb3cce02c425a212181e0
|
7
|
+
data.tar.gz: 6e1715037451e0cba49b3d3c4c618f29382df4b0a45e296bebc929f46d2d437a69bf1359272f149d1acdbe058b1ba71f2eb20ef19f024343109f6c997502dc82
|
@@ -12,18 +12,18 @@ module Rails5
|
|
12
12
|
@indent = options[:indent] || ' '
|
13
13
|
@quiet = options[:quiet]
|
14
14
|
@content = content
|
15
|
-
end
|
16
15
|
|
17
|
-
|
18
|
-
source_buffer =
|
19
|
-
source_buffer.source = @content
|
16
|
+
@source_buffer = Parser::Source::Buffer.new('(string)')
|
17
|
+
@source_buffer.source = @content
|
20
18
|
|
21
19
|
ast_builder = Astrolabe::Builder.new
|
22
|
-
parser = Parser::CurrentRuby.new(ast_builder)
|
20
|
+
@parser = Parser::CurrentRuby.new(ast_builder)
|
23
21
|
|
24
|
-
source_rewriter = Parser::Source::Rewriter.new(source_buffer)
|
22
|
+
@source_rewriter = Parser::Source::Rewriter.new(@source_buffer)
|
23
|
+
end
|
25
24
|
|
26
|
-
|
25
|
+
def transform
|
26
|
+
root_node = @parser.parse(@source_buffer)
|
27
27
|
root_node.each_node(:send) do |node|
|
28
28
|
target, verb, action, *args = node.children
|
29
29
|
next unless args.length > 0
|
@@ -33,15 +33,18 @@ module Rails5
|
|
33
33
|
next if looks_like_route_definition?(args[0])
|
34
34
|
next if has_key?(args[0], :params)
|
35
35
|
|
36
|
-
write_params_hash(
|
36
|
+
write_params_hash(
|
37
|
+
hash_node: args[0],
|
38
|
+
original_indent: node.loc.expression.source_line.match(/^(\s*)/)[1]
|
39
|
+
)
|
37
40
|
else
|
38
|
-
wrap_arg(
|
41
|
+
wrap_arg(args[0], 'params')
|
39
42
|
end
|
40
43
|
|
41
|
-
wrap_arg(
|
44
|
+
wrap_arg(args[1], 'headers') if args[1]
|
42
45
|
end
|
43
46
|
|
44
|
-
source_rewriter.process
|
47
|
+
@source_rewriter.process
|
45
48
|
end
|
46
49
|
|
47
50
|
private
|
@@ -68,38 +71,44 @@ module Rails5
|
|
68
71
|
hash_node.children.any? { |pair| pair.children[0].children[0] == key }
|
69
72
|
end
|
70
73
|
|
71
|
-
def write_params_hash(
|
72
|
-
pairs_that_belong_in_params =
|
73
|
-
pairs_that_belong_outside_params = []
|
74
|
-
|
75
|
-
hash_node.children.each do |pair|
|
76
|
-
key = pair.children[0].children[0]
|
77
|
-
|
78
|
-
if ALLOWED_KWARG_KEYS.include?(key)
|
79
|
-
pairs_that_belong_outside_params << pair
|
80
|
-
else
|
81
|
-
pairs_that_belong_in_params << pair
|
82
|
-
end
|
83
|
-
end
|
74
|
+
def write_params_hash(hash_node:, original_indent: )
|
75
|
+
pairs_that_belong_in_params, pairs_that_belong_outside_params = partition_params(hash_node)
|
84
76
|
|
85
77
|
if pairs_that_belong_in_params.length > 0
|
86
78
|
joiner = joiner_between_pairs(hash_node)
|
87
79
|
params_hash = appropriately_spaced_params_hash(
|
88
80
|
hash_node: hash_node,
|
89
|
-
pairs: pairs_that_belong_in_params
|
81
|
+
pairs: pairs_that_belong_in_params,
|
82
|
+
original_indent: original_indent
|
90
83
|
)
|
91
84
|
|
92
85
|
rewritten_hashes = ["params: #{params_hash}"]
|
93
86
|
if pairs_that_belong_outside_params.length > 0
|
94
87
|
rewritten_hashes << restring_hash(pairs_that_belong_outside_params, joiner: joiner)
|
95
88
|
end
|
96
|
-
source_rewriter.replace(
|
89
|
+
@source_rewriter.replace(
|
97
90
|
hash_node.loc.expression,
|
98
91
|
rewritten_hashes.join(joiner)
|
99
92
|
)
|
100
93
|
end
|
101
94
|
end
|
102
95
|
|
96
|
+
def partition_params(hash_node)
|
97
|
+
pairs_that_belong_in_params = []
|
98
|
+
pairs_that_belong_outside_params = []
|
99
|
+
|
100
|
+
hash_node.children.each do |pair|
|
101
|
+
key = pair.children[0].children[0]
|
102
|
+
|
103
|
+
if ALLOWED_KWARG_KEYS.include?(key)
|
104
|
+
pairs_that_belong_outside_params << pair
|
105
|
+
else
|
106
|
+
pairs_that_belong_in_params << pair
|
107
|
+
end
|
108
|
+
end
|
109
|
+
return pairs_that_belong_in_params, pairs_that_belong_outside_params
|
110
|
+
end
|
111
|
+
|
103
112
|
def indent_before_first_pair(hash_node)
|
104
113
|
return nil unless hash_node.children.length > 0
|
105
114
|
|
@@ -114,6 +123,17 @@ module Rails5
|
|
114
123
|
extract_indent(text_after_last_pair)
|
115
124
|
end
|
116
125
|
|
126
|
+
def indent_of_first_value_if_multiline(hash_node, original_indent)
|
127
|
+
return nil if hash_node.children.length == 0
|
128
|
+
first_value = hash_node.children[0].children[1]
|
129
|
+
return nil unless first_value.hash_type? || first_value.array_type?
|
130
|
+
value_str_lines = node_to_string(first_value).split("\n")
|
131
|
+
return nil if value_str_lines.length == 1
|
132
|
+
return nil unless value_str_lines[0].match(/[\s\[{]/)
|
133
|
+
|
134
|
+
value_str_lines[1].match(/^(\s*)/)[1].sub(original_indent, '')
|
135
|
+
end
|
136
|
+
|
117
137
|
def additional_indent(hash_node)
|
118
138
|
return nil if indent_before_first_pair(hash_node)
|
119
139
|
|
@@ -122,15 +142,14 @@ module Rails5
|
|
122
142
|
end
|
123
143
|
|
124
144
|
def existing_indent(hash_node)
|
125
|
-
|
126
|
-
text_before_hash = text_between_siblings(previous_sibling, hash_node)
|
145
|
+
text_before_hash = text_before_node(hash_node)
|
127
146
|
whitespace_indent = extract_indent(text_before_hash)
|
128
147
|
return whitespace_indent if whitespace_indent
|
129
148
|
|
130
149
|
return indent_before_first_pair(hash_node) if indent_before_first_pair(hash_node)
|
131
150
|
|
132
151
|
joiner = joiner_between_pairs(hash_node)
|
133
|
-
extract_indent(joiner)
|
152
|
+
extract_indent(joiner) || ''
|
134
153
|
end
|
135
154
|
|
136
155
|
def has_space_after_curly?(hash_node)
|
@@ -154,36 +173,49 @@ module Rails5
|
|
154
173
|
@content[node1.loc.expression.end_pos...node2.loc.expression.begin_pos]
|
155
174
|
end
|
156
175
|
|
157
|
-
def appropriately_spaced_params_hash(hash_node:, pairs:)
|
176
|
+
def appropriately_spaced_params_hash(hash_node:, pairs:, original_indent: )
|
177
|
+
outer_indent = existing_indent(hash_node)
|
178
|
+
middle_indent = indent_of_first_value_if_multiline(hash_node, original_indent)
|
158
179
|
inner_indent = additional_indent(hash_node)
|
159
180
|
|
160
|
-
if inner_indent || indent_before_first_pair(hash_node)
|
161
|
-
outer_indent = existing_indent(hash_node)
|
181
|
+
if inner_indent || middle_indent || indent_before_first_pair(hash_node)
|
162
182
|
restrung_hash = restring_hash(
|
163
183
|
pairs,
|
164
184
|
indent: outer_indent + (inner_indent || ''),
|
165
185
|
joiner: ",\n"
|
166
186
|
)
|
167
|
-
|
187
|
+
if middle_indent
|
188
|
+
restrung_hash = original_indent + add_indent(restrung_hash, middle_indent)
|
189
|
+
end
|
190
|
+
final_brace_indent = if middle_indent
|
191
|
+
original_indent
|
192
|
+
else
|
193
|
+
indent_after_last_pair(hash_node) || outer_indent
|
194
|
+
end
|
195
|
+
"{\n#{restrung_hash}\n#{final_brace_indent}}"
|
168
196
|
else
|
169
197
|
curly_sep = has_space_after_curly?(hash_node) ? '' : ' '
|
170
198
|
"{#{curly_sep}#{restring_hash(pairs)}#{curly_sep}}"
|
171
199
|
end
|
172
200
|
end
|
173
201
|
|
174
|
-
def wrap_arg(
|
202
|
+
def wrap_arg(node, key)
|
175
203
|
node_loc = node.loc.expression
|
176
204
|
node_source = node_loc.source
|
177
205
|
if node.hash_type? && !node_source.match(/^\s*\{.*\}$/m)
|
178
206
|
node_source = "{ #{node_source} }"
|
179
207
|
end
|
180
|
-
source_rewriter.replace(node_loc, "#{key}: #{node_source}")
|
208
|
+
@source_rewriter.replace(node_loc, "#{key}: #{node_source}")
|
181
209
|
end
|
182
210
|
|
183
211
|
def restring_hash(pairs, joiner: ", ", indent: '')
|
184
212
|
pairs.map { |pair| "#{indent}#{pair.loc.expression.source}" }.join(joiner)
|
185
213
|
end
|
186
214
|
|
215
|
+
def add_indent(str, indent)
|
216
|
+
str.split("\n").map { |line| indent + line }.join("\n")
|
217
|
+
end
|
218
|
+
|
187
219
|
def extract_indent(str)
|
188
220
|
return unless str
|
189
221
|
|
@@ -191,6 +223,17 @@ module Rails5
|
|
191
223
|
match[1] if match
|
192
224
|
end
|
193
225
|
|
226
|
+
def text_before_node(node)
|
227
|
+
previous_sibling = node.parent.children[node.sibling_index - 1]
|
228
|
+
return nil unless previous_sibling.loc.expression
|
229
|
+
|
230
|
+
text_between_siblings(previous_sibling, node)
|
231
|
+
end
|
232
|
+
|
233
|
+
def node_to_string(node)
|
234
|
+
@content[node.loc.expression.begin_pos...node.loc.expression.end_pos]
|
235
|
+
end
|
236
|
+
|
194
237
|
def log(str)
|
195
238
|
return if @quiet
|
196
239
|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rails5-spec-converter
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.
|
4
|
+
version: 1.0.9
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Travis Grathwell
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-
|
11
|
+
date: 2016-08-28 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: parser
|
@@ -139,8 +139,9 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
139
139
|
version: '0'
|
140
140
|
requirements: []
|
141
141
|
rubyforge_project:
|
142
|
-
rubygems_version: 2.5
|
142
|
+
rubygems_version: 2.4.5
|
143
143
|
signing_key:
|
144
144
|
specification_version: 4
|
145
145
|
summary: A tool to upgrade Rails 4-style specs to Rails 5-style
|
146
146
|
test_files: []
|
147
|
+
has_rdoc:
|