rubocop-performance 1.16.0 → 1.18.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +2 -2
- data/config/default.yml +1 -0
- data/lib/rubocop/cop/performance/case_when_splat.rb +2 -2
- data/lib/rubocop/cop/performance/compare_with_block.rb +19 -10
- data/lib/rubocop/cop/performance/constant_regexp.rb +4 -0
- data/lib/rubocop/cop/performance/count.rb +1 -1
- data/lib/rubocop/cop/performance/detect.rb +3 -6
- data/lib/rubocop/cop/performance/double_start_end_with.rb +2 -2
- data/lib/rubocop/cop/performance/end_with.rb +1 -1
- data/lib/rubocop/cop/performance/flat_map.rb +6 -4
- data/lib/rubocop/cop/performance/inefficient_hash_search.rb +1 -1
- data/lib/rubocop/cop/performance/io_readlines.rb +1 -1
- data/lib/rubocop/cop/performance/redundant_block_call.rb +1 -1
- data/lib/rubocop/cop/performance/redundant_equality_comparison_block.rb +34 -2
- data/lib/rubocop/cop/performance/redundant_match.rb +1 -1
- data/lib/rubocop/cop/performance/redundant_merge.rb +2 -2
- data/lib/rubocop/cop/performance/redundant_string_chars.rb +2 -2
- data/lib/rubocop/cop/performance/regexp_match.rb +16 -12
- data/lib/rubocop/cop/performance/reverse_first.rb +1 -1
- data/lib/rubocop/cop/performance/select_map.rb +1 -1
- data/lib/rubocop/cop/performance/squeeze.rb +1 -1
- data/lib/rubocop/cop/performance/start_with.rb +1 -1
- data/lib/rubocop/cop/performance/string_identifier_argument.rb +15 -10
- data/lib/rubocop/cop/performance/string_include.rb +1 -1
- data/lib/rubocop/cop/performance/string_replacement.rb +1 -1
- data/lib/rubocop/cop/performance/sum.rb +1 -1
- data/lib/rubocop/cop/performance/times_map.rb +1 -1
- data/lib/rubocop/cop/performance/uri_default_parser.rb +1 -1
- data/lib/rubocop/performance/version.rb +1 -1
- metadata +5 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f4926be80598b4880037ffd36eef32c9025051af7f0398f69a34439c135c9d87
|
4
|
+
data.tar.gz: ba3d738da529cbc70c33e8c5d4baa4c6c8013a5498c834f2e28dc87a8811c15a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 1b9a64379554a660c30bffea5a0fc8a8d36a9e31efef6ccb4576f4df432d2f270d91d76b0e7e7638740e6cf83a50b94b4dfe37d93e5366d0171b8a0f4e5bff50
|
7
|
+
data.tar.gz: d27b9db647eb1a53f3e80b0ec20cd43b37b0244127a28f7fbdacefcf9477205a7f4d373c0a27d882fcb43f902d4ab398ad73ea3f51cdd21e5d422cd419d621e9
|
data/README.md
CHANGED
@@ -11,7 +11,7 @@ Performance optimization analysis for your projects, as an extension to [RuboCop
|
|
11
11
|
Just install the `rubocop-performance` gem
|
12
12
|
|
13
13
|
```sh
|
14
|
-
gem install rubocop-performance
|
14
|
+
$ gem install rubocop-performance
|
15
15
|
```
|
16
16
|
|
17
17
|
or if you use bundler put this in your `Gemfile`
|
@@ -47,7 +47,7 @@ cops together with the standard cops.
|
|
47
47
|
### Command line
|
48
48
|
|
49
49
|
```sh
|
50
|
-
rubocop --require rubocop-performance
|
50
|
+
$ rubocop --require rubocop-performance
|
51
51
|
```
|
52
52
|
|
53
53
|
### Rake task
|
data/config/default.yml
CHANGED
@@ -99,7 +99,7 @@ module RuboCop
|
|
99
99
|
|
100
100
|
def inline_fix_branch(corrector, when_node)
|
101
101
|
conditions = when_node.conditions
|
102
|
-
range = range_between(conditions[0].
|
102
|
+
range = range_between(conditions[0].source_range.begin_pos, conditions[-1].source_range.end_pos)
|
103
103
|
|
104
104
|
corrector.replace(range, replacement(conditions))
|
105
105
|
end
|
@@ -110,7 +110,7 @@ module RuboCop
|
|
110
110
|
return if when_branches.one?
|
111
111
|
|
112
112
|
corrector.remove(when_branch_range(when_node))
|
113
|
-
corrector.insert_after(when_branches.last
|
113
|
+
corrector.insert_after(when_branches.last, reordering_correction(when_node))
|
114
114
|
end
|
115
115
|
|
116
116
|
def reordering_correction(when_node)
|
@@ -5,35 +5,42 @@ module RuboCop
|
|
5
5
|
module Performance
|
6
6
|
# Identifies places where `sort { |a, b| a.foo <=> b.foo }`
|
7
7
|
# can be replaced by `sort_by(&:foo)`.
|
8
|
-
# This cop also checks `max` and `
|
8
|
+
# This cop also checks `sort!`, `min`, `max` and `minmax` methods.
|
9
9
|
#
|
10
10
|
# @example
|
11
11
|
# # bad
|
12
|
-
# array.sort
|
13
|
-
# array.
|
14
|
-
# array.
|
15
|
-
# array.
|
12
|
+
# array.sort { |a, b| a.foo <=> b.foo }
|
13
|
+
# array.sort! { |a, b| a.foo <=> b.foo }
|
14
|
+
# array.max { |a, b| a.foo <=> b.foo }
|
15
|
+
# array.min { |a, b| a.foo <=> b.foo }
|
16
|
+
# array.minmax { |a, b| a.foo <=> b.foo }
|
17
|
+
# array.sort { |a, b| a[:foo] <=> b[:foo] }
|
16
18
|
#
|
17
19
|
# # good
|
18
20
|
# array.sort_by(&:foo)
|
21
|
+
# array.sort_by!(&:foo)
|
19
22
|
# array.sort_by { |v| v.foo }
|
20
23
|
# array.sort_by do |var|
|
21
24
|
# var.foo
|
22
25
|
# end
|
23
26
|
# array.max_by(&:foo)
|
24
27
|
# array.min_by(&:foo)
|
28
|
+
# array.minmax_by(&:foo)
|
25
29
|
# array.sort_by { |a| a[:foo] }
|
26
30
|
class CompareWithBlock < Base
|
27
31
|
include RangeHelp
|
28
32
|
extend AutoCorrector
|
29
33
|
|
30
|
-
MSG = 'Use `%<
|
34
|
+
MSG = 'Use `%<replacement_method>s%<instead>s` instead of ' \
|
31
35
|
'`%<compare_method>s { |%<var_a>s, %<var_b>s| %<str_a>s ' \
|
32
36
|
'<=> %<str_b>s }`.'
|
33
37
|
|
38
|
+
REPLACEMENT = { sort: :sort_by, sort!: :sort_by!, min: :min_by, max: :max_by, minmax: :minmax_by }.freeze
|
39
|
+
private_constant :REPLACEMENT
|
40
|
+
|
34
41
|
def_node_matcher :compare?, <<~PATTERN
|
35
42
|
(block
|
36
|
-
$(send _ {:sort :min :max})
|
43
|
+
$(send _ {:sort :sort! :min :max :minmax})
|
37
44
|
(args (arg $_a) (arg $_b))
|
38
45
|
$send)
|
39
46
|
PATTERN
|
@@ -54,9 +61,9 @@ module RuboCop
|
|
54
61
|
|
55
62
|
add_offense(range, message: message(send, method, var_a, var_b, args_a)) do |corrector|
|
56
63
|
replacement = if method == :[]
|
57
|
-
"#{send.method_name}
|
64
|
+
"#{REPLACEMENT[send.method_name]} { |a| a[#{args_a.first.source}] }"
|
58
65
|
else
|
59
|
-
"#{send.method_name}
|
66
|
+
"#{REPLACEMENT[send.method_name]}(&:#{method})"
|
60
67
|
end
|
61
68
|
corrector.replace(range, replacement)
|
62
69
|
end
|
@@ -82,7 +89,8 @@ module RuboCop
|
|
82
89
|
|
83
90
|
# rubocop:disable Metrics/MethodLength
|
84
91
|
def message(send, method, var_a, var_b, args)
|
85
|
-
compare_method
|
92
|
+
compare_method = send.method_name
|
93
|
+
replacement_method = REPLACEMENT[compare_method]
|
86
94
|
if method == :[]
|
87
95
|
key = args.first
|
88
96
|
instead = " { |a| a[#{key.source}] }"
|
@@ -94,6 +102,7 @@ module RuboCop
|
|
94
102
|
str_b = "#{var_b}.#{method}"
|
95
103
|
end
|
96
104
|
format(MSG, compare_method: compare_method,
|
105
|
+
replacement_method: replacement_method,
|
97
106
|
instead: instead,
|
98
107
|
var_a: var_a,
|
99
108
|
var_b: var_b,
|
@@ -38,6 +38,10 @@ module RuboCop
|
|
38
38
|
|
39
39
|
MSG = 'Extract this regexp into a constant, memoize it, or append an `/o` option to its options.'
|
40
40
|
|
41
|
+
def self.autocorrect_incompatible_with
|
42
|
+
[RegexpMatch]
|
43
|
+
end
|
44
|
+
|
41
45
|
def on_regexp(node)
|
42
46
|
return if within_allowed_assignment?(node) || !include_interpolated_const?(node) || node.single_interpolation?
|
43
47
|
|
@@ -110,7 +110,7 @@ module RuboCop
|
|
110
110
|
|
111
111
|
def negate_block_pass_reject(corrector, node)
|
112
112
|
corrector.replace(
|
113
|
-
node.receiver.
|
113
|
+
node.receiver.source_range.with(begin_pos: node.receiver.loc.begin.begin_pos),
|
114
114
|
negate_block_pass_as_inline_block(node.receiver)
|
115
115
|
)
|
116
116
|
end
|
@@ -8,12 +8,9 @@ module RuboCop
|
|
8
8
|
# `detect` instead.
|
9
9
|
#
|
10
10
|
# @safety
|
11
|
-
# This cop is unsafe because
|
12
|
-
# `
|
13
|
-
#
|
14
|
-
# frameworks. `Hash` and `ActiveRecord` do not implement a `detect`
|
15
|
-
# method and `find` has its own meaning. Correcting `Hash` and
|
16
|
-
# `ActiveRecord` methods with this cop should be considered unsafe.
|
11
|
+
# This cop is unsafe because it assumes that the receiver is an
|
12
|
+
# `Array` or equivalent, but can't reliably detect it. For example,
|
13
|
+
# if the receiver is a `Hash`, it may report a false positive.
|
17
14
|
#
|
18
15
|
# @example
|
19
16
|
# # bad
|
@@ -58,8 +58,8 @@ module RuboCop
|
|
58
58
|
private
|
59
59
|
|
60
60
|
def autocorrect(corrector, first_call_args, second_call_args, combined_args)
|
61
|
-
first_argument = first_call_args.first.
|
62
|
-
last_argument = second_call_args.last.
|
61
|
+
first_argument = first_call_args.first.source_range
|
62
|
+
last_argument = second_call_args.last.source_range
|
63
63
|
range = first_argument.join(last_argument)
|
64
64
|
|
65
65
|
corrector.replace(range, combined_args)
|
@@ -28,7 +28,7 @@ module RuboCop
|
|
28
28
|
def_node_matcher :flat_map_candidate?, <<~PATTERN
|
29
29
|
(send
|
30
30
|
{
|
31
|
-
(block
|
31
|
+
$(block (send _ ${:collect :map}) ...)
|
32
32
|
$(send _ ${:collect :map} (block_pass _))
|
33
33
|
}
|
34
34
|
${:flatten :flatten!}
|
@@ -60,7 +60,8 @@ module RuboCop
|
|
60
60
|
end
|
61
61
|
|
62
62
|
def register_offense(node, map_node, first_method, flatten, message)
|
63
|
-
|
63
|
+
map_send_node = map_node.block_type? ? map_node.send_node : map_node
|
64
|
+
range = range_between(map_send_node.loc.selector.begin_pos, node.source_range.end_pos)
|
64
65
|
message = format(message, method: first_method, flatten: flatten)
|
65
66
|
|
66
67
|
add_offense(range, message: message) do |corrector|
|
@@ -74,10 +75,11 @@ module RuboCop
|
|
74
75
|
|
75
76
|
return unless flatten_level
|
76
77
|
|
77
|
-
|
78
|
+
map_send_node = map_node.block_type? ? map_node.send_node : map_node
|
79
|
+
range = range_between(map_node.source_range.end_pos, node.source_range.end_pos)
|
78
80
|
|
79
81
|
corrector.remove(range)
|
80
|
-
corrector.replace(
|
82
|
+
corrector.replace(map_send_node.loc.selector, 'flat_map')
|
81
83
|
end
|
82
84
|
end
|
83
85
|
end
|
@@ -57,7 +57,7 @@ module RuboCop
|
|
57
57
|
# Replace `keys.include?` or `values.include?` with the appropriate
|
58
58
|
# `key?`/`value?` method.
|
59
59
|
corrector.replace(
|
60
|
-
node
|
60
|
+
node,
|
61
61
|
"#{autocorrect_hash_expression(node)}.#{autocorrect_method(node)}(#{autocorrect_argument(node)})"
|
62
62
|
)
|
63
63
|
end
|
@@ -10,6 +10,16 @@ module RuboCop
|
|
10
10
|
# behavior is appropriately overridden in subclass. For example,
|
11
11
|
# `Range#===` returns `true` when argument is within the range.
|
12
12
|
#
|
13
|
+
# This cop has `AllowRegexpMatch` option and it is true by default because
|
14
|
+
# `regexp.match?('string')` often used in block changes to the opposite result:
|
15
|
+
#
|
16
|
+
# [source,ruby]
|
17
|
+
# ----
|
18
|
+
# [/pattern/].all? { |regexp| regexp.match?('pattern') } # => true
|
19
|
+
# [/pattern/].all? { |regexp| regexp =~ 'pattern' } # => true
|
20
|
+
# [/pattern/].all?('pattern') # => false
|
21
|
+
# ----
|
22
|
+
#
|
13
23
|
# @safety
|
14
24
|
# This cop is unsafe because `===` and `==` do not always behave the same.
|
15
25
|
#
|
@@ -22,6 +32,19 @@ module RuboCop
|
|
22
32
|
#
|
23
33
|
# # good
|
24
34
|
# items.all?(pattern)
|
35
|
+
# items.all?(Klass)
|
36
|
+
#
|
37
|
+
# @example AllowRegexpMatch: true (default)
|
38
|
+
#
|
39
|
+
# # good
|
40
|
+
# items.all? { |item| item =~ pattern }
|
41
|
+
# items.all? { |item| item.match?(pattern) }
|
42
|
+
#
|
43
|
+
# @example AllowRegexpMatch: false
|
44
|
+
#
|
45
|
+
# # bad
|
46
|
+
# items.all? { |item| item =~ pattern }
|
47
|
+
# items.all? { |item| item.match?(pattern) }
|
25
48
|
#
|
26
49
|
class RedundantEqualityComparisonBlock < Base
|
27
50
|
extend AutoCorrector
|
@@ -33,6 +56,7 @@ module RuboCop
|
|
33
56
|
|
34
57
|
TARGET_METHODS = %i[all? any? one? none?].freeze
|
35
58
|
COMPARISON_METHODS = %i[== === is_a? kind_of?].freeze
|
59
|
+
REGEXP_METHODS = %i[=~ match?].freeze
|
36
60
|
IS_A_METHODS = %i[is_a? kind_of?].freeze
|
37
61
|
|
38
62
|
def on_block(node)
|
@@ -60,7 +84,11 @@ module RuboCop
|
|
60
84
|
end
|
61
85
|
|
62
86
|
def use_equality_comparison_block?(block_body)
|
63
|
-
block_body.send_type?
|
87
|
+
return false unless block_body.send_type?
|
88
|
+
|
89
|
+
method_name = block_body.method_name
|
90
|
+
|
91
|
+
COMPARISON_METHODS.include?(method_name) || (!allow_regexp_match? && REGEXP_METHODS.include?(method_name))
|
64
92
|
end
|
65
93
|
|
66
94
|
def same_block_argument_and_is_a_argument?(block_body, block_argument)
|
@@ -69,7 +97,7 @@ module RuboCop
|
|
69
97
|
elsif IS_A_METHODS.include?(block_body.method_name)
|
70
98
|
block_argument.source == block_body.first_argument.source
|
71
99
|
else
|
72
|
-
|
100
|
+
block_body.receiver.source == block_body.first_argument.receiver&.source
|
73
101
|
end
|
74
102
|
end
|
75
103
|
|
@@ -99,6 +127,10 @@ module RuboCop
|
|
99
127
|
def offense_range(node)
|
100
128
|
node.send_node.loc.selector.join(node.source_range.end)
|
101
129
|
end
|
130
|
+
|
131
|
+
def allow_regexp_match?
|
132
|
+
cop_config.fetch('AllowRegexpMatch', true)
|
133
|
+
end
|
102
134
|
end
|
103
135
|
end
|
104
136
|
end
|
@@ -112,11 +112,11 @@ module RuboCop
|
|
112
112
|
new_source.gsub!(/\n/, padding)
|
113
113
|
end
|
114
114
|
|
115
|
-
corrector.replace(node
|
115
|
+
corrector.replace(node, new_source)
|
116
116
|
end
|
117
117
|
|
118
118
|
def correct_single_element(corrector, node, new_source)
|
119
|
-
corrector.replace(node
|
119
|
+
corrector.replace(node, new_source)
|
120
120
|
end
|
121
121
|
|
122
122
|
def to_assignments(receiver, pairs)
|
@@ -69,11 +69,11 @@ module RuboCop
|
|
69
69
|
private
|
70
70
|
|
71
71
|
def offense_range(receiver, node)
|
72
|
-
range_between(receiver.loc.selector.begin_pos, node.
|
72
|
+
range_between(receiver.loc.selector.begin_pos, node.source_range.end_pos)
|
73
73
|
end
|
74
74
|
|
75
75
|
def correction_range(receiver, node)
|
76
|
-
range_between(receiver.loc.dot.begin_pos, node.
|
76
|
+
range_between(receiver.loc.dot.begin_pos, node.source_range.end_pos)
|
77
77
|
end
|
78
78
|
|
79
79
|
def build_message(method, args)
|
@@ -131,6 +131,10 @@ module RuboCop
|
|
131
131
|
}
|
132
132
|
PATTERN
|
133
133
|
|
134
|
+
def self.autocorrect_incompatible_with
|
135
|
+
[ConstantRegexp]
|
136
|
+
end
|
137
|
+
|
134
138
|
def on_if(node)
|
135
139
|
check_condition(node.condition)
|
136
140
|
end
|
@@ -185,9 +189,9 @@ module RuboCop
|
|
185
189
|
|
186
190
|
def range_to_search_for_last_matches(match_node, body, scope_root)
|
187
191
|
expression = if modifier_form?(match_node)
|
188
|
-
match_node.parent.if_branch.
|
192
|
+
match_node.parent.if_branch.source_range
|
189
193
|
else
|
190
|
-
match_node.
|
194
|
+
match_node.source_range
|
191
195
|
end
|
192
196
|
|
193
197
|
match_node_pos = expression.begin_pos
|
@@ -199,15 +203,15 @@ module RuboCop
|
|
199
203
|
def next_match_pos(body, match_node_pos, scope_root)
|
200
204
|
node = search_match_nodes(body).find do |match|
|
201
205
|
begin_pos = if modifier_form?(match)
|
202
|
-
match.parent.if_branch.
|
206
|
+
match.parent.if_branch.source_range.begin_pos
|
203
207
|
else
|
204
|
-
match.
|
208
|
+
match.source_range.begin_pos
|
205
209
|
end
|
206
210
|
|
207
211
|
begin_pos > match_node_pos && scope_root(match) == scope_root
|
208
212
|
end
|
209
213
|
|
210
|
-
node ? node.
|
214
|
+
node ? node.source_range.begin_pos : Float::INFINITY
|
211
215
|
end
|
212
216
|
|
213
217
|
def modifier_form?(match_node)
|
@@ -216,7 +220,7 @@ module RuboCop
|
|
216
220
|
|
217
221
|
def find_last_match(body, range, scope_root)
|
218
222
|
last_matches(body).find do |ref|
|
219
|
-
ref_pos = ref.
|
223
|
+
ref_pos = ref.source_range.begin_pos
|
220
224
|
range.cover?(ref_pos) && scope_root(ref) == scope_root
|
221
225
|
end
|
222
226
|
end
|
@@ -248,8 +252,8 @@ module RuboCop
|
|
248
252
|
|
249
253
|
replace_with_match_predicate_method(corrector, recv, arg, op_range)
|
250
254
|
|
251
|
-
corrector.insert_after(arg
|
252
|
-
corrector.insert_before(recv
|
255
|
+
corrector.insert_after(arg, ')') unless op_range.source.end_with?('(')
|
256
|
+
corrector.insert_before(recv, '!') if oper == :!~
|
253
257
|
end
|
254
258
|
|
255
259
|
def replace_with_match_predicate_method(corrector, recv, arg, op_range)
|
@@ -264,14 +268,14 @@ module RuboCop
|
|
264
268
|
end
|
265
269
|
|
266
270
|
def swap_receiver_and_arg(corrector, recv, arg)
|
267
|
-
corrector.replace(recv
|
268
|
-
corrector.replace(arg
|
271
|
+
corrector.replace(recv, arg.source)
|
272
|
+
corrector.replace(arg, recv.source)
|
269
273
|
end
|
270
274
|
|
271
275
|
def correction_range(recv, arg)
|
272
276
|
buffer = processed_source.buffer
|
273
|
-
op_begin_pos = recv.
|
274
|
-
op_end_pos = arg.
|
277
|
+
op_begin_pos = recv.source_range.end_pos
|
278
|
+
op_end_pos = arg.source_range.begin_pos
|
275
279
|
Parser::Source::Range.new(buffer, op_begin_pos, op_end_pos)
|
276
280
|
end
|
277
281
|
end
|
@@ -43,7 +43,7 @@ module RuboCop
|
|
43
43
|
private
|
44
44
|
|
45
45
|
def correction_range(receiver, node)
|
46
|
-
range_between(receiver.loc.selector.begin_pos, node.
|
46
|
+
range_between(receiver.loc.selector.begin_pos, node.source_range.end_pos)
|
47
47
|
end
|
48
48
|
|
49
49
|
def build_message(node)
|
@@ -27,28 +27,33 @@ module RuboCop
|
|
27
27
|
|
28
28
|
MSG = 'Use `%<symbol_arg>s` instead of `%<string_arg>s`.'
|
29
29
|
|
30
|
+
COMMAND_METHODS = %i[
|
31
|
+
alias_method attr_accessor attr_reader attr_writer autoload autoload? private private_constant
|
32
|
+
protected public public_constant module_function
|
33
|
+
].freeze
|
34
|
+
|
30
35
|
# NOTE: `attr` method is not included in this list as it can cause false positives in Nokogiri API.
|
31
36
|
# And `attr` may not be used because `Style/Attr` registers an offense.
|
32
37
|
# https://github.com/rubocop/rubocop-performance/issues/278
|
33
|
-
RESTRICT_ON_SEND = %i[
|
34
|
-
alias_method attr_accessor attr_reader attr_writer autoload autoload?
|
38
|
+
RESTRICT_ON_SEND = (%i[
|
35
39
|
class_variable_defined? const_defined? const_get const_set const_source_location
|
36
40
|
define_method instance_method method_defined? private_class_method? private_method_defined?
|
37
41
|
protected_method_defined? public_class_method public_instance_method public_method_defined?
|
38
42
|
remove_class_variable remove_method undef_method class_variable_get class_variable_set
|
39
|
-
deprecate_constant
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
__send__
|
44
|
-
].freeze
|
43
|
+
deprecate_constant remove_const ruby2_keywords define_singleton_method instance_variable_defined?
|
44
|
+
instance_variable_get instance_variable_set method public_method public_send remove_instance_variable
|
45
|
+
respond_to? send singleton_method __send__
|
46
|
+
] + COMMAND_METHODS).freeze
|
45
47
|
|
46
48
|
def on_send(node)
|
49
|
+
return if COMMAND_METHODS.include?(node.method_name) && node.receiver
|
47
50
|
return unless (first_argument = node.first_argument)
|
48
51
|
return unless first_argument.str_type?
|
49
|
-
return if first_argument.value.include?(' ') || first_argument.value.include?('::')
|
50
52
|
|
51
|
-
|
53
|
+
first_argument_value = first_argument.value
|
54
|
+
return if first_argument_value.include?(' ') || first_argument_value.include?('::')
|
55
|
+
|
56
|
+
replacement = first_argument_value.to_sym.inspect
|
52
57
|
|
53
58
|
message = format(MSG, symbol_arg: replacement, string_arg: first_argument.source)
|
54
59
|
|
@@ -43,7 +43,7 @@ module RuboCop
|
|
43
43
|
|
44
44
|
new_source = "#{'!' if negation}#{receiver.source}.include?(#{to_string_literal(regex_str)})"
|
45
45
|
|
46
|
-
corrector.replace(node
|
46
|
+
corrector.replace(node, new_source)
|
47
47
|
end
|
48
48
|
end
|
49
49
|
alias on_match_with_lvasgn on_send
|
@@ -70,7 +70,7 @@ module RuboCop
|
|
70
70
|
replacement_method = replacement_method(node, first_source, second_source)
|
71
71
|
|
72
72
|
corrector.replace(node.loc.selector, replacement_method)
|
73
|
-
corrector.replace(first_param
|
73
|
+
corrector.replace(first_param, to_string_literal(first_source)) unless first_param.str_type?
|
74
74
|
|
75
75
|
remove_second_param(corrector, node, first_param) if second_source.empty? && first_source.length == 1
|
76
76
|
end
|
@@ -52,7 +52,7 @@ module RuboCop
|
|
52
52
|
add_offense(node, message: message(map_or_collect, count)) do |corrector|
|
53
53
|
replacement = "Array.new(#{count.source}#{map_or_collect.arguments.map { |arg| ", #{arg.source}" }.join})"
|
54
54
|
|
55
|
-
corrector.replace(map_or_collect
|
55
|
+
corrector.replace(map_or_collect, replacement)
|
56
56
|
end
|
57
57
|
end
|
58
58
|
end
|
@@ -30,7 +30,7 @@ module RuboCop
|
|
30
30
|
message = format(MSG, double_colon: double_colon)
|
31
31
|
|
32
32
|
add_offense(node, message: message) do |corrector|
|
33
|
-
corrector.replace(node
|
33
|
+
corrector.replace(node, "#{double_colon}URI::DEFAULT_PARSER")
|
34
34
|
end
|
35
35
|
end
|
36
36
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rubocop-performance
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.18.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Bozhidar Batsov
|
@@ -10,7 +10,7 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date: 2023-
|
13
|
+
date: 2023-05-21 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: rubocop
|
@@ -123,7 +123,7 @@ metadata:
|
|
123
123
|
homepage_uri: https://docs.rubocop.org/rubocop-performance/
|
124
124
|
changelog_uri: https://github.com/rubocop/rubocop-performance/blob/master/CHANGELOG.md
|
125
125
|
source_code_uri: https://github.com/rubocop/rubocop-performance/
|
126
|
-
documentation_uri: https://docs.rubocop.org/rubocop-performance/1.
|
126
|
+
documentation_uri: https://docs.rubocop.org/rubocop-performance/1.18/
|
127
127
|
bug_tracker_uri: https://github.com/rubocop/rubocop-performance/issues
|
128
128
|
rubygems_mfa_required: 'true'
|
129
129
|
post_install_message:
|
@@ -134,14 +134,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
134
134
|
requirements:
|
135
135
|
- - ">="
|
136
136
|
- !ruby/object:Gem::Version
|
137
|
-
version: 2.
|
137
|
+
version: 2.7.0
|
138
138
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
139
139
|
requirements:
|
140
140
|
- - ">="
|
141
141
|
- !ruby/object:Gem::Version
|
142
142
|
version: '0'
|
143
143
|
requirements: []
|
144
|
-
rubygems_version: 3.
|
144
|
+
rubygems_version: 3.5.0.dev
|
145
145
|
signing_key:
|
146
146
|
specification_version: 4
|
147
147
|
summary: Automatic performance checking tool for Ruby code.
|