sevencop 0.32.0 → 0.32.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile.lock +1 -1
- data/config/default.yml +1 -0
- data/lib/rubocop/cop/sevencop/constant_base.rb +1 -1
- data/lib/rubocop/cop/sevencop/rails_order_field_in_order_of.rb +52 -16
- data/lib/sevencop/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f4a4965c23bf272ebe52214f0c8a37c6bd989638560cbf7e079b3af2e9782622
|
4
|
+
data.tar.gz: 134934de2b553fabf8b07b63c5e10364178fd007866bb45cea8ff8e357985c77
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6bf335fbbf8fc003e83369b98b67c2af236bdfd2cee48b6a142ff13a34cea3d0f633a142f340924c61411755adb771171e1fb87498a70edc0e3c4d241f96ca22
|
7
|
+
data.tar.gz: a5592277696b87dc3ec141b8d2155681da27d7d1f8369d919fd5d24dc1da8d1c2d8ca1070315083e334217f1ecf9d7e77e8879efcbcdc86ed9639ec4aeed0500
|
data/Gemfile.lock
CHANGED
data/config/default.yml
CHANGED
@@ -5,6 +5,23 @@ module RuboCop
|
|
5
5
|
module Sevencop
|
6
6
|
# Prefer `in_order_of` to MySQL `FIELD` function.
|
7
7
|
#
|
8
|
+
# @safety
|
9
|
+
# This cop's autocorrection is unsafe because in the original code the array value is interpolated as
|
10
|
+
# literals on SQL query, but after its autocorrection, the value will be now passed directly to in_order_of,
|
11
|
+
# which may produce different results.
|
12
|
+
#
|
13
|
+
# For example, the following code is valid where the id column is a integer column:
|
14
|
+
#
|
15
|
+
# ids = %w[1 2 3]
|
16
|
+
# order("FIELD(id, #{ids.join(', ')})") # "FIELD(id, 1, 2, 3)"
|
17
|
+
#
|
18
|
+
# But after its autocorrection, it will be like this:
|
19
|
+
#
|
20
|
+
# ids = %w[1 2 3]
|
21
|
+
# in_order_of(:id, ids) # We need to change this code as `ids.map(&:to_i)`.
|
22
|
+
#
|
23
|
+
# And this code will raise an error because `ids` is not an array of Integer but an array of String.
|
24
|
+
#
|
8
25
|
# @example
|
9
26
|
# # bad
|
10
27
|
# order('FIELD(id, 1, 2, 3)')
|
@@ -37,7 +54,7 @@ module RuboCop
|
|
37
54
|
\s*
|
38
55
|
field\(
|
39
56
|
\s*
|
40
|
-
(?<column_name
|
57
|
+
(?<column_name>[^,]+)
|
41
58
|
,\s*
|
42
59
|
\z
|
43
60
|
/ix.freeze
|
@@ -59,7 +76,7 @@ module RuboCop
|
|
59
76
|
\s*
|
60
77
|
field\(
|
61
78
|
\s*
|
62
|
-
(?<column_name
|
79
|
+
(?<column_name>[^,]+)
|
63
80
|
,\s*
|
64
81
|
(?<values>.+)
|
65
82
|
\s*
|
@@ -84,7 +101,9 @@ module RuboCop
|
|
84
101
|
def on_send(node)
|
85
102
|
return unless bad?(node)
|
86
103
|
|
87
|
-
add_offense(
|
104
|
+
add_offense(
|
105
|
+
convert_to_autocorrected_range(node)
|
106
|
+
) do |corrector|
|
88
107
|
autocorrect(corrector, node)
|
89
108
|
end
|
90
109
|
end
|
@@ -148,17 +167,23 @@ module RuboCop
|
|
148
167
|
node
|
149
168
|
)
|
150
169
|
corrector.replace(
|
151
|
-
node
|
152
|
-
begin_pos: node.location.selector.begin_pos
|
153
|
-
),
|
170
|
+
convert_to_autocorrected_range(node),
|
154
171
|
format_in_order_of(node)
|
155
172
|
)
|
156
173
|
end
|
157
174
|
|
175
|
+
# @param node [RuboCop::AST::SendNode]
|
176
|
+
# @return [Parser::Source::Range]
|
177
|
+
def convert_to_autocorrected_range(node)
|
178
|
+
node.location.expression.with(
|
179
|
+
begin_pos: node.location.selector.begin_pos
|
180
|
+
)
|
181
|
+
end
|
182
|
+
|
158
183
|
# @param node [RuboCop::AST::SendNode]
|
159
184
|
# @return [String, nil]
|
160
185
|
def extract_column_name(node)
|
161
|
-
if node
|
186
|
+
if search_from_arguments(node, type: :dstr).any?
|
162
187
|
extract_column_name_from_dstr(node)
|
163
188
|
else
|
164
189
|
extract_column_name_from_str(node)
|
@@ -168,25 +193,25 @@ module RuboCop
|
|
168
193
|
# @param node [RuboCop::AST::SendNode]
|
169
194
|
# @return [String]
|
170
195
|
def extract_column_name_from_dstr(node)
|
171
|
-
node
|
196
|
+
search_from_arguments(node, type: :str).first.value[REGEXP_FIELD_DSTR_HEAD, :column_name].delete('`')
|
172
197
|
end
|
173
198
|
|
174
199
|
# @param node [RuboCop::AST::SendNode]
|
175
200
|
# @return [String]
|
176
201
|
def extract_column_name_from_str(node)
|
177
|
-
node
|
202
|
+
search_from_arguments(node, type: :str).first.value[REGEXP_FIELD_STR, :column_name].delete('`')
|
178
203
|
end
|
179
204
|
|
180
205
|
# @param node [RuboCop::AST::SendNode]
|
181
206
|
# @return [String, nil]
|
182
207
|
def extract_order_from_dstr(node)
|
183
|
-
node
|
208
|
+
search_from_arguments(node, type: :str).to_a.last.value[REGEXP_FIELD_DSTR_TAIL, :order]
|
184
209
|
end
|
185
210
|
|
186
211
|
# @param node [RuboCop::AST::SendNode]
|
187
212
|
# @return [String, nil]
|
188
213
|
def extract_order_from_str(node)
|
189
|
-
node
|
214
|
+
search_from_arguments(node, type: :str).first.value[REGEXP_FIELD_STR, :order]
|
190
215
|
end
|
191
216
|
|
192
217
|
# @param node [RuboCop::AST::SendNode]
|
@@ -216,7 +241,7 @@ module RuboCop
|
|
216
241
|
# @param node [RuboCop::AST::SendNode]
|
217
242
|
# @return [String]
|
218
243
|
def extract_values_from_dstr(node)
|
219
|
-
node.
|
244
|
+
search_from_arguments(node).find do |descendant|
|
220
245
|
match_field_dstr_body?(descendant)
|
221
246
|
end.children.first.receiver.source
|
222
247
|
end
|
@@ -226,14 +251,14 @@ module RuboCop
|
|
226
251
|
def extract_values_from_str(node)
|
227
252
|
format(
|
228
253
|
'[%<values>s]',
|
229
|
-
values: node
|
254
|
+
values: search_from_arguments(node, type: :str).first.value[REGEXP_FIELD_STR, :values].split(',').map(&:strip).join(', ')
|
230
255
|
)
|
231
256
|
end
|
232
257
|
|
233
258
|
# @param node [RuboCop::AST::SendNode]
|
234
259
|
# @return [String]
|
235
260
|
def format_in_order_of(node)
|
236
|
-
if node
|
261
|
+
if search_from_arguments(node, type: :dstr).any?
|
237
262
|
format_in_order_of_on_dstr(node)
|
238
263
|
else
|
239
264
|
format_in_order_of_on_str(node)
|
@@ -244,7 +269,7 @@ module RuboCop
|
|
244
269
|
# @return [String]
|
245
270
|
def format_in_order_of_on_dstr(node)
|
246
271
|
format(
|
247
|
-
|
272
|
+
"in_order_of(:'%<column_name>s', %<values>s)%<reverse_order>s%<rest_order>s",
|
248
273
|
column_name: extract_column_name_from_dstr(node),
|
249
274
|
rest_order: extract_rest_order(node),
|
250
275
|
reverse_order: extract_reverse_order_from_dstr(node),
|
@@ -256,7 +281,7 @@ module RuboCop
|
|
256
281
|
# @return [String]
|
257
282
|
def format_in_order_of_on_str(node)
|
258
283
|
format(
|
259
|
-
|
284
|
+
"in_order_of(:'%<column_name>s', %<values>s)%<reverse_order>s%<rest_order>s",
|
260
285
|
column_name: extract_column_name_from_str(node),
|
261
286
|
rest_order: extract_rest_order(node),
|
262
287
|
reverse_order: extract_reverse_order_from_str(node),
|
@@ -310,6 +335,17 @@ module RuboCop
|
|
310
335
|
node.str_type? &&
|
311
336
|
node.value.match?(REGEXP_FIELD_STR)
|
312
337
|
end
|
338
|
+
|
339
|
+
# @param node [RuboCop::AST::SendNode]
|
340
|
+
# @param type [Symbol]
|
341
|
+
def search_from_arguments(
|
342
|
+
node,
|
343
|
+
type: nil
|
344
|
+
)
|
345
|
+
node.arguments.flat_map do |argument|
|
346
|
+
argument.each_node(*Array(type)).to_a
|
347
|
+
end
|
348
|
+
end
|
313
349
|
end
|
314
350
|
end
|
315
351
|
end
|
data/lib/sevencop/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sevencop
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.32.
|
4
|
+
version: 0.32.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ryo Nakamura
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2022-11-
|
11
|
+
date: 2022-11-21 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|