sevencop 0.32.0 → 0.32.2
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/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
|