rubocop 1.12.1 → 1.16.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (412) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +5 -2
  3. data/config/default.yml +78 -8
  4. data/exe/rubocop +1 -3
  5. data/lib/rubocop.rb +10 -1
  6. data/lib/rubocop/cached_data.rb +1 -3
  7. data/lib/rubocop/cli.rb +4 -6
  8. data/lib/rubocop/cli/command/auto_genenerate_config.rb +9 -19
  9. data/lib/rubocop/cli/command/init_dotfile.rb +1 -3
  10. data/lib/rubocop/cli/command/show_cops.rb +1 -4
  11. data/lib/rubocop/comment_config.rb +2 -7
  12. data/lib/rubocop/config.rb +11 -26
  13. data/lib/rubocop/config_loader.rb +5 -11
  14. data/lib/rubocop/config_loader_resolver.rb +22 -14
  15. data/lib/rubocop/config_obsoletion/cop_rule.rb +1 -2
  16. data/lib/rubocop/config_store.rb +1 -2
  17. data/lib/rubocop/config_validator.rb +5 -10
  18. data/lib/rubocop/cop/autocorrect_logic.rb +3 -8
  19. data/lib/rubocop/cop/badge.rb +1 -2
  20. data/lib/rubocop/cop/base.rb +8 -6
  21. data/lib/rubocop/cop/bundler/duplicated_gem.rb +1 -2
  22. data/lib/rubocop/cop/bundler/gem_comment.rb +43 -11
  23. data/lib/rubocop/cop/bundler/gem_version.rb +99 -0
  24. data/lib/rubocop/cop/bundler/ordered_gems.rb +1 -4
  25. data/lib/rubocop/cop/commissioner.rb +2 -8
  26. data/lib/rubocop/cop/cop.rb +4 -18
  27. data/lib/rubocop/cop/corrector.rb +1 -4
  28. data/lib/rubocop/cop/correctors/alignment_corrector.rb +3 -6
  29. data/lib/rubocop/cop/correctors/each_to_for_corrector.rb +2 -4
  30. data/lib/rubocop/cop/correctors/for_to_each_corrector.rb +1 -2
  31. data/lib/rubocop/cop/correctors/line_break_corrector.rb +3 -6
  32. data/lib/rubocop/cop/correctors/multiline_literal_brace_corrector.rb +1 -3
  33. data/lib/rubocop/cop/correctors/ordered_gem_corrector.rb +1 -3
  34. data/lib/rubocop/cop/correctors/percent_literal_corrector.rb +2 -8
  35. data/lib/rubocop/cop/gemspec/duplicated_assignment.rb +1 -2
  36. data/lib/rubocop/cop/gemspec/ordered_dependencies.rb +1 -4
  37. data/lib/rubocop/cop/generator.rb +1 -4
  38. data/lib/rubocop/cop/generator/configuration_injector.rb +1 -2
  39. data/lib/rubocop/cop/generator/require_file_injector.rb +2 -5
  40. data/lib/rubocop/cop/internal_affairs/example_description.rb +7 -5
  41. data/lib/rubocop/cop/internal_affairs/method_name_equal.rb +2 -5
  42. data/lib/rubocop/cop/internal_affairs/node_destructuring.rb +1 -3
  43. data/lib/rubocop/cop/internal_affairs/node_type_predicate.rb +1 -3
  44. data/lib/rubocop/cop/internal_affairs/offense_location_keyword.rb +1 -2
  45. data/lib/rubocop/cop/internal_affairs/style_detected_api_use.rb +1 -2
  46. data/lib/rubocop/cop/internal_affairs/useless_message_assertion.rb +1 -3
  47. data/lib/rubocop/cop/layout/access_modifier_indentation.rb +1 -2
  48. data/lib/rubocop/cop/layout/argument_alignment.rb +30 -14
  49. data/lib/rubocop/cop/layout/assignment_indentation.rb +2 -4
  50. data/lib/rubocop/cop/layout/begin_end_alignment.rb +1 -4
  51. data/lib/rubocop/cop/layout/block_alignment.rb +7 -19
  52. data/lib/rubocop/cop/layout/case_indentation.rb +57 -11
  53. data/lib/rubocop/cop/layout/class_structure.rb +4 -10
  54. data/lib/rubocop/cop/layout/closing_parenthesis_indentation.rb +4 -15
  55. data/lib/rubocop/cop/layout/comment_indentation.rb +1 -5
  56. data/lib/rubocop/cop/layout/def_end_alignment.rb +2 -6
  57. data/lib/rubocop/cop/layout/dot_position.rb +1 -3
  58. data/lib/rubocop/cop/layout/else_alignment.rb +1 -3
  59. data/lib/rubocop/cop/layout/empty_comment.rb +5 -12
  60. data/lib/rubocop/cop/layout/empty_line_after_guard_clause.rb +2 -5
  61. data/lib/rubocop/cop/layout/empty_line_between_defs.rb +2 -6
  62. data/lib/rubocop/cop/layout/empty_lines.rb +1 -3
  63. data/lib/rubocop/cop/layout/empty_lines_around_access_modifier.rb +8 -18
  64. data/lib/rubocop/cop/layout/empty_lines_around_exception_handling_keywords.rb +2 -8
  65. data/lib/rubocop/cop/layout/end_alignment.rb +1 -2
  66. data/lib/rubocop/cop/layout/end_of_line.rb +1 -1
  67. data/lib/rubocop/cop/layout/extra_spacing.rb +3 -7
  68. data/lib/rubocop/cop/layout/first_array_element_indentation.rb +1 -2
  69. data/lib/rubocop/cop/layout/first_array_element_line_break.rb +1 -2
  70. data/lib/rubocop/cop/layout/first_hash_element_indentation.rb +14 -5
  71. data/lib/rubocop/cop/layout/first_hash_element_line_break.rb +1 -2
  72. data/lib/rubocop/cop/layout/first_method_argument_line_break.rb +1 -2
  73. data/lib/rubocop/cop/layout/first_method_parameter_line_break.rb +1 -2
  74. data/lib/rubocop/cop/layout/hash_alignment.rb +36 -15
  75. data/lib/rubocop/cop/layout/heredoc_argument_closing_parenthesis.rb +2 -9
  76. data/lib/rubocop/cop/layout/heredoc_indentation.rb +2 -6
  77. data/lib/rubocop/cop/layout/indentation_style.rb +1 -3
  78. data/lib/rubocop/cop/layout/indentation_width.rb +6 -4
  79. data/lib/rubocop/cop/layout/initial_indentation.rb +1 -4
  80. data/lib/rubocop/cop/layout/line_length.rb +4 -15
  81. data/lib/rubocop/cop/layout/multiline_array_line_breaks.rb +1 -2
  82. data/lib/rubocop/cop/layout/multiline_block_layout.rb +7 -15
  83. data/lib/rubocop/cop/layout/multiline_hash_key_line_breaks.rb +1 -2
  84. data/lib/rubocop/cop/layout/multiline_method_argument_line_breaks.rb +1 -2
  85. data/lib/rubocop/cop/layout/multiline_method_call_indentation.rb +4 -10
  86. data/lib/rubocop/cop/layout/redundant_line_break.rb +137 -0
  87. data/lib/rubocop/cop/layout/rescue_ensure_alignment.rb +3 -6
  88. data/lib/rubocop/cop/layout/single_line_block_chain.rb +53 -0
  89. data/lib/rubocop/cop/layout/space_after_colon.rb +1 -3
  90. data/lib/rubocop/cop/layout/space_after_method_name.rb +2 -4
  91. data/lib/rubocop/cop/layout/space_around_block_parameters.rb +6 -14
  92. data/lib/rubocop/cop/layout/space_around_equals_in_parameter_default.rb +1 -2
  93. data/lib/rubocop/cop/layout/space_around_keyword.rb +19 -6
  94. data/lib/rubocop/cop/layout/space_around_operators.rb +4 -9
  95. data/lib/rubocop/cop/layout/space_before_block_braces.rb +1 -2
  96. data/lib/rubocop/cop/layout/space_before_brackets.rb +1 -3
  97. data/lib/rubocop/cop/layout/space_before_comment.rb +1 -3
  98. data/lib/rubocop/cop/layout/space_before_first_arg.rb +5 -11
  99. data/lib/rubocop/cop/layout/space_in_lambda_literal.rb +2 -4
  100. data/lib/rubocop/cop/layout/space_inside_array_literal_brackets.rb +5 -10
  101. data/lib/rubocop/cop/layout/space_inside_array_percent_literal.rb +2 -7
  102. data/lib/rubocop/cop/layout/space_inside_block_braces.rb +5 -10
  103. data/lib/rubocop/cop/layout/space_inside_hash_literal_braces.rb +1 -2
  104. data/lib/rubocop/cop/layout/space_inside_reference_brackets.rb +1 -2
  105. data/lib/rubocop/cop/legacy/corrections_proxy.rb +2 -8
  106. data/lib/rubocop/cop/legacy/corrector.rb +1 -3
  107. data/lib/rubocop/cop/lint/ambiguous_assignment.rb +1 -6
  108. data/lib/rubocop/cop/lint/ambiguous_block_association.rb +14 -7
  109. data/lib/rubocop/cop/lint/boolean_symbol.rb +1 -2
  110. data/lib/rubocop/cop/lint/constant_resolution.rb +1 -2
  111. data/lib/rubocop/cop/lint/deprecated_class_methods.rb +83 -41
  112. data/lib/rubocop/cop/lint/deprecated_constants.rb +3 -3
  113. data/lib/rubocop/cop/lint/deprecated_open_ssl_constant.rb +2 -5
  114. data/lib/rubocop/cop/lint/duplicate_branch.rb +1 -2
  115. data/lib/rubocop/cop/lint/duplicate_hash_key.rb +1 -3
  116. data/lib/rubocop/cop/lint/duplicate_methods.rb +3 -7
  117. data/lib/rubocop/cop/lint/else_layout.rb +1 -3
  118. data/lib/rubocop/cop/lint/empty_block.rb +18 -2
  119. data/lib/rubocop/cop/lint/empty_ensure.rb +1 -3
  120. data/lib/rubocop/cop/lint/empty_file.rb +1 -3
  121. data/lib/rubocop/cop/lint/empty_in_pattern.rb +62 -0
  122. data/lib/rubocop/cop/lint/empty_interpolation.rb +1 -3
  123. data/lib/rubocop/cop/lint/ensure_return.rb +1 -3
  124. data/lib/rubocop/cop/lint/erb_new_arguments.rb +3 -7
  125. data/lib/rubocop/cop/lint/float_out_of_range.rb +1 -2
  126. data/lib/rubocop/cop/lint/format_parameter_mismatch.rb +3 -6
  127. data/lib/rubocop/cop/lint/heredoc_method_call_position.rb +1 -2
  128. data/lib/rubocop/cop/lint/implicit_string_concatenation.rb +1 -2
  129. data/lib/rubocop/cop/lint/ineffective_access_modifier.rb +3 -7
  130. data/lib/rubocop/cop/lint/inherit_exception.rb +1 -2
  131. data/lib/rubocop/cop/lint/interpolation_check.rb +3 -11
  132. data/lib/rubocop/cop/lint/literal_in_interpolation.rb +3 -6
  133. data/lib/rubocop/cop/lint/loop.rb +1 -2
  134. data/lib/rubocop/cop/lint/missing_cop_enable_directive.rb +3 -7
  135. data/lib/rubocop/cop/lint/missing_super.rb +1 -2
  136. data/lib/rubocop/cop/lint/mixed_regexp_capture_types.rb +1 -2
  137. data/lib/rubocop/cop/lint/nested_method_definition.rb +1 -2
  138. data/lib/rubocop/cop/lint/nested_percent_literal.rb +1 -3
  139. data/lib/rubocop/cop/lint/non_deterministic_require_order.rb +1 -3
  140. data/lib/rubocop/cop/lint/number_conversion.rb +2 -3
  141. data/lib/rubocop/cop/lint/ordered_magic_comments.rb +1 -2
  142. data/lib/rubocop/cop/lint/out_of_range_regexp_ref.rb +1 -3
  143. data/lib/rubocop/cop/lint/parentheses_as_grouped_expression.rb +1 -3
  144. data/lib/rubocop/cop/lint/percent_symbol_array.rb +1 -3
  145. data/lib/rubocop/cop/lint/raise_exception.rb +1 -2
  146. data/lib/rubocop/cop/lint/rand_one.rb +1 -2
  147. data/lib/rubocop/cop/lint/redundant_cop_disable_directive.rb +18 -27
  148. data/lib/rubocop/cop/lint/redundant_safe_navigation.rb +1 -3
  149. data/lib/rubocop/cop/lint/redundant_splat_expansion.rb +3 -7
  150. data/lib/rubocop/cop/lint/redundant_string_coercion.rb +1 -2
  151. data/lib/rubocop/cop/lint/redundant_with_index.rb +1 -4
  152. data/lib/rubocop/cop/lint/redundant_with_object.rb +1 -4
  153. data/lib/rubocop/cop/lint/regexp_as_condition.rb +1 -3
  154. data/lib/rubocop/cop/lint/require_parentheses.rb +2 -4
  155. data/lib/rubocop/cop/lint/rescue_exception.rb +1 -2
  156. data/lib/rubocop/cop/lint/rescue_type.rb +2 -7
  157. data/lib/rubocop/cop/lint/return_in_void_context.rb +1 -2
  158. data/lib/rubocop/cop/lint/safe_navigation_chain.rb +1 -2
  159. data/lib/rubocop/cop/lint/safe_navigation_consistency.rb +4 -10
  160. data/lib/rubocop/cop/lint/safe_navigation_with_empty.rb +1 -2
  161. data/lib/rubocop/cop/lint/send_with_mixin_argument.rb +2 -7
  162. data/lib/rubocop/cop/lint/shadowed_argument.rb +4 -11
  163. data/lib/rubocop/cop/lint/shadowed_exception.rb +7 -8
  164. data/lib/rubocop/cop/lint/struct_new_override.rb +1 -2
  165. data/lib/rubocop/cop/lint/symbol_conversion.rb +4 -16
  166. data/lib/rubocop/cop/lint/syntax.rb +1 -3
  167. data/lib/rubocop/cop/lint/to_json.rb +1 -2
  168. data/lib/rubocop/cop/lint/trailing_comma_in_attribute_declaration.rb +1 -3
  169. data/lib/rubocop/cop/lint/underscore_prefixed_variable_name.rb +1 -3
  170. data/lib/rubocop/cop/lint/unreachable_code.rb +2 -5
  171. data/lib/rubocop/cop/lint/unreachable_loop.rb +14 -7
  172. data/lib/rubocop/cop/lint/unused_block_argument.rb +9 -7
  173. data/lib/rubocop/cop/lint/unused_method_argument.rb +1 -2
  174. data/lib/rubocop/cop/lint/useless_access_modifier.rb +2 -4
  175. data/lib/rubocop/cop/lint/useless_assignment.rb +4 -9
  176. data/lib/rubocop/cop/lint/useless_setter_call.rb +1 -3
  177. data/lib/rubocop/cop/lint/void.rb +5 -12
  178. data/lib/rubocop/cop/message_annotator.rb +1 -3
  179. data/lib/rubocop/cop/metrics/block_nesting.rb +2 -7
  180. data/lib/rubocop/cop/metrics/class_length.rb +1 -3
  181. data/lib/rubocop/cop/metrics/cyclomatic_complexity.rb +1 -2
  182. data/lib/rubocop/cop/metrics/module_length.rb +2 -6
  183. data/lib/rubocop/cop/metrics/parameter_lists.rb +2 -5
  184. data/lib/rubocop/cop/metrics/perceived_complexity.rb +1 -2
  185. data/lib/rubocop/cop/metrics/utils/abc_size_calculator.rb +4 -7
  186. data/lib/rubocop/cop/metrics/utils/repeated_attribute_discount.rb +2 -7
  187. data/lib/rubocop/cop/migration/department_name.rb +3 -7
  188. data/lib/rubocop/cop/mixin/alignment.rb +2 -4
  189. data/lib/rubocop/cop/mixin/check_line_breakable.rb +19 -3
  190. data/lib/rubocop/cop/mixin/code_length.rb +1 -3
  191. data/lib/rubocop/cop/mixin/configurable_enforced_style.rb +2 -2
  192. data/lib/rubocop/cop/mixin/configurable_formatting.rb +3 -8
  193. data/lib/rubocop/cop/mixin/def_node.rb +2 -5
  194. data/lib/rubocop/cop/mixin/documentation_comment.rb +2 -5
  195. data/lib/rubocop/cop/mixin/empty_lines_around_body.rb +3 -7
  196. data/lib/rubocop/cop/mixin/empty_parameter.rb +1 -3
  197. data/lib/rubocop/cop/mixin/end_keyword_alignment.rb +1 -3
  198. data/lib/rubocop/cop/mixin/enforce_superclass.rb +2 -6
  199. data/lib/rubocop/cop/mixin/first_element_line_break.rb +1 -3
  200. data/lib/rubocop/cop/mixin/frozen_string_literal.rb +7 -7
  201. data/lib/rubocop/cop/mixin/gem_declaration.rb +13 -0
  202. data/lib/rubocop/cop/mixin/hash_alignment_styles.rb +17 -9
  203. data/lib/rubocop/cop/mixin/hash_transform_method.rb +7 -22
  204. data/lib/rubocop/cop/mixin/interpolation.rb +1 -3
  205. data/lib/rubocop/cop/mixin/line_length_help.rb +2 -4
  206. data/lib/rubocop/cop/mixin/match_range.rb +2 -5
  207. data/lib/rubocop/cop/mixin/method_complexity.rb +1 -3
  208. data/lib/rubocop/cop/mixin/method_preference.rb +1 -2
  209. data/lib/rubocop/cop/mixin/multiline_element_indentation.rb +1 -2
  210. data/lib/rubocop/cop/mixin/multiline_element_line_breaks.rb +1 -3
  211. data/lib/rubocop/cop/mixin/multiline_expression_indentation.rb +7 -17
  212. data/lib/rubocop/cop/mixin/multiline_literal_brace_layout.rb +1 -2
  213. data/lib/rubocop/cop/mixin/negative_conditional.rb +1 -2
  214. data/lib/rubocop/cop/mixin/ordered_gem_node.rb +1 -4
  215. data/lib/rubocop/cop/mixin/percent_array.rb +1 -3
  216. data/lib/rubocop/cop/mixin/percent_literal.rb +0 -6
  217. data/lib/rubocop/cop/mixin/preceding_following_alignment.rb +5 -11
  218. data/lib/rubocop/cop/mixin/preferred_delimiters.rb +3 -6
  219. data/lib/rubocop/cop/mixin/range_help.rb +10 -13
  220. data/lib/rubocop/cop/mixin/rescue_node.rb +2 -6
  221. data/lib/rubocop/cop/mixin/safe_assignment.rb +1 -2
  222. data/lib/rubocop/cop/mixin/space_after_punctuation.rb +2 -4
  223. data/lib/rubocop/cop/mixin/space_before_punctuation.rb +1 -2
  224. data/lib/rubocop/cop/mixin/statement_modifier.rb +1 -3
  225. data/lib/rubocop/cop/mixin/string_literals_help.rb +3 -5
  226. data/lib/rubocop/cop/mixin/symbol_help.rb +13 -0
  227. data/lib/rubocop/cop/mixin/trailing_body.rb +1 -2
  228. data/lib/rubocop/cop/mixin/trailing_comma.rb +1 -2
  229. data/lib/rubocop/cop/mixin/uncommunicative_name.rb +3 -7
  230. data/lib/rubocop/cop/mixin/unused_argument.rb +1 -3
  231. data/lib/rubocop/cop/naming/ascii_identifiers.rb +2 -4
  232. data/lib/rubocop/cop/naming/binary_operator_parameter_name.rb +1 -2
  233. data/lib/rubocop/cop/naming/file_name.rb +7 -16
  234. data/lib/rubocop/cop/naming/memoized_instance_variable_name.rb +2 -3
  235. data/lib/rubocop/cop/naming/method_name.rb +1 -2
  236. data/lib/rubocop/cop/naming/predicate_name.rb +1 -2
  237. data/lib/rubocop/cop/offense.rb +3 -8
  238. data/lib/rubocop/cop/registry.rb +3 -11
  239. data/lib/rubocop/cop/style/access_modifier_declarations.rb +1 -3
  240. data/lib/rubocop/cop/style/accessor_grouping.rb +1 -3
  241. data/lib/rubocop/cop/style/alias.rb +5 -12
  242. data/lib/rubocop/cop/style/arguments_forwarding.rb +1 -3
  243. data/lib/rubocop/cop/style/ascii_comments.rb +1 -2
  244. data/lib/rubocop/cop/style/attr.rb +1 -3
  245. data/lib/rubocop/cop/style/auto_resource_cleanup.rb +2 -5
  246. data/lib/rubocop/cop/style/bisected_attr_accessor/macro.rb +1 -3
  247. data/lib/rubocop/cop/style/case_like_if.rb +1 -2
  248. data/lib/rubocop/cop/style/character_literal.rb +2 -4
  249. data/lib/rubocop/cop/style/class_and_module_children.rb +19 -10
  250. data/lib/rubocop/cop/style/class_methods.rb +1 -3
  251. data/lib/rubocop/cop/style/collection_compact.rb +1 -3
  252. data/lib/rubocop/cop/style/colon_method_call.rb +1 -3
  253. data/lib/rubocop/cop/style/combinable_loops.rb +3 -2
  254. data/lib/rubocop/cop/style/command_literal.rb +3 -8
  255. data/lib/rubocop/cop/style/comment_annotation.rb +3 -6
  256. data/lib/rubocop/cop/style/commented_keyword.rb +2 -8
  257. data/lib/rubocop/cop/style/conditional_assignment.rb +10 -24
  258. data/lib/rubocop/cop/style/copyright.rb +3 -6
  259. data/lib/rubocop/cop/style/date_time.rb +2 -5
  260. data/lib/rubocop/cop/style/def_with_parentheses.rb +1 -2
  261. data/lib/rubocop/cop/style/each_for_simple_loop.rb +1 -2
  262. data/lib/rubocop/cop/style/empty_case_condition.rb +2 -7
  263. data/lib/rubocop/cop/style/empty_else.rb +3 -9
  264. data/lib/rubocop/cop/style/empty_literal.rb +12 -9
  265. data/lib/rubocop/cop/style/empty_method.rb +3 -7
  266. data/lib/rubocop/cop/style/end_block.rb +1 -2
  267. data/lib/rubocop/cop/style/endless_method.rb +1 -3
  268. data/lib/rubocop/cop/style/eval_with_location.rb +2 -4
  269. data/lib/rubocop/cop/style/expand_path_arguments.rb +1 -3
  270. data/lib/rubocop/cop/style/explicit_block_argument.rb +1 -4
  271. data/lib/rubocop/cop/style/format_string_token.rb +1 -4
  272. data/lib/rubocop/cop/style/frozen_string_literal_comment.rb +3 -8
  273. data/lib/rubocop/cop/style/guard_clause.rb +3 -7
  274. data/lib/rubocop/cop/style/hash_conversion.rb +28 -3
  275. data/lib/rubocop/cop/style/hash_each_methods.rb +19 -3
  276. data/lib/rubocop/cop/style/hash_like_case.rb +1 -2
  277. data/lib/rubocop/cop/style/hash_syntax.rb +4 -9
  278. data/lib/rubocop/cop/style/identical_conditional_branches.rb +27 -8
  279. data/lib/rubocop/cop/style/if_unless_modifier.rb +40 -13
  280. data/lib/rubocop/cop/style/in_pattern_then.rb +56 -0
  281. data/lib/rubocop/cop/style/infinite_loop.rb +2 -5
  282. data/lib/rubocop/cop/style/inverse_methods.rb +3 -7
  283. data/lib/rubocop/cop/style/ip_addresses.rb +1 -2
  284. data/lib/rubocop/cop/style/lambda.rb +2 -4
  285. data/lib/rubocop/cop/style/lambda_call.rb +1 -2
  286. data/lib/rubocop/cop/style/line_end_concatenation.rb +5 -12
  287. data/lib/rubocop/cop/style/method_call_with_args_parentheses.rb +1 -1
  288. data/lib/rubocop/cop/style/method_call_with_args_parentheses/omit_parentheses.rb +7 -12
  289. data/lib/rubocop/cop/style/method_call_without_args_parentheses.rb +1 -2
  290. data/lib/rubocop/cop/style/method_called_on_do_end_block.rb +2 -4
  291. data/lib/rubocop/cop/style/method_def_parentheses.rb +4 -8
  292. data/lib/rubocop/cop/style/min_max.rb +1 -2
  293. data/lib/rubocop/cop/style/missing_else.rb +2 -4
  294. data/lib/rubocop/cop/style/missing_respond_to_missing.rb +1 -2
  295. data/lib/rubocop/cop/style/mixin_grouping.rb +4 -10
  296. data/lib/rubocop/cop/style/mixin_usage.rb +1 -2
  297. data/lib/rubocop/cop/style/module_function.rb +3 -6
  298. data/lib/rubocop/cop/style/multiline_block_chain.rb +1 -2
  299. data/lib/rubocop/cop/style/multiline_in_pattern_then.rb +62 -0
  300. data/lib/rubocop/cop/style/multiline_method_signature.rb +1 -3
  301. data/lib/rubocop/cop/style/multiline_ternary_operator.rb +1 -2
  302. data/lib/rubocop/cop/style/multiline_when_then.rb +2 -11
  303. data/lib/rubocop/cop/style/multiple_comparison.rb +2 -4
  304. data/lib/rubocop/cop/style/mutable_constant.rb +4 -10
  305. data/lib/rubocop/cop/style/negated_if.rb +1 -2
  306. data/lib/rubocop/cop/style/negated_if_else_condition.rb +17 -9
  307. data/lib/rubocop/cop/style/negated_unless.rb +1 -2
  308. data/lib/rubocop/cop/style/nested_modifier.rb +3 -7
  309. data/lib/rubocop/cop/style/nested_ternary_operator.rb +2 -3
  310. data/lib/rubocop/cop/style/next.rb +4 -9
  311. data/lib/rubocop/cop/style/nil_lambda.rb +29 -12
  312. data/lib/rubocop/cop/style/non_nil_check.rb +2 -5
  313. data/lib/rubocop/cop/style/numeric_literals.rb +3 -11
  314. data/lib/rubocop/cop/style/numeric_predicate.rb +2 -7
  315. data/lib/rubocop/cop/style/one_line_conditional.rb +1 -2
  316. data/lib/rubocop/cop/style/option_hash.rb +1 -3
  317. data/lib/rubocop/cop/style/optional_arguments.rb +2 -5
  318. data/lib/rubocop/cop/style/or_assignment.rb +2 -6
  319. data/lib/rubocop/cop/style/parallel_assignment.rb +6 -9
  320. data/lib/rubocop/cop/style/percent_literal_delimiters.rb +1 -3
  321. data/lib/rubocop/cop/style/percent_q_literals.rb +1 -2
  322. data/lib/rubocop/cop/style/perl_backrefs.rb +2 -9
  323. data/lib/rubocop/cop/style/preferred_hash_methods.rb +1 -4
  324. data/lib/rubocop/cop/style/proc.rb +1 -2
  325. data/lib/rubocop/cop/style/quoted_symbols.rb +110 -0
  326. data/lib/rubocop/cop/style/raise_args.rb +4 -8
  327. data/lib/rubocop/cop/style/random_with_offset.rb +3 -8
  328. data/lib/rubocop/cop/style/redundant_argument.rb +2 -11
  329. data/lib/rubocop/cop/style/redundant_assignment.rb +1 -3
  330. data/lib/rubocop/cop/style/redundant_begin.rb +4 -4
  331. data/lib/rubocop/cop/style/redundant_capital_w.rb +1 -2
  332. data/lib/rubocop/cop/style/redundant_condition.rb +2 -5
  333. data/lib/rubocop/cop/style/redundant_conditional.rb +3 -6
  334. data/lib/rubocop/cop/style/redundant_exception.rb +3 -6
  335. data/lib/rubocop/cop/style/redundant_file_extension_in_require.rb +1 -1
  336. data/lib/rubocop/cop/style/redundant_freeze.rb +1 -2
  337. data/lib/rubocop/cop/style/redundant_interpolation.rb +1 -2
  338. data/lib/rubocop/cop/style/redundant_parentheses.rb +8 -20
  339. data/lib/rubocop/cop/style/redundant_percent_q.rb +1 -2
  340. data/lib/rubocop/cop/style/redundant_regexp_escape.rb +1 -4
  341. data/lib/rubocop/cop/style/redundant_return.rb +3 -5
  342. data/lib/rubocop/cop/style/redundant_self.rb +25 -7
  343. data/lib/rubocop/cop/style/redundant_self_assignment.rb +2 -2
  344. data/lib/rubocop/cop/style/redundant_sort.rb +2 -5
  345. data/lib/rubocop/cop/style/regexp_literal.rb +4 -8
  346. data/lib/rubocop/cop/style/rescue_modifier.rb +4 -0
  347. data/lib/rubocop/cop/style/rescue_standard_error.rb +3 -7
  348. data/lib/rubocop/cop/style/return_nil.rb +1 -2
  349. data/lib/rubocop/cop/style/safe_navigation.rb +10 -21
  350. data/lib/rubocop/cop/style/send.rb +1 -2
  351. data/lib/rubocop/cop/style/signal_exception.rb +3 -7
  352. data/lib/rubocop/cop/style/single_argument_dig.rb +1 -2
  353. data/lib/rubocop/cop/style/single_line_block_params.rb +2 -5
  354. data/lib/rubocop/cop/style/single_line_methods.rb +20 -4
  355. data/lib/rubocop/cop/style/sole_nested_conditional.rb +15 -7
  356. data/lib/rubocop/cop/style/special_global_vars.rb +6 -18
  357. data/lib/rubocop/cop/style/stabby_lambda_parentheses.rb +1 -2
  358. data/lib/rubocop/cop/style/stderr_puts.rb +2 -6
  359. data/lib/rubocop/cop/style/string_chars.rb +2 -1
  360. data/lib/rubocop/cop/style/string_concatenation.rb +8 -10
  361. data/lib/rubocop/cop/style/string_literals.rb +3 -5
  362. data/lib/rubocop/cop/style/string_literals_in_interpolation.rb +1 -0
  363. data/lib/rubocop/cop/style/struct_inheritance.rb +9 -1
  364. data/lib/rubocop/cop/style/symbol_literal.rb +1 -3
  365. data/lib/rubocop/cop/style/symbol_proc.rb +4 -9
  366. data/lib/rubocop/cop/style/ternary_parentheses.rb +3 -6
  367. data/lib/rubocop/cop/style/top_level_method_definition.rb +83 -0
  368. data/lib/rubocop/cop/style/trailing_body_on_method_definition.rb +1 -2
  369. data/lib/rubocop/cop/style/trailing_comma_in_block_args.rb +2 -6
  370. data/lib/rubocop/cop/style/trailing_method_end_statement.rb +2 -5
  371. data/lib/rubocop/cop/style/trailing_underscore_variable.rb +4 -10
  372. data/lib/rubocop/cop/style/trivial_accessors.rb +67 -4
  373. data/lib/rubocop/cop/style/unless_else.rb +1 -2
  374. data/lib/rubocop/cop/style/unless_logical_operators.rb +2 -2
  375. data/lib/rubocop/cop/style/variable_interpolation.rb +1 -1
  376. data/lib/rubocop/cop/style/when_then.rb +4 -2
  377. data/lib/rubocop/cop/style/while_until_modifier.rb +1 -2
  378. data/lib/rubocop/cop/style/word_array.rb +1 -2
  379. data/lib/rubocop/cop/style/yoda_condition.rb +3 -11
  380. data/lib/rubocop/cop/style/zero_length_predicate.rb +1 -2
  381. data/lib/rubocop/cop/team.rb +2 -5
  382. data/lib/rubocop/cop/util.rb +4 -10
  383. data/lib/rubocop/cop/utils/format_string.rb +1 -3
  384. data/lib/rubocop/cop/variable_force.rb +6 -15
  385. data/lib/rubocop/cop/variable_force/assignment.rb +1 -2
  386. data/lib/rubocop/cop/variable_force/branch.rb +16 -2
  387. data/lib/rubocop/cop/variable_force/reference.rb +1 -3
  388. data/lib/rubocop/cop/variable_force/scope.rb +4 -8
  389. data/lib/rubocop/cop/variable_force/variable.rb +2 -4
  390. data/lib/rubocop/cops_documentation_generator.rb +7 -21
  391. data/lib/rubocop/directive_comment.rb +5 -1
  392. data/lib/rubocop/file_finder.rb +1 -3
  393. data/lib/rubocop/formatter/disabled_config_formatter.rb +3 -8
  394. data/lib/rubocop/formatter/git_hub_actions_formatter.rb +1 -5
  395. data/lib/rubocop/formatter/html_formatter.rb +4 -10
  396. data/lib/rubocop/formatter/json_formatter.rb +1 -5
  397. data/lib/rubocop/formatter/junit_formatter.rb +23 -14
  398. data/lib/rubocop/formatter/progress_formatter.rb +1 -3
  399. data/lib/rubocop/options.rb +30 -50
  400. data/lib/rubocop/path_util.rb +1 -3
  401. data/lib/rubocop/rake_task.rb +3 -0
  402. data/lib/rubocop/remote_config.rb +4 -7
  403. data/lib/rubocop/result_cache.rb +5 -12
  404. data/lib/rubocop/rspec/cop_helper.rb +1 -1
  405. data/lib/rubocop/rspec/expect_offense.rb +4 -9
  406. data/lib/rubocop/rspec/shared_contexts.rb +8 -15
  407. data/lib/rubocop/runner.rb +7 -14
  408. data/lib/rubocop/target_finder.rb +18 -16
  409. data/lib/rubocop/target_ruby.rb +4 -8
  410. data/lib/rubocop/version.rb +1 -1
  411. metadata +16 -7
  412. data/lib/rubocop/core_ext/hash.rb +0 -20
@@ -25,12 +25,7 @@ module RuboCop
25
25
 
26
26
  SIMPLE_ASSIGNMENT_TYPES = %i[lvasgn ivasgn cvasgn gvasgn casgn].freeze
27
27
 
28
- MISTAKES = {
29
- '=-' => '-=',
30
- '=+' => '+=',
31
- '=*' => '*=',
32
- '=!' => '!='
33
- }.freeze
28
+ MISTAKES = { '=-' => '-=', '=+' => '+=', '=*' => '*=', '=!' => '!=' }.freeze
34
29
 
35
30
  def on_asgn(node)
36
31
  return unless (rhs = rhs(node))
@@ -6,6 +6,8 @@ module RuboCop
6
6
  # This cop checks for ambiguous block association with method
7
7
  # when param passed without parentheses.
8
8
  #
9
+ # This cop can customize ignored methods with `IgnoredMethods`.
10
+ #
9
11
  # @example
10
12
  #
11
13
  # # bad
@@ -26,7 +28,14 @@ module RuboCop
26
28
  # # good
27
29
  # # Lambda arguments require no disambiguation
28
30
  # foo = ->(bar) { bar.baz }
31
+ #
32
+ # @example IgnoredMethods: [change]
33
+ #
34
+ # # good
35
+ # expect { do_something }.to change { object.attribute }
29
36
  class AmbiguousBlockAssociation < Base
37
+ include IgnoredMethods
38
+
30
39
  MSG = 'Parenthesize the param `%<param>s` to make sure that the ' \
31
40
  'block will be associated with the `%<method>s` method ' \
32
41
  'call.'
@@ -35,8 +44,7 @@ module RuboCop
35
44
  return unless node.arguments?
36
45
 
37
46
  return unless ambiguous_block_association?(node)
38
- return if node.parenthesized? ||
39
- node.last_argument.lambda? || allowed_method?(node)
47
+ return if node.parenthesized? || node.last_argument.lambda? || allowed_method?(node)
40
48
 
41
49
  message = message(node)
42
50
 
@@ -47,19 +55,18 @@ module RuboCop
47
55
  private
48
56
 
49
57
  def ambiguous_block_association?(send_node)
50
- send_node.last_argument.block_type? &&
51
- !send_node.last_argument.send_node.arguments?
58
+ send_node.last_argument.block_type? && !send_node.last_argument.send_node.arguments?
52
59
  end
53
60
 
54
61
  def allowed_method?(node)
55
- node.assignment? || node.operator_method? || node.method?(:[])
62
+ node.assignment? || node.operator_method? || node.method?(:[]) ||
63
+ ignored_method?(node.last_argument.send_node.source)
56
64
  end
57
65
 
58
66
  def message(send_node)
59
67
  block_param = send_node.last_argument
60
68
 
61
- format(MSG, param: block_param.source,
62
- method: block_param.send_node.source)
69
+ format(MSG, param: block_param.source, method: block_param.send_node.source)
63
70
  end
64
71
  end
65
72
  end
@@ -24,8 +24,7 @@ module RuboCop
24
24
  class BooleanSymbol < Base
25
25
  extend AutoCorrector
26
26
 
27
- MSG = 'Symbol with a boolean name - ' \
28
- 'you probably meant to use `%<boolean>s`.'
27
+ MSG = 'Symbol with a boolean name - you probably meant to use `%<boolean>s`.'
29
28
 
30
29
  # @!method boolean_symbol?(node)
31
30
  def_node_matcher :boolean_symbol?, '(sym {:true :false})'
@@ -73,8 +73,7 @@ module RuboCop
73
73
 
74
74
  def const_name?(name)
75
75
  name = name.to_s
76
- (allowed_names.empty? || allowed_names.include?(name)) &&
77
- !ignored_names.include?(name)
76
+ (allowed_names.empty? || allowed_names.include?(name)) && !ignored_names.include?(name)
78
77
  end
79
78
 
80
79
  def allowed_names
@@ -12,6 +12,8 @@ module RuboCop
12
12
  # File.exists?(some_path)
13
13
  # Dir.exists?(some_path)
14
14
  # iterator?
15
+ # Socket.gethostbyname(host)
16
+ # Socket.gethostbyaddr(host)
15
17
  #
16
18
  # @example
17
19
  #
@@ -20,21 +22,23 @@ module RuboCop
20
22
  # File.exist?(some_path)
21
23
  # Dir.exist?(some_path)
22
24
  # block_given?
25
+ # Addrinfo.getaddrinfo(nodename, service)
26
+ # Addrinfo.tcp(host, port).getnameinfo
23
27
  class DeprecatedClassMethods < Base
24
28
  extend AutoCorrector
25
29
 
26
30
  # Inner class to DeprecatedClassMethods.
27
- # This class exists to add abstraction and clean naming to the
28
- # objects that are going to be operated on.
31
+ # This class exists to add abstraction and clean naming
32
+ # to the deprecated objects
29
33
  class DeprecatedClassMethod
30
34
  include RuboCop::AST::Sexp
31
35
 
32
- attr_reader :class_constant, :deprecated_method, :replacement_method
36
+ attr_reader :method, :class_constant
33
37
 
34
- def initialize(deprecated:, replacement:, class_constant: nil)
35
- @deprecated_method = deprecated
36
- @replacement_method = replacement
38
+ def initialize(method, class_constant: nil, correctable: true)
39
+ @method = method
37
40
  @class_constant = class_constant
41
+ @correctable = correctable
38
42
  end
39
43
 
40
44
  def class_nodes
@@ -48,29 +52,80 @@ module RuboCop
48
52
  [nil]
49
53
  end
50
54
  end
55
+
56
+ def correctable?
57
+ @correctable
58
+ end
59
+
60
+ def to_s
61
+ [class_constant, method].compact.join(delimeter)
62
+ end
63
+
64
+ private
65
+
66
+ def delimeter
67
+ CLASS_METHOD_DELIMETER
68
+ end
69
+ end
70
+
71
+ # Inner class to DeprecatedClassMethods.
72
+ # This class exists to add abstraction and clean naming
73
+ # to the replacements for deprecated objects
74
+ class Replacement
75
+ attr_reader :method, :class_constant
76
+
77
+ def initialize(method, class_constant: nil, instance_method: false)
78
+ @method = method
79
+ @class_constant = class_constant
80
+ @instance_method = instance_method
81
+ end
82
+
83
+ def to_s
84
+ [class_constant, method].compact.join(delimeter)
85
+ end
86
+
87
+ private
88
+
89
+ def delimeter
90
+ instance_method? ? INSTANCE_METHOD_DELIMETER : CLASS_METHOD_DELIMETER
91
+ end
92
+
93
+ def instance_method?
94
+ @instance_method
95
+ end
51
96
  end
52
97
 
53
98
  MSG = '`%<current>s` is deprecated in favor of `%<prefer>s`.'
54
- DEPRECATED_METHODS_OBJECT = [
55
- DeprecatedClassMethod.new(deprecated: :exists?,
56
- replacement: :exist?,
57
- class_constant: :File),
58
- DeprecatedClassMethod.new(deprecated: :exists?,
59
- replacement: :exist?,
60
- class_constant: :Dir),
61
- DeprecatedClassMethod.new(deprecated: :iterator?,
62
- replacement: :block_given?)
63
- ].freeze
64
-
65
- RESTRICT_ON_SEND = DEPRECATED_METHODS_OBJECT.map(&:deprecated_method).freeze
99
+
100
+ DEPRECATED_METHODS_OBJECT = {
101
+ DeprecatedClassMethod.new(:exists?, class_constant: :File) =>
102
+ Replacement.new(:exist?, class_constant: :File),
103
+
104
+ DeprecatedClassMethod.new(:exists?, class_constant: :Dir) =>
105
+ Replacement.new(:exist?, class_constant: :Dir),
106
+
107
+ DeprecatedClassMethod.new(:iterator?) => Replacement.new(:block_given?),
108
+
109
+ DeprecatedClassMethod.new(:gethostbyaddr, class_constant: :Socket, correctable: false) =>
110
+ Replacement.new(:getnameinfo, class_constant: :Addrinfo, instance_method: true),
111
+
112
+ DeprecatedClassMethod.new(:gethostbyname, class_constant: :Socket, correctable: false) =>
113
+ Replacement.new(:getaddrinfo, class_constant: :Addrinfo, instance_method: true)
114
+ }.freeze
115
+
116
+ RESTRICT_ON_SEND = DEPRECATED_METHODS_OBJECT.keys.map(&:method).freeze
117
+
118
+ CLASS_METHOD_DELIMETER = '.'
119
+ INSTANCE_METHOD_DELIMETER = '#'
66
120
 
67
121
  def on_send(node)
68
- check(node) do |data|
69
- message = format(MSG, current: deprecated_method(data),
70
- prefer: replacement_method(data))
122
+ check(node) do |deprecated|
123
+ message = format(MSG, current: deprecated, prefer: replacement(deprecated))
71
124
 
72
125
  add_offense(node.loc.selector, message: message) do |corrector|
73
- corrector.replace(node.loc.selector, data.replacement_method.to_s)
126
+ if deprecated.correctable?
127
+ corrector.replace(node.loc.selector, replacement(deprecated).method)
128
+ end
74
129
  end
75
130
  end
76
131
  end
@@ -78,29 +133,16 @@ module RuboCop
78
133
  private
79
134
 
80
135
  def check(node)
81
- DEPRECATED_METHODS_OBJECT.each do |data|
82
- next unless data.class_nodes.include?(node.receiver)
83
- next unless node.method?(data.deprecated_method)
136
+ DEPRECATED_METHODS_OBJECT.each_key do |deprecated|
137
+ next unless deprecated.class_nodes.include?(node.receiver)
138
+ next unless node.method?(deprecated.method)
84
139
 
85
- yield data
140
+ yield deprecated
86
141
  end
87
142
  end
88
143
 
89
- def deprecated_method(data)
90
- method_call(data.class_constant, data.deprecated_method)
91
- end
92
-
93
- def replacement_method(data)
94
- method_call(data.class_constant, data.replacement_method)
95
- end
96
-
97
- def method_call(class_constant, method)
98
- if class_constant
99
- format('%<constant>s.%<method>s', constant: class_constant,
100
- method: method)
101
- else
102
- format('%<method>s', method: method)
103
- end
144
+ def replacement(deprecated)
145
+ DEPRECATED_METHODS_OBJECT[deprecated]
104
146
  end
105
147
  end
106
148
  end
@@ -42,7 +42,7 @@ module RuboCop
42
42
  # Maybe further investigation of RuboCop AST will lead to an essential solution.
43
43
  return unless node.loc
44
44
 
45
- constant = node.absolute? ? consntant_name(node, node.short_name.to_s) : node.source
45
+ constant = node.absolute? ? constant_name(node, node.short_name.to_s) : node.source
46
46
  return unless (deprecated_constant = deprecated_constants[constant])
47
47
 
48
48
  alternative = deprecated_constant['Alternative']
@@ -55,10 +55,10 @@ module RuboCop
55
55
 
56
56
  private
57
57
 
58
- def consntant_name(node, nested_constant_name)
58
+ def constant_name(node, nested_constant_name)
59
59
  return nested_constant_name unless node.namespace.const_type?
60
60
 
61
- consntant_name(node.namespace, "#{node.namespace.short_name}::#{nested_constant_name}")
61
+ constant_name(node.namespace, "#{node.namespace.short_name}::#{nested_constant_name}")
62
62
  end
63
63
 
64
64
  def message(good, bad, deprecated_version)
@@ -41,8 +41,7 @@ module RuboCop
41
41
  include RangeHelp
42
42
  extend AutoCorrector
43
43
 
44
- MSG = 'Use `%<constant>s.%<method>s(%<replacement_args>s)`' \
45
- ' instead of `%<original>s`.'
44
+ MSG = 'Use `%<constant>s.%<method>s(%<replacement_args>s)` instead of `%<original>s`.'
46
45
 
47
46
  NO_ARG_ALGORITHM = %w[BF DES IDEA RC4].freeze
48
47
 
@@ -62,9 +61,7 @@ module RuboCop
62
61
 
63
62
  message = message(node)
64
63
 
65
- add_offense(node, message: message) do |corrector|
66
- autocorrect(corrector, node)
67
- end
64
+ add_offense(node, message: message) { |corrector| autocorrect(corrector, node) }
68
65
  end
69
66
 
70
67
  private
@@ -104,8 +104,7 @@ module RuboCop
104
104
  def offense_range(duplicate_branch)
105
105
  parent = duplicate_branch.parent
106
106
 
107
- if parent.respond_to?(:else_branch) &&
108
- parent.else_branch.equal?(duplicate_branch)
107
+ if parent.respond_to?(:else_branch) && parent.else_branch.equal?(duplicate_branch)
109
108
  if parent.if_type? && parent.ternary?
110
109
  duplicate_branch.source_range
111
110
  else
@@ -28,9 +28,7 @@ module RuboCop
28
28
 
29
29
  return unless duplicates?(keys)
30
30
 
31
- consecutive_duplicates(keys).each do |key|
32
- add_offense(key)
33
- end
31
+ consecutive_duplicates(keys).each { |key| add_offense(key) }
34
32
  end
35
33
  end
36
34
  end
@@ -50,11 +50,9 @@ module RuboCop
50
50
  #
51
51
  # alias bar foo
52
52
  class DuplicateMethods < Base
53
- MSG = 'Method `%<method>s` is defined at both %<defined>s and ' \
54
- '%<current>s.'
53
+ MSG = 'Method `%<method>s` is defined at both %<defined>s and %<current>s.'
55
54
 
56
- RESTRICT_ON_SEND = %i[alias_method attr_reader attr_writer
57
- attr_accessor attr].freeze
55
+ RESTRICT_ON_SEND = %i[alias_method attr_reader attr_writer attr_accessor attr].freeze
58
56
 
59
57
  def initialize(config = nil, options = nil)
60
58
  super
@@ -192,9 +190,7 @@ module RuboCop
192
190
  namespace, mod_name = *ancestor.defined_module
193
191
  loop do
194
192
  if mod_name == const_name
195
- return qualified_name(ancestor.parent_module_name,
196
- namespace,
197
- mod_name)
193
+ return qualified_name(ancestor.parent_module_name, namespace, mod_name)
198
194
  end
199
195
 
200
196
  break if namespace.nil?
@@ -74,9 +74,7 @@ module RuboCop
74
74
  return unless first_else
75
75
  return unless first_else.source_range.line == node.loc.else.line
76
76
 
77
- add_offense(first_else) do |corrector|
78
- autocorrect(corrector, node, first_else)
79
- end
77
+ add_offense(first_else) { |corrector| autocorrect(corrector, node, first_else) }
80
78
  end
81
79
 
82
80
  def autocorrect(corrector, node, first_else)
@@ -7,7 +7,11 @@ module RuboCop
7
7
  # Such empty blocks are typically an oversight or we should provide a comment
8
8
  # be clearer what we're aiming for.
9
9
  #
10
- # Empty lambdas are ignored by default.
10
+ # Empty lambdas and procs are ignored by default.
11
+ #
12
+ # NOTE: For backwards compatibility, the configuration that allows/disallows
13
+ # empty lambdas and procs is called `AllowEmptyLambdas`, even though it also
14
+ # applies to procs.
11
15
  #
12
16
  # @example
13
17
  # # bad
@@ -40,6 +44,10 @@ module RuboCop
40
44
  # end
41
45
  # (callable || placeholder).call
42
46
  #
47
+ # proc { }
48
+ #
49
+ # Proc.new { }
50
+ #
43
51
  # @example AllowEmptyLambdas: false
44
52
  # # bad
45
53
  # allow(subject).to receive(:callable).and_return(-> {})
@@ -48,12 +56,16 @@ module RuboCop
48
56
  # end
49
57
  # (callable || placeholder).call
50
58
  #
59
+ # proc { }
60
+ #
61
+ # Proc.new { }
62
+ #
51
63
  class EmptyBlock < Base
52
64
  MSG = 'Empty block detected.'
53
65
 
54
66
  def on_block(node)
55
67
  return if node.body
56
- return if allow_empty_lambdas? && node.lambda?
68
+ return if allow_empty_lambdas? && lambda_or_proc?(node)
57
69
  return if cop_config['AllowComments'] && allow_comment?(node)
58
70
 
59
71
  add_offense(node)
@@ -76,6 +88,10 @@ module RuboCop
76
88
  regexp_pattern = "# rubocop : (disable|todo) ([^,],)* (all|#{cop_name})"
77
89
  Regexp.new(regexp_pattern.gsub(' ', '\s*')).match?(comment)
78
90
  end
91
+
92
+ def lambda_or_proc?(node)
93
+ node.lambda? || node.proc?
94
+ end
79
95
  end
80
96
  end
81
97
  end
@@ -50,9 +50,7 @@ module RuboCop
50
50
  def on_ensure(node)
51
51
  return if node.body
52
52
 
53
- add_offense(node.loc.keyword) do |corrector|
54
- corrector.remove(node.loc.keyword)
55
- end
53
+ add_offense(node.loc.keyword) { |corrector| corrector.remove(node.loc.keyword) }
56
54
  end
57
55
  end
58
56
  end
@@ -40,9 +40,7 @@ module RuboCop
40
40
  end
41
41
 
42
42
  def contains_only_comments?
43
- processed_source.lines.all? do |line|
44
- line.blank? || comment_line?(line)
45
- end
43
+ processed_source.lines.all? { |line| line.blank? || comment_line?(line) }
46
44
  end
47
45
  end
48
46
  end
@@ -0,0 +1,62 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ module Cop
5
+ module Lint
6
+ # This cop checks for the presence of `in` pattern branches without a body.
7
+ #
8
+ # @example
9
+ #
10
+ # # bad
11
+ # case condition
12
+ # in [a]
13
+ # do_something
14
+ # in [a, b]
15
+ # end
16
+ #
17
+ # # good
18
+ # case condition
19
+ # in [a]
20
+ # do_something
21
+ # in [a, b]
22
+ # nil
23
+ # end
24
+ #
25
+ # @example AllowComments: true (default)
26
+ #
27
+ # # good
28
+ # case condition
29
+ # in [a]
30
+ # do_something
31
+ # in [a, b]
32
+ # # noop
33
+ # end
34
+ #
35
+ # @example AllowComments: false
36
+ #
37
+ # # bad
38
+ # case condition
39
+ # in [a]
40
+ # do_something
41
+ # in [a, b]
42
+ # # noop
43
+ # end
44
+ #
45
+ class EmptyInPattern < Base
46
+ extend TargetRubyVersion
47
+
48
+ MSG = 'Avoid `in` branches without a body.'
49
+
50
+ minimum_target_ruby_version 2.7
51
+
52
+ def on_case_match(node)
53
+ node.in_pattern_branches.each do |branch|
54
+ next if branch.body || cop_config['AllowComments'] && comment_lines?(node)
55
+
56
+ add_offense(branch)
57
+ end
58
+ end
59
+ end
60
+ end
61
+ end
62
+ end