rubocop 1.18.1 → 1.22.3

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 (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)