rubocop-performance 1.7.0 → 1.9.1

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.
Files changed (50) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +8 -0
  3. data/config/default.yml +49 -7
  4. data/lib/rubocop/cop/mixin/regexp_metacharacter.rb +4 -4
  5. data/lib/rubocop/cop/performance/ancestors_include.rb +16 -12
  6. data/lib/rubocop/cop/performance/array_semi_infinite_range_slice.rb +77 -0
  7. data/lib/rubocop/cop/performance/big_decimal_with_numeric_argument.rb +17 -14
  8. data/lib/rubocop/cop/performance/bind_call.rb +9 -18
  9. data/lib/rubocop/cop/performance/block_given_with_explicit_block.rb +52 -0
  10. data/lib/rubocop/cop/performance/caller.rb +14 -15
  11. data/lib/rubocop/cop/performance/case_when_splat.rb +18 -11
  12. data/lib/rubocop/cop/performance/casecmp.rb +13 -20
  13. data/lib/rubocop/cop/performance/chain_array_allocation.rb +24 -28
  14. data/lib/rubocop/cop/performance/collection_literal_in_loop.rb +140 -0
  15. data/lib/rubocop/cop/performance/compare_with_block.rb +10 -21
  16. data/lib/rubocop/cop/performance/constant_regexp.rb +68 -0
  17. data/lib/rubocop/cop/performance/count.rb +14 -16
  18. data/lib/rubocop/cop/performance/delete_prefix.rb +14 -22
  19. data/lib/rubocop/cop/performance/delete_suffix.rb +14 -22
  20. data/lib/rubocop/cop/performance/detect.rb +65 -32
  21. data/lib/rubocop/cop/performance/double_start_end_with.rb +16 -24
  22. data/lib/rubocop/cop/performance/end_with.rb +9 -13
  23. data/lib/rubocop/cop/performance/fixed_size.rb +2 -1
  24. data/lib/rubocop/cop/performance/flat_map.rb +21 -22
  25. data/lib/rubocop/cop/performance/inefficient_hash_search.rb +15 -14
  26. data/lib/rubocop/cop/performance/io_readlines.rb +27 -42
  27. data/lib/rubocop/cop/performance/method_object_as_block.rb +32 -0
  28. data/lib/rubocop/cop/performance/open_struct.rb +3 -2
  29. data/lib/rubocop/cop/performance/range_include.rb +8 -6
  30. data/lib/rubocop/cop/performance/redundant_block_call.rb +15 -10
  31. data/lib/rubocop/cop/performance/redundant_match.rb +12 -6
  32. data/lib/rubocop/cop/performance/redundant_merge.rb +19 -17
  33. data/lib/rubocop/cop/performance/redundant_sort_block.rb +6 -16
  34. data/lib/rubocop/cop/performance/redundant_string_chars.rb +10 -18
  35. data/lib/rubocop/cop/performance/regexp_match.rb +20 -20
  36. data/lib/rubocop/cop/performance/reverse_each.rb +10 -5
  37. data/lib/rubocop/cop/performance/reverse_first.rb +5 -10
  38. data/lib/rubocop/cop/performance/size.rb +7 -6
  39. data/lib/rubocop/cop/performance/sort_reverse.rb +6 -15
  40. data/lib/rubocop/cop/performance/squeeze.rb +8 -11
  41. data/lib/rubocop/cop/performance/start_with.rb +9 -13
  42. data/lib/rubocop/cop/performance/string_include.rb +13 -14
  43. data/lib/rubocop/cop/performance/string_replacement.rb +24 -27
  44. data/lib/rubocop/cop/performance/sum.rb +236 -0
  45. data/lib/rubocop/cop/performance/times_map.rb +12 -18
  46. data/lib/rubocop/cop/performance/unfreeze_string.rb +20 -2
  47. data/lib/rubocop/cop/performance/uri_default_parser.rb +7 -12
  48. data/lib/rubocop/cop/performance_cops.rb +6 -0
  49. data/lib/rubocop/performance/version.rb +6 -1
  50. metadata +25 -13
@@ -0,0 +1,236 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ module Cop
5
+ module Performance
6
+ # This cop identifies places where custom code finding the sum of elements
7
+ # in some Enumerable object can be replaced by `Enumerable#sum` method.
8
+ #
9
+ # This cop can change auto-correction scope depending on the value of
10
+ # `SafeAutoCorrect`.
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:
14
+ #
15
+ # [source,ruby]
16
+ # ----
17
+ # ['a', 'b'].sum # => (String can't be coerced into Integer)
18
+ # ----
19
+ #
20
+ # Therefore if initial value is not specified, unsafe auto-corrected will not occur.
21
+ #
22
+ # If you always want to enable auto-correction, you can set `SafeAutoCorrect: false`.
23
+ #
24
+ # [source,yaml]
25
+ # ----
26
+ # Performance/Sum:
27
+ # SafeAutoCorrect: false
28
+ # ----
29
+ #
30
+ # Please note that the auto-correction command line option will be changed from
31
+ # `rubocop -a` to `rubocop -A`, which includes unsafe auto-correction.
32
+ #
33
+ # @example
34
+ # # bad
35
+ # [1, 2, 3].inject(:+) # These bad cases with no initial value are unsafe and
36
+ # [1, 2, 3].inject(&:+) # will not be auto-correced by default. If you want to
37
+ # [1, 2, 3].reduce { |acc, elem| acc + elem } # auto-corrected, you can set `SafeAutoCorrect: false`.
38
+ # [1, 2, 3].reduce(10, :+)
39
+ # [1, 2, 3].map { |elem| elem ** 2 }.sum
40
+ # [1, 2, 3].collect(&:count).sum(10)
41
+ #
42
+ # # good
43
+ # [1, 2, 3].sum
44
+ # [1, 2, 3].sum(10)
45
+ # [1, 2, 3].sum { |elem| elem ** 2 }
46
+ # [1, 2, 3].sum(10, &:count)
47
+ #
48
+ class Sum < Base
49
+ include RangeHelp
50
+ extend AutoCorrector
51
+
52
+ MSG = 'Use `%<good_method>s` instead of `%<bad_method>s`.'
53
+ MSG_IF_NO_INIT_VALUE =
54
+ 'Use `%<good_method>s` instead of `%<bad_method>s`, unless calling `%<bad_method>s` on an empty array.'
55
+ RESTRICT_ON_SEND = %i[inject reduce sum].freeze
56
+
57
+ def_node_matcher :sum_candidate?, <<~PATTERN
58
+ (send _ ${:inject :reduce} $_init ? ${(sym :+) (block_pass (sym :+))})
59
+ PATTERN
60
+
61
+ def_node_matcher :sum_map_candidate?, <<~PATTERN
62
+ (send
63
+ {
64
+ (block $(send _ {:map :collect}) ...)
65
+ $(send _ {:map :collect} (block_pass _))
66
+ }
67
+ :sum $_init ?)
68
+ PATTERN
69
+
70
+ def_node_matcher :sum_with_block_candidate?, <<~PATTERN
71
+ (block
72
+ $(send _ {:inject :reduce} $_init ?)
73
+ (args (arg $_acc) (arg $_elem))
74
+ $send)
75
+ PATTERN
76
+
77
+ def_node_matcher :acc_plus_elem?, <<~PATTERN
78
+ (send (lvar %1) :+ (lvar %2))
79
+ PATTERN
80
+ alias elem_plus_acc? acc_plus_elem?
81
+
82
+ def on_send(node)
83
+ return if empty_array_literal?(node)
84
+
85
+ handle_sum_candidate(node)
86
+ handle_sum_map_candidate(node)
87
+ end
88
+
89
+ def on_block(node)
90
+ sum_with_block_candidate?(node) do |send, init, var_acc, var_elem, body|
91
+ if acc_plus_elem?(body, var_acc, var_elem) || elem_plus_acc?(body, var_elem, var_acc)
92
+ range = sum_block_range(send, node)
93
+ message = build_block_message(send, init, var_acc, var_elem, body)
94
+
95
+ add_offense(range, message: message) do |corrector|
96
+ autocorrect(corrector, init, range)
97
+ end
98
+ end
99
+ end
100
+ end
101
+
102
+ private
103
+
104
+ def handle_sum_candidate(node)
105
+ sum_candidate?(node) do |method, init, operation|
106
+ range = sum_method_range(node)
107
+ message = build_method_message(node, method, init, operation)
108
+
109
+ add_offense(range, message: message) do |corrector|
110
+ autocorrect(corrector, init, range)
111
+ end
112
+ end
113
+ end
114
+
115
+ def handle_sum_map_candidate(node)
116
+ sum_map_candidate?(node) do |map, init|
117
+ next if node.block_literal? || node.block_argument?
118
+
119
+ message = build_sum_map_message(map.method_name, init)
120
+
121
+ add_offense(sum_map_range(map, node), message: message) do |corrector|
122
+ autocorrect_sum_map(corrector, node, map, init)
123
+ end
124
+ end
125
+ end
126
+
127
+ def empty_array_literal?(node)
128
+ receiver = node.children.first
129
+ array_literal?(node) && receiver && receiver.children.empty?
130
+ end
131
+
132
+ def array_literal?(node)
133
+ receiver = node.children.first
134
+ receiver&.literal? && receiver&.array_type?
135
+ end
136
+
137
+ def autocorrect(corrector, init, range)
138
+ return if init.empty? && safe_autocorrect?
139
+
140
+ replacement = build_good_method(init)
141
+
142
+ corrector.replace(range, replacement)
143
+ end
144
+
145
+ def autocorrect_sum_map(corrector, sum, map, init)
146
+ sum_range = method_call_with_args_range(sum)
147
+ map_range = method_call_with_args_range(map)
148
+
149
+ block_pass = map.last_argument if map.last_argument&.block_pass_type?
150
+ replacement = build_good_method(init, block_pass)
151
+
152
+ corrector.remove(sum_range)
153
+ corrector.replace(map_range, ".#{replacement}")
154
+ end
155
+
156
+ def sum_method_range(node)
157
+ range_between(node.loc.selector.begin_pos, node.loc.end.end_pos)
158
+ end
159
+
160
+ def sum_map_range(map, sum)
161
+ range_between(map.loc.selector.begin_pos, sum.source_range.end.end_pos)
162
+ end
163
+
164
+ def sum_block_range(send, node)
165
+ range_between(send.loc.selector.begin_pos, node.loc.end.end_pos)
166
+ end
167
+
168
+ def build_method_message(node, method, init, operation)
169
+ good_method = build_good_method(init)
170
+ bad_method = build_method_bad_method(init, method, operation)
171
+ msg = if init.empty? && !array_literal?(node)
172
+ MSG_IF_NO_INIT_VALUE
173
+ else
174
+ MSG
175
+ end
176
+ format(msg, good_method: good_method, bad_method: bad_method)
177
+ end
178
+
179
+ def build_sum_map_message(method, init)
180
+ sum_method = build_good_method(init)
181
+ good_method = "#{sum_method} { ... }"
182
+ bad_method = "#{method} { ... }.#{sum_method}"
183
+ format(MSG, good_method: good_method, bad_method: bad_method)
184
+ end
185
+
186
+ def build_block_message(send, init, var_acc, var_elem, body)
187
+ good_method = build_good_method(init)
188
+ bad_method = build_block_bad_method(send.method_name, init, var_acc, var_elem, body)
189
+ format(MSG, good_method: good_method, bad_method: bad_method)
190
+ end
191
+
192
+ def build_good_method(init, block_pass = nil)
193
+ good_method = 'sum'
194
+
195
+ args = []
196
+ unless init.empty?
197
+ init = init.first
198
+ args << init.source unless init.int_type? && init.value.zero?
199
+ end
200
+ args << block_pass.source if block_pass
201
+ good_method += "(#{args.join(', ')})" unless args.empty?
202
+ good_method
203
+ end
204
+
205
+ def build_method_bad_method(init, method, operation)
206
+ bad_method = "#{method}("
207
+ unless init.empty?
208
+ init = init.first
209
+ bad_method += "#{init.source}, "
210
+ end
211
+ bad_method += if operation.block_pass_type?
212
+ '&:+)'
213
+ else
214
+ ':+)'
215
+ end
216
+ bad_method
217
+ end
218
+
219
+ def build_block_bad_method(method, init, var_acc, var_elem, body)
220
+ bad_method = method.to_s
221
+
222
+ unless init.empty?
223
+ init = init.first
224
+ bad_method += "(#{init.source})"
225
+ end
226
+ bad_method += " { |#{var_acc}, #{var_elem}| #{body.source} }"
227
+ bad_method
228
+ end
229
+
230
+ def method_call_with_args_range(node)
231
+ node.receiver.source_range.end.join(node.source_range.end)
232
+ end
233
+ end
234
+ end
235
+ end
236
+ end
@@ -17,10 +17,13 @@ module RuboCop
17
17
  # Array.new(9) do |i|
18
18
  # i.to_s
19
19
  # end
20
- class TimesMap < Cop
20
+ class TimesMap < Base
21
+ extend AutoCorrector
22
+
21
23
  MESSAGE = 'Use `Array.new(%<count>s)` with a block ' \
22
24
  'instead of `.times.%<map_or_collect>s`'
23
25
  MESSAGE_ONLY_IF = 'only if `%<count>s` is always 0 or more'
26
+ RESTRICT_ON_SEND = %i[map collect].freeze
24
27
 
25
28
  def on_send(node)
26
29
  check(node)
@@ -30,35 +33,26 @@ module RuboCop
30
33
  check(node)
31
34
  end
32
35
 
33
- def autocorrect(node)
34
- map_or_collect, count = times_map_call(node)
35
-
36
- replacement =
37
- "Array.new(#{count.source}" \
38
- "#{map_or_collect.arguments.map { |arg| ", #{arg.source}" }.join})"
39
-
40
- lambda do |corrector|
41
- corrector.replace(map_or_collect.loc.expression, replacement)
42
- end
43
- end
44
-
45
36
  private
46
37
 
47
38
  def check(node)
48
39
  times_map_call(node) do |map_or_collect, count|
49
- add_offense(node, message: message(map_or_collect, count))
40
+ add_offense(node, message: message(map_or_collect, count)) do |corrector|
41
+ replacement = "Array.new(#{count.source}" \
42
+ "#{map_or_collect.arguments.map { |arg| ", #{arg.source}" }.join})"
43
+
44
+ corrector.replace(map_or_collect.loc.expression, replacement)
45
+ end
50
46
  end
51
47
  end
52
48
 
53
49
  def message(map_or_collect, count)
54
50
  template = if count.literal?
55
- MESSAGE + '.'
51
+ "#{MESSAGE}."
56
52
  else
57
53
  "#{MESSAGE} #{MESSAGE_ONLY_IF}."
58
54
  end
59
- format(template,
60
- count: count.source,
61
- map_or_collect: map_or_collect.method_name)
55
+ format(template, count: count.source, map_or_collect: map_or_collect.method_name)
62
56
  end
63
57
 
64
58
  def_node_matcher :times_map_call, <<~PATTERN
@@ -10,6 +10,7 @@ module RuboCop
10
10
  # NOTE: `String.new` (without operator) is not exactly the same as `+''`.
11
11
  # These differ in encoding. `String.new.encoding` is always `ASCII-8BIT`.
12
12
  # However, `(+'').encoding` is the same as script encoding(e.g. `UTF-8`).
13
+ # Therefore, auto-correction is unsafe.
13
14
  # So, if you expect `ASCII-8BIT` encoding, disable this cop.
14
15
  #
15
16
  # @example
@@ -23,8 +24,11 @@ module RuboCop
23
24
  # # good
24
25
  # +'something'
25
26
  # +''
26
- class UnfreezeString < Cop
27
+ class UnfreezeString < Base
28
+ extend AutoCorrector
29
+
27
30
  MSG = 'Use unary plus to get an unfrozen string literal.'
31
+ RESTRICT_ON_SEND = %i[dup new].freeze
28
32
 
29
33
  def_node_matcher :dup_string?, <<~PATTERN
30
34
  (send {str dstr} :dup)
@@ -38,7 +42,21 @@ module RuboCop
38
42
  PATTERN
39
43
 
40
44
  def on_send(node)
41
- add_offense(node) if dup_string?(node) || string_new?(node)
45
+ return unless dup_string?(node) || string_new?(node)
46
+
47
+ add_offense(node) do |corrector|
48
+ corrector.replace(node, "+#{string_value(node)}")
49
+ end
50
+ end
51
+
52
+ private
53
+
54
+ def string_value(node)
55
+ if node.receiver.source == 'String' && node.method?(:new)
56
+ node.arguments.empty? ? "''" : node.first_argument.source
57
+ else
58
+ node.receiver.source
59
+ end
42
60
  end
43
61
  end
44
62
  end
@@ -13,9 +13,12 @@ module RuboCop
13
13
  # # good
14
14
  # URI::DEFAULT_PARSER
15
15
  #
16
- class UriDefaultParser < Cop
16
+ class UriDefaultParser < Base
17
+ extend AutoCorrector
18
+
17
19
  MSG = 'Use `%<double_colon>sURI::DEFAULT_PARSER` instead of ' \
18
20
  '`%<double_colon>sURI::Parser.new`.'
21
+ RESTRICT_ON_SEND = %i[new].freeze
19
22
 
20
23
  def_node_matcher :uri_parser_new?, <<~PATTERN
21
24
  (send
@@ -28,17 +31,9 @@ module RuboCop
28
31
  double_colon = captured_value ? '::' : ''
29
32
  message = format(MSG, double_colon: double_colon)
30
33
 
31
- add_offense(node, message: message)
32
- end
33
- end
34
-
35
- def autocorrect(node)
36
- lambda do |corrector|
37
- double_colon = uri_parser_new?(node) ? '::' : ''
38
-
39
- corrector.replace(
40
- node.loc.expression, "#{double_colon}URI::DEFAULT_PARSER"
41
- )
34
+ add_offense(node, message: message) do |corrector|
35
+ corrector.replace(node.loc.expression, "#{double_colon}URI::DEFAULT_PARSER")
36
+ end
42
37
  end
43
38
  end
44
39
  end
@@ -4,12 +4,16 @@ require_relative 'mixin/regexp_metacharacter'
4
4
  require_relative 'mixin/sort_block'
5
5
 
6
6
  require_relative 'performance/ancestors_include'
7
+ require_relative 'performance/array_semi_infinite_range_slice'
7
8
  require_relative 'performance/big_decimal_with_numeric_argument'
8
9
  require_relative 'performance/bind_call'
10
+ require_relative 'performance/block_given_with_explicit_block'
9
11
  require_relative 'performance/caller'
10
12
  require_relative 'performance/case_when_splat'
11
13
  require_relative 'performance/casecmp'
14
+ require_relative 'performance/collection_literal_in_loop'
12
15
  require_relative 'performance/compare_with_block'
16
+ require_relative 'performance/constant_regexp'
13
17
  require_relative 'performance/count'
14
18
  require_relative 'performance/delete_prefix'
15
19
  require_relative 'performance/delete_suffix'
@@ -19,6 +23,7 @@ require_relative 'performance/end_with'
19
23
  require_relative 'performance/fixed_size'
20
24
  require_relative 'performance/flat_map'
21
25
  require_relative 'performance/inefficient_hash_search'
26
+ require_relative 'performance/method_object_as_block'
22
27
  require_relative 'performance/open_struct'
23
28
  require_relative 'performance/range_include'
24
29
  require_relative 'performance/io_readlines'
@@ -36,6 +41,7 @@ require_relative 'performance/squeeze'
36
41
  require_relative 'performance/start_with'
37
42
  require_relative 'performance/string_include'
38
43
  require_relative 'performance/string_replacement'
44
+ require_relative 'performance/sum'
39
45
  require_relative 'performance/times_map'
40
46
  require_relative 'performance/unfreeze_string'
41
47
  require_relative 'performance/uri_default_parser'
@@ -2,8 +2,13 @@
2
2
 
3
3
  module RuboCop
4
4
  module Performance
5
+ # This module holds the RuboCop Performance version information.
5
6
  module Version
6
- STRING = '1.7.0'
7
+ STRING = '1.9.1'
8
+
9
+ def self.document_version
10
+ STRING.match('\d+\.\d+').to_s
11
+ end
7
12
  end
8
13
  end
9
14
  end
metadata CHANGED
@@ -1,16 +1,16 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rubocop-performance
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.7.0
4
+ version: 1.9.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Bozhidar Batsov
8
8
  - Jonas Arvidsson
9
9
  - Yuji Nakayama
10
- autorequire:
10
+ autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2020-07-07 00:00:00.000000000 Z
13
+ date: 2020-11-28 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: rubocop
@@ -18,28 +18,34 @@ dependencies:
18
18
  requirements:
19
19
  - - ">="
20
20
  - !ruby/object:Gem::Version
21
- version: 0.82.0
21
+ version: 0.90.0
22
+ - - "<"
23
+ - !ruby/object:Gem::Version
24
+ version: '2.0'
22
25
  type: :runtime
23
26
  prerelease: false
24
27
  version_requirements: !ruby/object:Gem::Requirement
25
28
  requirements:
26
29
  - - ">="
27
30
  - !ruby/object:Gem::Version
28
- version: 0.82.0
31
+ version: 0.90.0
32
+ - - "<"
33
+ - !ruby/object:Gem::Version
34
+ version: '2.0'
29
35
  - !ruby/object:Gem::Dependency
30
- name: simplecov
36
+ name: rubocop-ast
31
37
  requirement: !ruby/object:Gem::Requirement
32
38
  requirements:
33
39
  - - ">="
34
40
  - !ruby/object:Gem::Version
35
- version: '0'
36
- type: :development
41
+ version: 0.4.0
42
+ type: :runtime
37
43
  prerelease: false
38
44
  version_requirements: !ruby/object:Gem::Requirement
39
45
  requirements:
40
46
  - - ">="
41
47
  - !ruby/object:Gem::Version
42
- version: '0'
48
+ version: 0.4.0
43
49
  description: |
44
50
  A collection of RuboCop cops to check for performance optimizations
45
51
  in Ruby code.
@@ -57,13 +63,17 @@ files:
57
63
  - lib/rubocop/cop/mixin/regexp_metacharacter.rb
58
64
  - lib/rubocop/cop/mixin/sort_block.rb
59
65
  - lib/rubocop/cop/performance/ancestors_include.rb
66
+ - lib/rubocop/cop/performance/array_semi_infinite_range_slice.rb
60
67
  - lib/rubocop/cop/performance/big_decimal_with_numeric_argument.rb
61
68
  - lib/rubocop/cop/performance/bind_call.rb
69
+ - lib/rubocop/cop/performance/block_given_with_explicit_block.rb
62
70
  - lib/rubocop/cop/performance/caller.rb
63
71
  - lib/rubocop/cop/performance/case_when_splat.rb
64
72
  - lib/rubocop/cop/performance/casecmp.rb
65
73
  - lib/rubocop/cop/performance/chain_array_allocation.rb
74
+ - lib/rubocop/cop/performance/collection_literal_in_loop.rb
66
75
  - lib/rubocop/cop/performance/compare_with_block.rb
76
+ - lib/rubocop/cop/performance/constant_regexp.rb
67
77
  - lib/rubocop/cop/performance/count.rb
68
78
  - lib/rubocop/cop/performance/delete_prefix.rb
69
79
  - lib/rubocop/cop/performance/delete_suffix.rb
@@ -74,6 +84,7 @@ files:
74
84
  - lib/rubocop/cop/performance/flat_map.rb
75
85
  - lib/rubocop/cop/performance/inefficient_hash_search.rb
76
86
  - lib/rubocop/cop/performance/io_readlines.rb
87
+ - lib/rubocop/cop/performance/method_object_as_block.rb
77
88
  - lib/rubocop/cop/performance/open_struct.rb
78
89
  - lib/rubocop/cop/performance/range_include.rb
79
90
  - lib/rubocop/cop/performance/redundant_block_call.rb
@@ -90,6 +101,7 @@ files:
90
101
  - lib/rubocop/cop/performance/start_with.rb
91
102
  - lib/rubocop/cop/performance/string_include.rb
92
103
  - lib/rubocop/cop/performance/string_replacement.rb
104
+ - lib/rubocop/cop/performance/sum.rb
93
105
  - lib/rubocop/cop/performance/times_map.rb
94
106
  - lib/rubocop/cop/performance/unfreeze_string.rb
95
107
  - lib/rubocop/cop/performance/uri_default_parser.rb
@@ -104,9 +116,9 @@ metadata:
104
116
  homepage_uri: https://docs.rubocop.org/rubocop-performance/
105
117
  changelog_uri: https://github.com/rubocop-hq/rubocop-performance/blob/master/CHANGELOG.md
106
118
  source_code_uri: https://github.com/rubocop-hq/rubocop-performance/
107
- documentation_uri: https://docs.rubocop.org/rubocop-performance/
119
+ documentation_uri: https://docs.rubocop.org/rubocop-performance/1.9/
108
120
  bug_tracker_uri: https://github.com/rubocop-hq/rubocop-performance/issues
109
- post_install_message:
121
+ post_install_message:
110
122
  rdoc_options: []
111
123
  require_paths:
112
124
  - lib
@@ -121,8 +133,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
121
133
  - !ruby/object:Gem::Version
122
134
  version: '0'
123
135
  requirements: []
124
- rubygems_version: 3.1.4
125
- signing_key:
136
+ rubygems_version: 3.2.0.rc.2
137
+ signing_key:
126
138
  specification_version: 4
127
139
  summary: Automatic performance checking tool for Ruby code.
128
140
  test_files: []