rubocop 1.50.2 → 1.57.2

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