rubocop 1.39.0 → 1.44.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (188) hide show
  1. checksums.yaml +4 -4
  2. data/LICENSE.txt +1 -1
  3. data/README.md +2 -2
  4. data/config/default.yml +149 -11
  5. data/exe/rubocop +1 -1
  6. data/lib/rubocop/cli.rb +1 -1
  7. data/lib/rubocop/comment_config.rb +5 -0
  8. data/lib/rubocop/config.rb +39 -15
  9. data/lib/rubocop/config_loader.rb +26 -20
  10. data/lib/rubocop/config_loader_resolver.rb +6 -2
  11. data/lib/rubocop/config_validator.rb +1 -1
  12. data/lib/rubocop/cop/badge.rb +9 -4
  13. data/lib/rubocop/cop/base.rb +84 -74
  14. data/lib/rubocop/cop/commissioner.rb +8 -3
  15. data/lib/rubocop/cop/cop.rb +29 -29
  16. data/lib/rubocop/cop/corrector.rb +30 -10
  17. data/lib/rubocop/cop/correctors/multiline_literal_brace_corrector.rb +22 -6
  18. data/lib/rubocop/cop/correctors/ordered_gem_corrector.rb +1 -6
  19. data/lib/rubocop/cop/gemspec/dependency_version.rb +16 -18
  20. data/lib/rubocop/cop/gemspec/development_dependencies.rb +107 -0
  21. data/lib/rubocop/cop/internal_affairs/cop_description.rb +3 -1
  22. data/lib/rubocop/cop/internal_affairs/lambda_or_proc.rb +46 -0
  23. data/lib/rubocop/cop/internal_affairs/redundant_let_rubocop_config_new.rb +11 -3
  24. data/lib/rubocop/cop/internal_affairs.rb +1 -0
  25. data/lib/rubocop/cop/layout/block_end_newline.rb +7 -1
  26. data/lib/rubocop/cop/layout/class_structure.rb +32 -11
  27. data/lib/rubocop/cop/layout/closing_parenthesis_indentation.rb +2 -6
  28. data/lib/rubocop/cop/layout/comment_indentation.rb +3 -1
  29. data/lib/rubocop/cop/layout/empty_lines.rb +2 -0
  30. data/lib/rubocop/cop/layout/extra_spacing.rb +10 -6
  31. data/lib/rubocop/cop/layout/first_array_element_line_break.rb +38 -2
  32. data/lib/rubocop/cop/layout/first_hash_element_line_break.rb +49 -2
  33. data/lib/rubocop/cop/layout/first_method_argument_line_break.rb +61 -2
  34. data/lib/rubocop/cop/layout/first_method_parameter_line_break.rb +52 -2
  35. data/lib/rubocop/cop/layout/heredoc_indentation.rb +6 -9
  36. data/lib/rubocop/cop/layout/indentation_style.rb +7 -2
  37. data/lib/rubocop/cop/layout/line_continuation_leading_space.rb +5 -0
  38. data/lib/rubocop/cop/layout/line_continuation_spacing.rb +11 -5
  39. data/lib/rubocop/cop/layout/line_length.rb +2 -0
  40. data/lib/rubocop/cop/layout/multiline_array_line_breaks.rb +51 -2
  41. data/lib/rubocop/cop/layout/multiline_block_layout.rb +1 -1
  42. data/lib/rubocop/cop/layout/multiline_hash_key_line_breaks.rb +49 -2
  43. data/lib/rubocop/cop/layout/multiline_method_argument_line_breaks.rb +53 -2
  44. data/lib/rubocop/cop/layout/multiline_method_parameter_line_breaks.rb +58 -2
  45. data/lib/rubocop/cop/layout/redundant_line_break.rb +2 -2
  46. data/lib/rubocop/cop/layout/space_around_keyword.rb +1 -1
  47. data/lib/rubocop/cop/layout/space_inside_array_literal_brackets.rb +0 -2
  48. data/lib/rubocop/cop/layout/trailing_empty_lines.rb +1 -1
  49. data/lib/rubocop/cop/layout/trailing_whitespace.rb +11 -4
  50. data/lib/rubocop/cop/lint/ambiguous_block_association.rb +1 -1
  51. data/lib/rubocop/cop/lint/ambiguous_operator.rb +4 -0
  52. data/lib/rubocop/cop/lint/assignment_in_condition.rb +11 -1
  53. data/lib/rubocop/cop/lint/constant_resolution.rb +4 -0
  54. data/lib/rubocop/cop/lint/debugger.rb +3 -1
  55. data/lib/rubocop/cop/lint/deprecated_class_methods.rb +62 -112
  56. data/lib/rubocop/cop/lint/deprecated_constants.rb +8 -1
  57. data/lib/rubocop/cop/lint/duplicate_branch.rb +0 -2
  58. data/lib/rubocop/cop/lint/duplicate_methods.rb +19 -8
  59. data/lib/rubocop/cop/lint/else_layout.rb +2 -6
  60. data/lib/rubocop/cop/lint/empty_block.rb +1 -5
  61. data/lib/rubocop/cop/lint/empty_conditional_body.rb +1 -1
  62. data/lib/rubocop/cop/lint/format_parameter_mismatch.rb +11 -7
  63. data/lib/rubocop/cop/lint/heredoc_method_call_position.rb +15 -17
  64. data/lib/rubocop/cop/lint/interpolation_check.rb +4 -3
  65. data/lib/rubocop/cop/lint/mixed_regexp_capture_types.rb +1 -0
  66. data/lib/rubocop/cop/lint/non_atomic_file_operation.rb +10 -5
  67. data/lib/rubocop/cop/lint/out_of_range_regexp_ref.rb +19 -0
  68. data/lib/rubocop/cop/lint/parentheses_as_grouped_expression.rb +5 -0
  69. data/lib/rubocop/cop/lint/redundant_cop_disable_directive.rb +15 -3
  70. data/lib/rubocop/cop/lint/redundant_cop_enable_directive.rb +1 -1
  71. data/lib/rubocop/cop/lint/redundant_require_statement.rb +11 -1
  72. data/lib/rubocop/cop/lint/regexp_as_condition.rb +6 -0
  73. data/lib/rubocop/cop/lint/require_parentheses.rb +3 -1
  74. data/lib/rubocop/cop/lint/safe_navigation_chain.rb +10 -12
  75. data/lib/rubocop/cop/lint/send_with_mixin_argument.rb +5 -4
  76. data/lib/rubocop/cop/lint/shadowing_outer_local_variable.rb +4 -3
  77. data/lib/rubocop/cop/lint/unused_method_argument.rb +2 -1
  78. data/lib/rubocop/cop/lint/useless_method_definition.rb +3 -3
  79. data/lib/rubocop/cop/lint/useless_rescue.rb +85 -0
  80. data/lib/rubocop/cop/lint/useless_ruby2_keywords.rb +14 -4
  81. data/lib/rubocop/cop/lint/void.rb +25 -16
  82. data/lib/rubocop/cop/metrics/block_length.rb +9 -4
  83. data/lib/rubocop/cop/metrics/block_nesting.rb +1 -1
  84. data/lib/rubocop/cop/metrics/class_length.rb +10 -5
  85. data/lib/rubocop/cop/metrics/cyclomatic_complexity.rb +1 -1
  86. data/lib/rubocop/cop/metrics/method_length.rb +9 -4
  87. data/lib/rubocop/cop/metrics/module_length.rb +10 -5
  88. data/lib/rubocop/cop/metrics/parameter_lists.rb +27 -0
  89. data/lib/rubocop/cop/metrics/perceived_complexity.rb +1 -1
  90. data/lib/rubocop/cop/metrics/utils/abc_size_calculator.rb +3 -6
  91. data/lib/rubocop/cop/metrics/utils/code_length_calculator.rb +6 -3
  92. data/lib/rubocop/cop/mixin/alignment.rb +2 -2
  93. data/lib/rubocop/cop/mixin/allowed_identifiers.rb +2 -2
  94. data/lib/rubocop/cop/mixin/annotation_comment.rb +13 -6
  95. data/lib/rubocop/cop/mixin/configurable_enforced_style.rb +21 -9
  96. data/lib/rubocop/cop/mixin/first_element_line_break.rb +11 -7
  97. data/lib/rubocop/cop/mixin/hash_shorthand_syntax.rb +59 -6
  98. data/lib/rubocop/cop/mixin/line_length_help.rb +11 -2
  99. data/lib/rubocop/cop/mixin/method_complexity.rb +5 -3
  100. data/lib/rubocop/cop/mixin/multiline_element_line_breaks.rb +5 -3
  101. data/lib/rubocop/cop/mixin/percent_array.rb +3 -5
  102. data/lib/rubocop/cop/mixin/preceding_following_alignment.rb +1 -1
  103. data/lib/rubocop/cop/mixin/require_library.rb +2 -0
  104. data/lib/rubocop/cop/mixin/rescue_node.rb +3 -3
  105. data/lib/rubocop/cop/mixin/statement_modifier.rb +16 -1
  106. data/lib/rubocop/cop/naming/block_forwarding.rb +5 -1
  107. data/lib/rubocop/cop/naming/class_and_module_camel_case.rb +2 -0
  108. data/lib/rubocop/cop/naming/inclusive_language.rb +4 -1
  109. data/lib/rubocop/cop/registry.rb +63 -43
  110. data/lib/rubocop/cop/security/compound_hash.rb +2 -1
  111. data/lib/rubocop/cop/style/access_modifier_declarations.rb +18 -10
  112. data/lib/rubocop/cop/style/alias.rb +9 -1
  113. data/lib/rubocop/cop/style/array_intersect.rb +111 -0
  114. data/lib/rubocop/cop/style/block_comments.rb +1 -1
  115. data/lib/rubocop/cop/style/block_delimiters.rb +8 -2
  116. data/lib/rubocop/cop/style/class_and_module_children.rb +2 -9
  117. data/lib/rubocop/cop/style/comparable_clamp.rb +125 -0
  118. data/lib/rubocop/cop/style/concat_array_literals.rb +86 -0
  119. data/lib/rubocop/cop/style/conditional_assignment.rb +0 -6
  120. data/lib/rubocop/cop/style/documentation.rb +11 -5
  121. data/lib/rubocop/cop/style/guard_clause.rb +44 -9
  122. data/lib/rubocop/cop/style/hash_each_methods.rb +13 -1
  123. data/lib/rubocop/cop/style/hash_syntax.rb +11 -7
  124. data/lib/rubocop/cop/style/identical_conditional_branches.rb +15 -0
  125. data/lib/rubocop/cop/style/if_with_semicolon.rb +4 -4
  126. data/lib/rubocop/cop/style/infinite_loop.rb +2 -5
  127. data/lib/rubocop/cop/style/inverse_methods.rb +2 -0
  128. data/lib/rubocop/cop/style/invertible_unless_condition.rb +114 -0
  129. data/lib/rubocop/cop/style/line_end_concatenation.rb +4 -1
  130. data/lib/rubocop/cop/style/map_to_set.rb +61 -0
  131. data/lib/rubocop/cop/style/method_call_with_args_parentheses/omit_parentheses.rb +23 -14
  132. data/lib/rubocop/cop/style/method_call_without_args_parentheses.rb +2 -0
  133. data/lib/rubocop/cop/style/method_def_parentheses.rb +11 -4
  134. data/lib/rubocop/cop/style/min_max_comparison.rb +83 -0
  135. data/lib/rubocop/cop/style/missing_else.rb +13 -1
  136. data/lib/rubocop/cop/style/multiline_if_modifier.rb +0 -4
  137. data/lib/rubocop/cop/style/multiline_memoization.rb +2 -2
  138. data/lib/rubocop/cop/style/negated_if_else_condition.rb +1 -5
  139. data/lib/rubocop/cop/style/nil_lambda.rb +1 -1
  140. data/lib/rubocop/cop/style/one_line_conditional.rb +3 -6
  141. data/lib/rubocop/cop/style/operator_method_call.rb +15 -1
  142. data/lib/rubocop/cop/style/parallel_assignment.rb +3 -1
  143. data/lib/rubocop/cop/style/redundant_argument.rb +3 -0
  144. data/lib/rubocop/cop/style/redundant_conditional.rb +0 -4
  145. data/lib/rubocop/cop/style/redundant_constant_base.rb +85 -0
  146. data/lib/rubocop/cop/style/redundant_double_splat_hash_braces.rb +45 -0
  147. data/lib/rubocop/cop/style/redundant_regexp_escape.rb +2 -1
  148. data/lib/rubocop/cop/style/redundant_return.rb +7 -0
  149. data/lib/rubocop/cop/style/redundant_sort.rb +1 -1
  150. data/lib/rubocop/cop/style/redundant_string_escape.rb +6 -3
  151. data/lib/rubocop/cop/style/require_order.rb +135 -0
  152. data/lib/rubocop/cop/style/safe_navigation.rb +35 -6
  153. data/lib/rubocop/cop/style/select_by_regexp.rb +13 -5
  154. data/lib/rubocop/cop/style/self_assignment.rb +2 -2
  155. data/lib/rubocop/cop/style/semicolon.rb +26 -3
  156. data/lib/rubocop/cop/style/signal_exception.rb +8 -6
  157. data/lib/rubocop/cop/style/string_hash_keys.rb +4 -1
  158. data/lib/rubocop/cop/style/string_literals.rb +1 -5
  159. data/lib/rubocop/cop/style/symbol_proc.rb +2 -4
  160. data/lib/rubocop/cop/style/trailing_comma_in_arguments.rb +4 -4
  161. data/lib/rubocop/cop/style/word_array.rb +41 -0
  162. data/lib/rubocop/cop/style/yoda_expression.rb +81 -0
  163. data/lib/rubocop/cop/style/zero_length_predicate.rb +31 -14
  164. data/lib/rubocop/cop/team.rb +30 -30
  165. data/lib/rubocop/cop/util.rb +32 -5
  166. data/lib/rubocop/cop/variable_force/assignment.rb +1 -1
  167. data/lib/rubocop/cop/variable_force/variable_table.rb +3 -1
  168. data/lib/rubocop/cop/variable_force.rb +18 -30
  169. data/lib/rubocop/cops_documentation_generator.rb +33 -11
  170. data/lib/rubocop/directive_comment.rb +1 -1
  171. data/lib/rubocop/file_patterns.rb +43 -0
  172. data/lib/rubocop/formatter/disabled_config_formatter.rb +17 -6
  173. data/lib/rubocop/formatter/html_formatter.rb +1 -1
  174. data/lib/rubocop/formatter.rb +4 -1
  175. data/lib/rubocop/options.rb +8 -0
  176. data/lib/rubocop/path_util.rb +50 -22
  177. data/lib/rubocop/result_cache.rb +2 -2
  178. data/lib/rubocop/rspec/cop_helper.rb +4 -1
  179. data/lib/rubocop/rspec/expect_offense.rb +6 -4
  180. data/lib/rubocop/rspec/support.rb +2 -2
  181. data/lib/rubocop/runner.rb +10 -3
  182. data/lib/rubocop/server/cache.rb +3 -1
  183. data/lib/rubocop/server/core.rb +1 -1
  184. data/lib/rubocop/target_finder.rb +1 -1
  185. data/lib/rubocop/target_ruby.rb +1 -2
  186. data/lib/rubocop/version.rb +1 -1
  187. data/lib/rubocop.rb +23 -6
  188. metadata +23 -9
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 881807be0f0f6eea20bd13bd8f08fdb158a5b155c8d3a22fd748683a68c1fef1
4
- data.tar.gz: 2a8e7d4b02f1ba468e02a4c20f8e3b830ce2a1d8ff0210f86aaeafab597c8c88
3
+ metadata.gz: 3f6f58220d287e215fa9baaa9c274e89b128c0e42222595caa432132d27de274
4
+ data.tar.gz: e3c547bef6b2803f80ba22013eae4cff56f6fb572aca19a886bb2fb52e8ba665
5
5
  SHA512:
6
- metadata.gz: 11ea36bec754b07912e06b5481f964d10a6dbf5bfd56f99d8a8842ca46d56ae03a342a283d843336f977760c28a697ee995aa98268254a55b1218fa57a9fb5c7
7
- data.tar.gz: b5096cb4589d9bafdab0b6ab409ea9e7841dc06b274aeb7f7d5a26e703cb216c2a428d695fb2a087637467f1cdd5ac005398c66ee3e7d28d49cb4b203a87667d
6
+ metadata.gz: f9d29df635f00839a5da2cee59c55d4a279129529e3f0b130b7ad8602058fa11e733562a8e253dfa03b45e716c406e425d6c1f28fbd5a4a0b06436404058aa91
7
+ data.tar.gz: 4a80236cfa9402004dddf72346b395e944840da07525658de1a42ce5bbef7a030be86c38af798e6cf977b75b2c6153ecd7f33b9d91ab3cec1d631b68d21a4568
data/LICENSE.txt CHANGED
@@ -1,4 +1,4 @@
1
- Copyright (c) 2012-22 Bozhidar Batsov
1
+ Copyright (c) 2012-23 Bozhidar Batsov
2
2
 
3
3
  Permission is hereby granted, free of charge, to any person obtaining
4
4
  a copy of this software and associated documentation files (the
data/README.md CHANGED
@@ -53,7 +53,7 @@ To prevent an unwanted RuboCop update you might want to use a conservative versi
53
53
  in your `Gemfile`:
54
54
 
55
55
  ```rb
56
- gem 'rubocop', '~> 1.39', require: false
56
+ gem 'rubocop', '~> 1.44', require: false
57
57
  ```
58
58
 
59
59
  See [our versioning policy](https://docs.rubocop.org/rubocop/versioning.html) for further details.
@@ -246,5 +246,5 @@ RuboCop's changelog is available [here](CHANGELOG.md).
246
246
 
247
247
  ## Copyright
248
248
 
249
- Copyright (c) 2012-2022 Bozhidar Batsov. See [LICENSE.txt](LICENSE.txt) for
249
+ Copyright (c) 2012-2023 Bozhidar Batsov. See [LICENSE.txt](LICENSE.txt) for
250
250
  further details.
data/config/default.yml CHANGED
@@ -161,7 +161,9 @@ AllCops:
161
161
  Bundler/DuplicatedGem:
162
162
  Description: 'Checks for duplicate gem entries in Gemfile.'
163
163
  Enabled: true
164
+ Severity: warning
164
165
  VersionAdded: '0.46'
166
+ VersionChanged: '1.40'
165
167
  Include:
166
168
  - '**/*.gemfile'
167
169
  - '**/Gemfile'
@@ -213,7 +215,9 @@ Bundler/InsecureProtocolSource:
213
215
  because HTTP requests are insecure. Please change your source to
214
216
  'https://rubygems.org' if possible, or 'http://rubygems.org' if not.
215
217
  Enabled: true
218
+ Severity: warning
216
219
  VersionAdded: '0.50'
220
+ VersionChanged: '1.40'
217
221
  AllowHttpProtocol: true
218
222
  Include:
219
223
  - '**/*.gemfile'
@@ -252,14 +256,34 @@ Gemspec/DependencyVersion:
252
256
  Gemspec/DeprecatedAttributeAssignment:
253
257
  Description: Checks that deprecated attribute assignments are not set in a gemspec file.
254
258
  Enabled: pending
259
+ Severity: warning
255
260
  VersionAdded: '1.30'
261
+ VersionChanged: '1.40'
262
+ Include:
263
+ - '**/*.gemspec'
264
+
265
+ Gemspec/DevelopmentDependencies:
266
+ Description: Checks that development dependencies are specified in Gemfile rather than gemspec.
267
+ Enabled: pending
268
+ VersionAdded: '1.44'
269
+ EnforcedStyle: Gemfile
270
+ SupportedStyles:
271
+ - Gemfile
272
+ - gems.rb
273
+ - gemspec
274
+ AllowedGems:
275
+ - bundler
256
276
  Include:
257
277
  - '**/*.gemspec'
278
+ - '**/Gemfile'
279
+ - '**/gems.rb'
258
280
 
259
281
  Gemspec/DuplicatedAssignment:
260
282
  Description: 'An attribute assignment method calls should be listed only once in a gemspec.'
261
283
  Enabled: true
284
+ Severity: warning
262
285
  VersionAdded: '0.52'
286
+ VersionChanged: '1.40'
263
287
  Include:
264
288
  - '**/*.gemspec'
265
289
 
@@ -278,7 +302,9 @@ Gemspec/OrderedDependencies:
278
302
  Gemspec/RequireMFA:
279
303
  Description: 'Checks that the gemspec has metadata to require Multi-Factor Authentication from RubyGems.'
280
304
  Enabled: pending
305
+ Severity: warning
281
306
  VersionAdded: '1.23'
307
+ VersionChanged: '1.40'
282
308
  Reference:
283
309
  - https://guides.rubygems.org/mfa-requirement-opt-in/
284
310
  Include:
@@ -287,8 +313,9 @@ Gemspec/RequireMFA:
287
313
  Gemspec/RequiredRubyVersion:
288
314
  Description: 'Checks that `required_ruby_version` of gemspec is specified and equal to `TargetRubyVersion` of .rubocop.yml.'
289
315
  Enabled: true
316
+ Severity: warning
290
317
  VersionAdded: '0.52'
291
- VersionChanged: '1.22'
318
+ VersionChanged: '1.40'
292
319
  Include:
293
320
  - '**/*.gemspec'
294
321
 
@@ -296,7 +323,9 @@ Gemspec/RubyVersionGlobalsUsage:
296
323
  Description: Checks usage of RUBY_VERSION in gemspec.
297
324
  StyleGuide: '#no-ruby-version-in-the-gemspec'
298
325
  Enabled: true
326
+ Severity: warning
299
327
  VersionAdded: '0.72'
328
+ VersionChanged: '1.40'
300
329
  Include:
301
330
  - '**/*.gemspec'
302
331
 
@@ -378,8 +407,9 @@ Layout/AssignmentIndentation:
378
407
  Checks the indentation of the first line of the
379
408
  right-hand-side of a multi-line assignment.
380
409
  Enabled: true
410
+ SafeAutoCorrect: false
381
411
  VersionAdded: '0.49'
382
- VersionChanged: '0.77'
412
+ VersionChanged: '1.40'
383
413
  # By default the indentation width from `Layout/IndentationWidth` is used,
384
414
  # but it can be overridden by setting this parameter.
385
415
  IndentationWidth: ~
@@ -748,6 +778,7 @@ Layout/FirstArrayElementLineBreak:
748
778
  multi-line array.
749
779
  Enabled: false
750
780
  VersionAdded: '0.49'
781
+ AllowMultilineFinalElement: false
751
782
 
752
783
  Layout/FirstHashElementIndentation:
753
784
  Description: 'Checks the indentation of the first key in a hash literal.'
@@ -780,6 +811,7 @@ Layout/FirstHashElementLineBreak:
780
811
  multi-line hash.
781
812
  Enabled: false
782
813
  VersionAdded: '0.49'
814
+ AllowMultilineFinalElement: false
783
815
 
784
816
  Layout/FirstMethodArgumentLineBreak:
785
817
  Description: >-
@@ -787,6 +819,7 @@ Layout/FirstMethodArgumentLineBreak:
787
819
  multi-line method call.
788
820
  Enabled: false
789
821
  VersionAdded: '0.49'
822
+ AllowMultilineFinalElement: false
790
823
 
791
824
  Layout/FirstMethodParameterLineBreak:
792
825
  Description: >-
@@ -794,6 +827,7 @@ Layout/FirstMethodParameterLineBreak:
794
827
  multi-line method parameter definition.
795
828
  Enabled: false
796
829
  VersionAdded: '0.49'
830
+ AllowMultilineFinalElement: false
797
831
 
798
832
  Layout/FirstParameterIndentation:
799
833
  Description: >-
@@ -1053,6 +1087,7 @@ Layout/MultilineArrayLineBreaks:
1053
1087
  starts on a separate line.
1054
1088
  Enabled: false
1055
1089
  VersionAdded: '0.67'
1090
+ AllowMultilineFinalElement: false
1056
1091
 
1057
1092
  Layout/MultilineAssignmentLayout:
1058
1093
  Description: 'Check for a newline after the assignment operator in multi-line assignments.'
@@ -1103,6 +1138,7 @@ Layout/MultilineHashKeyLineBreaks:
1103
1138
  starts on a separate line.
1104
1139
  Enabled: false
1105
1140
  VersionAdded: '0.67'
1141
+ AllowMultilineFinalElement: false
1106
1142
 
1107
1143
  Layout/MultilineMethodArgumentLineBreaks:
1108
1144
  Description: >-
@@ -1110,6 +1146,7 @@ Layout/MultilineMethodArgumentLineBreaks:
1110
1146
  starts on a separate line.
1111
1147
  Enabled: false
1112
1148
  VersionAdded: '0.67'
1149
+ AllowMultilineFinalElement: false
1113
1150
 
1114
1151
  Layout/MultilineMethodCallBraceLayout:
1115
1152
  Description: >-
@@ -1164,6 +1201,7 @@ Layout/MultilineMethodParameterLineBreaks:
1164
1201
  starts on a separate line.
1165
1202
  Enabled: false
1166
1203
  VersionAdded: '1.32'
1204
+ AllowMultilineFinalElement: false
1167
1205
 
1168
1206
  Layout/MultilineOperationIndentation:
1169
1207
  Description: >-
@@ -1643,7 +1681,7 @@ Lint/DeprecatedConstants:
1643
1681
  Description: 'Checks for deprecated constants.'
1644
1682
  Enabled: pending
1645
1683
  VersionAdded: '1.8'
1646
- VersionChanged: '1.22'
1684
+ VersionChanged: '1.40'
1647
1685
  # You can configure deprecated constants.
1648
1686
  # If there is an alternative method, you can set alternative value as `Alternative`.
1649
1687
  # And you can set the deprecated version as `DeprecatedVersion`.
@@ -1670,6 +1708,12 @@ Lint/DeprecatedConstants:
1670
1708
  'Random::DEFAULT':
1671
1709
  Alternative: 'Random.new'
1672
1710
  DeprecatedVersion: '3.0'
1711
+ 'Struct::Group':
1712
+ Alternative: 'Etc::Group'
1713
+ DeprecatedVersion: '3.0'
1714
+ 'Struct::Passwd':
1715
+ Alternative: 'Etc::Passwd'
1716
+ DeprecatedVersion: '3.0'
1673
1717
 
1674
1718
  Lint/DeprecatedOpenSSLConstant:
1675
1719
  Description: "Don't use algorithm constants for `OpenSSL::Cipher` and `OpenSSL::Digest`."
@@ -1894,11 +1938,11 @@ Lint/InheritException:
1894
1938
  - runtime_error
1895
1939
 
1896
1940
  Lint/InterpolationCheck:
1897
- Description: 'Raise warning for interpolation in single q strs.'
1941
+ Description: 'Checks for interpolation in a single quoted string.'
1898
1942
  Enabled: true
1899
- Safe: false
1943
+ SafeAutoCorrect: false
1900
1944
  VersionAdded: '0.50'
1901
- VersionChanged: '0.87'
1945
+ VersionChanged: '1.40'
1902
1946
 
1903
1947
  Lint/LambdaWithoutLiteralBlock:
1904
1948
  Description: 'Checks uses of lambda without a literal block.'
@@ -2424,6 +2468,11 @@ Lint/UselessMethodDefinition:
2424
2468
  VersionChanged: '0.91'
2425
2469
  Safe: false
2426
2470
 
2471
+ Lint/UselessRescue:
2472
+ Description: 'Checks for useless `rescue`s.'
2473
+ Enabled: pending
2474
+ VersionAdded: '1.43'
2475
+
2427
2476
  Lint/UselessRuby2Keywords:
2428
2477
  Description: 'Finds unnecessary uses of `ruby2_keywords`.'
2429
2478
  Enabled: pending
@@ -2806,6 +2855,7 @@ Naming/MethodParameterName:
2806
2855
  - as
2807
2856
  - at
2808
2857
  - by
2858
+ - cc
2809
2859
  - db
2810
2860
  - id
2811
2861
  - if
@@ -3013,6 +3063,11 @@ Style/ArrayCoercion:
3013
3063
  Enabled: false
3014
3064
  VersionAdded: '0.88'
3015
3065
 
3066
+ Style/ArrayIntersect:
3067
+ Description: 'Use `array1.intersect?(array2)` instead of `(array1 & array2).any?`.'
3068
+ Enabled: 'pending'
3069
+ VersionAdded: '1.40'
3070
+
3016
3071
  Style/ArrayJoin:
3017
3072
  Description: 'Use Array#join instead of Array#*.'
3018
3073
  StyleGuide: '#array-join'
@@ -3392,6 +3447,17 @@ Style/CommentedKeyword:
3392
3447
  VersionAdded: '0.51'
3393
3448
  VersionChanged: '1.19'
3394
3449
 
3450
+ Style/ComparableClamp:
3451
+ Description: 'Enforces the use of `Comparable#clamp` instead of comparison by minimum and maximum.'
3452
+ Enabled: pending
3453
+ VersionAdded: '1.44'
3454
+
3455
+ Style/ConcatArrayLiterals:
3456
+ Description: 'Enforces the use of `Array#push(item)` instead of `Array#concat([item])` to avoid redundant array literals.'
3457
+ Enabled: pending
3458
+ Safe: false
3459
+ VersionAdded: '1.41'
3460
+
3395
3461
  Style/ConditionalAssignment:
3396
3462
  Description: >-
3397
3463
  Use the return value of `if` and `case` statements for
@@ -3813,7 +3879,8 @@ Style/HashEachMethods:
3813
3879
  Safe: false
3814
3880
  VersionAdded: '0.80'
3815
3881
  VersionChanged: '1.16'
3816
- AllowedReceivers: []
3882
+ AllowedReceivers:
3883
+ - Thread.current
3817
3884
 
3818
3885
  Style/HashExcept:
3819
3886
  Description: >-
@@ -3861,7 +3928,7 @@ Style/HashSyntax:
3861
3928
  - never
3862
3929
  # accepts both shorthand and explicit use of hash literal value.
3863
3930
  - either
3864
- # like "either", but will avoid mixing styles in a single hash
3931
+ # forces use of the 3.1 syntax only if all values can be omitted in the hash.
3865
3932
  - consistent
3866
3933
  # Force hashes that have a symbol value to use hash rockets
3867
3934
  UseHashRocketsWithSymbolValues: false
@@ -3985,6 +4052,35 @@ Style/InverseMethods:
3985
4052
  :select: :reject
3986
4053
  :select!: :reject!
3987
4054
 
4055
+ Style/InvertibleUnlessCondition:
4056
+ Description: 'Favor `if` with inverted condition over `unless`.'
4057
+ Enabled: false
4058
+ VersionAdded: '1.44'
4059
+ # `InverseMethods` are methods that can be inverted in a `unless` condition.
4060
+ # The relationship of inverse methods needs to be defined in both directions.
4061
+ # Keys and values both need to be defined as symbols.
4062
+ InverseMethods:
4063
+ :!=: :==
4064
+ :>: :<=
4065
+ :<=: :>
4066
+ :<: :>=
4067
+ :>=: :<
4068
+ :!~: :=~
4069
+ :zero?: :nonzero?
4070
+ :nonzero?: :zero?
4071
+ :any?: :none?
4072
+ :none?: :any?
4073
+ :even?: :odd?
4074
+ :odd?: :even?
4075
+ # `ActiveSupport` defines some common inverse methods. They are listed below,
4076
+ # and not enabled by default.
4077
+ # :present?: :blank?
4078
+ # :blank?: :present?
4079
+ # :include?: :exclude?
4080
+ # :exclude?: :include?
4081
+ # :one?: :many?
4082
+ # :many?: :one?
4083
+
3988
4084
  Style/IpAddresses:
3989
4085
  Description: "Don't include literal IP addresses in code."
3990
4086
  Enabled: false
@@ -4070,6 +4166,12 @@ Style/MapToHash:
4070
4166
  VersionAdded: '1.24'
4071
4167
  Safe: false
4072
4168
 
4169
+ Style/MapToSet:
4170
+ Description: 'Prefer `to_set` with a block over `map.to_set`.'
4171
+ Enabled: pending
4172
+ Safe: false
4173
+ VersionAdded: '1.42'
4174
+
4073
4175
  Style/MethodCallWithArgsParentheses:
4074
4176
  Description: 'Use parentheses for method calls with arguments.'
4075
4177
  StyleGuide: '#method-invocation-parens'
@@ -4128,6 +4230,12 @@ Style/MinMax:
4128
4230
  Enabled: true
4129
4231
  VersionAdded: '0.50'
4130
4232
 
4233
+ Style/MinMaxComparison:
4234
+ Description: 'Enforces the use of `max` or `min` instead of comparison for greater or less.'
4235
+ Enabled: pending
4236
+ Safe: false
4237
+ VersionAdded: '1.42'
4238
+
4131
4239
  Style/MissingElse:
4132
4240
  Description: >-
4133
4241
  Require if/case expressions to have an else branches.
@@ -4660,10 +4768,12 @@ Style/RedundantArgument:
4660
4768
  Enabled: pending
4661
4769
  Safe: false
4662
4770
  VersionAdded: '1.4'
4663
- VersionChanged: '1.7'
4771
+ VersionChanged: '1.40'
4664
4772
  Methods:
4665
4773
  # Array#join
4666
4774
  join: ''
4775
+ # Array#sum
4776
+ sum: 0
4667
4777
  # String#split
4668
4778
  split: ' '
4669
4779
  # String#chomp
@@ -4698,6 +4808,16 @@ Style/RedundantConditional:
4698
4808
  Enabled: true
4699
4809
  VersionAdded: '0.50'
4700
4810
 
4811
+ Style/RedundantConstantBase:
4812
+ Description: Avoid redundant `::` prefix on constant.
4813
+ Enabled: pending
4814
+ VersionAdded: '1.40'
4815
+
4816
+ Style/RedundantDoubleSplatHashBraces:
4817
+ Description: 'Checks for redundant uses of double splat hash braces.'
4818
+ Enabled: pending
4819
+ VersionAdded: '1.41'
4820
+
4701
4821
  Style/RedundantEach:
4702
4822
  Description: 'Checks for redundant `each`.'
4703
4823
  Enabled: pending
@@ -4838,6 +4958,12 @@ Style/RegexpLiteral:
4838
4958
  # are found in the regexp string.
4839
4959
  AllowInnerSlashes: false
4840
4960
 
4961
+ Style/RequireOrder:
4962
+ Description: Sort `require` and `require_relative` in alphabetical order.
4963
+ Enabled: false
4964
+ SafeAutoCorrect: false
4965
+ VersionAdded: '1.40'
4966
+
4841
4967
  Style/RescueModifier:
4842
4968
  Description: 'Avoid using rescue in its modifier form.'
4843
4969
  StyleGuide: '#no-rescue-modifiers'
@@ -5122,12 +5248,11 @@ Style/SymbolProc:
5122
5248
  Enabled: true
5123
5249
  Safe: false
5124
5250
  VersionAdded: '0.26'
5125
- VersionChanged: '1.28'
5251
+ VersionChanged: '1.40'
5126
5252
  AllowMethodsWithArguments: false
5127
5253
  # A list of method names to be always allowed by the check.
5128
5254
  # The names should be fairly unique, otherwise you'll end up ignoring lots of code.
5129
5255
  AllowedMethods:
5130
- - respond_to
5131
5256
  - define_method
5132
5257
  AllowedPatterns: []
5133
5258
  IgnoredMethods: [] # deprecated
@@ -5369,6 +5494,19 @@ Style/YodaCondition:
5369
5494
  VersionAdded: '0.49'
5370
5495
  VersionChanged: '0.75'
5371
5496
 
5497
+ Style/YodaExpression:
5498
+ Description: 'Forbid the use of yoda expressions.'
5499
+ Enabled: false
5500
+ Safe: false
5501
+ VersionAdded: '1.42'
5502
+ VersionChanged: '1.43'
5503
+ SupportedOperators:
5504
+ - '*'
5505
+ - '+'
5506
+ - '&'
5507
+ - '|'
5508
+ - '^'
5509
+
5372
5510
  Style/ZeroLengthPredicate:
5373
5511
  Description: 'Use #empty? when testing for objects of length 0.'
5374
5512
  Enabled: true
data/exe/rubocop CHANGED
@@ -11,8 +11,8 @@ exit exit_status if server_cli.exit?
11
11
  if RuboCop::Server.running?
12
12
  exit_status = RuboCop::Server::ClientCommand::Exec.new.run
13
13
  else
14
- require 'rubocop'
15
14
  require 'benchmark'
15
+ require 'rubocop'
16
16
 
17
17
  cli = RuboCop::CLI.new
18
18
 
data/lib/rubocop/cli.rb CHANGED
@@ -7,7 +7,7 @@ module RuboCop
7
7
  STATUS_SUCCESS = 0
8
8
  STATUS_OFFENSES = 1
9
9
  STATUS_ERROR = 2
10
- STATUS_INTERRUPTED = 128 + Signal.list['INT']
10
+ STATUS_INTERRUPTED = Signal.list['INT'] + 128
11
11
  DEFAULT_PARALLEL_OPTIONS = %i[
12
12
  color debug display_style_guide display_time display_only_fail_level_offenses
13
13
  display_only_failed except extra_details fail_level fix_layout format
@@ -31,6 +31,7 @@ module RuboCop
31
31
 
32
32
  def initialize(processed_source)
33
33
  @processed_source = processed_source
34
+ @no_directives = !processed_source.raw_source.include?('rubocop')
34
35
  end
35
36
 
36
37
  def cop_enabled_at_line?(cop, line_number)
@@ -74,6 +75,8 @@ module RuboCop
74
75
  end
75
76
 
76
77
  def analyze # rubocop:todo Metrics/AbcSize
78
+ return {} if @no_directives
79
+
77
80
  analyses = Hash.new { |hash, key| hash[key] = CopAnalysis.new([], nil) }
78
81
  inject_disabled_cops_directives(analyses)
79
82
 
@@ -146,6 +149,8 @@ module RuboCop
146
149
  end
147
150
 
148
151
  def each_directive
152
+ return if @no_directives
153
+
149
154
  processed_source.comments.each do |comment|
150
155
  directive = DirectiveComment.new(comment)
151
156
  yield directive if directive.cop_names
@@ -21,24 +21,30 @@ module RuboCop
21
21
  DEFAULT_RAILS_VERSION = 5.0
22
22
  attr_reader :loaded_path
23
23
 
24
+ def self.create(hash, path, check: true)
25
+ config = new(hash, path)
26
+ config.check if check
27
+
28
+ config
29
+ end
30
+
31
+ # rubocop:disable Metrics/AbcSize
24
32
  def initialize(hash = {}, loaded_path = nil)
25
33
  @loaded_path = loaded_path
26
34
  @for_cop = Hash.new do |h, cop|
27
- qualified_cop_name = Cop::Registry.qualified_cop_name(cop, loaded_path)
35
+ cop_name = cop.respond_to?(:cop_name) ? cop.cop_name : cop
36
+ qualified_cop_name = Cop::Registry.qualified_cop_name(cop_name, loaded_path)
28
37
  cop_options = self[qualified_cop_name].dup || {}
29
38
  cop_options['Enabled'] = enable_cop?(qualified_cop_name, cop_options)
30
- h[cop] = cop_options
39
+ h[cop] = h[cop_name] = cop_options
31
40
  end
32
41
  @hash = hash
33
42
  @validator = ConfigValidator.new(self)
34
- end
35
43
 
36
- def self.create(hash, path, check: true)
37
- config = new(hash, path)
38
- config.check if check
39
-
40
- config
44
+ @badge_config_cache = {}.compare_by_identity
45
+ @clusivity_config_exists_cache = {}
41
46
  end
47
+ # rubocop:enable Metrics/AbcSize
42
48
 
43
49
  def loaded_features
44
50
  @loaded_features ||= ConfigLoader.loaded_features
@@ -116,14 +122,31 @@ module RuboCop
116
122
  # Note: the 'Enabled' attribute is calculated according to the department's
117
123
  # and 'AllCops' configuration; other attributes are not inherited.
118
124
  def for_cop(cop)
119
- @for_cop[cop.respond_to?(:cop_name) ? cop.cop_name : cop]
125
+ @for_cop[cop]
120
126
  end
121
127
 
122
128
  # @return [Config] for the given cop merged with that of its department (if any)
123
129
  # Note: the 'Enabled' attribute is same as that returned by `for_cop`
124
130
  def for_badge(badge)
125
- cop_config = for_cop(badge.to_s)
126
- fetch(badge.department.to_s) { return cop_config }.merge(cop_config)
131
+ @badge_config_cache[badge] ||= begin
132
+ department_config = self[badge.department_name]
133
+ cop_config = for_cop(badge.to_s)
134
+ if department_config
135
+ department_config.merge(cop_config)
136
+ else
137
+ cop_config
138
+ end
139
+ end
140
+ end
141
+
142
+ # @return [Boolean] whether config for this badge has 'Include' or 'Exclude' keys
143
+ # @api private
144
+ def clusivity_config_for_badge?(badge)
145
+ exists = @clusivity_config_exists_cache[badge.to_s]
146
+ return exists unless exists.nil?
147
+
148
+ cop_config = for_badge(badge)
149
+ @clusivity_config_exists_cache[badge.to_s] = cop_config['Include'] || cop_config['Exclude']
127
150
  end
128
151
 
129
152
  # @return [Config] for the given department name.
@@ -215,7 +238,7 @@ module RuboCop
215
238
  # directory since that wouldn't work.
216
239
  def base_dir_for_path_parameters
217
240
  @base_dir_for_path_parameters ||=
218
- if File.basename(loaded_path).start_with?('.rubocop') &&
241
+ if loaded_path && File.basename(loaded_path).start_with?('.rubocop') &&
219
242
  loaded_path != File.join(Dir.home, ConfigLoader::DOTFILE)
220
243
  File.expand_path(File.dirname(loaded_path))
221
244
  else
@@ -272,9 +295,10 @@ module RuboCop
272
295
  return nil unless lock_file_path
273
296
 
274
297
  File.foreach(lock_file_path) do |line|
275
- # If rails is in Gemfile.lock or gems.lock, there should be a line like:
276
- # rails (X.X.X)
277
- result = line.match(/^\s+rails\s+\((\d+\.\d+)/)
298
+ # If Rails (or one of its frameworks) is in Gemfile.lock or gems.lock, there should be
299
+ # a line like:
300
+ # railties (X.X.X)
301
+ result = line.match(/^\s+railties\s+\((\d+\.\d+)/)
278
302
  return result.captures.first.to_f if result
279
303
  end
280
304
  end
@@ -1,8 +1,8 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require 'erb'
4
- require 'yaml'
5
4
  require 'pathname'
5
+ require 'yaml'
6
6
  require_relative 'config_finder'
7
7
 
8
8
  module RuboCop
@@ -42,18 +42,18 @@ module RuboCop
42
42
 
43
43
  hash = load_yaml_configuration(path)
44
44
 
45
- # Resolve requires first in case they define additional cops
46
45
  loaded_features = resolver.resolve_requires(path, hash)
47
46
  add_loaded_features(loaded_features)
48
47
 
49
- add_missing_namespaces(path, hash)
50
-
51
48
  resolver.override_department_setting_for_cops({}, hash)
52
49
  resolver.resolve_inheritance_from_gems(hash)
53
50
  resolver.resolve_inheritance(path, hash, file, debug?)
54
-
55
51
  hash.delete('inherit_from')
56
52
 
53
+ # Adding missing namespaces only after resolving requires & inheritance,
54
+ # since both can introduce new cops that need to be considered here.
55
+ add_missing_namespaces(path, hash)
56
+
57
57
  Config.create(hash, path, check: check)
58
58
  end
59
59
 
@@ -111,10 +111,17 @@ module RuboCop
111
111
  end
112
112
 
113
113
  merge_with_default(config, config_file).tap do |merged_config|
114
- warn_on_pending_cops(merged_config.pending_cops) unless possible_new_cops?(merged_config)
114
+ unless possible_new_cops?(merged_config)
115
+ pending_cops = pending_cops_only_qualified(merged_config.pending_cops)
116
+ warn_on_pending_cops(pending_cops) unless pending_cops.empty?
117
+ end
115
118
  end
116
119
  end
117
120
 
121
+ def pending_cops_only_qualified(pending_cops)
122
+ pending_cops.select { |cop| Cop::Registry.qualified_cop?(cop.name) }
123
+ end
124
+
118
125
  def possible_new_cops?(config)
119
126
  disable_pending_cops || enable_pending_cops ||
120
127
  config.disabled_new_cops? || config.enabled_new_cops?
@@ -137,6 +144,15 @@ module RuboCop
137
144
  end
138
145
  end
139
146
 
147
+ # @api private
148
+ def inject_defaults!(project_root)
149
+ path = File.join(project_root, 'config', 'default.yml')
150
+ config = load_file(path)
151
+ new_config = ConfigLoader.merge_with_default(config, path)
152
+ puts "configuration from #{path}" if debug?
153
+ @default_configuration = new_config
154
+ end
155
+
140
156
  # Returns the path RuboCop inferred as the root of the project. No file
141
157
  # searches will go past this directory.
142
158
  # @deprecated Use `RuboCop::ConfigFinder.project_root` instead.
@@ -158,8 +174,6 @@ module RuboCop
158
174
  BANNER
159
175
 
160
176
  def warn_on_pending_cops(pending_cops)
161
- return if pending_cops.empty?
162
-
163
177
  warn Rainbow(PENDING_BANNER).yellow
164
178
 
165
179
  pending_cops.each { |cop| warn_pending_cop cop }
@@ -232,18 +246,10 @@ module RuboCop
232
246
  raise
233
247
  end
234
248
 
235
- if Gem::Version.new(Psych::VERSION) >= Gem::Version.new('3.1.0')
236
- def yaml_safe_load!(yaml_code, filename)
237
- YAML.safe_load(yaml_code,
238
- permitted_classes: [Regexp, Symbol],
239
- permitted_symbols: [],
240
- aliases: true,
241
- filename: filename)
242
- end
243
- else # Ruby < 2.6
244
- def yaml_safe_load!(yaml_code, filename)
245
- YAML.safe_load(yaml_code, [Regexp, Symbol], [], true, filename)
246
- end
249
+ def yaml_safe_load!(yaml_code, filename)
250
+ YAML.safe_load(
251
+ yaml_code, permitted_classes: [Regexp, Symbol], aliases: true, filename: filename
252
+ )
247
253
  end
248
254
  end
249
255