rubocop 1.39.0 → 1.44.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 (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