rubocop 1.18.1 → 1.22.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (249) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +1 -1
  3. data/config/default.yml +116 -23
  4. data/lib/rubocop/cli.rb +18 -0
  5. data/lib/rubocop/config.rb +5 -0
  6. data/lib/rubocop/config_loader.rb +5 -3
  7. data/lib/rubocop/config_loader_resolver.rb +22 -7
  8. data/lib/rubocop/config_validator.rb +27 -6
  9. data/lib/rubocop/cop/base.rb +3 -3
  10. data/lib/rubocop/cop/bundler/gem_comment.rb +3 -3
  11. data/lib/rubocop/cop/bundler/gem_filename.rb +103 -0
  12. data/lib/rubocop/cop/bundler/insecure_protocol_source.rb +45 -21
  13. data/lib/rubocop/cop/bundler/ordered_gems.rb +3 -12
  14. data/lib/rubocop/cop/correctors/lambda_literal_to_method_corrector.rb +2 -2
  15. data/lib/rubocop/cop/correctors/line_break_corrector.rb +1 -1
  16. data/lib/rubocop/cop/correctors/ordered_gem_corrector.rb +11 -10
  17. data/lib/rubocop/cop/correctors/require_library_corrector.rb +23 -0
  18. data/lib/rubocop/cop/documentation.rb +1 -1
  19. data/lib/rubocop/cop/gemspec/ordered_dependencies.rb +3 -12
  20. data/lib/rubocop/cop/gemspec/required_ruby_version.rb +31 -24
  21. data/lib/rubocop/cop/generator.rb +14 -8
  22. data/lib/rubocop/cop/internal_affairs/inherit_deprecated_cop_class.rb +34 -0
  23. data/lib/rubocop/cop/internal_affairs/location_line_equality_comparison.rb +60 -0
  24. data/lib/rubocop/cop/internal_affairs/node_matcher_directive.rb +1 -1
  25. data/lib/rubocop/cop/internal_affairs/undefined_config.rb +71 -0
  26. data/lib/rubocop/cop/internal_affairs.rb +3 -0
  27. data/lib/rubocop/cop/layout/argument_alignment.rb +1 -1
  28. data/lib/rubocop/cop/layout/assignment_indentation.rb +1 -1
  29. data/lib/rubocop/cop/layout/block_alignment.rb +3 -3
  30. data/lib/rubocop/cop/layout/class_structure.rb +7 -2
  31. data/lib/rubocop/cop/layout/dot_position.rb +34 -5
  32. data/lib/rubocop/cop/layout/empty_comment.rb +1 -1
  33. data/lib/rubocop/cop/layout/empty_line_after_guard_clause.rb +9 -0
  34. data/lib/rubocop/cop/layout/empty_lines_around_exception_handling_keywords.rb +7 -4
  35. data/lib/rubocop/cop/layout/end_alignment.rb +9 -2
  36. data/lib/rubocop/cop/layout/first_argument_indentation.rb +1 -1
  37. data/lib/rubocop/cop/layout/first_array_element_indentation.rb +1 -1
  38. data/lib/rubocop/cop/layout/first_hash_element_indentation.rb +1 -1
  39. data/lib/rubocop/cop/layout/first_parameter_indentation.rb +1 -1
  40. data/lib/rubocop/cop/layout/hash_alignment.rb +22 -18
  41. data/lib/rubocop/cop/layout/heredoc_argument_closing_parenthesis.rb +1 -1
  42. data/lib/rubocop/cop/layout/heredoc_indentation.rb +0 -7
  43. data/lib/rubocop/cop/layout/indentation_style.rb +2 -2
  44. data/lib/rubocop/cop/layout/indentation_width.rb +1 -1
  45. data/lib/rubocop/cop/layout/leading_comment_space.rb +2 -2
  46. data/lib/rubocop/cop/layout/line_end_string_concatenation_indentation.rb +36 -17
  47. data/lib/rubocop/cop/layout/line_length.rb +9 -7
  48. data/lib/rubocop/cop/layout/multiline_assignment_layout.rb +1 -1
  49. data/lib/rubocop/cop/layout/multiline_block_layout.rb +3 -3
  50. data/lib/rubocop/cop/layout/multiline_method_argument_line_breaks.rb +3 -0
  51. data/lib/rubocop/cop/layout/multiline_method_call_indentation.rb +1 -1
  52. data/lib/rubocop/cop/layout/redundant_line_break.rb +1 -0
  53. data/lib/rubocop/cop/layout/rescue_ensure_alignment.rb +23 -10
  54. data/lib/rubocop/cop/layout/single_line_block_chain.rb +15 -4
  55. data/lib/rubocop/cop/layout/space_after_not.rb +1 -0
  56. data/lib/rubocop/cop/layout/space_around_equals_in_parameter_default.rb +2 -1
  57. data/lib/rubocop/cop/layout/space_around_keyword.rb +2 -2
  58. data/lib/rubocop/cop/layout/space_around_operators.rb +12 -1
  59. data/lib/rubocop/cop/layout/space_before_brackets.rb +1 -0
  60. data/lib/rubocop/cop/layout/space_before_comment.rb +2 -2
  61. data/lib/rubocop/cop/layout/space_inside_parens.rb +78 -32
  62. data/lib/rubocop/cop/layout/space_inside_reference_brackets.rb +1 -1
  63. data/lib/rubocop/cop/layout/trailing_whitespace.rb +24 -1
  64. data/lib/rubocop/cop/lint/ambiguous_operator_precedence.rb +111 -0
  65. data/lib/rubocop/cop/lint/ambiguous_range.rb +105 -0
  66. data/lib/rubocop/cop/lint/ambiguous_regexp_literal.rb +5 -2
  67. data/lib/rubocop/cop/lint/assignment_in_condition.rb +7 -5
  68. data/lib/rubocop/cop/lint/binary_operator_with_identical_operands.rb +18 -5
  69. data/lib/rubocop/cop/lint/boolean_symbol.rb +5 -0
  70. data/lib/rubocop/cop/lint/debugger.rb +2 -4
  71. data/lib/rubocop/cop/lint/deprecated_class_methods.rb +4 -4
  72. data/lib/rubocop/cop/lint/deprecated_constants.rb +3 -2
  73. data/lib/rubocop/cop/lint/disjunctive_assignment_in_constructor.rb +24 -1
  74. data/lib/rubocop/cop/lint/duplicate_branch.rb +2 -1
  75. data/lib/rubocop/cop/lint/duplicate_methods.rb +8 -5
  76. data/lib/rubocop/cop/lint/else_layout.rb +10 -6
  77. data/lib/rubocop/cop/lint/empty_in_pattern.rb +1 -1
  78. data/lib/rubocop/cop/lint/erb_new_arguments.rb +1 -1
  79. data/lib/rubocop/cop/lint/float_out_of_range.rb +1 -1
  80. data/lib/rubocop/cop/lint/hash_compare_by_identity.rb +12 -3
  81. data/lib/rubocop/cop/lint/incompatible_io_select_with_fiber_scheduler.rb +67 -0
  82. data/lib/rubocop/cop/lint/interpolation_check.rb +5 -0
  83. data/lib/rubocop/cop/lint/loop.rb +4 -3
  84. data/lib/rubocop/cop/lint/non_deterministic_require_order.rb +5 -1
  85. data/lib/rubocop/cop/lint/number_conversion.rb +12 -1
  86. data/lib/rubocop/cop/lint/numbered_parameter_assignment.rb +1 -1
  87. data/lib/rubocop/cop/lint/or_assignment_to_constant.rb +4 -2
  88. data/lib/rubocop/cop/lint/out_of_range_regexp_ref.rb +17 -0
  89. data/lib/rubocop/cop/lint/percent_string_array.rb +10 -0
  90. data/lib/rubocop/cop/lint/raise_exception.rb +4 -0
  91. data/lib/rubocop/cop/lint/redundant_safe_navigation.rb +5 -4
  92. data/lib/rubocop/cop/lint/require_relative_self_path.rb +50 -0
  93. data/lib/rubocop/cop/lint/shadowed_argument.rb +1 -1
  94. data/lib/rubocop/cop/lint/shadowing_outer_local_variable.rb +1 -1
  95. data/lib/rubocop/cop/lint/symbol_conversion.rb +1 -1
  96. data/lib/rubocop/cop/lint/triple_quotes.rb +1 -1
  97. data/lib/rubocop/cop/lint/unexpected_block_arity.rb +8 -3
  98. data/lib/rubocop/cop/lint/unused_method_argument.rb +2 -3
  99. data/lib/rubocop/cop/lint/useless_method_definition.rb +3 -2
  100. data/lib/rubocop/cop/lint/useless_setter_call.rb +7 -4
  101. data/lib/rubocop/cop/lint/useless_times.rb +5 -4
  102. data/lib/rubocop/cop/metrics/abc_size.rb +6 -0
  103. data/lib/rubocop/cop/metrics/parameter_lists.rb +5 -2
  104. data/lib/rubocop/cop/metrics/perceived_complexity.rb +1 -1
  105. data/lib/rubocop/cop/metrics/utils/abc_size_calculator.rb +1 -1
  106. data/lib/rubocop/cop/metrics/utils/code_length_calculator.rb +1 -1
  107. data/lib/rubocop/cop/mixin/annotation_comment.rb +57 -34
  108. data/lib/rubocop/cop/mixin/check_line_breakable.rb +2 -2
  109. data/lib/rubocop/cop/mixin/code_length.rb +1 -1
  110. data/lib/rubocop/cop/mixin/documentation_comment.rb +5 -2
  111. data/lib/rubocop/cop/mixin/end_keyword_alignment.rb +1 -2
  112. data/lib/rubocop/cop/mixin/frozen_string_literal.rb +23 -1
  113. data/lib/rubocop/cop/mixin/hash_transform_method.rb +9 -4
  114. data/lib/rubocop/cop/mixin/heredoc.rb +5 -0
  115. data/lib/rubocop/cop/mixin/multiline_element_indentation.rb +1 -1
  116. data/lib/rubocop/cop/mixin/multiline_expression_indentation.rb +2 -2
  117. data/lib/rubocop/cop/mixin/multiline_literal_brace_layout.rb +1 -1
  118. data/lib/rubocop/cop/mixin/ordered_gem_node.rb +9 -1
  119. data/lib/rubocop/cop/mixin/percent_array.rb +18 -7
  120. data/lib/rubocop/cop/mixin/preceding_following_alignment.rb +9 -1
  121. data/lib/rubocop/cop/mixin/require_library.rb +59 -0
  122. data/lib/rubocop/cop/mixin/space_after_punctuation.rb +1 -1
  123. data/lib/rubocop/cop/mixin/space_before_punctuation.rb +2 -2
  124. data/lib/rubocop/cop/mixin/statement_modifier.rb +1 -1
  125. data/lib/rubocop/cop/mixin/string_literals_help.rb +5 -1
  126. data/lib/rubocop/cop/mixin/trailing_body.rb +1 -1
  127. data/lib/rubocop/cop/naming/ascii_identifiers.rb +0 -3
  128. data/lib/rubocop/cop/naming/block_parameter_name.rb +1 -1
  129. data/lib/rubocop/cop/naming/constant_name.rb +1 -1
  130. data/lib/rubocop/cop/naming/inclusive_language.rb +27 -10
  131. data/lib/rubocop/cop/naming/memoized_instance_variable_name.rb +5 -4
  132. data/lib/rubocop/cop/naming/rescued_exceptions_variable_name.rb +7 -0
  133. data/lib/rubocop/cop/security/io_methods.rb +49 -0
  134. data/lib/rubocop/cop/security/json_load.rb +8 -7
  135. data/lib/rubocop/cop/security/open.rb +4 -0
  136. data/lib/rubocop/cop/security/yaml_load.rb +4 -0
  137. data/lib/rubocop/cop/style/accessor_grouping.rb +2 -2
  138. data/lib/rubocop/cop/style/and_or.rb +5 -0
  139. data/lib/rubocop/cop/style/arguments_forwarding.rb +13 -2
  140. data/lib/rubocop/cop/style/array_coercion.rb +21 -3
  141. data/lib/rubocop/cop/style/ascii_comments.rb +0 -3
  142. data/lib/rubocop/cop/style/block_delimiters.rb +50 -2
  143. data/lib/rubocop/cop/style/case_equality.rb +6 -9
  144. data/lib/rubocop/cop/style/case_like_if.rb +5 -0
  145. data/lib/rubocop/cop/style/class_and_module_children.rb +9 -0
  146. data/lib/rubocop/cop/style/collection_compact.rb +7 -5
  147. data/lib/rubocop/cop/style/collection_methods.rb +8 -6
  148. data/lib/rubocop/cop/style/combinable_loops.rb +3 -2
  149. data/lib/rubocop/cop/style/comment_annotation.rb +55 -25
  150. data/lib/rubocop/cop/style/commented_keyword.rb +9 -3
  151. data/lib/rubocop/cop/style/conditional_assignment.rb +19 -5
  152. data/lib/rubocop/cop/style/date_time.rb +5 -0
  153. data/lib/rubocop/cop/style/document_dynamic_eval_definition.rb +1 -1
  154. data/lib/rubocop/cop/style/documentation.rb +23 -8
  155. data/lib/rubocop/cop/style/double_cop_disable_directive.rb +1 -7
  156. data/lib/rubocop/cop/style/double_negation.rb +27 -6
  157. data/lib/rubocop/cop/style/empty_method.rb +1 -1
  158. data/lib/rubocop/cop/style/encoding.rb +26 -15
  159. data/lib/rubocop/cop/style/eval_with_location.rb +1 -1
  160. data/lib/rubocop/cop/style/explicit_block_argument.rb +46 -11
  161. data/lib/rubocop/cop/style/float_division.rb +10 -2
  162. data/lib/rubocop/cop/style/frozen_string_literal_comment.rb +14 -3
  163. data/lib/rubocop/cop/style/global_std_stream.rb +4 -0
  164. data/lib/rubocop/cop/style/hash_as_last_array_item.rb +11 -0
  165. data/lib/rubocop/cop/style/hash_each_methods.rb +5 -0
  166. data/lib/rubocop/cop/style/hash_except.rb +4 -3
  167. data/lib/rubocop/cop/style/hash_syntax.rb +1 -1
  168. data/lib/rubocop/cop/style/hash_transform_keys.rb +4 -9
  169. data/lib/rubocop/cop/style/hash_transform_values.rb +4 -6
  170. data/lib/rubocop/cop/style/identical_conditional_branches.rb +32 -5
  171. data/lib/rubocop/cop/style/if_with_boolean_literal_branches.rb +18 -4
  172. data/lib/rubocop/cop/style/infinite_loop.rb +4 -3
  173. data/lib/rubocop/cop/style/inverse_methods.rb +9 -2
  174. data/lib/rubocop/cop/style/lambda_call.rb +1 -1
  175. data/lib/rubocop/cop/style/line_end_concatenation.rb +14 -1
  176. data/lib/rubocop/cop/style/method_call_with_args_parentheses/omit_parentheses.rb +6 -6
  177. data/lib/rubocop/cop/style/method_def_parentheses.rb +10 -1
  178. data/lib/rubocop/cop/style/missing_else.rb +7 -0
  179. data/lib/rubocop/cop/style/module_function.rb +8 -9
  180. data/lib/rubocop/cop/style/multiline_in_pattern_then.rb +1 -1
  181. data/lib/rubocop/cop/style/multiline_when_then.rb +1 -1
  182. data/lib/rubocop/cop/style/mutable_constant.rb +79 -14
  183. data/lib/rubocop/cop/style/negated_if.rb +1 -1
  184. data/lib/rubocop/cop/style/negated_unless.rb +1 -1
  185. data/lib/rubocop/cop/style/non_nil_check.rb +2 -2
  186. data/lib/rubocop/cop/style/not.rb +2 -2
  187. data/lib/rubocop/cop/style/numbered_parameters.rb +46 -0
  188. data/lib/rubocop/cop/style/numbered_parameters_limit.rb +50 -0
  189. data/lib/rubocop/cop/style/numeric_literals.rb +7 -8
  190. data/lib/rubocop/cop/style/numeric_predicate.rb +5 -0
  191. data/lib/rubocop/cop/style/optional_arguments.rb +4 -0
  192. data/lib/rubocop/cop/style/optional_boolean_parameter.rb +14 -4
  193. data/lib/rubocop/cop/style/parallel_assignment.rb +1 -1
  194. data/lib/rubocop/cop/style/percent_q_literals.rb +2 -2
  195. data/lib/rubocop/cop/style/preferred_hash_methods.rb +9 -4
  196. data/lib/rubocop/cop/style/quoted_symbols.rb +10 -6
  197. data/lib/rubocop/cop/style/raise_args.rb +1 -1
  198. data/lib/rubocop/cop/style/redundant_argument.rb +19 -9
  199. data/lib/rubocop/cop/style/redundant_begin.rb +25 -0
  200. data/lib/rubocop/cop/style/redundant_condition.rb +2 -3
  201. data/lib/rubocop/cop/style/redundant_fetch_block.rb +4 -0
  202. data/lib/rubocop/cop/style/redundant_file_extension_in_require.rb +12 -3
  203. data/lib/rubocop/cop/style/redundant_freeze.rb +4 -4
  204. data/lib/rubocop/cop/style/redundant_interpolation.rb +1 -1
  205. data/lib/rubocop/cop/style/redundant_percent_q.rb +2 -3
  206. data/lib/rubocop/cop/style/redundant_self.rb +10 -0
  207. data/lib/rubocop/cop/style/redundant_self_assignment.rb +4 -3
  208. data/lib/rubocop/cop/style/redundant_self_assignment_branch.rb +83 -0
  209. data/lib/rubocop/cop/style/redundant_sort.rb +53 -20
  210. data/lib/rubocop/cop/style/regexp_literal.rb +3 -3
  211. data/lib/rubocop/cop/style/return_nil.rb +2 -1
  212. data/lib/rubocop/cop/style/safe_navigation.rb +13 -2
  213. data/lib/rubocop/cop/style/select_by_regexp.rb +139 -0
  214. data/lib/rubocop/cop/style/semicolon.rb +32 -24
  215. data/lib/rubocop/cop/style/single_argument_dig.rb +5 -0
  216. data/lib/rubocop/cop/style/single_line_block_params.rb +3 -1
  217. data/lib/rubocop/cop/style/single_line_methods.rb +25 -15
  218. data/lib/rubocop/cop/style/slicing_with_range.rb +13 -0
  219. data/lib/rubocop/cop/style/sole_nested_conditional.rb +4 -0
  220. data/lib/rubocop/cop/style/special_global_vars.rb +25 -0
  221. data/lib/rubocop/cop/style/static_class.rb +5 -5
  222. data/lib/rubocop/cop/style/string_chars.rb +4 -2
  223. data/lib/rubocop/cop/style/string_concatenation.rb +5 -1
  224. data/lib/rubocop/cop/style/string_hash_keys.rb +4 -0
  225. data/lib/rubocop/cop/style/struct_inheritance.rb +4 -0
  226. data/lib/rubocop/cop/style/swap_values.rb +4 -2
  227. data/lib/rubocop/cop/style/symbol_array.rb +3 -3
  228. data/lib/rubocop/cop/style/symbol_proc.rb +26 -0
  229. data/lib/rubocop/cop/style/trailing_comma_in_block_args.rb +19 -0
  230. data/lib/rubocop/cop/style/trivial_accessors.rb +1 -1
  231. data/lib/rubocop/cop/style/word_array.rb +23 -5
  232. data/lib/rubocop/cop/style/yoda_condition.rb +24 -7
  233. data/lib/rubocop/cop/style/zero_length_predicate.rb +6 -0
  234. data/lib/rubocop/cop/util.rb +22 -6
  235. data/lib/rubocop/cops_documentation_generator.rb +17 -5
  236. data/lib/rubocop/formatter/git_hub_actions_formatter.rb +1 -1
  237. data/lib/rubocop/magic_comment.rb +44 -15
  238. data/lib/rubocop/options.rb +127 -113
  239. data/lib/rubocop/rake_task.rb +1 -1
  240. data/lib/rubocop/result_cache.rb +3 -3
  241. data/lib/rubocop/rspec/cop_helper.rb +1 -1
  242. data/lib/rubocop/rspec/expect_offense.rb +6 -2
  243. data/lib/rubocop/rspec/parallel_formatter.rb +90 -0
  244. data/lib/rubocop/rspec/support.rb +1 -0
  245. data/lib/rubocop/runner.rb +2 -3
  246. data/lib/rubocop/target_finder.rb +1 -1
  247. data/lib/rubocop/version.rb +1 -1
  248. data/lib/rubocop.rb +14 -2
  249. metadata +21 -5
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 885ddbf92c177482e1be63255a018fcda8be3a10e76f30628b2fc1a1e9405188
4
- data.tar.gz: e67837d33ac5625327dff10d9317c4fd2fb6b9c7b543c73326ab32aea0e6066f
3
+ metadata.gz: f74b024d0339618cd4782bd451e3bbe8be65eab0a5f3dbfc1d2137c74848c6fa
4
+ data.tar.gz: ef762c615b2d68f52d5aac425abea13a40d097f1b7885cd1558a991dd23c136d
5
5
  SHA512:
6
- metadata.gz: 6e72582647c14682bae1d594feb36fa464ced9096e3146e95b6ea534b8483115bf2770a4c727fc3f2d4e3c1ae80f65c41a55b393858ac28cbb962c55fa5717f9
7
- data.tar.gz: d92789df44f307cb341226be7e397936af7dbfd045fa7aa23f8ba34aeddc846d79439e464e3ce9ac197c3c4220384ebff5ba76982c6871957a1a4bbf44167967
6
+ metadata.gz: bfdba4bbc01e69d2a0873272815dc9c03d5e95f2dce5f02186b38f2f9e1e28ae34df246e6b548cdccf0831bace4f02bfad334f59548b2bf67430431b5760731b
7
+ data.tar.gz: 662e06452c13b66a949e7a8035bc6b4b31e7af7a3cf161b9802634365a53a0b2452aeb7741ab13387186483cdf9027dc5cca736734d5d3022f78362bfabf9a5c
data/README.md CHANGED
@@ -54,7 +54,7 @@ To prevent an unwanted RuboCop update you might want to use a conservative versi
54
54
  in your `Gemfile`:
55
55
 
56
56
  ```rb
57
- gem 'rubocop', '~> 1.18', require: false
57
+ gem 'rubocop', '~> 1.22', require: false
58
58
  ```
59
59
 
60
60
  See [our versioning policy](https://docs.rubocop.org/rubocop/versioning.html) for further details.
data/config/default.yml CHANGED
@@ -130,7 +130,7 @@ AllCops:
130
130
  # What MRI version of the Ruby interpreter is the inspected code intended to
131
131
  # run on? (If there is more than one, set this to the lowest version.)
132
132
  # If a value is specified for TargetRubyVersion then it is used. Acceptable
133
- # values are specificed as a float (i.e. 3.0); the teeny version of Ruby
133
+ # values are specified as a float (i.e. 3.0); the teeny version of Ruby
134
134
  # should not be included. If the project specifies a Ruby version in the
135
135
  # .tool-versions or .ruby-version files, Gemfile or gems.rb file, RuboCop will
136
136
  # try to determine the desired version of Ruby by inspecting the
@@ -174,6 +174,20 @@ Bundler/GemComment:
174
174
  IgnoredGems: []
175
175
  OnlyFor: []
176
176
 
177
+ Bundler/GemFilename:
178
+ Description: 'Enforces the filename for managing gems.'
179
+ Enabled: true
180
+ VersionAdded: '1.20'
181
+ EnforcedStyle: 'Gemfile'
182
+ SupportedStyles:
183
+ - 'Gemfile'
184
+ - 'gems.rb'
185
+ Include:
186
+ - '**/Gemfile'
187
+ - '**/gems.rb'
188
+ - '**/Gemfile.lock'
189
+ - '**/gems.locked'
190
+
177
191
  Bundler/GemVersion:
178
192
  Description: 'Requires or forbids specifying gem versions.'
179
193
  Enabled: false
@@ -195,6 +209,7 @@ Bundler/InsecureProtocolSource:
195
209
  'https://rubygems.org' if possible, or 'http://rubygems.org' if not.
196
210
  Enabled: true
197
211
  VersionAdded: '0.50'
212
+ AllowHttpProtocol: true
198
213
  Include:
199
214
  - '**/*.gemfile'
200
215
  - '**/Gemfile'
@@ -247,7 +262,7 @@ Gemspec/RequiredRubyVersion:
247
262
  Description: 'Checks that `required_ruby_version` of gemspec is specified and equal to `TargetRubyVersion` of .rubocop.yml.'
248
263
  Enabled: true
249
264
  VersionAdded: '0.52'
250
- VersionChanged: '0.89'
265
+ VersionChanged: '1.22'
251
266
  Include:
252
267
  - '**/*.gemspec'
253
268
 
@@ -943,7 +958,6 @@ Layout/LineLength:
943
958
  Enabled: true
944
959
  VersionAdded: '0.25'
945
960
  VersionChanged: '1.4'
946
- AutoCorrect: true
947
961
  Max: 120
948
962
  # To make it possible to copy or click on URIs in the code, we allow lines
949
963
  # containing a URI to be longer than Max.
@@ -1347,10 +1361,11 @@ Layout/SpaceInsideParens:
1347
1361
  StyleGuide: '#spaces-braces'
1348
1362
  Enabled: true
1349
1363
  VersionAdded: '0.49'
1350
- VersionChanged: '0.55'
1364
+ VersionChanged: '1.22'
1351
1365
  EnforcedStyle: no_space
1352
1366
  SupportedStyles:
1353
1367
  - space
1368
+ - compact
1354
1369
  - no_space
1355
1370
 
1356
1371
  Layout/SpaceInsidePercentLiteralDelimiters:
@@ -1434,6 +1449,20 @@ Lint/AmbiguousOperator:
1434
1449
  VersionAdded: '0.17'
1435
1450
  VersionChanged: '0.83'
1436
1451
 
1452
+ Lint/AmbiguousOperatorPrecedence:
1453
+ Description: >-
1454
+ Checks for expressions containing multiple binary operations with
1455
+ ambiguous precedence.
1456
+ Enabled: pending
1457
+ VersionAdded: '1.21'
1458
+
1459
+ Lint/AmbiguousRange:
1460
+ Description: Checks for ranges with ambiguous boundaries.
1461
+ Enabled: pending
1462
+ VersionAdded: '1.19'
1463
+ SafeAutoCorrect: false
1464
+ RequireParenthesesForMethodChains: false
1465
+
1437
1466
  Lint/AmbiguousRegexpLiteral:
1438
1467
  Description: >-
1439
1468
  Checks for ambiguous regexp literals in the first argument of
@@ -1464,9 +1493,9 @@ Lint/BinaryOperatorWithIdenticalOperands:
1464
1493
  Lint/BooleanSymbol:
1465
1494
  Description: 'Check for `:true` and `:false` symbols.'
1466
1495
  Enabled: true
1467
- Safe: false
1496
+ SafeAutoCorrect: false
1468
1497
  VersionAdded: '0.50'
1469
- VersionChanged: '0.83'
1498
+ VersionChanged: '1.22'
1470
1499
 
1471
1500
  Lint/CircularArgumentReference:
1472
1501
  Description: "Default values in optional keyword arguments and optional ordinal arguments should not refer back to the name of the argument."
@@ -1512,6 +1541,11 @@ Lint/Debugger:
1512
1541
  Capybara:
1513
1542
  - save_and_open_page
1514
1543
  - save_and_open_screenshot
1544
+ debug.rb:
1545
+ - binding.b
1546
+ - binding.break
1547
+ - Kernel.binding.b
1548
+ - Kernel.binding.break
1515
1549
  Pry:
1516
1550
  - binding.pry
1517
1551
  - binding.remote_pry
@@ -1520,6 +1554,8 @@ Lint/Debugger:
1520
1554
  Rails:
1521
1555
  - debugger
1522
1556
  - Kernel.debugger
1557
+ RubyJard:
1558
+ - jard
1523
1559
  WebConsole:
1524
1560
  - binding.console
1525
1561
 
@@ -1532,6 +1568,7 @@ Lint/DeprecatedConstants:
1532
1568
  Description: 'Checks for deprecated constants.'
1533
1569
  Enabled: pending
1534
1570
  VersionAdded: '1.8'
1571
+ VersionChanged: '1.22'
1535
1572
  # You can configure deprecated constants.
1536
1573
  # If there is an alternative method, you can set alternative value as `Alternative`.
1537
1574
  # And you can set the deprecated version as `DeprecatedVersion`.
@@ -1552,6 +1589,9 @@ Lint/DeprecatedConstants:
1552
1589
  'FALSE':
1553
1590
  Alternative: 'false'
1554
1591
  DeprecatedVersion: '2.4'
1592
+ 'Net::HTTPServerException':
1593
+ Alternative: 'Net::HTTPClientException'
1594
+ DeprecatedVersion: '2.6'
1555
1595
  'Random::DEFAULT':
1556
1596
  Alternative: 'Random.new'
1557
1597
  DeprecatedVersion: '3.0'
@@ -1743,6 +1783,11 @@ Lint/ImplicitStringConcatenation:
1743
1783
  Enabled: true
1744
1784
  VersionAdded: '0.36'
1745
1785
 
1786
+ Lint/IncompatibleIoSelectWithFiberScheduler:
1787
+ Description: 'Checks for `IO.select` that is incompatible with Fiber Scheduler.'
1788
+ Enabled: pending
1789
+ VersionAdded: '1.21'
1790
+
1746
1791
  Lint/IneffectiveAccessModifier:
1747
1792
  Description: >-
1748
1793
  Checks for attempts to use `private` or `protected` to set
@@ -1809,7 +1854,7 @@ Lint/MissingCopEnableDirective:
1809
1854
  Lint/MissingSuper:
1810
1855
  Description: >-
1811
1856
  This cop checks for the presence of constructors and lifecycle callbacks
1812
- without calls to `super`'.
1857
+ without calls to `super`.
1813
1858
  Enabled: true
1814
1859
  VersionAdded: '0.89'
1815
1860
  VersionChanged: '1.4'
@@ -1824,7 +1869,6 @@ Lint/MultipleComparison:
1824
1869
  Enabled: true
1825
1870
  VersionAdded: '0.47'
1826
1871
  VersionChanged: '1.1'
1827
- AllowMethodComparison: true
1828
1872
 
1829
1873
  Lint/NestedMethodDefinition:
1830
1874
  Description: 'Do not use nested method definitions.'
@@ -2007,6 +2051,11 @@ Lint/RequireParentheses:
2007
2051
  Enabled: true
2008
2052
  VersionAdded: '0.18'
2009
2053
 
2054
+ Lint/RequireRelativeSelfPath:
2055
+ Description: 'Checks for uses a file requiring itself with `require_relative`.'
2056
+ Enabled: pending
2057
+ VersionAdded: '1.22'
2058
+
2010
2059
  Lint/RescueException:
2011
2060
  Description: 'Avoid rescuing the Exception class.'
2012
2061
  StyleGuide: '#no-blind-rescues'
@@ -2536,8 +2585,9 @@ Naming/HeredocDelimiterNaming:
2536
2585
 
2537
2586
  Naming/InclusiveLanguage:
2538
2587
  Description: 'Recommend the use of inclusive language instead of problematic terms.'
2539
- Enabled: pending
2588
+ Enabled: false
2540
2589
  VersionAdded: '1.18'
2590
+ VersionChanged: '1.21'
2541
2591
  CheckIdentifiers: true
2542
2592
  CheckConstants: true
2543
2593
  CheckVariables: true
@@ -2557,6 +2607,7 @@ Naming/InclusiveLanguage:
2557
2607
  - denylist
2558
2608
  - block
2559
2609
  slave:
2610
+ WholeWord: true
2560
2611
  Suggestions: ['replica', 'secondary', 'follower']
2561
2612
 
2562
2613
  Naming/MemoizedInstanceVariableName:
@@ -2692,6 +2743,14 @@ Security/Eval:
2692
2743
  Enabled: true
2693
2744
  VersionAdded: '0.47'
2694
2745
 
2746
+ Security/IoMethods:
2747
+ Description: >-
2748
+ Checks for the first argument to `IO.read`, `IO.binread`, `IO.write`, `IO.binwrite`,
2749
+ `IO.foreach`, and `IO.readlines`.
2750
+ Enabled: pending
2751
+ Safe: false
2752
+ VersionAdded: '1.22'
2753
+
2695
2754
  Security/JSONLoad:
2696
2755
  Description: >-
2697
2756
  Prefer usage of `JSON.parse` over `JSON.load` due to potential
@@ -2699,10 +2758,9 @@ Security/JSONLoad:
2699
2758
  Reference: 'https://ruby-doc.org/stdlib-2.7.0/libdoc/json/rdoc/JSON.html#method-i-load'
2700
2759
  Enabled: true
2701
2760
  VersionAdded: '0.43'
2702
- VersionChanged: '0.44'
2761
+ VersionChanged: '1.22'
2703
2762
  # Autocorrect here will change to a method that may cause crashes depending
2704
2763
  # on the value of the argument.
2705
- AutoCorrect: false
2706
2764
  SafeAutoCorrect: false
2707
2765
 
2708
2766
  Security/MarshalLoad:
@@ -2768,8 +2826,9 @@ Style/AndOr:
2768
2826
  Description: 'Use &&/|| instead of and/or.'
2769
2827
  StyleGuide: '#no-and-or-or'
2770
2828
  Enabled: true
2829
+ SafeAutoCorrect: false
2771
2830
  VersionAdded: '0.9'
2772
- VersionChanged: '0.25'
2831
+ VersionChanged: '1.21'
2773
2832
  # Whether `and` and `or` are banned only in conditionals (conditionals)
2774
2833
  # or completely (always).
2775
2834
  EnforcedStyle: conditionals
@@ -2803,9 +2862,9 @@ Style/ArrayJoin:
2803
2862
  Style/AsciiComments:
2804
2863
  Description: 'Use only ascii symbols in comments.'
2805
2864
  StyleGuide: '#english-comments'
2806
- Enabled: true
2865
+ Enabled: false
2807
2866
  VersionAdded: '0.9'
2808
- VersionChanged: '0.52'
2867
+ VersionChanged: '1.21'
2809
2868
  AllowedChars:
2810
2869
  - ©
2811
2870
 
@@ -2967,7 +3026,7 @@ Style/CaseEquality:
2967
3026
  Enabled: true
2968
3027
  VersionAdded: '0.9'
2969
3028
  VersionChanged: '0.89'
2970
- # If AllowOnConstant is enabled, the cop will ignore violations when the receiver of
3029
+ # If `AllowOnConstant` option is enabled, the cop will ignore violations when the receiver of
2971
3030
  # the case equality operator is a constant.
2972
3031
  #
2973
3032
  # # bad
@@ -3142,7 +3201,7 @@ Style/CommentAnnotation:
3142
3201
  StyleGuide: '#annotate-keywords'
3143
3202
  Enabled: true
3144
3203
  VersionAdded: '0.10'
3145
- VersionChanged: '1.3'
3204
+ VersionChanged: '1.20'
3146
3205
  Keywords:
3147
3206
  - TODO
3148
3207
  - FIXME
@@ -3150,12 +3209,14 @@ Style/CommentAnnotation:
3150
3209
  - HACK
3151
3210
  - REVIEW
3152
3211
  - NOTE
3212
+ RequireColon: true
3153
3213
 
3154
3214
  Style/CommentedKeyword:
3155
3215
  Description: 'Do not place comments on the same line as certain keywords.'
3156
3216
  Enabled: true
3217
+ SafeAutoCorrect: false
3157
3218
  VersionAdded: '0.51'
3158
- VersionChanged: '1.7'
3219
+ VersionChanged: '1.19'
3159
3220
 
3160
3221
  Style/ConditionalAssignment:
3161
3222
  Description: >-
@@ -3602,8 +3663,9 @@ Style/IdenticalConditionalBranches:
3602
3663
  line at the end of each branch, which can validly be moved
3603
3664
  out of the conditional.
3604
3665
  Enabled: true
3666
+ SafeAutoCorrect: false
3605
3667
  VersionAdded: '0.36'
3606
- VersionChanged: '1.16'
3668
+ VersionChanged: '1.19'
3607
3669
 
3608
3670
  Style/IfInsideElse:
3609
3671
  Description: 'Finds if nodes inside else, which can be converted to elsif.'
@@ -3659,7 +3721,7 @@ Style/InPatternThen:
3659
3721
  Style/InfiniteLoop:
3660
3722
  Description: >-
3661
3723
  Use Kernel#loop for infinite loops.
3662
- This cop is unsafe in the body may raise a `StopIteration` exception.
3724
+ This cop is unsafe if the body may raise a `StopIteration` exception.
3663
3725
  Safe: false
3664
3726
  StyleGuide: '#infinite-loop'
3665
3727
  Enabled: true
@@ -3928,6 +3990,7 @@ Style/MultipleComparison:
3928
3990
  Enabled: true
3929
3991
  VersionAdded: '0.49'
3930
3992
  VersionChanged: '1.1'
3993
+ AllowMethodComparison: true
3931
3994
 
3932
3995
  Style/MutableConstant:
3933
3996
  Description: 'Do not assign mutable objects to constants.'
@@ -4084,6 +4147,21 @@ Style/Not:
4084
4147
  VersionAdded: '0.9'
4085
4148
  VersionChanged: '0.20'
4086
4149
 
4150
+ Style/NumberedParameters:
4151
+ Description: 'Restrict the usage of numbered parameters.'
4152
+ Enabled: pending
4153
+ VersionAdded: '1.22'
4154
+ EnforcedStyle: allow_single_line
4155
+ SupportedStyles:
4156
+ - allow_single_line
4157
+ - disallow
4158
+
4159
+ Style/NumberedParametersLimit:
4160
+ Description: 'Avoid excessive numbered params in a single block.'
4161
+ Enabled: pending
4162
+ VersionAdded: '1.22'
4163
+ Max: 1
4164
+
4087
4165
  Style/NumericLiteralPrefix:
4088
4166
  Description: 'Use smallcase prefixes for numeric literals.'
4089
4167
  StyleGuide: '#numeric-literal-prefixes'
@@ -4094,7 +4172,6 @@ Style/NumericLiteralPrefix:
4094
4172
  - zero_with_o
4095
4173
  - zero_only
4096
4174
 
4097
-
4098
4175
  Style/NumericLiterals:
4099
4176
  Description: >-
4100
4177
  Add underscores to large numeric literals to improve their
@@ -4151,6 +4228,7 @@ Style/OptionHash:
4151
4228
  - args
4152
4229
  - params
4153
4230
  - parameters
4231
+ Allowlist: []
4154
4232
 
4155
4233
  Style/OptionalArguments:
4156
4234
  Description: >-
@@ -4403,12 +4481,19 @@ Style/RedundantSelfAssignment:
4403
4481
  Safe: false
4404
4482
  VersionAdded: '0.90'
4405
4483
 
4484
+ Style/RedundantSelfAssignmentBranch:
4485
+ Description: 'Checks for places where conditional branch makes redundant self-assignment.'
4486
+ Enabled: pending
4487
+ VersionAdded: '1.19'
4488
+
4406
4489
  Style/RedundantSort:
4407
4490
  Description: >-
4408
4491
  Use `min` instead of `sort.first`,
4409
4492
  `max_by` instead of `sort_by...last`, etc.
4410
4493
  Enabled: true
4411
4494
  VersionAdded: '0.76'
4495
+ VersionChanged: '1.22'
4496
+ Safe: false
4412
4497
 
4413
4498
  Style/RedundantSortBy:
4414
4499
  Description: 'Use `sort` instead of `sort_by { |x| x }`.'
@@ -4489,6 +4574,12 @@ Style/Sample:
4489
4574
  Enabled: true
4490
4575
  VersionAdded: '0.30'
4491
4576
 
4577
+ Style/SelectByRegexp:
4578
+ Description: 'Prefer grep/grep_v to select/reject with a regexp match.'
4579
+ Enabled: pending
4580
+ SafeAutoCorrect: false
4581
+ VersionAdded: '1.22'
4582
+
4492
4583
  Style/SelfAssignment:
4493
4584
  Description: >-
4494
4585
  Checks for places where self-assignment shorthand should have
@@ -4574,6 +4665,7 @@ Style/SpecialGlobalVars:
4574
4665
  VersionAdded: '0.13'
4575
4666
  VersionChanged: '0.36'
4576
4667
  SafeAutoCorrect: false
4668
+ RequireEnglish: true
4577
4669
  EnforcedStyle: use_english_names
4578
4670
  SupportedStyles:
4579
4671
  - use_perl_names
@@ -4674,8 +4766,9 @@ Style/StructInheritance:
4674
4766
  Description: 'Checks for inheritance from Struct.new.'
4675
4767
  StyleGuide: '#no-extend-struct-new'
4676
4768
  Enabled: true
4769
+ SafeAutoCorrect: false
4677
4770
  VersionAdded: '0.29'
4678
- VersionChanged: '0.86'
4771
+ VersionChanged: '1.20'
4679
4772
 
4680
4773
  Style/SwapValues:
4681
4774
  Description: 'This cop enforces the use of shorthand-style swapping of 2 variables.'
@@ -4894,7 +4987,7 @@ Style/VariableInterpolation:
4894
4987
 
4895
4988
  Style/WhenThen:
4896
4989
  Description: 'Use when x then ... for one-line cases.'
4897
- StyleGuide: '#one-line-cases'
4990
+ StyleGuide: '#no-when-semicolons'
4898
4991
  Enabled: true
4899
4992
  VersionAdded: '0.9'
4900
4993
 
@@ -4918,7 +5011,7 @@ Style/WordArray:
4918
5011
  StyleGuide: '#percent-w'
4919
5012
  Enabled: true
4920
5013
  VersionAdded: '0.9'
4921
- VersionChanged: '0.36'
5014
+ VersionChanged: '1.19'
4922
5015
  EnforcedStyle: percent
4923
5016
  SupportedStyles:
4924
5017
  # percent style: %w(word1 word2)
data/lib/rubocop/cli.rb CHANGED
@@ -8,6 +8,11 @@ module RuboCop
8
8
  STATUS_OFFENSES = 1
9
9
  STATUS_ERROR = 2
10
10
  STATUS_INTERRUPTED = 128 + Signal.list['INT']
11
+ DEFAULT_PARALLEL_OPTIONS = %i[
12
+ color debug display_style_guide display_time display_only_fail_level_offenses
13
+ display_only_failed except extra_details fail_level fix_layout format
14
+ ignore_disable_comments lint only only_guide_cops require safe
15
+ ].freeze
11
16
 
12
17
  class Finished < RuntimeError; end
13
18
 
@@ -37,6 +42,7 @@ module RuboCop
37
42
  else
38
43
  act_on_options
39
44
  validate_options_vs_config
45
+ parallel_by_default!
40
46
  apply_default_formatter
41
47
  execute_runners
42
48
  end
@@ -84,6 +90,18 @@ module RuboCop
84
90
  'with AllCops: UseCache: false is not allowed.'
85
91
  end
86
92
 
93
+ def parallel_by_default!
94
+ # See https://github.com/rubocop/rubocop/pull/4537 for JRuby and Windows constraints.
95
+ return if RUBY_ENGINE != 'ruby' || RuboCop::Platform.windows?
96
+
97
+ if (@options.keys - DEFAULT_PARALLEL_OPTIONS).empty? &&
98
+ @config_store.for_pwd.for_all_cops['UseCache'] != false
99
+ puts 'Use parallel by default.' if @options[:debug]
100
+
101
+ @options[:parallel] = true
102
+ end
103
+ end
104
+
87
105
  def act_on_options
88
106
  set_options_to_config_loader
89
107
 
@@ -51,6 +51,11 @@ module RuboCop
51
51
  self
52
52
  end
53
53
 
54
+ def validate_after_resolution
55
+ @validator.validate_after_resolution
56
+ self
57
+ end
58
+
54
59
  def_delegators :@hash, :[], :[]=, :delete, :dig, :each, :key?, :keys, :each_key,
55
60
  :fetch, :map, :merge, :replace, :to_h, :to_hash, :transform_values
56
61
  def_delegators :@validator, :validate, :target_ruby_version
@@ -101,6 +101,8 @@ module RuboCop
101
101
  return default_configuration if config_file == DEFAULT_FILE
102
102
 
103
103
  config = load_file(config_file, check: check)
104
+ config.validate_after_resolution if check
105
+
104
106
  if ignore_parent_exclusion?
105
107
  print 'Ignoring AllCops/Exclude from parent folders' if debug?
106
108
  else
@@ -134,7 +136,7 @@ module RuboCop
134
136
  end
135
137
  end
136
138
 
137
- # Returns the path rubocop inferred as the root of the project. No file
139
+ # Returns the path RuboCop inferred as the root of the project. No file
138
140
  # searches will go past this directory.
139
141
  def project_root
140
142
  @project_root ||= find_project_root
@@ -143,7 +145,7 @@ module RuboCop
143
145
  PENDING_BANNER = <<~BANNER
144
146
  The following cops were added to RuboCop, but are not configured. Please set Enabled to either `true` or `false` in your `.rubocop.yml` file.
145
147
 
146
- Please also note that can also opt-in to new cops by default by adding this to your config:
148
+ Please also note that you can opt-in to new cops by default by adding this to your config:
147
149
  AllCops:
148
150
  NewCops: enable
149
151
  BANNER
@@ -161,7 +163,7 @@ module RuboCop
161
163
  def warn_pending_cop(cop)
162
164
  version = cop.metadata['VersionAdded'] || 'N/A'
163
165
 
164
- warn Rainbow("#{cop.name}: # (new in #{version})").yellow
166
+ warn Rainbow("#{cop.name}: # new in #{version}").yellow
165
167
  warn Rainbow(' Enabled: true').yellow
166
168
  end
167
169
 
@@ -23,7 +23,7 @@ module RuboCop
23
23
  def resolve_inheritance(path, hash, file, debug) # rubocop:disable Metrics/MethodLength, Metrics/AbcSize
24
24
  inherited_files = Array(hash['inherit_from'])
25
25
  base_configs(path, inherited_files, file)
26
- .reverse.each_with_index do |base_config, index|
26
+ .each_with_index.reverse_each do |base_config, index|
27
27
  override_department_setting_for_cops(base_config, hash)
28
28
  override_enabled_for_disabled_departments(base_config, hash)
29
29
 
@@ -108,7 +108,7 @@ module RuboCop
108
108
  result.delete(key)
109
109
  elsif merge_hashes?(base_hash, derived_hash, key)
110
110
  result[key] = merge(base_hash[key], derived_hash[key], **opts)
111
- elsif should_union?(base_hash, key, opts[:inherit_mode])
111
+ elsif should_union?(derived_hash, base_hash, opts[:inherit_mode], key)
112
112
  result[key] = base_hash[key] | derived_hash[key]
113
113
  elsif opts[:debug]
114
114
  warn_on_duplicate_setting(base_hash, derived_hash, key, **opts)
@@ -183,11 +183,26 @@ module RuboCop
183
183
  local_inherit || hash['inherit_mode'] || {}
184
184
  end
185
185
 
186
- def should_union?(base_hash, key, inherit_mode)
187
- base_hash[key].is_a?(Array) &&
188
- inherit_mode &&
189
- inherit_mode['merge'] &&
190
- inherit_mode['merge'].include?(key)
186
+ def should_union?(derived_hash, base_hash, root_mode, key)
187
+ return false unless base_hash[key].is_a?(Array)
188
+
189
+ derived_mode = derived_hash['inherit_mode']
190
+ return false if should_override?(derived_mode, key)
191
+ return true if should_merge?(derived_mode, key)
192
+
193
+ base_mode = base_hash['inherit_mode']
194
+ return false if should_override?(base_mode, key)
195
+ return true if should_merge?(base_mode, key)
196
+
197
+ should_merge?(root_mode, key)
198
+ end
199
+
200
+ def should_merge?(mode, key)
201
+ mode && mode['merge'] && mode['merge'].include?(key)
202
+ end
203
+
204
+ def should_override?(mode, key)
205
+ mode && mode['override'] && mode['override'].include?(key)
191
206
  end
192
207
 
193
208
  def merge_hashes?(base_hash, derived_hash, key)
@@ -44,7 +44,6 @@ module RuboCop
44
44
  check_obsoletions
45
45
 
46
46
  alert_about_unrecognized_cops(invalid_cop_names)
47
- check_target_ruby
48
47
  validate_new_cops_parameter
49
48
  validate_parameter_names(valid_cop_names)
50
49
  validate_enforced_styles(valid_cop_names)
@@ -52,6 +51,15 @@ module RuboCop
52
51
  reject_mutually_exclusive_defaults
53
52
  end
54
53
 
54
+ # Validations that should only be run after all config resolving has
55
+ # taken place:
56
+ # * The target ruby version is only checked once the entire inheritance
57
+ # chain has been loaded so that only the final value is validated, and
58
+ # any obsolete but overridden values are ignored.
59
+ def validate_after_resolution
60
+ check_target_ruby
61
+ end
62
+
55
63
  def target_ruby_version
56
64
  target_ruby.version
57
65
  end
@@ -104,12 +112,9 @@ module RuboCop
104
112
  # to do so than to pass the value around to various methods.
105
113
  next if name == 'inherit_mode'
106
114
 
107
- suggestions = NameSimilarity.find_similar_names(name, Cop::Registry.global.map(&:cop_name))
108
- suggestion = "Did you mean `#{suggestions.join('`, `')}`?" if suggestions.any?
109
-
110
115
  message = <<~MESSAGE.rstrip
111
- unrecognized cop #{name} found in #{smart_loaded_path}
112
- #{suggestion}
116
+ unrecognized cop or department #{name} found in #{smart_loaded_path}
117
+ #{suggestion(name)}
113
118
  MESSAGE
114
119
 
115
120
  unknown_cops << message
@@ -117,6 +122,22 @@ module RuboCop
117
122
  raise ValidationError, unknown_cops.join("\n") if unknown_cops.any?
118
123
  end
119
124
 
125
+ def suggestion(name)
126
+ registry = Cop::Registry.global
127
+ departments = registry.departments.map(&:to_s)
128
+ suggestions = NameSimilarity.find_similar_names(name, departments + registry.map(&:cop_name))
129
+ if suggestions.any?
130
+ "Did you mean `#{suggestions.join('`, `')}`?"
131
+ else
132
+ # Department names can contain slashes, e.g. Chef/Correctness, but there's no support for
133
+ # the concept of higher level departments in RuboCop. It's a flat structure. So if the user
134
+ # tries to configure a "top level department", we hint that it's the bottom level
135
+ # departments that should be configured.
136
+ suggestions = departments.select { |department| department.start_with?("#{name}/") }
137
+ "#{name} is not a department. Use `#{suggestions.join('`, `')}`." if suggestions.any?
138
+ end
139
+ end
140
+
120
141
  def validate_syntax_cop
121
142
  syntax_config = @config['Lint/Syntax']
122
143
  default_config = ConfigLoader.default_configuration['Lint/Syntax']
@@ -24,7 +24,7 @@ module RuboCop
24
24
  # `add_global_offense`. Use the `processed_source` method to
25
25
  # get the currently processed source being investigated.
26
26
  #
27
- # In case of invalid syntax / unparseable content,
27
+ # In case of invalid syntax / unparsable content,
28
28
  # the callback `on_other_file` is called instead of all the other
29
29
  # `on_...` callbacks.
30
30
  #
@@ -222,8 +222,8 @@ module RuboCop
222
222
 
223
223
  def relevant_file?(file)
224
224
  file == RuboCop::AST::ProcessedSource::STRING_SOURCE_NAME ||
225
- file_name_matches_any?(file, 'Include', true) &&
226
- !file_name_matches_any?(file, 'Exclude', false)
225
+ (file_name_matches_any?(file, 'Include', true) &&
226
+ !file_name_matches_any?(file, 'Exclude', false))
227
227
  end
228
228
 
229
229
  def excluded_file?(file)
@@ -88,7 +88,7 @@ module RuboCop
88
88
  CHECKED_OPTIONS_CONFIG = 'OnlyFor'
89
89
  VERSION_SPECIFIERS_OPTION = 'version_specifiers'
90
90
  RESTRICTIVE_VERSION_SPECIFIERS_OPTION = 'restrictive_version_specifiers'
91
- RESTRICTIVE_VERSION_PATTERN = /<|~>/.freeze
91
+ RESTRICTIVE_VERSION_PATTERN = /\A\s*(?:<|~>|\d|=)/.freeze
92
92
  RESTRICT_ON_SEND = %i[gem].freeze
93
93
 
94
94
  def on_send(node)
@@ -152,8 +152,8 @@ module RuboCop
152
152
  def restrictive_version_specified_gem?(node)
153
153
  return unless version_specified_gem?(node)
154
154
 
155
- node.arguments
156
- .any? { |arg| arg&.str_type? && RESTRICTIVE_VERSION_PATTERN.match?(arg.to_s) }
155
+ node.arguments[1..-1]
156
+ .any? { |arg| arg&.str_type? && RESTRICTIVE_VERSION_PATTERN.match?(arg.value) }
157
157
  end
158
158
 
159
159
  def contains_checked_options?(node)