rubocop-performance 1.16.0 → 1.18.0
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/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.
|