rubocop-performance 0.0.1 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 43633d075fac26295caf28e79d71f56cdbacd6d7853aead53b3ca35e4f29f99b
4
- data.tar.gz: 60886d6ea540f6ed25014424376b2e0cf0f489a2291e298f1f4cbf6084f3e580
3
+ metadata.gz: ab226ddbd8840eb8a3c4281e137a727b4514d9ee99c0f321de8e5d16621622cd
4
+ data.tar.gz: 04e64315a9ecbbb6cbef28c1dfecb953069b3282f0749caede003c00c93b981c
5
5
  SHA512:
6
- metadata.gz: b7b30f444965b49aa1597f9f1e483802b3c2f2f786c71fd577f6af18dbdf268e0100793982aa2d8979b86c7a9f302b0b211694e5f8e04c6b2eeaae85c7dd0591
7
- data.tar.gz: ac1707a5f94ae008d1baf8c90b2ff269a6bfb3da8e27ed4adb1fa968b69e6dfdbc7ae8a074d18c4fa5d6e7c6b3d5de814f5b5dfbd38832338e80d107b854ad33
6
+ metadata.gz: 59f5c83e64695cb149d5babfa5e8be759fa11f23f4395810e928b627c236f0d7206f20527a1b2a96953e585f39a89c25f18ac68a44a3dd56ae2daffbc2513990
7
+ data.tar.gz: '0189ac9e3a329fec641134b595776cb04ba34fe13f1a3f72fc506bc95cb2021402a113090edc3be86bccd251f23768afe6cf81c6f64cfb9855ba3b32b30a0a9e'
data/README.md CHANGED
@@ -1 +1,73 @@
1
- # rubocop-performance
1
+ # RuboCop Performance
2
+
3
+ [![CircleCI](https://circleci.com/gh/rubocop-hq/rubocop-performance.svg?style=svg)](https://circleci.com/gh/rubocop-hq/rubocop-performance)
4
+
5
+ Performance optimization analysis for your projects, as an extension to [RuboCop](https://github.com/rubocop-hq/rubocop).
6
+
7
+ ## Installation
8
+
9
+ Just install the `rubocop-performance` gem
10
+
11
+ ```sh
12
+ gem install rubocop-performance
13
+ ```
14
+
15
+ or if you use bundler put this in your `Gemfile`
16
+
17
+ ```ruby
18
+ gem 'rubocop-performance'
19
+ ```
20
+
21
+ ## Usage
22
+
23
+ You need to tell RuboCop to load the Performance extension. There are three
24
+ ways to do this:
25
+
26
+ ### RuboCop configuration file
27
+
28
+ Put this into your `.rubocop.yml`.
29
+
30
+ ```yaml
31
+ require: rubocop-performance
32
+ ```
33
+
34
+ Now you can run `rubocop` and it will automatically load the RuboCop Performance
35
+ cops together with the standard cops.
36
+
37
+ ### Command line
38
+
39
+ ```sh
40
+ rubocop --require rubocop-performance
41
+ ```
42
+
43
+ ### Rake task
44
+
45
+ ```ruby
46
+ RuboCop::RakeTask.new do |task|
47
+ task.requires << 'rubocop-performance'
48
+ end
49
+ ```
50
+
51
+ ## The Cops
52
+
53
+ All cops are located under
54
+ [`lib/rubocop/cop/performance`](lib/rubocop/cop/performance), and contain
55
+ examples/documentation.
56
+
57
+ In your `.rubocop.yml`, you may treat the Performance cops just like any other
58
+ cop. For example:
59
+
60
+ ```yaml
61
+ Performance/Size:
62
+ Exclude:
63
+ - lib/example.rb
64
+ ```
65
+
66
+ ## Contributing
67
+
68
+ Checkout the [contribution guidelines](CONTRIBUTING.md).
69
+
70
+ ## License
71
+
72
+ `rubocop-performance` is MIT licensed. [See the accompanying file](LICENSE.txt) for
73
+ the full text.
@@ -1,11 +1,27 @@
1
1
  # This is the default configuration file.
2
2
 
3
+ Performance/Caller:
4
+ Description: >-
5
+ Use `caller(n..n)` instead of `caller`.
6
+ Enabled: true
7
+ VersionAdded: '0.49'
8
+
3
9
  Performance/CaseWhenSplat:
4
10
  Description: >-
5
11
  Reordering `when` conditions with a splat to the end
6
12
  of the `when` branches can improve performance.
7
13
  Enabled: false
8
14
  AutoCorrect: false
15
+ SafeAutoCorrect: false
16
+ VersionAdded: '0.34'
17
+ VersionChanged: '0.59'
18
+
19
+ Performance/Casecmp:
20
+ Description: >-
21
+ Use `casecmp` rather than `downcase ==`, `upcase ==`, `== downcase`, or `== upcase`..
22
+ Reference: 'https://github.com/JuanitoFatas/fast-ruby#stringcasecmp-vs-stringdowncase---code'
23
+ Enabled: true
24
+ VersionAdded: '0.36'
9
25
 
10
26
  Performance/ChainArrayAllocation:
11
27
  Description: >-
@@ -13,12 +29,206 @@ Performance/ChainArrayAllocation:
13
29
  existing array.
14
30
  Reference: 'https://twitter.com/schneems/status/1034123879978029057'
15
31
  Enabled: false
32
+ VersionAdded: '0.59'
33
+
34
+ Performance/CompareWithBlock:
35
+ Description: 'Use `sort_by(&:foo)` instead of `sort { |a, b| a.foo <=> b.foo }`.'
36
+ Enabled: true
37
+ VersionAdded: '0.46'
38
+
39
+ Performance/Count:
40
+ Description: >-
41
+ Use `count` instead of `select...size`, `reject...size`,
42
+ `select...count`, `reject...count`, `select...length`,
43
+ and `reject...length`.
44
+ # This cop has known compatibility issues with `ActiveRecord` and other
45
+ # frameworks. ActiveRecord's `count` ignores the block that is passed to it.
46
+ # For more information, see the documentation in the cop itself.
47
+ # If you understand the known risk, you can disable `SafeMode`.
48
+ SafeMode: true
49
+ Enabled: true
50
+ VersionAdded: '0.31'
51
+ VersionChanged: '0.39'
52
+
53
+ Performance/Detect:
54
+ Description: >-
55
+ Use `detect` instead of `select.first`, `find_all.first`,
56
+ `select.last`, and `find_all.last`.
57
+ Reference: 'https://github.com/JuanitoFatas/fast-ruby#enumerabledetect-vs-enumerableselectfirst-code'
58
+ # This cop has known compatibility issues with `ActiveRecord` and other
59
+ # frameworks. `ActiveRecord` does not implement a `detect` method and `find`
60
+ # has its own meaning. Correcting `ActiveRecord` methods with this cop
61
+ # should be considered unsafe.
62
+ SafeMode: true
63
+ Enabled: true
64
+ VersionAdded: '0.30'
65
+ VersionChanged: '0.39'
16
66
 
17
67
  Performance/DoubleStartEndWith:
68
+ Description: >-
69
+ Use `str.{start,end}_with?(x, ..., y, ...)`
70
+ instead of `str.{start,end}_with?(x, ...) || str.{start,end}_with?(y, ...)`.
71
+ Enabled: true
72
+ VersionAdded: '0.36'
73
+ VersionChanged: '0.48'
18
74
  # Used to check for `starts_with?` and `ends_with?`.
19
75
  # These methods are defined by `ActiveSupport`.
20
76
  IncludeActiveSupportAliases: false
21
77
 
78
+ Performance/EndWith:
79
+ Description: 'Use `end_with?` instead of a regex match anchored to the end of a string.'
80
+ Reference: 'https://github.com/JuanitoFatas/fast-ruby#stringmatch-vs-stringstart_withstringend_with-code-start-code-end'
81
+ # This will change to a new method call which isn't guaranteed to be on the
82
+ # object. Switching these methods has to be done with knowledge of the types
83
+ # of the variables which rubocop doesn't have.
84
+ SafeAutoCorrect: false
85
+ AutoCorrect: false
86
+ Enabled: true
87
+ VersionAdded: '0.36'
88
+ VersionChanged: '0.44'
89
+
90
+ Performance/FixedSize:
91
+ Description: 'Do not compute the size of statically sized objects except in constants'
92
+ Enabled: true
93
+ VersionAdded: '0.35'
94
+
95
+ Performance/FlatMap:
96
+ Description: >-
97
+ Use `Enumerable#flat_map`
98
+ instead of `Enumerable#map...Array#flatten(1)`
99
+ or `Enumberable#collect..Array#flatten(1)`
100
+ Reference: 'https://github.com/JuanitoFatas/fast-ruby#enumerablemaparrayflatten-vs-enumerableflat_map-code'
101
+ Enabled: true
102
+ VersionAdded: '0.30'
103
+ EnabledForFlattenWithoutParams: false
104
+ # If enabled, this cop will warn about usages of
105
+ # `flatten` being called without any parameters.
106
+ # This can be dangerous since `flat_map` will only flatten 1 level, and
107
+ # `flatten` without any parameters can flatten multiple levels.
108
+
109
+ Performance/InefficientHashSearch:
110
+ Description: 'Use `key?` or `value?` instead of `keys.include?` or `values.include?`'
111
+ Reference: 'https://github.com/JuanitoFatas/fast-ruby#hashkey-instead-of-hashkeysinclude-code'
112
+ Enabled: true
113
+ VersionAdded: '0.56'
114
+ Safe: false
115
+
116
+ Performance/LstripRstrip:
117
+ Description: 'Use `strip` instead of `lstrip.rstrip`.'
118
+ Enabled: true
119
+ VersionAdded: '0.36'
120
+
121
+ Performance/OpenStruct:
122
+ Description: 'Use `Struct` instead of `OpenStruct`.'
123
+ Enabled: false
124
+ VersionAdded: '0.61'
125
+ Safe: false
126
+
127
+ Performance/RangeInclude:
128
+ Description: 'Use `Range#cover?` instead of `Range#include?`.'
129
+ Reference: 'https://github.com/JuanitoFatas/fast-ruby#cover-vs-include-code'
130
+ Enabled: true
131
+ VersionAdded: '0.36'
132
+ Safe: false
133
+
134
+ Performance/RedundantBlockCall:
135
+ Description: 'Use `yield` instead of `block.call`.'
136
+ Reference: 'https://github.com/JuanitoFatas/fast-ruby#proccall-and-block-arguments-vs-yieldcode'
137
+ Enabled: true
138
+ VersionAdded: '0.36'
139
+
140
+ Performance/RedundantMatch:
141
+ Description: >-
142
+ Use `=~` instead of `String#match` or `Regexp#match` in a context where the
143
+ returned `MatchData` is not needed.
144
+ Enabled: true
145
+ VersionAdded: '0.36'
146
+
22
147
  Performance/RedundantMerge:
148
+ Description: 'Use Hash#[]=, rather than Hash#merge! with a single key-value pair.'
149
+ Reference: 'https://github.com/JuanitoFatas/fast-ruby#hashmerge-vs-hash-code'
150
+ Enabled: true
151
+ VersionAdded: '0.36'
23
152
  # Max number of key-value pairs to consider an offense
24
153
  MaxKeyValuePairs: 2
154
+
155
+ Performance/RedundantSortBy:
156
+ Description: 'Use `sort` instead of `sort_by { |x| x }`.'
157
+ Enabled: true
158
+ VersionAdded: '0.36'
159
+
160
+ Performance/RegexpMatch:
161
+ Description: >-
162
+ Use `match?` instead of `Regexp#match`, `String#match`, `Symbol#match`,
163
+ `Regexp#===`, or `=~` when `MatchData` is not used.
164
+ Reference: 'https://github.com/JuanitoFatas/fast-ruby#regexp-vs-stringmatch-vs-string-vs-stringmatch-code-'
165
+ Enabled: true
166
+ VersionAdded: '0.47'
167
+
168
+ Performance/ReverseEach:
169
+ Description: 'Use `reverse_each` instead of `reverse.each`.'
170
+ Reference: 'https://github.com/JuanitoFatas/fast-ruby#enumerablereverseeach-vs-enumerablereverse_each-code'
171
+ Enabled: true
172
+ VersionAdded: '0.30'
173
+
174
+ Performance/Sample:
175
+ Description: >-
176
+ Use `sample` instead of `shuffle.first`,
177
+ `shuffle.last`, and `shuffle[Integer]`.
178
+ Reference: 'https://github.com/JuanitoFatas/fast-ruby#arrayshufflefirst-vs-arraysample-code'
179
+ Enabled: true
180
+ VersionAdded: '0.30'
181
+
182
+ Performance/Size:
183
+ Description: >-
184
+ Use `size` instead of `count` for counting
185
+ the number of elements in `Array` and `Hash`.
186
+ Reference: 'https://github.com/JuanitoFatas/fast-ruby#arraylength-vs-arraysize-vs-arraycount-code'
187
+ Enabled: true
188
+ VersionAdded: '0.30'
189
+
190
+ Performance/StartWith:
191
+ Description: 'Use `start_with?` instead of a regex match anchored to the beginning of a string.'
192
+ Reference: 'https://github.com/JuanitoFatas/fast-ruby#stringmatch-vs-stringstart_withstringend_with-code-start-code-end'
193
+ # This will change to a new method call which isn't guaranteed to be on the
194
+ # object. Switching these methods has to be done with knowledge of the types
195
+ # of the variables which rubocop doesn't have.
196
+ SafeAutoCorrect: false
197
+ AutoCorrect: false
198
+ Enabled: true
199
+ VersionAdded: '0.36'
200
+ VersionChanged: '0.44'
201
+
202
+ Performance/StringReplacement:
203
+ Description: >-
204
+ Use `tr` instead of `gsub` when you are replacing the same
205
+ number of characters. Use `delete` instead of `gsub` when
206
+ you are deleting characters.
207
+ Reference: 'https://github.com/JuanitoFatas/fast-ruby#stringgsub-vs-stringtr-code'
208
+ Enabled: true
209
+ VersionAdded: '0.33'
210
+
211
+ Performance/TimesMap:
212
+ Description: 'Checks for .times.map calls.'
213
+ AutoCorrect: false
214
+ Enabled: true
215
+ VersionAdded: '0.36'
216
+ VersionChanged: '0.50'
217
+ SafeAutoCorrect: false # see https://github.com/rubocop-hq/rubocop/issues/4658
218
+
219
+ Performance/UnfreezeString:
220
+ Description: 'Use unary plus to get an unfrozen string literal.'
221
+ Enabled: true
222
+ VersionAdded: '0.50'
223
+
224
+ Performance/UnneededSort:
225
+ Description: >-
226
+ Use `min` instead of `sort.first`,
227
+ `max_by` instead of `sort_by...last`, etc.
228
+ Enabled: true
229
+ VersionAdded: '0.55'
230
+
231
+ Performance/UriDefaultParser:
232
+ Description: 'Use `URI::DEFAULT_PARSER` instead of `URI::Parser.new`.'
233
+ Enabled: true
234
+ VersionAdded: '0.50'
@@ -1,5 +1,11 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require 'rubocop'
4
+
5
+ require_relative 'rubocop/performance'
4
6
  require_relative 'rubocop/performance/version'
7
+ require_relative 'rubocop/performance/inject'
8
+
9
+ RuboCop::Performance::Inject.defaults!
10
+
5
11
  require_relative 'rubocop/cop/performance_cops'
@@ -47,8 +47,9 @@ module RuboCop
47
47
  HAS_MUTATION_ALTERNATIVE = ':collect :compact :flatten :map :reject '\
48
48
  ':reverse :rotate :select :shuffle :sort '\
49
49
  ':uniq '.freeze
50
- MSG = 'Use `%<method>s...%<second_method>s!` instead of `%<method>s' \
51
- '...%<second_method>s`.'.freeze
50
+ MSG = 'Use unchained `%<method>s!` and `%<second_method>s!` '\
51
+ '(followed by `return array` if required) instead of chaining '\
52
+ '`%<method>s...%<second_method>s`.'.freeze
52
53
 
53
54
  def_node_matcher :flat_map_candidate?, <<-PATTERN
54
55
  {
@@ -0,0 +1,46 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ module Cop
5
+ module Performance
6
+ # This cop checks for `OpenStruct.new` calls.
7
+ # Instantiation of an `OpenStruct` invalidates
8
+ # Ruby global method cache as it causes dynamic method
9
+ # definition during program runtime.
10
+ # This could have an effect on performance,
11
+ # especially in case of single-threaded
12
+ # applications with multiple `OpenStruct` instantiations.
13
+ #
14
+ # @example
15
+ # # bad
16
+ # class MyClass
17
+ # def my_method
18
+ # OpenStruct.new(my_key1: 'my_value1', my_key2: 'my_value2')
19
+ # end
20
+ # end
21
+ #
22
+ # # good
23
+ # class MyClass
24
+ # MyStruct = Struct.new(:my_key1, :my_key2)
25
+ # def my_method
26
+ # MyStruct.new('my_value1', 'my_value2')
27
+ # end
28
+ # end
29
+ #
30
+ class OpenStruct < Cop
31
+ MSG = 'Consider using `Struct` over `OpenStruct` ' \
32
+ 'to optimize the performance.'.freeze
33
+
34
+ def_node_matcher :open_struct, <<-PATTERN
35
+ (send (const {nil? cbase} :OpenStruct) :new ...)
36
+ PATTERN
37
+
38
+ def on_send(node)
39
+ open_struct(node) do |method|
40
+ add_offense(node, location: :selector, message: format(MSG, method))
41
+ end
42
+ end
43
+ end
44
+ end
45
+ end
46
+ end
@@ -9,6 +9,9 @@ module RuboCop
9
9
  # end points of the `Range`. In a great majority of cases, this is what
10
10
  # is wanted.
11
11
  #
12
+ # This cop is `Safe: false` by default because `Range#include?` and
13
+ # `Range#cover?` are not equivalent behaviour.
14
+ #
12
15
  # @example
13
16
  # # bad
14
17
  # ('a'..'z').include?('b') # => true
@@ -14,6 +14,12 @@ module RuboCop
14
14
  AREF_ASGN = '%<receiver>s[%<key>s] = %<value>s'.freeze
15
15
  MSG = 'Use `%<prefer>s` instead of `%<current>s`.'.freeze
16
16
 
17
+ WITH_MODIFIER_CORRECTION = <<-RUBY.strip_indent
18
+ %<keyword>s %<condition>s
19
+ %<leading_space>s%<indent>s%<body>s
20
+ %<leading_space>send
21
+ RUBY
22
+
17
23
  def_node_matcher :redundant_merge_candidate, <<-PATTERN
18
24
  (send $!nil? :merge! [(hash $...) !kwsplat_type?])
19
25
  PATTERN
@@ -60,6 +66,7 @@ module RuboCop
60
66
 
61
67
  def non_redundant_merge?(node, receiver, pairs)
62
68
  non_redundant_pairs?(receiver, pairs) ||
69
+ kwsplat_used?(pairs) ||
63
70
  non_redundant_value_used?(receiver, node)
64
71
  end
65
72
 
@@ -67,6 +74,10 @@ module RuboCop
67
74
  pairs.size > 1 && !receiver.pure? || pairs.size > max_key_value_pairs
68
75
  end
69
76
 
77
+ def kwsplat_used?(pairs)
78
+ pairs.any?(&:kwsplat_type?)
79
+ end
80
+
70
81
  def non_redundant_value_used?(receiver, node)
71
82
  node.value_used? &&
72
83
  !EachWithObjectInspector.new(node, receiver).value_used?
@@ -101,12 +112,15 @@ module RuboCop
101
112
  end
102
113
 
103
114
  def rewrite_with_modifier(node, parent, new_source)
104
- cond, = *parent
105
- padding = "\n#{(' ' * indent_width) + leading_spaces(node)}"
115
+ indent = ' ' * indent_width
116
+ padding = "\n#{indent + leading_spaces(node)}"
106
117
  new_source.gsub!(/\n/, padding)
107
118
 
108
- parent.loc.keyword.source << ' ' << cond.source << padding <<
109
- new_source << "\n" << leading_spaces(node) << 'end'
119
+ format(WITH_MODIFIER_CORRECTION, keyword: parent.loc.keyword.source,
120
+ condition: parent.condition.source,
121
+ leading_space: leading_spaces(node),
122
+ indent: indent,
123
+ body: new_source).chomp
110
124
  end
111
125
 
112
126
  def leading_spaces(node)
@@ -1,9 +1,9 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module RuboCop
4
+ # RuboCop included the performance cops directly before version 1.0.0.
5
+ # We can remove them to avoid warnings about redefining constants.
4
6
  module Cop
5
- # RuboCop included the performance cops directly before version 1.0.0.
6
- # We can remove them to avoid warnings about redefining constants.
7
7
  remove_const('Performance') if const_defined?('Performance')
8
8
  end
9
9
  end
@@ -20,6 +20,7 @@ require_relative 'performance/fixed_size'
20
20
  require_relative 'performance/flat_map'
21
21
  require_relative 'performance/inefficient_hash_search'
22
22
  require_relative 'performance/lstrip_rstrip'
23
+ require_relative 'performance/open_struct'
23
24
  require_relative 'performance/range_include'
24
25
  require_relative 'performance/redundant_block_call'
25
26
  require_relative 'performance/redundant_match'
@@ -0,0 +1,12 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ # RuboCop Performance project namespace
5
+ module Performance
6
+ PROJECT_ROOT = Pathname.new(__dir__).parent.parent.expand_path.freeze
7
+ CONFIG_DEFAULT = PROJECT_ROOT.join('config', 'default.yml').freeze
8
+ CONFIG = YAML.safe_load(CONFIG_DEFAULT.read).freeze
9
+
10
+ private_constant(:CONFIG_DEFAULT, :PROJECT_ROOT)
11
+ end
12
+ end
@@ -0,0 +1,18 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ module Performance
5
+ # Because RuboCop doesn't yet support plugins, we have to monkey patch in a
6
+ # bit of our configuration.
7
+ module Inject
8
+ def self.defaults!
9
+ path = CONFIG_DEFAULT.to_s
10
+ hash = ConfigLoader.send(:load_yaml_configuration, path)
11
+ config = Config.new(hash, path)
12
+ puts "configuration from #{path}" if ConfigLoader.debug?
13
+ config = ConfigLoader.merge_with_default(config, path)
14
+ ConfigLoader.instance_variable_set(:@default_configuration, config)
15
+ end
16
+ end
17
+ end
18
+ end
@@ -3,7 +3,7 @@
3
3
  module RuboCop
4
4
  module Performance
5
5
  module Version
6
- STRING = '0.0.1'
6
+ STRING = '1.0.0'.freeze
7
7
  end
8
8
  end
9
9
  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: 0.0.1
4
+ version: 1.0.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: 2018-10-31 00:00:00.000000000 Z
13
+ date: 2019-03-14 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: rubocop
@@ -67,6 +67,7 @@ files:
67
67
  - lib/rubocop/cop/performance/flat_map.rb
68
68
  - lib/rubocop/cop/performance/inefficient_hash_search.rb
69
69
  - lib/rubocop/cop/performance/lstrip_rstrip.rb
70
+ - lib/rubocop/cop/performance/open_struct.rb
70
71
  - lib/rubocop/cop/performance/range_include.rb
71
72
  - lib/rubocop/cop/performance/redundant_block_call.rb
72
73
  - lib/rubocop/cop/performance/redundant_match.rb
@@ -83,6 +84,8 @@ files:
83
84
  - lib/rubocop/cop/performance/unneeded_sort.rb
84
85
  - lib/rubocop/cop/performance/uri_default_parser.rb
85
86
  - lib/rubocop/cop/performance_cops.rb
87
+ - lib/rubocop/performance.rb
88
+ - lib/rubocop/performance/inject.rb
86
89
  - lib/rubocop/performance/version.rb
87
90
  homepage: https://github.com/rubocop-hq/rubocop-performance
88
91
  licenses:
@@ -108,8 +111,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
108
111
  - !ruby/object:Gem::Version
109
112
  version: '0'
110
113
  requirements: []
111
- rubyforge_project:
112
- rubygems_version: 2.7.6
114
+ rubygems_version: 3.0.3
113
115
  signing_key:
114
116
  specification_version: 4
115
117
  summary: Automatic performance checking tool for Ruby code.