rubocop 1.50.2 → 1.57.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (232) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +5 -3
  3. data/config/default.yml +110 -14
  4. data/config/obsoletion.yml +5 -0
  5. data/lib/rubocop/cli/command/auto_generate_config.rb +10 -5
  6. data/lib/rubocop/cli/command/lsp.rb +19 -0
  7. data/lib/rubocop/cli.rb +4 -1
  8. data/lib/rubocop/config.rb +4 -0
  9. data/lib/rubocop/config_finder.rb +2 -2
  10. data/lib/rubocop/config_loader_resolver.rb +4 -3
  11. data/lib/rubocop/config_obsoletion/parameter_rule.rb +9 -1
  12. data/lib/rubocop/config_obsoletion.rb +2 -2
  13. data/lib/rubocop/cop/autocorrect_logic.rb +3 -1
  14. data/lib/rubocop/cop/base.rb +6 -2
  15. data/lib/rubocop/cop/bundler/duplicated_gem.rb +1 -0
  16. data/lib/rubocop/cop/bundler/duplicated_group.rb +127 -0
  17. data/lib/rubocop/cop/bundler/gem_comment.rb +1 -1
  18. data/lib/rubocop/cop/bundler/gem_version.rb +2 -2
  19. data/lib/rubocop/cop/bundler/ordered_gems.rb +9 -1
  20. data/lib/rubocop/cop/correctors/alignment_corrector.rb +1 -1
  21. data/lib/rubocop/cop/correctors/lambda_literal_to_method_corrector.rb +7 -4
  22. data/lib/rubocop/cop/gemspec/dependency_version.rb +2 -2
  23. data/lib/rubocop/cop/gemspec/development_dependencies.rb +1 -1
  24. data/lib/rubocop/cop/gemspec/ordered_dependencies.rb +9 -1
  25. data/lib/rubocop/cop/generator/require_file_injector.rb +1 -1
  26. data/lib/rubocop/cop/internal_affairs/cop_description.rb +32 -8
  27. data/lib/rubocop/cop/internal_affairs/example_description.rb +42 -21
  28. data/lib/rubocop/cop/internal_affairs/location_line_equality_comparison.rb +3 -1
  29. data/lib/rubocop/cop/internal_affairs/node_matcher_directive.rb +5 -5
  30. data/lib/rubocop/cop/internal_affairs/redundant_method_dispatch_node.rb +11 -2
  31. data/lib/rubocop/cop/internal_affairs/useless_message_assertion.rb +2 -0
  32. data/lib/rubocop/cop/layout/class_structure.rb +7 -0
  33. data/lib/rubocop/cop/layout/closing_heredoc_indentation.rb +1 -2
  34. data/lib/rubocop/cop/layout/dot_position.rb +1 -5
  35. data/lib/rubocop/cop/layout/empty_line_after_guard_clause.rb +42 -9
  36. data/lib/rubocop/cop/layout/empty_line_between_defs.rb +27 -4
  37. data/lib/rubocop/cop/layout/empty_lines_around_exception_handling_keywords.rb +2 -0
  38. data/lib/rubocop/cop/layout/end_alignment.rb +7 -1
  39. data/lib/rubocop/cop/layout/heredoc_argument_closing_parenthesis.rb +2 -2
  40. data/lib/rubocop/cop/layout/heredoc_indentation.rb +3 -0
  41. data/lib/rubocop/cop/layout/indentation_style.rb +1 -1
  42. data/lib/rubocop/cop/layout/indentation_width.rb +3 -3
  43. data/lib/rubocop/cop/layout/leading_comment_space.rb +1 -1
  44. data/lib/rubocop/cop/layout/line_continuation_leading_space.rb +17 -9
  45. data/lib/rubocop/cop/layout/line_continuation_spacing.rb +1 -1
  46. data/lib/rubocop/cop/layout/line_end_string_concatenation_indentation.rb +2 -0
  47. data/lib/rubocop/cop/layout/multiline_method_call_indentation.rb +18 -3
  48. data/lib/rubocop/cop/layout/redundant_line_break.rb +14 -4
  49. data/lib/rubocop/cop/layout/space_after_comma.rb +9 -1
  50. data/lib/rubocop/cop/layout/space_after_not.rb +1 -1
  51. data/lib/rubocop/cop/layout/space_around_method_call_operator.rb +2 -2
  52. data/lib/rubocop/cop/layout/space_around_operators.rb +3 -1
  53. data/lib/rubocop/cop/layout/space_inside_block_braces.rb +2 -0
  54. data/lib/rubocop/cop/layout/space_inside_parens.rb +1 -1
  55. data/lib/rubocop/cop/layout/space_inside_range_literal.rb +1 -1
  56. data/lib/rubocop/cop/layout/trailing_empty_lines.rb +5 -0
  57. data/lib/rubocop/cop/lint/ambiguous_block_association.rb +13 -1
  58. data/lib/rubocop/cop/lint/debugger.rb +18 -5
  59. data/lib/rubocop/cop/lint/duplicate_hash_key.rb +2 -1
  60. data/lib/rubocop/cop/lint/duplicate_regexp_character_class_element.rb +46 -19
  61. data/lib/rubocop/cop/lint/empty_block.rb +1 -1
  62. data/lib/rubocop/cop/lint/erb_new_arguments.rb +3 -4
  63. data/lib/rubocop/cop/lint/heredoc_method_call_position.rb +1 -1
  64. data/lib/rubocop/cop/lint/identity_comparison.rb +0 -1
  65. data/lib/rubocop/cop/lint/incompatible_io_select_with_fiber_scheduler.rb +5 -3
  66. data/lib/rubocop/cop/lint/inherit_exception.rb +9 -0
  67. data/lib/rubocop/cop/lint/lambda_without_literal_block.rb +1 -1
  68. data/lib/rubocop/cop/lint/literal_in_interpolation.rb +1 -1
  69. data/lib/rubocop/cop/lint/missing_super.rb +34 -5
  70. data/lib/rubocop/cop/lint/mixed_case_range.rb +111 -0
  71. data/lib/rubocop/cop/lint/non_atomic_file_operation.rb +10 -7
  72. data/lib/rubocop/cop/lint/number_conversion.rb +5 -0
  73. data/lib/rubocop/cop/lint/numbered_parameter_assignment.rb +2 -2
  74. data/lib/rubocop/cop/lint/ordered_magic_comments.rb +0 -1
  75. data/lib/rubocop/cop/lint/out_of_range_regexp_ref.rb +2 -2
  76. data/lib/rubocop/cop/lint/redundant_regexp_quantifiers.rb +130 -0
  77. data/lib/rubocop/cop/lint/redundant_require_statement.rb +12 -3
  78. data/lib/rubocop/cop/lint/redundant_safe_navigation.rb +20 -4
  79. data/lib/rubocop/cop/lint/redundant_string_coercion.rb +1 -1
  80. data/lib/rubocop/cop/lint/safe_navigation_chain.rb +11 -4
  81. data/lib/rubocop/cop/lint/send_with_mixin_argument.rb +1 -2
  82. data/lib/rubocop/cop/lint/shadowed_exception.rb +5 -11
  83. data/lib/rubocop/cop/lint/shadowing_outer_local_variable.rb +7 -1
  84. data/lib/rubocop/cop/lint/struct_new_override.rb +12 -12
  85. data/lib/rubocop/cop/lint/suppressed_exception.rb +2 -2
  86. data/lib/rubocop/cop/lint/symbol_conversion.rb +1 -1
  87. data/lib/rubocop/cop/lint/to_enum_arguments.rb +5 -3
  88. data/lib/rubocop/cop/lint/top_level_return_with_argument.rb +23 -9
  89. data/lib/rubocop/cop/lint/useless_assignment.rb +94 -10
  90. data/lib/rubocop/cop/lint/void.rb +78 -10
  91. data/lib/rubocop/cop/metrics/block_length.rb +1 -1
  92. data/lib/rubocop/cop/metrics/class_length.rb +8 -3
  93. data/lib/rubocop/cop/metrics/method_length.rb +1 -1
  94. data/lib/rubocop/cop/metrics/utils/abc_size_calculator.rb +1 -2
  95. data/lib/rubocop/cop/metrics/utils/code_length_calculator.rb +32 -4
  96. data/lib/rubocop/cop/migration/department_name.rb +2 -2
  97. data/lib/rubocop/cop/mixin/allowed_receivers.rb +34 -0
  98. data/lib/rubocop/cop/mixin/comments_help.rb +19 -11
  99. data/lib/rubocop/cop/mixin/def_node.rb +1 -1
  100. data/lib/rubocop/cop/mixin/end_keyword_alignment.rb +1 -1
  101. data/lib/rubocop/cop/mixin/hash_shorthand_syntax.rb +14 -11
  102. data/lib/rubocop/cop/mixin/heredoc.rb +6 -2
  103. data/lib/rubocop/cop/mixin/multiline_expression_indentation.rb +3 -2
  104. data/lib/rubocop/cop/mixin/percent_literal.rb +1 -1
  105. data/lib/rubocop/cop/mixin/preceding_following_alignment.rb +5 -7
  106. data/lib/rubocop/cop/mixin/space_after_punctuation.rb +1 -1
  107. data/lib/rubocop/cop/mixin/string_help.rb +4 -2
  108. data/lib/rubocop/cop/mixin/trailing_comma.rb +1 -1
  109. data/lib/rubocop/cop/naming/block_forwarding.rb +1 -1
  110. data/lib/rubocop/cop/naming/constant_name.rb +1 -1
  111. data/lib/rubocop/cop/naming/file_name.rb +1 -1
  112. data/lib/rubocop/cop/naming/heredoc_delimiter_naming.rb +3 -1
  113. data/lib/rubocop/cop/naming/memoized_instance_variable_name.rb +25 -10
  114. data/lib/rubocop/cop/naming/rescued_exceptions_variable_name.rb +11 -3
  115. data/lib/rubocop/cop/naming/variable_name.rb +6 -1
  116. data/lib/rubocop/cop/style/accessor_grouping.rb +5 -1
  117. data/lib/rubocop/cop/style/alias.rb +9 -8
  118. data/lib/rubocop/cop/style/arguments_forwarding.rb +280 -63
  119. data/lib/rubocop/cop/style/array_intersect.rb +13 -5
  120. data/lib/rubocop/cop/style/attr.rb +11 -1
  121. data/lib/rubocop/cop/style/begin_block.rb +1 -2
  122. data/lib/rubocop/cop/style/block_comments.rb +1 -1
  123. data/lib/rubocop/cop/style/block_delimiters.rb +5 -4
  124. data/lib/rubocop/cop/style/class_and_module_children.rb +1 -1
  125. data/lib/rubocop/cop/style/class_equality_comparison.rb +24 -39
  126. data/lib/rubocop/cop/style/collection_compact.rb +16 -6
  127. data/lib/rubocop/cop/style/collection_methods.rb +2 -0
  128. data/lib/rubocop/cop/style/colon_method_call.rb +2 -2
  129. data/lib/rubocop/cop/style/combinable_loops.rb +30 -8
  130. data/lib/rubocop/cop/style/concat_array_literals.rb +1 -1
  131. data/lib/rubocop/cop/style/conditional_assignment.rb +5 -3
  132. data/lib/rubocop/cop/style/copyright.rb +5 -2
  133. data/lib/rubocop/cop/style/dir.rb +1 -1
  134. data/lib/rubocop/cop/style/dir_empty.rb +8 -14
  135. data/lib/rubocop/cop/style/document_dynamic_eval_definition.rb +1 -1
  136. data/lib/rubocop/cop/style/documentation.rb +1 -1
  137. data/lib/rubocop/cop/style/empty_case_condition.rb +6 -1
  138. data/lib/rubocop/cop/style/eval_with_location.rb +5 -5
  139. data/lib/rubocop/cop/style/exact_regexp_match.rb +68 -0
  140. data/lib/rubocop/cop/style/file_read.rb +2 -2
  141. data/lib/rubocop/cop/style/for.rb +1 -1
  142. data/lib/rubocop/cop/style/format_string.rb +24 -3
  143. data/lib/rubocop/cop/style/frozen_string_literal_comment.rb +3 -1
  144. data/lib/rubocop/cop/style/guard_clause.rb +28 -0
  145. data/lib/rubocop/cop/style/hash_conversion.rb +10 -0
  146. data/lib/rubocop/cop/style/hash_each_methods.rb +1 -22
  147. data/lib/rubocop/cop/style/hash_except.rb +19 -8
  148. data/lib/rubocop/cop/style/hash_transform_keys.rb +2 -2
  149. data/lib/rubocop/cop/style/hash_transform_values.rb +2 -2
  150. data/lib/rubocop/cop/style/identical_conditional_branches.rb +31 -5
  151. data/lib/rubocop/cop/style/if_inside_else.rb +6 -0
  152. data/lib/rubocop/cop/style/if_unless_modifier.rb +3 -0
  153. data/lib/rubocop/cop/style/if_with_semicolon.rb +2 -2
  154. data/lib/rubocop/cop/style/invertible_unless_condition.rb +10 -6
  155. data/lib/rubocop/cop/style/lambda.rb +3 -3
  156. data/lib/rubocop/cop/style/lambda_call.rb +5 -0
  157. data/lib/rubocop/cop/style/method_call_with_args_parentheses/omit_parentheses.rb +11 -5
  158. data/lib/rubocop/cop/style/mixin_grouping.rb +1 -1
  159. data/lib/rubocop/cop/style/multiline_block_chain.rb +1 -1
  160. data/lib/rubocop/cop/style/multiline_ternary_operator.rb +1 -1
  161. data/lib/rubocop/cop/style/multiple_comparison.rb +14 -0
  162. data/lib/rubocop/cop/style/nested_ternary_operator.rb +3 -11
  163. data/lib/rubocop/cop/style/numeric_literals.rb +1 -1
  164. data/lib/rubocop/cop/style/open_struct_use.rb +1 -1
  165. data/lib/rubocop/cop/style/operator_method_call.rb +6 -0
  166. data/lib/rubocop/cop/style/percent_literal_delimiters.rb +1 -1
  167. data/lib/rubocop/cop/style/preferred_hash_methods.rb +1 -1
  168. data/lib/rubocop/cop/style/redundant_argument.rb +6 -1
  169. data/lib/rubocop/cop/style/redundant_array_constructor.rb +77 -0
  170. data/lib/rubocop/cop/style/redundant_begin.rb +10 -2
  171. data/lib/rubocop/cop/style/redundant_conditional.rb +2 -10
  172. data/lib/rubocop/cop/style/redundant_current_directory_in_path.rb +38 -0
  173. data/lib/rubocop/cop/style/redundant_double_splat_hash_braces.rb +93 -5
  174. data/lib/rubocop/cop/style/redundant_exception.rb +32 -12
  175. data/lib/rubocop/cop/style/redundant_filter_chain.rb +118 -0
  176. data/lib/rubocop/cop/style/redundant_line_continuation.rb +7 -3
  177. data/lib/rubocop/cop/style/redundant_parentheses.rb +42 -16
  178. data/lib/rubocop/cop/style/redundant_regexp_argument.rb +100 -0
  179. data/lib/rubocop/cop/style/redundant_regexp_constructor.rb +46 -0
  180. data/lib/rubocop/cop/style/redundant_regexp_escape.rb +2 -1
  181. data/lib/rubocop/cop/style/redundant_return.rb +7 -2
  182. data/lib/rubocop/cop/style/redundant_self_assignment_branch.rb +8 -1
  183. data/lib/rubocop/cop/style/redundant_sort.rb +1 -1
  184. data/lib/rubocop/cop/style/redundant_string_escape.rb +2 -0
  185. data/lib/rubocop/cop/style/regexp_literal.rb +11 -2
  186. data/lib/rubocop/cop/style/require_order.rb +11 -5
  187. data/lib/rubocop/cop/style/rescue_modifier.rb +1 -3
  188. data/lib/rubocop/cop/style/return_nil.rb +6 -2
  189. data/lib/rubocop/cop/style/return_nil_in_predicate_method_definition.rb +95 -0
  190. data/lib/rubocop/cop/style/select_by_regexp.rb +15 -5
  191. data/lib/rubocop/cop/style/semicolon.rb +12 -4
  192. data/lib/rubocop/cop/style/signal_exception.rb +1 -1
  193. data/lib/rubocop/cop/style/single_argument_dig.rb +2 -1
  194. data/lib/rubocop/cop/style/single_line_do_end_block.rb +67 -0
  195. data/lib/rubocop/cop/style/single_line_methods.rb +1 -1
  196. data/lib/rubocop/cop/style/sole_nested_conditional.rb +6 -2
  197. data/lib/rubocop/cop/style/special_global_vars.rb +3 -4
  198. data/lib/rubocop/cop/style/string_literals_in_interpolation.rb +30 -5
  199. data/lib/rubocop/cop/style/symbol_array.rb +35 -15
  200. data/lib/rubocop/cop/style/yaml_file_read.rb +66 -0
  201. data/lib/rubocop/cop/style/yoda_condition.rb +4 -2
  202. data/lib/rubocop/cop/style/yoda_expression.rb +8 -7
  203. data/lib/rubocop/cop/team.rb +1 -1
  204. data/lib/rubocop/cop/util.rb +1 -1
  205. data/lib/rubocop/cop/utils/regexp_ranges.rb +113 -0
  206. data/lib/rubocop/cop/variable_force/assignment.rb +45 -4
  207. data/lib/rubocop/cop/variable_force/variable_table.rb +2 -2
  208. data/lib/rubocop/cop/variable_force.rb +1 -0
  209. data/lib/rubocop/cops_documentation_generator.rb +1 -1
  210. data/lib/rubocop/ext/regexp_parser.rb +4 -1
  211. data/lib/rubocop/file_finder.rb +4 -7
  212. data/lib/rubocop/formatter/html_formatter.rb +4 -2
  213. data/lib/rubocop/formatter/junit_formatter.rb +1 -1
  214. data/lib/rubocop/lsp/logger.rb +22 -0
  215. data/lib/rubocop/lsp/routes.rb +246 -0
  216. data/lib/rubocop/lsp/runtime.rb +99 -0
  217. data/lib/rubocop/lsp/server.rb +68 -0
  218. data/lib/rubocop/lsp/severity.rb +27 -0
  219. data/lib/rubocop/magic_comment.rb +12 -10
  220. data/lib/rubocop/options.rb +11 -1
  221. data/lib/rubocop/result_cache.rb +5 -1
  222. data/lib/rubocop/rspec/cop_helper.rb +1 -1
  223. data/lib/rubocop/rspec/shared_contexts.rb +2 -3
  224. data/lib/rubocop/runner.rb +5 -3
  225. data/lib/rubocop/server/cache.rb +1 -0
  226. data/lib/rubocop/server/client_command/exec.rb +3 -2
  227. data/lib/rubocop/string_interpreter.rb +3 -3
  228. data/lib/rubocop/target_finder.rb +7 -3
  229. data/lib/rubocop/target_ruby.rb +12 -7
  230. data/lib/rubocop/version.rb +10 -6
  231. data/lib/rubocop.rb +15 -0
  232. metadata +45 -11
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 67accbc10c4c2ae80033ab2a3713fce8a190d772234cbd52c5584e5c69895915
4
- data.tar.gz: 69e7f99ee66c192619b2dc26df6d0ac73c794bb088bade8182f3eceb1cb8d8c0
3
+ metadata.gz: adf1db90b03283f492e0e10f234d54d6efc215a8b182965087313e3954d533dd
4
+ data.tar.gz: fa84dfd9d61e4834df9287e0ba0619622f4b7eb9e229e8de1172bc1742c04df5
5
5
  SHA512:
6
- metadata.gz: 21005d0d16a207a998640686ee7dcf251683899ab8e746baa861888fd26f2e58791733b48869a085b1b365ce2b67e64b216b4cfe6c1a2e26a2ecc699da0ea085
7
- data.tar.gz: 461a588bb95269c194efee4ee8570c166ce009695664aa31181f1f0806220f451e4685d4feff8751d4135f196d3cb42ec100c171b905526e06ed968cd9bb47f9
6
+ metadata.gz: 44a683eed5e4b9d26caf4d0c775a6f4ba00960b6aaeee29c3f610320d1471326d650e8fc41ee2725af07b4e6a50bf17d442232134522709ebb2a46ec5b80bf40
7
+ data.tar.gz: d4f5dda0dbf7689c55b39de3922c2bd1a0c40aa62ac1046f06c98a19e7f2719cfea11babd480ba4e9b9ff2203d20422a51f096165d5919bf564e009c3a91c087
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.50', require: false
56
+ gem 'rubocop', '~> 1.57', require: false
57
57
  ```
58
58
 
59
59
  See [our versioning policy](https://docs.rubocop.org/rubocop/versioning.html) for further details.
@@ -67,6 +67,8 @@ $ cd my/cool/ruby/project
67
67
  $ rubocop
68
68
  ```
69
69
 
70
+ You can also use this magic in your favorite editor with RuboCop's [built-in LSP](https://docs.rubocop.org/rubocop/usage/lsp.html).
71
+
70
72
  ## Documentation
71
73
 
72
74
  You can read a lot more about RuboCop in its [official docs](https://docs.rubocop.org).
@@ -75,8 +77,8 @@ You can read a lot more about RuboCop in its [official docs](https://docs.ruboco
75
77
 
76
78
  RuboCop officially supports the following runtime Ruby implementations:
77
79
 
78
- * MRI 2.6+
79
- * JRuby 9.3+
80
+ * MRI 2.7+
81
+ * JRuby 9.4+
80
82
 
81
83
  Targets Ruby 2.0+ code analysis.
82
84
 
data/config/default.yml CHANGED
@@ -30,6 +30,7 @@ AllCops:
30
30
  - '**/*.rbx'
31
31
  - '**/*.ru'
32
32
  - '**/*.ruby'
33
+ - '**/*.schema'
33
34
  - '**/*.spec'
34
35
  - '**/*.thor'
35
36
  - '**/*.watchr'
@@ -55,6 +56,7 @@ AllCops:
55
56
  - '**/Puppetfile'
56
57
  - '**/Rakefile'
57
58
  - '**/rakefile'
59
+ - '**/Schemafile'
58
60
  - '**/Snapfile'
59
61
  - '**/Steepfile'
60
62
  - '**/Thorfile'
@@ -140,7 +142,7 @@ AllCops:
140
142
  # or gems.locked file. (Although the Ruby version is specified in the Gemfile
141
143
  # or gems.rb file, RuboCop reads the final value from the lock file.) If the
142
144
  # Ruby version is still unresolved, RuboCop will use the oldest officially
143
- # supported Ruby version (currently Ruby 2.6).
145
+ # supported Ruby version (currently Ruby 2.7).
144
146
  TargetRubyVersion: ~
145
147
  # Determines if a notification for extension libraries should be shown when
146
148
  # rubocop is run. Keys are the name of the extension, and values are an array
@@ -154,6 +156,7 @@ AllCops:
154
156
  rubocop-rake: [rake]
155
157
  rubocop-graphql: [graphql]
156
158
  rubocop-capybara: [capybara]
159
+ rubocop-factory_bot: [factory_bot, factory_bot_rails]
157
160
  # Enable/Disable checking the methods extended by Active Support.
158
161
  ActiveSupportExtensionsEnabled: false
159
162
 
@@ -170,6 +173,16 @@ Bundler/DuplicatedGem:
170
173
  - '**/Gemfile'
171
174
  - '**/gems.rb'
172
175
 
176
+ Bundler/DuplicatedGroup:
177
+ Description: 'Checks for duplicate group entries in Gemfile.'
178
+ Enabled: true
179
+ Severity: warning
180
+ VersionAdded: '1.56'
181
+ Include:
182
+ - '**/*.gemfile'
183
+ - '**/Gemfile'
184
+ - '**/gems.rb'
185
+
173
186
  Bundler/GemComment:
174
187
  Description: 'Add a comment describing each gem.'
175
188
  Enabled: false
@@ -466,7 +479,9 @@ Layout/ClassStructure:
466
479
  Description: 'Enforces a configured order of definitions within a class body.'
467
480
  StyleGuide: '#consistent-classes'
468
481
  Enabled: false
482
+ SafeAutoCorrect: false
469
483
  VersionAdded: '0.52'
484
+ VersionChanged: '1.53'
470
485
  Categories:
471
486
  module_inclusion:
472
487
  - include
@@ -574,6 +589,8 @@ Layout/EmptyLineBetweenDefs:
574
589
  EmptyLineBetweenMethodDefs: true
575
590
  EmptyLineBetweenClassDefs: true
576
591
  EmptyLineBetweenModuleDefs: true
592
+ # `DefLikeMacros` takes the name of any macro that you want to treat like a def.
593
+ DefLikeMacros: []
577
594
  # `AllowAdjacentOneLineDefs` means that single line method definitions don't
578
595
  # need an empty line between them. `true` by default.
579
596
  AllowAdjacentOneLineDefs: true
@@ -1529,7 +1546,6 @@ Lint/AmbiguousBlockAssociation:
1529
1546
  Description: >-
1530
1547
  Checks for ambiguous block association with method when param passed without
1531
1548
  parentheses.
1532
- StyleGuide: '#syntax'
1533
1549
  Enabled: true
1534
1550
  VersionAdded: '0.48'
1535
1551
  VersionChanged: '1.13'
@@ -1987,9 +2003,16 @@ Lint/MissingSuper:
1987
2003
  Checks for the presence of constructors and lifecycle callbacks
1988
2004
  without calls to `super`.
1989
2005
  Enabled: true
2006
+ AllowedParentClasses: []
1990
2007
  VersionAdded: '0.89'
1991
2008
  VersionChanged: '1.4'
1992
2009
 
2010
+ Lint/MixedCaseRange:
2011
+ Description: 'Checks for mixed-case character ranges since they include likely unintended characters.'
2012
+ Enabled: pending
2013
+ SafeAutoCorrect: false
2014
+ VersionAdded: '1.53'
2015
+
1993
2016
  Lint/MixedRegexpCaptureTypes:
1994
2017
  Description: 'Do not mix named captures and numbered captures in a Regexp literal.'
1995
2018
  Enabled: true
@@ -2139,10 +2162,17 @@ Lint/RedundantDirGlobSort:
2139
2162
  VersionChanged: '1.26'
2140
2163
  SafeAutoCorrect: false
2141
2164
 
2165
+ Lint/RedundantRegexpQuantifiers:
2166
+ Description: 'Checks for redundant quantifiers in Regexps.'
2167
+ Enabled: pending
2168
+ VersionAdded: '1.53'
2169
+
2142
2170
  Lint/RedundantRequireStatement:
2143
2171
  Description: 'Checks for unnecessary `require` statement.'
2144
2172
  Enabled: true
2173
+ SafeAutoCorrect: false
2145
2174
  VersionAdded: '0.76'
2175
+ VersionChanged: '1.57'
2146
2176
 
2147
2177
  Lint/RedundantSafeNavigation:
2148
2178
  Description: 'Checks for redundant safe navigation calls.'
@@ -2343,6 +2373,9 @@ Lint/TopLevelReturnWithArgument:
2343
2373
  Description: 'Detects top level return statements with argument.'
2344
2374
  Enabled: true
2345
2375
  VersionAdded: '0.89'
2376
+ # These codes are `eval`-ed in method and their return values may be used.
2377
+ Exclude:
2378
+ - '**/*.jb'
2346
2379
 
2347
2380
  Lint/TrailingCommaInAttributeDeclaration:
2348
2381
  Description: 'Checks for trailing commas in attribute declarations.'
@@ -2451,6 +2484,8 @@ Lint/UselessAssignment:
2451
2484
  StyleGuide: '#underscore-unused-vars'
2452
2485
  Enabled: true
2453
2486
  VersionAdded: '0.11'
2487
+ VersionChanged: '1.51'
2488
+ SafeAutoCorrect: false
2454
2489
 
2455
2490
  Lint/UselessElseWithoutRescue:
2456
2491
  Description: 'Checks for useless `else` in `begin..end` without `rescue`.'
@@ -2478,10 +2513,9 @@ Lint/UselessRuby2Keywords:
2478
2513
  Lint/UselessSetterCall:
2479
2514
  Description: 'Checks for useless setter call to a local variable.'
2480
2515
  Enabled: true
2481
- SafeAutoCorrect: false
2516
+ Safe: false
2482
2517
  VersionAdded: '0.13'
2483
2518
  VersionChanged: '1.2'
2484
- Safe: false
2485
2519
 
2486
2520
  Lint/UselessTimes:
2487
2521
  Description: 'Checks for useless `Integer#times` calls.'
@@ -2942,7 +2976,9 @@ Naming/VariableNumber:
2942
2976
  Security/CompoundHash:
2943
2977
  Description: 'When overwriting Object#hash to combine values, prefer delegating to Array#hash over writing a custom implementation.'
2944
2978
  Enabled: pending
2979
+ Safe: false
2945
2980
  VersionAdded: '1.28'
2981
+ VersionChanged: '1.51'
2946
2982
 
2947
2983
  Security/Eval:
2948
2984
  Description: 'The use of eval represents a serious security risk.'
@@ -3048,6 +3084,7 @@ Style/ArgumentsForwarding:
3048
3084
  StyleGuide: '#arguments-forwarding'
3049
3085
  Enabled: pending
3050
3086
  AllowOnlyRestArgument: true
3087
+ UseAnonymousForwarding: true
3051
3088
  VersionAdded: '1.1'
3052
3089
 
3053
3090
  Style/ArrayCoercion:
@@ -3319,7 +3356,9 @@ Style/ClassEqualityComparison:
3319
3356
  Description: 'Enforces the use of `Object#instance_of?` instead of class comparison for equality.'
3320
3357
  StyleGuide: '#instance-of-vs-class-comparison'
3321
3358
  Enabled: true
3359
+ SafeAutoCorrect: false
3322
3360
  VersionAdded: '0.93'
3361
+ VersionChanged: '1.57'
3323
3362
  AllowedMethods:
3324
3363
  - ==
3325
3364
  - equal?
@@ -3355,6 +3394,7 @@ Style/CollectionCompact:
3355
3394
  Safe: false
3356
3395
  VersionAdded: '1.2'
3357
3396
  VersionChanged: '1.3'
3397
+ AllowedReceivers: []
3358
3398
 
3359
3399
  # Align with the style guide.
3360
3400
  Style/CollectionMethods:
@@ -3373,6 +3413,7 @@ Style/CollectionMethods:
3373
3413
  PreferredMethods:
3374
3414
  collect: 'map'
3375
3415
  collect!: 'map!'
3416
+ collect_concat: 'flat_map'
3376
3417
  inject: 'reduce'
3377
3418
  detect: 'find'
3378
3419
  find_all: 'select'
@@ -3515,7 +3556,9 @@ Style/DataInheritance:
3515
3556
  Description: 'Checks for inheritance from Data.define.'
3516
3557
  StyleGuide: '#no-extend-data-define'
3517
3558
  Enabled: pending
3559
+ SafeAutoCorrect: false
3518
3560
  VersionAdded: '1.49'
3561
+ VersionChanged: '1.51'
3519
3562
 
3520
3563
  Style/DateTime:
3521
3564
  Description: 'Use Time over DateTime.'
@@ -3706,6 +3749,11 @@ Style/EvenOdd:
3706
3749
  VersionAdded: '0.12'
3707
3750
  VersionChanged: '0.29'
3708
3751
 
3752
+ Style/ExactRegexpMatch:
3753
+ Description: 'Checks for exact regexp match inside Regexp literals.'
3754
+ Enabled: pending
3755
+ VersionAdded: '1.51'
3756
+
3709
3757
  Style/ExpandPathArguments:
3710
3758
  Description: "Use `expand_path(__dir__)` instead of `expand_path('..', __FILE__)`."
3711
3759
  Enabled: true
@@ -3884,8 +3932,9 @@ Style/HashConversion:
3884
3932
  Description: 'Avoid Hash[] in favor of ary.to_h or literal hashes.'
3885
3933
  StyleGuide: '#avoid-hash-constructor'
3886
3934
  Enabled: pending
3935
+ SafeAutoCorrect: false
3887
3936
  VersionAdded: '1.10'
3888
- VersionChanged: '1.11'
3937
+ VersionChanged: '1.55'
3889
3938
  AllowSplatArgument: true
3890
3939
 
3891
3940
  Style/HashEachMethods:
@@ -4086,14 +4135,6 @@ Style/InvertibleUnlessCondition:
4086
4135
  :none?: :any?
4087
4136
  :even?: :odd?
4088
4137
  :odd?: :even?
4089
- # `ActiveSupport` defines some common inverse methods. They are listed below,
4090
- # and not enabled by default.
4091
- # :present?: :blank?
4092
- # :blank?: :present?
4093
- # :include?: :exclude?
4094
- # :exclude?: :include?
4095
- # :one?: :many?
4096
- # :many?: :one?
4097
4138
 
4098
4139
  Style/IpAddresses:
4099
4140
  Description: "Don't include literal IP addresses in code."
@@ -4370,6 +4411,7 @@ Style/MultipleComparison:
4370
4411
  VersionAdded: '0.49'
4371
4412
  VersionChanged: '1.1'
4372
4413
  AllowMethodComparison: true
4414
+ ComparisonsThreshold: 2
4373
4415
 
4374
4416
  Style/MutableConstant:
4375
4417
  Description: 'Do not assign mutable objects to constants.'
@@ -4624,7 +4666,9 @@ Style/OpenStructUse:
4624
4666
  - https://docs.ruby-lang.org/en/3.0.0/OpenStruct.html#class-OpenStruct-label-Caveats
4625
4667
 
4626
4668
  Enabled: pending
4669
+ Safe: false
4627
4670
  VersionAdded: '1.23'
4671
+ VersionChanged: '1.51'
4628
4672
 
4629
4673
  Style/OperatorMethodCall:
4630
4674
  Description: 'Checks for redundant dot before operator method call.'
@@ -4777,12 +4821,16 @@ Style/RedundantArgument:
4777
4821
  Enabled: pending
4778
4822
  Safe: false
4779
4823
  VersionAdded: '1.4'
4780
- VersionChanged: '1.40'
4824
+ VersionChanged: '1.55'
4781
4825
  Methods:
4782
4826
  # Array#join
4783
4827
  join: ''
4784
4828
  # Array#sum
4785
4829
  sum: 0
4830
+ # Kernel.#exit
4831
+ exit: true
4832
+ # Kernel.#exit!
4833
+ exit!: false
4786
4834
  # String#split
4787
4835
  split: ' '
4788
4836
  # String#chomp
@@ -4790,6 +4838,11 @@ Style/RedundantArgument:
4790
4838
  # String#chomp!
4791
4839
  chomp!: "\n"
4792
4840
 
4841
+ Style/RedundantArrayConstructor:
4842
+ Description: 'Checks for the instantiation of array using redundant `Array` constructor.'
4843
+ Enabled: pending
4844
+ VersionAdded: '1.52'
4845
+
4793
4846
  Style/RedundantAssignment:
4794
4847
  Description: 'Checks for redundant assignment before returning.'
4795
4848
  Enabled: true
@@ -4822,6 +4875,11 @@ Style/RedundantConstantBase:
4822
4875
  Enabled: pending
4823
4876
  VersionAdded: '1.40'
4824
4877
 
4878
+ Style/RedundantCurrentDirectoryInPath:
4879
+ Description: 'Checks for uses a redundant current directory in path.'
4880
+ Enabled: pending
4881
+ VersionAdded: '1.53'
4882
+
4825
4883
  Style/RedundantDoubleSplatHashBraces:
4826
4884
  Description: 'Checks for redundant uses of double splat hash braces.'
4827
4885
  Enabled: pending
@@ -4861,6 +4919,15 @@ Style/RedundantFileExtensionInRequire:
4861
4919
  Enabled: true
4862
4920
  VersionAdded: '0.88'
4863
4921
 
4922
+ Style/RedundantFilterChain:
4923
+ Description: >-
4924
+ Identifies usages of `any?`, `empty?`, `none?` or `one?` predicate methods chained to
4925
+ `select`/`filter`/`find_all` and change them to use predicate method instead.
4926
+ Enabled: pending
4927
+ SafeAutoCorrect: false
4928
+ VersionAdded: '1.52'
4929
+ VersionChanged: '1.57'
4930
+
4864
4931
  Style/RedundantFreeze:
4865
4932
  Description: "Checks usages of Object#freeze on immutable objects."
4866
4933
  Enabled: true
@@ -4903,11 +4970,21 @@ Style/RedundantPercentQ:
4903
4970
  Enabled: true
4904
4971
  VersionAdded: '0.76'
4905
4972
 
4973
+ Style/RedundantRegexpArgument:
4974
+ Description: 'Identifies places where argument can be replaced from a deterministic regexp to a string.'
4975
+ Enabled: pending
4976
+ VersionAdded: '1.53'
4977
+
4906
4978
  Style/RedundantRegexpCharacterClass:
4907
4979
  Description: 'Checks for unnecessary single-element Regexp character classes.'
4908
4980
  Enabled: true
4909
4981
  VersionAdded: '0.85'
4910
4982
 
4983
+ Style/RedundantRegexpConstructor:
4984
+ Description: 'Checks for the instantiation of regexp using redundant `Regexp.new` or `Regexp.compile`.'
4985
+ Enabled: pending
4986
+ VersionAdded: '1.52'
4987
+
4911
4988
  Style/RedundantRegexpEscape:
4912
4989
  Description: 'Checks for redundant escapes in Regexps.'
4913
4990
  Enabled: true
@@ -5010,6 +5087,15 @@ Style/ReturnNil:
5010
5087
  - return_nil
5011
5088
  VersionAdded: '0.50'
5012
5089
 
5090
+ Style/ReturnNilInPredicateMethodDefinition:
5091
+ Description: 'Checks if uses of `return` or `return nil` in predicate method definition.'
5092
+ StyleGuide: '#bool-methods-qmark'
5093
+ Enabled: pending
5094
+ SafeAutoCorrect: false
5095
+ AllowedMethods: []
5096
+ AllowedPatterns: []
5097
+ VersionAdded: '1.53'
5098
+
5013
5099
  Style/SafeNavigation:
5014
5100
  Description: >-
5015
5101
  Transforms usages of a method call safeguarded by
@@ -5102,6 +5188,11 @@ Style/SingleLineBlockParams:
5102
5188
  - acc
5103
5189
  - elem
5104
5190
 
5191
+ Style/SingleLineDoEndBlock:
5192
+ Description: 'Checks for single-line `do`...`end` blocks.'
5193
+ Enabled: pending
5194
+ VersionAdded: '1.57'
5195
+
5105
5196
  Style/SingleLineMethods:
5106
5197
  Description: 'Avoid single-line methods.'
5107
5198
  StyleGuide: '#no-single-line-methods'
@@ -5494,6 +5585,11 @@ Style/WordArray:
5494
5585
  # The regular expression `WordRegex` decides what is considered a word.
5495
5586
  WordRegex: !ruby/regexp '/\A(?:\p{Word}|\p{Word}-\p{Word}|\n|\t)+\z/'
5496
5587
 
5588
+ Style/YAMLFileRead:
5589
+ Description: 'Checks for the use of `YAML.load`, `YAML.safe_load`, and `YAML.parse` with `File.read` argument.'
5590
+ Enabled: pending
5591
+ VersionAdded: '1.53'
5592
+
5497
5593
  Style/YodaCondition:
5498
5594
  Description: 'Forbid or enforce yoda conditions.'
5499
5595
  Reference: 'https://en.wikipedia.org/wiki/Yoda_conditions'
@@ -224,6 +224,11 @@ changed_parameters:
224
224
  - AllowedMethods
225
225
  - AllowedPatterns
226
226
  severity: warning
227
+ - cops: Style/ArgumentsForwarding
228
+ parameters: AllowOnlyRestArgument
229
+ reason: "`AllowOnlyRestArgument` has no effect with TargetRubyVersion >= 3.2."
230
+ severity: warning
231
+ minimum_ruby_version: 3.2
227
232
 
228
233
  # Enforced styles that have been removed or replaced
229
234
  changed_enforced_styles:
@@ -10,6 +10,7 @@ module RuboCop
10
10
 
11
11
  AUTO_GENERATED_FILE = '.rubocop_todo.yml'
12
12
  YAML_OPTIONAL_DOC_START = /\A---(\s+#|\s*\z)/.freeze
13
+ PLACEHOLDER = '###rubocop:inherit_here'
13
14
 
14
15
  PHASE_1 = 'Phase 1 of 2: run Layout/LineLength cop'
15
16
  PHASE_2 = 'Phase 2 of 2: run all cops'
@@ -125,15 +126,19 @@ module RuboCop
125
126
 
126
127
  def existing_configuration(config_file)
127
128
  File.read(config_file, encoding: Encoding::UTF_8)
128
- .sub(/^inherit_from: *[^\n]+/, '')
129
- .sub(/^inherit_from: *(\n *- *[^\n]+)+/, '')
129
+ .sub(/^inherit_from: *[^\n]+/, PLACEHOLDER)
130
+ .sub(/^inherit_from: *(\n *- *[^\n]+)+/, PLACEHOLDER)
130
131
  end
131
132
 
132
133
  def write_config_file(file_name, file_string, rubocop_yml_contents)
133
134
  lines = /\S/.match?(rubocop_yml_contents) ? rubocop_yml_contents.split("\n", -1) : []
134
- doc_start_index = lines.index { |line| YAML_OPTIONAL_DOC_START.match?(line) } || -1
135
- lines.insert(doc_start_index + 1, "inherit_from:#{file_string}\n")
136
- File.write(file_name, lines.join("\n"))
135
+ unless rubocop_yml_contents&.include?(PLACEHOLDER)
136
+ doc_start_index = lines.index { |line| YAML_OPTIONAL_DOC_START.match?(line) } || -1
137
+ lines.insert(doc_start_index + 1, PLACEHOLDER)
138
+ end
139
+ File.write(file_name, lines.join("\n")
140
+ .sub(/#{PLACEHOLDER}\n*/o, "inherit_from:#{file_string}\n\n")
141
+ .sub(/\n\n+\Z/, "\n"))
137
142
  end
138
143
 
139
144
  def relative_path_to_todo_from_options_config
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative '../../lsp/server'
4
+
5
+ module RuboCop
6
+ class CLI
7
+ module Command
8
+ # Start Language Server Protocol of RuboCop.
9
+ # @api private
10
+ class Lsp < Base
11
+ self.command_name = :lsp
12
+
13
+ def run
14
+ RuboCop::Lsp::Server.new(@config_store).start
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
data/lib/rubocop/cli.rb CHANGED
@@ -11,7 +11,7 @@ module RuboCop
11
11
  STATUS_ERROR = 2
12
12
  STATUS_INTERRUPTED = Signal.list['INT'] + 128
13
13
  DEFAULT_PARALLEL_OPTIONS = %i[
14
- color debug display_style_guide display_time display_only_fail_level_offenses
14
+ color config debug display_style_guide display_time display_only_fail_level_offenses
15
15
  display_only_failed except extra_details fail_level fix_layout format
16
16
  ignore_disable_comments lint only only_guide_cops require safe
17
17
  autocorrect safe_autocorrect autocorrect_all
@@ -174,14 +174,17 @@ module RuboCop
174
174
  ConfigLoader.ignore_unrecognized_cops = @options[:ignore_unrecognized_cops]
175
175
  end
176
176
 
177
+ # rubocop:disable Metrics/CyclomaticComplexity
177
178
  def handle_exiting_options
178
179
  return unless Options::EXITING_OPTIONS.any? { |o| @options.key? o }
179
180
 
180
181
  run_command(:version) if @options[:version] || @options[:verbose_version]
181
182
  run_command(:show_cops) if @options[:show_cops]
182
183
  run_command(:show_docs_url) if @options[:show_docs_url]
184
+ run_command(:lsp) if @options[:lsp]
183
185
  raise Finished
184
186
  end
187
+ # rubocop:enable Metrics/CyclomaticComplexity
185
188
 
186
189
  def apply_default_formatter
187
190
  # This must be done after the options have already been processed,
@@ -284,6 +284,10 @@ module RuboCop
284
284
  end
285
285
  end
286
286
 
287
+ def inspect # :nodoc:
288
+ "#<#{self.class.name}:#{object_id} @loaded_path=#{loaded_path}>"
289
+ end
290
+
287
291
  private
288
292
 
289
293
  def target_rails_version_from_bundler_lock_file
@@ -46,14 +46,14 @@ module RuboCop
46
46
 
47
47
  file = File.join(Dir.home, DOTFILE)
48
48
 
49
- return file if File.exist?(file)
49
+ file if File.exist?(file)
50
50
  end
51
51
 
52
52
  def find_user_xdg_config
53
53
  xdg_config_home = expand_path(ENV.fetch('XDG_CONFIG_HOME', '~/.config'))
54
54
  xdg_config = File.join(xdg_config_home, 'rubocop', XDG_CONFIG)
55
55
 
56
- return xdg_config if File.exist?(xdg_config)
56
+ xdg_config if File.exist?(xdg_config)
57
57
  end
58
58
 
59
59
  def expand_path(path)
@@ -33,7 +33,7 @@ module RuboCop
33
33
  inherit_mode: determine_inherit_mode(hash, k))
34
34
  end
35
35
  hash[k] = v
36
- fix_include_paths(base_config.loaded_path, hash, k, v) if v.key?('Include')
36
+ fix_include_paths(base_config.loaded_path, hash, path, k, v) if v.key?('Include')
37
37
  end
38
38
  end
39
39
  end
@@ -42,12 +42,13 @@ module RuboCop
42
42
  # base configuration are relative to the directory where the base configuration file is. For the
43
43
  # derived configuration, we need to make those paths relative to where the derived configuration
44
44
  # file is.
45
- def fix_include_paths(base_config_path, hash, key, value)
45
+ def fix_include_paths(base_config_path, hash, path, key, value)
46
46
  return unless File.basename(base_config_path).start_with?('.rubocop')
47
47
 
48
48
  base_dir = File.dirname(base_config_path)
49
+ derived_dir = File.dirname(path)
49
50
  hash[key]['Include'] = value['Include'].map do |include_path|
50
- PathUtil.relative_path(File.join(base_dir, include_path), Dir.pwd)
51
+ PathUtil.relative_path(File.join(base_dir, include_path), derived_dir)
51
52
  end
52
53
  end
53
54
 
@@ -19,7 +19,7 @@ module RuboCop
19
19
  end
20
20
 
21
21
  def violated?
22
- config[cop]&.key?(parameter)
22
+ applies_to_current_ruby_version? && config[cop]&.key?(parameter)
23
23
  end
24
24
 
25
25
  def warning?
@@ -28,6 +28,14 @@ module RuboCop
28
28
 
29
29
  private
30
30
 
31
+ def applies_to_current_ruby_version?
32
+ minimum_ruby_version = metadata['minimum_ruby_version']
33
+
34
+ return true unless minimum_ruby_version
35
+
36
+ config.target_ruby_version >= minimum_ruby_version
37
+ end
38
+
31
39
  def alternative
32
40
  metadata['alternative']
33
41
  end
@@ -68,11 +68,11 @@ module RuboCop
68
68
  # Cop rules are keyed by the name of the original cop
69
69
  def load_cop_rules(rules)
70
70
  rules.flat_map do |rule_type, data|
71
- data.map do |cop_name, configuration|
71
+ data.filter_map do |cop_name, configuration|
72
72
  next unless configuration # allow configurations to be disabled with `CopName: ~`
73
73
 
74
74
  COP_RULE_CLASSES[rule_type].new(@config, cop_name, configuration)
75
- end.compact
75
+ end
76
76
  end
77
77
  end
78
78
 
@@ -82,7 +82,9 @@ module RuboCop
82
82
  node.array_type? && node.percent_literal?
83
83
  end
84
84
 
85
- percent_array.map(&:source_range).find { |range| range.overlaps?(offense_range) }
85
+ percent_array.map(&:source_range).find do |range|
86
+ offense_range.begin_pos > range.begin_pos && range.overlaps?(offense_range)
87
+ end
86
88
  end
87
89
 
88
90
  def range_of_first_line(range)
@@ -53,7 +53,7 @@ module RuboCop
53
53
  # List of cops that should not try to autocorrect at the same
54
54
  # time as this cop
55
55
  #
56
- # @return [Array<RuboCop::Cop::Cop>]
56
+ # @return [Array<RuboCop::Cop::Base>]
57
57
  #
58
58
  # @api public
59
59
  def self.autocorrect_incompatible_with
@@ -284,7 +284,7 @@ module RuboCop
284
284
  # @api private
285
285
  def self.callbacks_needed
286
286
  @callbacks_needed ||= public_instance_methods.select do |m|
287
- m.match?(/^on_|^after_/) &&
287
+ m.start_with?(/on_|after_/) &&
288
288
  !Base.method_defined?(m) # exclude standard "callbacks" like 'on_begin_investigation'
289
289
  end
290
290
  end
@@ -305,6 +305,10 @@ module RuboCop
305
305
  @current_original = original
306
306
  end
307
307
 
308
+ def inspect # :nodoc:
309
+ "#<#{self.class.name}:#{object_id} @config=#{@config} @options=#{@options}>"
310
+ end
311
+
308
312
  private
309
313
 
310
314
  ### Reserved for Cop::Cop
@@ -4,6 +4,7 @@ module RuboCop
4
4
  module Cop
5
5
  module Bundler
6
6
  # A Gem's requirements should be listed only once in a Gemfile.
7
+ #
7
8
  # @example
8
9
  # # bad
9
10
  # gem 'rubocop'