rubocop-performance 1.12.0 → 1.13.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/config/default.yml +14 -7
- data/lib/rubocop/cop/performance/big_decimal_with_numeric_argument.rb +23 -12
- data/lib/rubocop/cop/performance/detect.rb +0 -4
- data/lib/rubocop/cop/performance/double_start_end_with.rb +21 -0
- data/lib/rubocop/cop/performance/map_compact.rb +16 -4
- data/lib/rubocop/cop/performance/redundant_string_chars.rb +15 -7
- data/lib/rubocop/cop/performance/string_identifier_argument.rb +59 -0
- data/lib/rubocop/cop/performance/sum.rb +46 -22
- data/lib/rubocop/cop/performance_cops.rb +1 -0
- data/lib/rubocop/performance/version.rb +1 -1
- metadata +6 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 874ce36b942ed539ead8c3329a7dd6831224459a286c2b3189605775e725fc60
|
4
|
+
data.tar.gz: 584a851432d98e548151baa8afc1f9a30d5dcca05f8eae0d86c68f17bf933f34
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 102cccbb3be2ba55702a2e7aff3c56c6325c80481d269f87921ca1d16a79fa12830c6f080f49bacdebf4b5726e4f4c42af2527c13a4abac5aae0cf4544fb018e
|
7
|
+
data.tar.gz: 23c8beebceef175caf7e226a136bb3eaff500b71f5e3e26cba9fee9a84e36aa7a3b315b11216844b7980a421a82fff7a5346560ef1418f58fbe5261599fe4dec
|
data/config/default.yml
CHANGED
@@ -17,7 +17,7 @@ Performance/ArraySemiInfiniteRangeSlice:
|
|
17
17
|
VersionAdded: '1.9'
|
18
18
|
|
19
19
|
Performance/BigDecimalWithNumericArgument:
|
20
|
-
Description: 'Convert numeric
|
20
|
+
Description: 'Convert numeric literal to string and pass it to `BigDecimal`.'
|
21
21
|
Enabled: 'pending'
|
22
22
|
VersionAdded: '1.7'
|
23
23
|
|
@@ -43,10 +43,9 @@ Performance/CaseWhenSplat:
|
|
43
43
|
Reordering `when` conditions with a splat to the end
|
44
44
|
of the `when` branches can improve performance.
|
45
45
|
Enabled: false
|
46
|
-
AutoCorrect: false
|
47
46
|
SafeAutoCorrect: false
|
48
47
|
VersionAdded: '0.34'
|
49
|
-
VersionChanged: '
|
48
|
+
VersionChanged: '1.13'
|
50
49
|
|
51
50
|
Performance/Casecmp:
|
52
51
|
Description: >-
|
@@ -137,7 +136,7 @@ Performance/DoubleStartEndWith:
|
|
137
136
|
VersionAdded: '0.36'
|
138
137
|
VersionChanged: '0.48'
|
139
138
|
# Used to check for `starts_with?` and `ends_with?`.
|
140
|
-
# These methods are defined by
|
139
|
+
# These methods are defined by Active Support.
|
141
140
|
IncludeActiveSupportAliases: false
|
142
141
|
|
143
142
|
Performance/EndWith:
|
@@ -312,6 +311,11 @@ Performance/StartWith:
|
|
312
311
|
VersionAdded: '0.36'
|
313
312
|
VersionChanged: '1.10'
|
314
313
|
|
314
|
+
Performance/StringIdentifierArgument:
|
315
|
+
Description: 'Use symbol identifier argument instead of string identifier argument.'
|
316
|
+
Enabled: pending
|
317
|
+
VersionAdded: '1.13'
|
318
|
+
|
315
319
|
Performance/StringInclude:
|
316
320
|
Description: 'Use `String#include?` instead of a regex match with literal-only pattern.'
|
317
321
|
Enabled: 'pending'
|
@@ -330,17 +334,20 @@ Performance/StringReplacement:
|
|
330
334
|
|
331
335
|
Performance/Sum:
|
332
336
|
Description: 'Use `sum` instead of a custom array summation.'
|
337
|
+
SafeAutoCorrect: false
|
333
338
|
Reference: 'https://blog.bigbinary.com/2016/11/02/ruby-2-4-introduces-enumerable-sum.html'
|
334
339
|
Enabled: 'pending'
|
335
340
|
VersionAdded: '1.8'
|
341
|
+
VersionChanged: '1.13'
|
342
|
+
OnlySumOrWithInitialValue: false
|
336
343
|
|
337
344
|
Performance/TimesMap:
|
338
345
|
Description: 'Checks for .times.map calls.'
|
339
|
-
AutoCorrect: false
|
340
346
|
Enabled: true
|
347
|
+
# See https://github.com/rubocop/rubocop/issues/4658
|
348
|
+
SafeAutoCorrect: false
|
341
349
|
VersionAdded: '0.36'
|
342
|
-
VersionChanged: '
|
343
|
-
SafeAutoCorrect: false # see https://github.com/rubocop/rubocop/issues/4658
|
350
|
+
VersionChanged: '1.13'
|
344
351
|
|
345
352
|
Performance/UnfreezeString:
|
346
353
|
Description: 'Use unary plus to get an unfrozen string literal.'
|
@@ -10,36 +10,47 @@ module RuboCop
|
|
10
10
|
# @example
|
11
11
|
# # bad
|
12
12
|
# BigDecimal(1, 2)
|
13
|
+
# 4.to_d(6)
|
13
14
|
# BigDecimal(1.2, 3, exception: true)
|
15
|
+
# 4.5.to_d(6, exception: true)
|
14
16
|
#
|
15
17
|
# # good
|
16
18
|
# BigDecimal('1', 2)
|
19
|
+
# BigDecimal('4', 6)
|
17
20
|
# BigDecimal('1.2', 3, exception: true)
|
21
|
+
# BigDecimal('4.5', 6, exception: true)
|
18
22
|
#
|
19
23
|
class BigDecimalWithNumericArgument < Base
|
20
24
|
extend AutoCorrector
|
21
25
|
|
22
|
-
MSG = 'Convert numeric
|
23
|
-
RESTRICT_ON_SEND = %i[BigDecimal].freeze
|
26
|
+
MSG = 'Convert numeric literal to string and pass it to `BigDecimal`.'
|
27
|
+
RESTRICT_ON_SEND = %i[BigDecimal to_d].freeze
|
24
28
|
|
25
29
|
def_node_matcher :big_decimal_with_numeric_argument?, <<~PATTERN
|
26
30
|
(send nil? :BigDecimal $numeric_type? ...)
|
27
31
|
PATTERN
|
28
32
|
|
33
|
+
def_node_matcher :to_d?, <<~PATTERN
|
34
|
+
(send [!nil? $numeric_type?] :to_d ...)
|
35
|
+
PATTERN
|
36
|
+
|
29
37
|
def on_send(node)
|
30
|
-
|
31
|
-
|
38
|
+
if (numeric = big_decimal_with_numeric_argument?(node))
|
39
|
+
add_offense(numeric.source_range) do |corrector|
|
40
|
+
corrector.wrap(numeric, "'", "'")
|
41
|
+
end
|
42
|
+
elsif (numeric_to_d = to_d?(node))
|
43
|
+
add_offense(numeric_to_d.source_range) do |corrector|
|
44
|
+
big_decimal_args = node
|
45
|
+
.arguments
|
46
|
+
.map(&:source)
|
47
|
+
.unshift("'#{numeric_to_d.source}'")
|
48
|
+
.join(', ')
|
32
49
|
|
33
|
-
|
34
|
-
|
50
|
+
corrector.replace(node, "BigDecimal(#{big_decimal_args})")
|
51
|
+
end
|
35
52
|
end
|
36
53
|
end
|
37
|
-
|
38
|
-
private
|
39
|
-
|
40
|
-
def specifies_precision?(node)
|
41
|
-
node.arguments.size > 1 && !node.arguments[1].hash_type?
|
42
|
-
end
|
43
54
|
end
|
44
55
|
end
|
45
56
|
end
|
@@ -27,10 +27,6 @@ module RuboCop
|
|
27
27
|
# [].detect { |item| true }
|
28
28
|
# [].reverse.detect { |item| true }
|
29
29
|
#
|
30
|
-
# `ActiveRecord` compatibility:
|
31
|
-
# `ActiveRecord` does not implement a `detect` method and `find` has its
|
32
|
-
# own meaning. Correcting ActiveRecord methods with this cop should be
|
33
|
-
# considered unsafe.
|
34
30
|
class Detect < Base
|
35
31
|
extend AutoCorrector
|
36
32
|
|
@@ -7,6 +7,9 @@ module RuboCop
|
|
7
7
|
# separated by `||`. In some cases such calls can be replaced
|
8
8
|
# with an single `#start_with?`/`#end_with?` call.
|
9
9
|
#
|
10
|
+
# `IncludeActiveSupportAliases` configuration option is used to check for
|
11
|
+
# `starts_with?` and `ends_with?`. These methods are defined by Active Support.
|
12
|
+
#
|
10
13
|
# @example
|
11
14
|
# # bad
|
12
15
|
# str.start_with?("a") || str.start_with?(Some::CONST)
|
@@ -17,6 +20,24 @@ module RuboCop
|
|
17
20
|
# str.start_with?("a", Some::CONST)
|
18
21
|
# str.start_with?("a", "b", "c")
|
19
22
|
# str.end_with?(var1, var2)
|
23
|
+
#
|
24
|
+
# @example IncludeActiveSupportAliases: false (default)
|
25
|
+
# # good
|
26
|
+
# str.starts_with?("a", "b") || str.starts_with?("c")
|
27
|
+
# str.ends_with?(var1) || str.ends_with?(var2)
|
28
|
+
#
|
29
|
+
# str.starts_with?("a", "b", "c")
|
30
|
+
# str.ends_with?(var1, var2)
|
31
|
+
#
|
32
|
+
# @example IncludeActiveSupportAliases: true
|
33
|
+
# # bad
|
34
|
+
# str.starts_with?("a", "b") || str.starts_with?("c")
|
35
|
+
# str.ends_with?(var1) || str.ends_with?(var2)
|
36
|
+
#
|
37
|
+
# # good
|
38
|
+
# str.starts_with?("a", "b", "c")
|
39
|
+
# str.ends_with?(var1, var2)
|
40
|
+
#
|
20
41
|
class DoubleStartEndWith < Base
|
21
42
|
extend AutoCorrector
|
22
43
|
|
@@ -58,19 +58,19 @@ module RuboCop
|
|
58
58
|
|
59
59
|
add_offense(range) do |corrector|
|
60
60
|
corrector.replace(map_node.loc.selector, 'filter_map')
|
61
|
-
remove_compact_method(corrector, node)
|
61
|
+
remove_compact_method(corrector, node, node.parent)
|
62
62
|
end
|
63
63
|
end
|
64
64
|
|
65
65
|
private
|
66
66
|
|
67
|
-
def remove_compact_method(corrector, compact_node)
|
68
|
-
chained_method = compact_node.parent
|
67
|
+
def remove_compact_method(corrector, compact_node, chained_method)
|
69
68
|
compact_method_range = compact_node.loc.selector
|
70
69
|
|
71
70
|
if compact_node.multiline? && chained_method&.loc.respond_to?(:selector) && chained_method.dot? &&
|
71
|
+
!map_method_and_compact_method_on_same_line?(compact_node) &&
|
72
72
|
!invoke_method_after_map_compact_on_same_line?(compact_node, chained_method)
|
73
|
-
compact_method_range =
|
73
|
+
compact_method_range = compact_method_with_final_newline_range(compact_method_range)
|
74
74
|
else
|
75
75
|
corrector.remove(compact_node.loc.dot)
|
76
76
|
end
|
@@ -78,9 +78,21 @@ module RuboCop
|
|
78
78
|
corrector.remove(compact_method_range)
|
79
79
|
end
|
80
80
|
|
81
|
+
def map_method_and_compact_method_on_same_line?(compact_node)
|
82
|
+
return false unless compact_node.children.first.respond_to?(:send_node)
|
83
|
+
|
84
|
+
map_node = compact_node.children.first.send_node
|
85
|
+
|
86
|
+
compact_node.loc.selector.line == map_node.loc.selector.line
|
87
|
+
end
|
88
|
+
|
81
89
|
def invoke_method_after_map_compact_on_same_line?(compact_node, chained_method)
|
82
90
|
compact_node.loc.selector.line == chained_method.loc.selector.line
|
83
91
|
end
|
92
|
+
|
93
|
+
def compact_method_with_final_newline_range(compact_method_range)
|
94
|
+
range_by_whole_lines(compact_method_range, include_final_newline: true)
|
95
|
+
end
|
84
96
|
end
|
85
97
|
end
|
86
98
|
end
|
@@ -82,14 +82,10 @@ module RuboCop
|
|
82
82
|
|
83
83
|
def build_good_method(method, args)
|
84
84
|
case method
|
85
|
-
when :
|
85
|
+
when :slice
|
86
86
|
"[#{build_call_args(args)}].chars"
|
87
|
-
when :first
|
88
|
-
|
89
|
-
"[0...#{args.first.source}].chars"
|
90
|
-
else
|
91
|
-
'[0]'
|
92
|
-
end
|
87
|
+
when :[], :first
|
88
|
+
build_good_method_for_brackets_or_first_method(method, args)
|
93
89
|
when :take
|
94
90
|
"[0...#{args.first.source}].chars"
|
95
91
|
else
|
@@ -97,6 +93,18 @@ module RuboCop
|
|
97
93
|
end
|
98
94
|
end
|
99
95
|
|
96
|
+
def build_good_method_for_brackets_or_first_method(method, args)
|
97
|
+
first_arg = args.first
|
98
|
+
|
99
|
+
if first_arg&.range_type?
|
100
|
+
"[#{build_call_args(args)}].chars"
|
101
|
+
elsif method == :first && args.any?
|
102
|
+
"[0...#{args.first.source}].chars"
|
103
|
+
else
|
104
|
+
first_arg ? "[#{first_arg.source}]" : '[0]'
|
105
|
+
end
|
106
|
+
end
|
107
|
+
|
100
108
|
def build_bad_method(method, args)
|
101
109
|
case method
|
102
110
|
when :[]
|
@@ -0,0 +1,59 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RuboCop
|
4
|
+
module Cop
|
5
|
+
module Performance
|
6
|
+
# This cop identifies places where string identifier argument can be replaced
|
7
|
+
# by symbol identifier argument.
|
8
|
+
# It prevents the redundancy of the internal string-to-symbol conversion.
|
9
|
+
#
|
10
|
+
# This cop targets methods that take identifier (e.g. method name) argument
|
11
|
+
# and the following examples are parts of it.
|
12
|
+
#
|
13
|
+
# @example
|
14
|
+
#
|
15
|
+
# # bad
|
16
|
+
# send('do_something')
|
17
|
+
# attr_accessor 'do_something'
|
18
|
+
# instance_variable_get('@ivar')
|
19
|
+
#
|
20
|
+
# # good
|
21
|
+
# send(:do_something)
|
22
|
+
# attr_accessor :do_something
|
23
|
+
# instance_variable_get(:@ivar)
|
24
|
+
#
|
25
|
+
class StringIdentifierArgument < Base
|
26
|
+
extend AutoCorrector
|
27
|
+
|
28
|
+
MSG = 'Use `%<symbol_arg>s` instead of `%<string_arg>s`.'
|
29
|
+
|
30
|
+
RESTRICT_ON_SEND = %i[
|
31
|
+
alias_method attr attr_accessor attr_reader attr_writer autoload autoload?
|
32
|
+
class_variable_defined? const_defined? const_get const_set const_source_location
|
33
|
+
define_method instance_method method_defined? private_class_method? private_method_defined?
|
34
|
+
protected_method_defined? public_class_method public_instance_method public_method_defined?
|
35
|
+
remove_class_variable remove_method undef_method class_variable_get class_variable_set
|
36
|
+
deprecate_constant module_function private private_constant protected public public_constant
|
37
|
+
remove_const ruby2_keywords
|
38
|
+
define_singleton_method instance_variable_defined instance_variable_get instance_variable_set
|
39
|
+
method public_method public_send remove_instance_variable respond_to? send singleton_method
|
40
|
+
__send__
|
41
|
+
].freeze
|
42
|
+
|
43
|
+
def on_send(node)
|
44
|
+
return unless (first_argument = node.first_argument)
|
45
|
+
return unless first_argument.str_type?
|
46
|
+
return if first_argument.value.include?(' ')
|
47
|
+
|
48
|
+
replacement = first_argument.value.to_sym.inspect
|
49
|
+
|
50
|
+
message = format(MSG, symbol_arg: replacement, string_arg: first_argument.source)
|
51
|
+
|
52
|
+
add_offense(first_argument, message: message) do |corrector|
|
53
|
+
corrector.replace(first_argument, replacement)
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
@@ -6,35 +6,46 @@ module RuboCop
|
|
6
6
|
# This cop identifies places where custom code finding the sum of elements
|
7
7
|
# in some Enumerable object can be replaced by `Enumerable#sum` method.
|
8
8
|
#
|
9
|
-
#
|
10
|
-
#
|
11
|
-
# Its auto-correction is marked as safe by default (`SafeAutoCorrect: true`)
|
12
|
-
# to prevent `TypeError` in auto-correced code when initial value is not
|
13
|
-
# specified as shown below:
|
9
|
+
# @safety
|
10
|
+
# Auto-corrections are unproblematic wherever an initial value is provided explicitly:
|
14
11
|
#
|
15
|
-
#
|
16
|
-
#
|
17
|
-
#
|
18
|
-
#
|
12
|
+
# [source,ruby]
|
13
|
+
# ----
|
14
|
+
# [1, 2, 3].reduce(4, :+) # => 10
|
15
|
+
# [1, 2, 3].sum(4) # => 10
|
19
16
|
#
|
20
|
-
#
|
17
|
+
# [].reduce(4, :+) # => 4
|
18
|
+
# [].sum(4) # => 4
|
19
|
+
# ----
|
21
20
|
#
|
22
|
-
#
|
21
|
+
# This also holds true for non-numeric types which implement a `:+` method:
|
23
22
|
#
|
24
|
-
#
|
25
|
-
#
|
26
|
-
#
|
27
|
-
#
|
28
|
-
#
|
23
|
+
# [source,ruby]
|
24
|
+
# ----
|
25
|
+
# ['l', 'o'].reduce('Hel', :+) # => "Hello"
|
26
|
+
# ['l', 'o'].sum('Hel') # => "Hello"
|
27
|
+
# ----
|
29
28
|
#
|
30
|
-
#
|
31
|
-
#
|
29
|
+
# When no initial value is provided though, `Enumerable#reduce` will pick the first enumerated value
|
30
|
+
# as initial value and successively add all following values to it, whereas
|
31
|
+
# `Enumerable#sum` will set an initial value of `0` (`Integer`) which can lead to a `TypeError`:
|
32
32
|
#
|
33
|
-
#
|
33
|
+
# [source,ruby]
|
34
|
+
# ----
|
35
|
+
# [].reduce(:+) # => nil
|
36
|
+
# [1, 2, 3].reduce(:+) # => 6
|
37
|
+
# ['H', 'e', 'l', 'l', 'o'].reduce(:+) # => "Hello"
|
38
|
+
#
|
39
|
+
# [].sum # => 0
|
40
|
+
# [1, 2, 3].sum # => 6
|
41
|
+
# ['H', 'e', 'l', 'l', 'o'].sum # => in `+': String can't be coerced into Integer (TypeError)
|
42
|
+
# ----
|
43
|
+
#
|
44
|
+
# @example OnlySumOrWithInitialValue: false (default)
|
34
45
|
# # bad
|
35
|
-
# [1, 2, 3].inject(:+) #
|
36
|
-
# [1, 2, 3].inject(&:+) # will
|
37
|
-
# [1, 2, 3].reduce { |acc, elem| acc + elem } #
|
46
|
+
# [1, 2, 3].inject(:+) # Auto-corrections for cases without initial value are unsafe
|
47
|
+
# [1, 2, 3].inject(&:+) # and will only be performed when using the `-A` option.
|
48
|
+
# [1, 2, 3].reduce { |acc, elem| acc + elem } # They can be prohibited completely using `SafeAutoCorrect: true`.
|
38
49
|
# [1, 2, 3].reduce(10, :+)
|
39
50
|
# [1, 2, 3].map { |elem| elem ** 2 }.sum
|
40
51
|
# [1, 2, 3].collect(&:count).sum(10)
|
@@ -45,6 +56,17 @@ module RuboCop
|
|
45
56
|
# [1, 2, 3].sum { |elem| elem ** 2 }
|
46
57
|
# [1, 2, 3].sum(10, &:count)
|
47
58
|
#
|
59
|
+
# @example OnlySumOrWithInitialValue: true
|
60
|
+
# # bad
|
61
|
+
# [1, 2, 3].reduce(10, :+)
|
62
|
+
# [1, 2, 3].map { |elem| elem ** 2 }.sum
|
63
|
+
# [1, 2, 3].collect(&:count).sum(10)
|
64
|
+
#
|
65
|
+
# # good
|
66
|
+
# [1, 2, 3].sum(10)
|
67
|
+
# [1, 2, 3].sum { |elem| elem ** 2 }
|
68
|
+
# [1, 2, 3].sum(10, &:count)
|
69
|
+
#
|
48
70
|
class Sum < Base
|
49
71
|
include RangeHelp
|
50
72
|
extend AutoCorrector
|
@@ -103,6 +125,8 @@ module RuboCop
|
|
103
125
|
|
104
126
|
def handle_sum_candidate(node)
|
105
127
|
sum_candidate?(node) do |method, init, operation|
|
128
|
+
next if cop_config['OnlySumOrWithInitialValue'] && init.empty?
|
129
|
+
|
106
130
|
range = sum_method_range(node)
|
107
131
|
message = build_method_message(node, method, init, operation)
|
108
132
|
|
@@ -44,6 +44,7 @@ require_relative 'performance/size'
|
|
44
44
|
require_relative 'performance/sort_reverse'
|
45
45
|
require_relative 'performance/squeeze'
|
46
46
|
require_relative 'performance/start_with'
|
47
|
+
require_relative 'performance/string_identifier_argument'
|
47
48
|
require_relative 'performance/string_include'
|
48
49
|
require_relative 'performance/string_replacement'
|
49
50
|
require_relative 'performance/sum'
|
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.13.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: 2021-
|
13
|
+
date: 2021-12-25 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: rubocop
|
@@ -105,6 +105,7 @@ files:
|
|
105
105
|
- lib/rubocop/cop/performance/sort_reverse.rb
|
106
106
|
- lib/rubocop/cop/performance/squeeze.rb
|
107
107
|
- lib/rubocop/cop/performance/start_with.rb
|
108
|
+
- lib/rubocop/cop/performance/string_identifier_argument.rb
|
108
109
|
- lib/rubocop/cop/performance/string_include.rb
|
109
110
|
- lib/rubocop/cop/performance/string_replacement.rb
|
110
111
|
- lib/rubocop/cop/performance/sum.rb
|
@@ -122,8 +123,9 @@ metadata:
|
|
122
123
|
homepage_uri: https://docs.rubocop.org/rubocop-performance/
|
123
124
|
changelog_uri: https://github.com/rubocop/rubocop-performance/blob/master/CHANGELOG.md
|
124
125
|
source_code_uri: https://github.com/rubocop/rubocop-performance/
|
125
|
-
documentation_uri: https://docs.rubocop.org/rubocop-performance/1.
|
126
|
+
documentation_uri: https://docs.rubocop.org/rubocop-performance/1.13/
|
126
127
|
bug_tracker_uri: https://github.com/rubocop/rubocop-performance/issues
|
128
|
+
rubygems_mfa_required: 'true'
|
127
129
|
post_install_message:
|
128
130
|
rdoc_options: []
|
129
131
|
require_paths:
|
@@ -139,7 +141,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
139
141
|
- !ruby/object:Gem::Version
|
140
142
|
version: '0'
|
141
143
|
requirements: []
|
142
|
-
rubygems_version: 3.3.0
|
144
|
+
rubygems_version: 3.3.0
|
143
145
|
signing_key:
|
144
146
|
specification_version: 4
|
145
147
|
summary: Automatic performance checking tool for Ruby code.
|