rubocop 1.4.0 → 1.5.2

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 (54) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +1 -1
  3. data/assets/logo.png +0 -0
  4. data/assets/output.html.erb +261 -0
  5. data/config/default.yml +49 -9
  6. data/lib/rubocop.rb +4 -0
  7. data/lib/rubocop/cli.rb +5 -1
  8. data/lib/rubocop/cli/command/suggest_extensions.rb +108 -0
  9. data/lib/rubocop/config_loader.rb +1 -1
  10. data/lib/rubocop/config_loader_resolver.rb +5 -1
  11. data/lib/rubocop/config_obsoletion.rb +21 -3
  12. data/lib/rubocop/config_validator.rb +8 -1
  13. data/lib/rubocop/cop/autocorrect_logic.rb +21 -6
  14. data/lib/rubocop/cop/generator.rb +1 -1
  15. data/lib/rubocop/cop/layout/empty_line_between_defs.rb +3 -3
  16. data/lib/rubocop/cop/layout/empty_lines_around_arguments.rb +6 -1
  17. data/lib/rubocop/cop/layout/end_of_line.rb +5 -5
  18. data/lib/rubocop/cop/layout/first_argument_indentation.rb +7 -2
  19. data/lib/rubocop/cop/layout/heredoc_argument_closing_parenthesis.rb +12 -0
  20. data/lib/rubocop/cop/layout/multiline_method_call_indentation.rb +7 -3
  21. data/lib/rubocop/cop/lint/interpolation_check.rb +7 -2
  22. data/lib/rubocop/cop/lint/no_return_in_begin_end_blocks.rb +1 -1
  23. data/lib/rubocop/cop/lint/shadowing_outer_local_variable.rb +13 -0
  24. data/lib/rubocop/cop/lint/unexpected_block_arity.rb +85 -0
  25. data/lib/rubocop/cop/lint/unmodified_reduce_accumulator.rb +7 -2
  26. data/lib/rubocop/cop/metrics/abc_size.rb +25 -1
  27. data/lib/rubocop/cop/metrics/block_length.rb +13 -7
  28. data/lib/rubocop/cop/metrics/method_length.rb +7 -2
  29. data/lib/rubocop/cop/metrics/parameter_lists.rb +64 -1
  30. data/lib/rubocop/cop/metrics/utils/abc_size_calculator.rb +20 -10
  31. data/lib/rubocop/cop/metrics/utils/repeated_attribute_discount.rb +146 -0
  32. data/lib/rubocop/cop/metrics/utils/repeated_csend_discount.rb +6 -1
  33. data/lib/rubocop/cop/mixin/configurable_numbering.rb +3 -2
  34. data/lib/rubocop/cop/mixin/enforce_superclass.rb +9 -1
  35. data/lib/rubocop/cop/mixin/ignored_methods.rb +36 -3
  36. data/lib/rubocop/cop/mixin/method_complexity.rb +6 -0
  37. data/lib/rubocop/cop/naming/variable_number.rb +3 -1
  38. data/lib/rubocop/cop/style/and_or.rb +10 -0
  39. data/lib/rubocop/cop/style/class_and_module_children.rb +8 -3
  40. data/lib/rubocop/cop/style/format_string.rb +8 -3
  41. data/lib/rubocop/cop/style/if_with_semicolon.rb +39 -4
  42. data/lib/rubocop/cop/style/method_call_without_args_parentheses.rb +11 -2
  43. data/lib/rubocop/cop/style/numeric_literals.rb +14 -11
  44. data/lib/rubocop/cop/style/redundant_argument.rb +3 -1
  45. data/lib/rubocop/cop/style/redundant_condition.rb +2 -1
  46. data/lib/rubocop/cop/style/redundant_regexp_escape.rb +24 -8
  47. data/lib/rubocop/cop/style/sole_nested_conditional.rb +59 -3
  48. data/lib/rubocop/cop/style/string_concatenation.rb +7 -1
  49. data/lib/rubocop/cop/style/symbol_proc.rb +5 -3
  50. data/lib/rubocop/core_ext/hash.rb +20 -0
  51. data/lib/rubocop/ext/regexp_node.rb +29 -12
  52. data/lib/rubocop/ext/regexp_parser.rb +20 -9
  53. data/lib/rubocop/version.rb +1 -1
  54. metadata +23 -5
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 840dbd224c26defdcf3fe6d5c48f6e495f4288141a38f5e79de74552a0a1d9d8
4
- data.tar.gz: 381215eaceb9e62bdb1ba0df04880b4b8c702bfd4e11df78d0683b539451fb3c
3
+ metadata.gz: 77baac77fdf5ed6293449d9653e1caeadc94b18e49bbd5115176c3681b8ed752
4
+ data.tar.gz: 677ced7d3409d54555aaba855aec07fac0717bdb100eef4ea0196d68688247d6
5
5
  SHA512:
6
- metadata.gz: d3a563aeb426e7ae74dcc9dbc28d153e3b672d0abcae22bea62ff6077bb2bb7eff78cdacf3f4f9a384d09ddc417744135c3a47536145052bbbca985008514b5e
7
- data.tar.gz: 0c832cf607fa6fe0bd5513dc82f315638285f225c7456a2a884830cd173bb740ca741b4ea2279e908b8a00ecb94e60f40c7b2064841efa2152f50ce6a40477a2
6
+ metadata.gz: d083c6f78d892e14780bc3ab2cadf4b4208b87ab3dae357df39cc5dcbd9c2a18ff416795cd73a39c0d743fd07923ccbd092b916be3e738114558aa2b37f724cc
7
+ data.tar.gz: 6a5e0502cfbc9c0c5c11f075b89a91ea7ae4ec1b70134fbe6930caca9f7959282dea23f9358db291cca2a4e1fa72e830a1717c1c845528024eb89d23e6368379
data/README.md CHANGED
@@ -51,7 +51,7 @@ To prevent an unwanted RuboCop update you might want to use a conservative versi
51
51
  in your `Gemfile`:
52
52
 
53
53
  ```rb
54
- gem 'rubocop', '~> 1.4', require: false
54
+ gem 'rubocop', '~> 1.5', require: false
55
55
  ```
56
56
 
57
57
  See [versioning](https://docs.rubocop.org/rubocop/1.0/versioning.html) for further details.
Binary file
@@ -0,0 +1,261 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <meta charset='UTF-8' />
5
+ <title>RuboCop Inspection Report</title>
6
+ <%# TODO: Clean up the messy markup and style definitions. %>
7
+ <style>
8
+ * {
9
+ -webkit-box-sizing: border-box;
10
+ -moz-box-sizing: border-box;
11
+ box-sizing: border-box;
12
+ }
13
+
14
+ body, html {
15
+ font-size: 62.5%;
16
+ }
17
+ body {
18
+ background-color: #ecedf0;
19
+ font-family: "Helvetica Neue",Helvetica,Arial,sans-serif;
20
+ margin: 0;
21
+ }
22
+ code {
23
+ font-family: Consolas, "Liberation Mono", Menlo, Courier, monospace;
24
+ font-size: 85%;
25
+ }
26
+ #header {
27
+ background: #f9f9f9;
28
+ color: #333;
29
+ border-bottom: 3px solid #ccc;
30
+ height: 50px;
31
+ padding: 0;
32
+ }
33
+ #header .logo {
34
+ float: left;
35
+ margin: 5px 12px 7px 20px;
36
+ width: 38px;
37
+ height: 38px;
38
+ }
39
+ #header .title {
40
+ display: inline-block;
41
+ float: left;
42
+ height: 50px;
43
+ font-size: 2.4rem;
44
+ letter-spacing: normal;
45
+ line-height: 50px;
46
+ margin: 0;
47
+ }
48
+
49
+ .information, #offenses {
50
+ width: 100%;
51
+ padding: 20px;
52
+ color: #333;
53
+ }
54
+ #offenses {
55
+ padding: 0 20px;
56
+ }
57
+
58
+ .information .infobox {
59
+ border-left: 3px solid;
60
+ border-radius: 4px;
61
+ background-color: #fff;
62
+ -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05);
63
+ box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05);
64
+ padding: 15px;
65
+ border-color: #0088cc;
66
+ font-size: 1.4rem;
67
+ }
68
+ .information .infobox .info-title {
69
+ font-size: 1.8rem;
70
+ line-height: 2.2rem;
71
+ margin: 0 0 0.5em;
72
+ }
73
+ .information .offenses-list li {
74
+ line-height: 1.8rem
75
+ }
76
+ .information .offenses-list {
77
+ padding-left: 20px;
78
+ margin-bottom: 0;
79
+ }
80
+
81
+ #offenses .offense-box {
82
+ border-radius: 4px;
83
+ margin-bottom: 20px;
84
+ background-color: #fff;
85
+ -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05);
86
+ box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05);
87
+ }
88
+ .fixed .box-title {
89
+ position: fixed;
90
+ top: 0;
91
+ z-index: 10;
92
+ width: 100%;
93
+ }
94
+ .box-title-placeholder {
95
+ display: none;
96
+ }
97
+ .fixed .box-title-placeholder {
98
+ display: block;
99
+ }
100
+ #offenses .offense-box .box-title h3, #offenses .offense-box .box-title-placeholder h3 {
101
+ color: #33353f;
102
+ background-color: #f6f6f6;
103
+ font-size: 2rem;
104
+ line-height: 2rem;
105
+ display: block;
106
+ padding: 15px;
107
+ border-radius: 5px;
108
+ margin: 0;
109
+ }
110
+ #offenses .offense-box .offense-reports {
111
+ padding: 0 15px;
112
+ }
113
+ #offenses .offense-box .offense-reports .report {
114
+ border-bottom: 1px dotted #ddd;
115
+ padding: 15px 0px;
116
+ position: relative;
117
+ font-size: 1.3rem;
118
+ }
119
+ #offenses .offense-box .offense-reports .report:last-child {
120
+ border-bottom: none;
121
+ }
122
+ #offenses .offense-box .offense-reports .report pre code {
123
+ display: block;
124
+ background: #000;
125
+ color: #fff;
126
+ padding: 10px 15px;
127
+ border-radius: 5px;
128
+ line-height: 1.6rem;
129
+ }
130
+ #offenses .offense-box .offense-reports .report .location {
131
+ font-weight: bold;
132
+ }
133
+ #offenses .offense-box .offense-reports .report .message code {
134
+ padding: 0.3em;
135
+ background-color: rgba(0,0,0,0.07);
136
+ border-radius: 3px;
137
+ }
138
+ .severity {
139
+ text-transform: capitalize;
140
+ font-weight: bold;
141
+ }
142
+ .highlight {
143
+ padding: 2px;
144
+ border-radius: 2px;
145
+ font-weight: bold;
146
+ }
147
+ <%- SEVERITY_COLORS.each do |severity, color| %>
148
+ .severity.<%= severity %> {
149
+ color: <%= color %>;
150
+ }
151
+ .highlight.<%= severity %> {
152
+ background-color: <%= color.fade_out(0.4) %>;
153
+ border: 1px solid <%= color.fade_out(0.6) %>;
154
+ }
155
+ <%- end %>
156
+ footer {
157
+ margin-bottom: 20px;
158
+ margin-right: 20px;
159
+ font-size: 1.3rem;
160
+ color: #777;
161
+ text-align: right;
162
+ }
163
+ .extra-code {
164
+ color: #ED9C28
165
+ }
166
+ </style>
167
+
168
+ <script>
169
+ (function() {
170
+ // floating headers. requires classList support.
171
+ if (!('classList' in document.createElement("_"))) return;
172
+
173
+ var loaded = false,
174
+ boxes,
175
+ boxPositions;
176
+
177
+ window.onload = function() {
178
+ var scrollY = window.scrollY;
179
+ boxes = document.querySelectorAll('.offense-box');
180
+ boxPositions = [];
181
+ for (var i = 0; i < boxes.length; i++)
182
+ // need to add scrollY because the page might be somewhere other than the top when loaded.
183
+ boxPositions[i] = boxes[i].getBoundingClientRect().top + scrollY;
184
+ loaded = true;
185
+ };
186
+
187
+ window.onscroll = function() {
188
+ if (!loaded) return;
189
+ var i,
190
+ idx,
191
+ scrollY = window.scrollY;
192
+ for (i = 0; i < boxPositions.length; i++) {
193
+ if (scrollY <= boxPositions[i] - 1) {
194
+ idx = i;
195
+ break;
196
+ }
197
+ }
198
+ if (typeof idx == 'undefined') idx = boxes.length;
199
+ if (idx > 0)
200
+ boxes[idx - 1].classList.add('fixed');
201
+ for (i = 0; i < boxes.length; i++) {
202
+ if (i < idx) continue;
203
+ boxes[i].classList.remove('fixed');
204
+ }
205
+ };
206
+ })();
207
+ </script>
208
+ </head>
209
+ <body>
210
+ <div id="header">
211
+ <img class="logo" src="data:image/png;base64,<%= base64_encoded_logo_image %>" alt="">
212
+ <h1 class="title">RuboCop Inspection Report</h1>
213
+ </div>
214
+ <div class="information">
215
+ <div class="infobox">
216
+ <div class="total">
217
+ <%= pluralize(files.count, 'file') %> inspected,
218
+ <%= pluralize(summary.offense_count, 'offense', no_for_zero: true) %> detected:
219
+ </div>
220
+ <ul class="offenses-list">
221
+ <% files.each do |file| %>
222
+ <% next if file.offenses.none? %>
223
+ <li>
224
+ <a href="#offense_<%= relative_path(file.path) %>">
225
+ <%= relative_path(file.path) %> - <%= pluralize(file.offenses.count, 'offense') %>
226
+ </a>
227
+ </li>
228
+ <% end %>
229
+ </ul>
230
+ </div>
231
+ </div>
232
+ <div id="offenses">
233
+ <% files.each do |file| %>
234
+ <% if file.offenses.any? %>
235
+ <div class="offense-box" id="offense_<%= relative_path(file.path) %>">
236
+ <div class="box-title-placeholder"><h3>&nbsp;</h3></div>
237
+ <div class="box-title"><h3><%= relative_path(file.path) %> - <%= pluralize(file.offenses.count, 'offense') %></h3></div>
238
+ <div class="offense-reports">
239
+ <% file.offenses.each do |offense| %>
240
+ <div class="report">
241
+ <div class="meta">
242
+ <span class="location">Line #<%= offense.location.line %></span> –
243
+ <span class="severity <%= offense.severity %>"><%= offense.severity %>:</span>
244
+ <span class="message"><%= decorated_message(offense) %></span>
245
+ </div>
246
+ <% unless offense.location.source_line.strip.empty? %>
247
+ <pre><code><%= highlighted_source_line(offense) %></code></pre>
248
+ <% end %>
249
+ </div>
250
+ <% end %>
251
+ </div>
252
+ </div>
253
+ <% end %>
254
+ <% end %>
255
+ </div>
256
+ <footer>
257
+ Generated by <a href="https://github.com/rubocop-hq/rubocop">RuboCop</a>
258
+ <span class="version"><%= RuboCop::Version::STRING %></span>
259
+ </footer>
260
+ </body>
261
+ </html>
@@ -139,6 +139,16 @@ AllCops:
139
139
  # from the lock file.) If the Ruby version is still unresolved, RuboCop will
140
140
  # use the oldest officially supported Ruby version (currently Ruby 2.4).
141
141
  TargetRubyVersion: ~
142
+ # Determines if a notification for extension libraries should be shown when
143
+ # rubocop is run. Keys are the name of the extension, and values are an array
144
+ # of gems in the Gemfile that the extension is suggested for, if not already
145
+ # included.
146
+ SuggestExtensions:
147
+ rubocop-rails: [rails]
148
+ rubocop-rspec: [rspec, rspec-rails]
149
+ rubocop-minitest: [minitest]
150
+ rubocop-sequel: [sequel]
151
+ rubocop-rake: [rake]
142
152
 
143
153
  #################### Bundler ###############################
144
154
 
@@ -459,7 +469,7 @@ Layout/EmptyLineAfterMultilineCondition:
459
469
  - https://github.com/airbnb/ruby#multiline-if-newline
460
470
 
461
471
  Layout/EmptyLineBetweenDefs:
462
- Description: 'Use empty lines between defs.'
472
+ Description: 'Use empty lines between class/module/method defs.'
463
473
  StyleGuide: '#empty-lines-between-methods'
464
474
  Enabled: true
465
475
  VersionAdded: '0.49'
@@ -1998,6 +2008,23 @@ Lint/UnderscorePrefixedVariableName:
1998
2008
  VersionAdded: '0.21'
1999
2009
  AllowKeywordBlockArguments: false
2000
2010
 
2011
+ Lint/UnexpectedBlockArity:
2012
+ Description: 'Looks for blocks that have fewer arguments that the calling method expects.'
2013
+ Enabled: pending
2014
+ Safe: false
2015
+ VersionAdded: '1.5'
2016
+ Methods:
2017
+ chunk_while: 2
2018
+ each_with_index: 2
2019
+ each_with_object: 2
2020
+ inject: 2
2021
+ max: 2
2022
+ min: 2
2023
+ minmax: 2
2024
+ reduce: 2
2025
+ slice_when: 2
2026
+ sort: 2
2027
+
2001
2028
  Lint/UnifiedInteger:
2002
2029
  Description: 'Use Integer instead of Fixnum or Bignum.'
2003
2030
  Enabled: true
@@ -2007,6 +2034,7 @@ Lint/UnmodifiedReduceAccumulator:
2007
2034
  Description: Checks for `reduce` or `inject` blocks that do not update the accumulator each iteration.
2008
2035
  Enabled: pending
2009
2036
  VersionAdded: '1.1'
2037
+ VersionChanged: '1.5'
2010
2038
 
2011
2039
  Lint/UnreachableCode:
2012
2040
  Description: 'Unreachable code.'
@@ -2110,21 +2138,23 @@ Metrics/AbcSize:
2110
2138
  - https://en.wikipedia.org/wiki/ABC_Software_Metric
2111
2139
  Enabled: true
2112
2140
  VersionAdded: '0.27'
2113
- VersionChanged: '0.81'
2141
+ VersionChanged: '1.5'
2114
2142
  # The ABC size is a calculated magnitude, so this number can be an Integer or
2115
2143
  # a Float.
2116
2144
  IgnoredMethods: []
2145
+ CountRepeatedAttributes: true
2117
2146
  Max: 17
2118
2147
 
2119
2148
  Metrics/BlockLength:
2120
2149
  Description: 'Avoid long blocks with many lines.'
2121
2150
  Enabled: true
2122
2151
  VersionAdded: '0.44'
2123
- VersionChanged: '0.87'
2152
+ VersionChanged: '1.5'
2124
2153
  CountComments: false # count full line comments?
2125
2154
  Max: 25
2126
2155
  CountAsOne: []
2127
- ExcludedMethods:
2156
+ ExcludedMethods: [] # deprecated, retained for backwards compatibility
2157
+ IgnoredMethods:
2128
2158
  # By default, exclude the `#refine` method, as it tends to have larger
2129
2159
  # associated blocks.
2130
2160
  - refine
@@ -2165,11 +2195,12 @@ Metrics/MethodLength:
2165
2195
  StyleGuide: '#short-methods'
2166
2196
  Enabled: true
2167
2197
  VersionAdded: '0.25'
2168
- VersionChanged: '0.87'
2198
+ VersionChanged: '1.5'
2169
2199
  CountComments: false # count full line comments?
2170
2200
  Max: 10
2171
2201
  CountAsOne: []
2172
- ExcludedMethods: []
2202
+ ExcludedMethods: [] # deprecated, retained for backwards compatibility
2203
+ IgnoredMethods: []
2173
2204
 
2174
2205
  Metrics/ModuleLength:
2175
2206
  Description: 'Avoid modules longer than 100 lines of code.'
@@ -2185,8 +2216,10 @@ Metrics/ParameterLists:
2185
2216
  StyleGuide: '#too-many-params'
2186
2217
  Enabled: true
2187
2218
  VersionAdded: '0.25'
2219
+ VersionChanged: '1.5'
2188
2220
  Max: 5
2189
2221
  CountKeywordArgs: true
2222
+ MaxOptionalParameters: 3
2190
2223
 
2191
2224
  Metrics/PerceivedComplexity:
2192
2225
  Description: >-
@@ -2456,7 +2489,7 @@ Naming/VariableNumber:
2456
2489
  StyleGuide: '#snake-case-symbols-methods-vars-with-numbers'
2457
2490
  Enabled: true
2458
2491
  VersionAdded: '0.50'
2459
- VersionChanged: '1.3'
2492
+ VersionChanged: '1.4'
2460
2493
  EnforcedStyle: normalcase
2461
2494
  SupportedStyles:
2462
2495
  - snake_case
@@ -2464,7 +2497,13 @@ Naming/VariableNumber:
2464
2497
  - non_integer
2465
2498
  CheckMethodNames: true
2466
2499
  CheckSymbols: true
2467
- AllowedIdentifiers: []
2500
+ AllowedIdentifiers:
2501
+ - capture3 # Open3.capture3
2502
+ - iso8601 # Time#iso8601
2503
+ - rfc1123_date # CGI.rfc1123_date
2504
+ - rfc822 # Time#rfc822
2505
+ - rfc2822 # Time#rfc2822
2506
+ - rfc3339 # DateTime.rfc3339
2468
2507
 
2469
2508
  #################### Security ##############################
2470
2509
 
@@ -4262,6 +4301,7 @@ Style/SoleNestedConditional:
4262
4301
  which can be merged into outer conditional node.
4263
4302
  Enabled: true
4264
4303
  VersionAdded: '0.89'
4304
+ VersionChanged: '1.5'
4265
4305
  AllowModifier: false
4266
4306
 
4267
4307
  Style/SpecialGlobalVars:
@@ -4394,7 +4434,7 @@ Style/SymbolProc:
4394
4434
  Enabled: true
4395
4435
  Safe: false
4396
4436
  VersionAdded: '0.26'
4397
- VersionChanged: '0.64'
4437
+ VersionChanged: '1.5'
4398
4438
  # A list of method names to be ignored by the check.
4399
4439
  # The names should be fairly unique, otherwise you'll end up ignoring lots of code.
4400
4440
  IgnoredMethods:
@@ -18,6 +18,7 @@ require_relative 'rubocop/ext/regexp_node'
18
18
  require_relative 'rubocop/ext/regexp_parser'
19
19
 
20
20
  require_relative 'rubocop/core_ext/string'
21
+ require_relative 'rubocop/core_ext/hash'
21
22
  require_relative 'rubocop/ext/processed_source'
22
23
 
23
24
  require_relative 'rubocop/path_util'
@@ -88,6 +89,7 @@ require_relative 'rubocop/cop/mixin/interpolation'
88
89
  require_relative 'rubocop/cop/mixin/line_length_help'
89
90
  require_relative 'rubocop/cop/mixin/match_range'
90
91
  require_relative 'rubocop/cop/metrics/utils/repeated_csend_discount'
92
+ require_relative 'rubocop/cop/metrics/utils/repeated_attribute_discount'
91
93
  require_relative 'rubocop/cop/mixin/method_complexity'
92
94
  require_relative 'rubocop/cop/mixin/method_preference'
93
95
  require_relative 'rubocop/cop/mixin/min_body_length'
@@ -341,6 +343,7 @@ require_relative 'rubocop/cop/lint/to_json'
341
343
  require_relative 'rubocop/cop/lint/top_level_return_with_argument'
342
344
  require_relative 'rubocop/cop/lint/trailing_comma_in_attribute_declaration'
343
345
  require_relative 'rubocop/cop/lint/underscore_prefixed_variable_name'
346
+ require_relative 'rubocop/cop/lint/unexpected_block_arity'
344
347
  require_relative 'rubocop/cop/lint/unified_integer'
345
348
  require_relative 'rubocop/cop/lint/unmodified_reduce_accumulator'
346
349
  require_relative 'rubocop/cop/lint/unreachable_code'
@@ -646,6 +649,7 @@ require_relative 'rubocop/cli/command/auto_genenerate_config'
646
649
  require_relative 'rubocop/cli/command/execute_runner'
647
650
  require_relative 'rubocop/cli/command/init_dotfile'
648
651
  require_relative 'rubocop/cli/command/show_cops'
652
+ require_relative 'rubocop/cli/command/suggest_extensions'
649
653
  require_relative 'rubocop/cli/command/version'
650
654
  require_relative 'rubocop/config_regeneration'
651
655
  require_relative 'rubocop/options'