rubocop 1.12.0 → 1.16.0

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 (415) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +5 -2
  3. data/config/default.yml +77 -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 +22 -8
  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 +35 -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 +16 -10
  86. data/lib/rubocop/cop/layout/multiline_operation_indentation.rb +4 -0
  87. data/lib/rubocop/cop/layout/redundant_line_break.rb +137 -0
  88. data/lib/rubocop/cop/layout/rescue_ensure_alignment.rb +3 -6
  89. data/lib/rubocop/cop/layout/single_line_block_chain.rb +53 -0
  90. data/lib/rubocop/cop/layout/space_after_colon.rb +1 -3
  91. data/lib/rubocop/cop/layout/space_after_method_name.rb +2 -4
  92. data/lib/rubocop/cop/layout/space_around_block_parameters.rb +6 -14
  93. data/lib/rubocop/cop/layout/space_around_equals_in_parameter_default.rb +1 -2
  94. data/lib/rubocop/cop/layout/space_around_keyword.rb +19 -6
  95. data/lib/rubocop/cop/layout/space_around_operators.rb +4 -9
  96. data/lib/rubocop/cop/layout/space_before_block_braces.rb +1 -2
  97. data/lib/rubocop/cop/layout/space_before_brackets.rb +1 -3
  98. data/lib/rubocop/cop/layout/space_before_comment.rb +1 -3
  99. data/lib/rubocop/cop/layout/space_before_first_arg.rb +5 -11
  100. data/lib/rubocop/cop/layout/space_in_lambda_literal.rb +2 -4
  101. data/lib/rubocop/cop/layout/space_inside_array_literal_brackets.rb +5 -10
  102. data/lib/rubocop/cop/layout/space_inside_array_percent_literal.rb +2 -7
  103. data/lib/rubocop/cop/layout/space_inside_block_braces.rb +5 -10
  104. data/lib/rubocop/cop/layout/space_inside_hash_literal_braces.rb +1 -2
  105. data/lib/rubocop/cop/layout/space_inside_reference_brackets.rb +1 -2
  106. data/lib/rubocop/cop/legacy/corrections_proxy.rb +2 -8
  107. data/lib/rubocop/cop/legacy/corrector.rb +1 -3
  108. data/lib/rubocop/cop/lint/ambiguous_assignment.rb +1 -6
  109. data/lib/rubocop/cop/lint/ambiguous_block_association.rb +14 -7
  110. data/lib/rubocop/cop/lint/boolean_symbol.rb +1 -2
  111. data/lib/rubocop/cop/lint/constant_resolution.rb +1 -2
  112. data/lib/rubocop/cop/lint/deprecated_class_methods.rb +83 -41
  113. data/lib/rubocop/cop/lint/deprecated_constants.rb +3 -3
  114. data/lib/rubocop/cop/lint/deprecated_open_ssl_constant.rb +2 -5
  115. data/lib/rubocop/cop/lint/duplicate_branch.rb +1 -2
  116. data/lib/rubocop/cop/lint/duplicate_hash_key.rb +1 -3
  117. data/lib/rubocop/cop/lint/duplicate_methods.rb +3 -7
  118. data/lib/rubocop/cop/lint/else_layout.rb +1 -3
  119. data/lib/rubocop/cop/lint/empty_block.rb +18 -2
  120. data/lib/rubocop/cop/lint/empty_ensure.rb +1 -3
  121. data/lib/rubocop/cop/lint/empty_file.rb +1 -3
  122. data/lib/rubocop/cop/lint/empty_in_pattern.rb +62 -0
  123. data/lib/rubocop/cop/lint/empty_interpolation.rb +1 -3
  124. data/lib/rubocop/cop/lint/ensure_return.rb +1 -3
  125. data/lib/rubocop/cop/lint/erb_new_arguments.rb +3 -7
  126. data/lib/rubocop/cop/lint/float_out_of_range.rb +1 -2
  127. data/lib/rubocop/cop/lint/format_parameter_mismatch.rb +3 -6
  128. data/lib/rubocop/cop/lint/heredoc_method_call_position.rb +1 -2
  129. data/lib/rubocop/cop/lint/implicit_string_concatenation.rb +1 -2
  130. data/lib/rubocop/cop/lint/ineffective_access_modifier.rb +3 -7
  131. data/lib/rubocop/cop/lint/inherit_exception.rb +1 -2
  132. data/lib/rubocop/cop/lint/interpolation_check.rb +3 -11
  133. data/lib/rubocop/cop/lint/literal_in_interpolation.rb +3 -6
  134. data/lib/rubocop/cop/lint/loop.rb +1 -2
  135. data/lib/rubocop/cop/lint/missing_cop_enable_directive.rb +3 -7
  136. data/lib/rubocop/cop/lint/missing_super.rb +1 -2
  137. data/lib/rubocop/cop/lint/mixed_regexp_capture_types.rb +1 -2
  138. data/lib/rubocop/cop/lint/nested_method_definition.rb +1 -2
  139. data/lib/rubocop/cop/lint/nested_percent_literal.rb +1 -3
  140. data/lib/rubocop/cop/lint/non_deterministic_require_order.rb +1 -3
  141. data/lib/rubocop/cop/lint/number_conversion.rb +4 -5
  142. data/lib/rubocop/cop/lint/ordered_magic_comments.rb +1 -2
  143. data/lib/rubocop/cop/lint/out_of_range_regexp_ref.rb +1 -3
  144. data/lib/rubocop/cop/lint/parentheses_as_grouped_expression.rb +1 -3
  145. data/lib/rubocop/cop/lint/percent_symbol_array.rb +1 -3
  146. data/lib/rubocop/cop/lint/raise_exception.rb +1 -2
  147. data/lib/rubocop/cop/lint/rand_one.rb +1 -2
  148. data/lib/rubocop/cop/lint/redundant_cop_disable_directive.rb +18 -27
  149. data/lib/rubocop/cop/lint/redundant_safe_navigation.rb +1 -3
  150. data/lib/rubocop/cop/lint/redundant_splat_expansion.rb +3 -7
  151. data/lib/rubocop/cop/lint/redundant_string_coercion.rb +1 -2
  152. data/lib/rubocop/cop/lint/redundant_with_index.rb +1 -4
  153. data/lib/rubocop/cop/lint/redundant_with_object.rb +1 -4
  154. data/lib/rubocop/cop/lint/regexp_as_condition.rb +1 -3
  155. data/lib/rubocop/cop/lint/require_parentheses.rb +2 -4
  156. data/lib/rubocop/cop/lint/rescue_exception.rb +1 -2
  157. data/lib/rubocop/cop/lint/rescue_type.rb +2 -7
  158. data/lib/rubocop/cop/lint/return_in_void_context.rb +1 -2
  159. data/lib/rubocop/cop/lint/safe_navigation_chain.rb +1 -2
  160. data/lib/rubocop/cop/lint/safe_navigation_consistency.rb +4 -10
  161. data/lib/rubocop/cop/lint/safe_navigation_with_empty.rb +1 -2
  162. data/lib/rubocop/cop/lint/send_with_mixin_argument.rb +2 -7
  163. data/lib/rubocop/cop/lint/shadowed_argument.rb +4 -11
  164. data/lib/rubocop/cop/lint/shadowed_exception.rb +7 -8
  165. data/lib/rubocop/cop/lint/struct_new_override.rb +1 -2
  166. data/lib/rubocop/cop/lint/symbol_conversion.rb +4 -16
  167. data/lib/rubocop/cop/lint/syntax.rb +1 -3
  168. data/lib/rubocop/cop/lint/to_json.rb +1 -2
  169. data/lib/rubocop/cop/lint/trailing_comma_in_attribute_declaration.rb +1 -3
  170. data/lib/rubocop/cop/lint/underscore_prefixed_variable_name.rb +1 -3
  171. data/lib/rubocop/cop/lint/unreachable_code.rb +2 -5
  172. data/lib/rubocop/cop/lint/unreachable_loop.rb +14 -7
  173. data/lib/rubocop/cop/lint/unused_block_argument.rb +9 -7
  174. data/lib/rubocop/cop/lint/unused_method_argument.rb +1 -2
  175. data/lib/rubocop/cop/lint/useless_access_modifier.rb +2 -4
  176. data/lib/rubocop/cop/lint/useless_assignment.rb +4 -9
  177. data/lib/rubocop/cop/lint/useless_setter_call.rb +1 -3
  178. data/lib/rubocop/cop/lint/void.rb +5 -12
  179. data/lib/rubocop/cop/message_annotator.rb +1 -3
  180. data/lib/rubocop/cop/metrics/block_nesting.rb +2 -7
  181. data/lib/rubocop/cop/metrics/class_length.rb +1 -3
  182. data/lib/rubocop/cop/metrics/cyclomatic_complexity.rb +1 -2
  183. data/lib/rubocop/cop/metrics/module_length.rb +2 -6
  184. data/lib/rubocop/cop/metrics/parameter_lists.rb +2 -5
  185. data/lib/rubocop/cop/metrics/perceived_complexity.rb +1 -2
  186. data/lib/rubocop/cop/metrics/utils/abc_size_calculator.rb +4 -7
  187. data/lib/rubocop/cop/metrics/utils/repeated_attribute_discount.rb +2 -7
  188. data/lib/rubocop/cop/migration/department_name.rb +3 -7
  189. data/lib/rubocop/cop/mixin/alignment.rb +2 -4
  190. data/lib/rubocop/cop/mixin/check_line_breakable.rb +20 -4
  191. data/lib/rubocop/cop/mixin/code_length.rb +1 -3
  192. data/lib/rubocop/cop/mixin/configurable_enforced_style.rb +2 -2
  193. data/lib/rubocop/cop/mixin/configurable_formatting.rb +3 -8
  194. data/lib/rubocop/cop/mixin/def_node.rb +2 -5
  195. data/lib/rubocop/cop/mixin/documentation_comment.rb +2 -5
  196. data/lib/rubocop/cop/mixin/empty_lines_around_body.rb +3 -7
  197. data/lib/rubocop/cop/mixin/empty_parameter.rb +1 -3
  198. data/lib/rubocop/cop/mixin/end_keyword_alignment.rb +1 -3
  199. data/lib/rubocop/cop/mixin/enforce_superclass.rb +2 -6
  200. data/lib/rubocop/cop/mixin/first_element_line_break.rb +1 -3
  201. data/lib/rubocop/cop/mixin/frozen_string_literal.rb +7 -7
  202. data/lib/rubocop/cop/mixin/gem_declaration.rb +13 -0
  203. data/lib/rubocop/cop/mixin/hash_alignment_styles.rb +17 -9
  204. data/lib/rubocop/cop/mixin/hash_transform_method.rb +7 -22
  205. data/lib/rubocop/cop/mixin/interpolation.rb +1 -3
  206. data/lib/rubocop/cop/mixin/line_length_help.rb +2 -4
  207. data/lib/rubocop/cop/mixin/match_range.rb +2 -5
  208. data/lib/rubocop/cop/mixin/method_complexity.rb +1 -3
  209. data/lib/rubocop/cop/mixin/method_preference.rb +1 -2
  210. data/lib/rubocop/cop/mixin/multiline_element_indentation.rb +1 -2
  211. data/lib/rubocop/cop/mixin/multiline_element_line_breaks.rb +1 -3
  212. data/lib/rubocop/cop/mixin/multiline_expression_indentation.rb +7 -37
  213. data/lib/rubocop/cop/mixin/multiline_literal_brace_layout.rb +1 -2
  214. data/lib/rubocop/cop/mixin/negative_conditional.rb +1 -2
  215. data/lib/rubocop/cop/mixin/ordered_gem_node.rb +1 -4
  216. data/lib/rubocop/cop/mixin/percent_array.rb +1 -3
  217. data/lib/rubocop/cop/mixin/percent_literal.rb +0 -6
  218. data/lib/rubocop/cop/mixin/preceding_following_alignment.rb +5 -11
  219. data/lib/rubocop/cop/mixin/preferred_delimiters.rb +3 -6
  220. data/lib/rubocop/cop/mixin/range_help.rb +10 -13
  221. data/lib/rubocop/cop/mixin/rescue_node.rb +2 -6
  222. data/lib/rubocop/cop/mixin/safe_assignment.rb +1 -2
  223. data/lib/rubocop/cop/mixin/space_after_punctuation.rb +2 -4
  224. data/lib/rubocop/cop/mixin/space_before_punctuation.rb +1 -2
  225. data/lib/rubocop/cop/mixin/statement_modifier.rb +1 -3
  226. data/lib/rubocop/cop/mixin/string_literals_help.rb +3 -5
  227. data/lib/rubocop/cop/mixin/symbol_help.rb +13 -0
  228. data/lib/rubocop/cop/mixin/trailing_body.rb +1 -2
  229. data/lib/rubocop/cop/mixin/trailing_comma.rb +1 -2
  230. data/lib/rubocop/cop/mixin/uncommunicative_name.rb +3 -7
  231. data/lib/rubocop/cop/mixin/unused_argument.rb +1 -3
  232. data/lib/rubocop/cop/naming/ascii_identifiers.rb +2 -4
  233. data/lib/rubocop/cop/naming/binary_operator_parameter_name.rb +1 -2
  234. data/lib/rubocop/cop/naming/file_name.rb +7 -16
  235. data/lib/rubocop/cop/naming/memoized_instance_variable_name.rb +2 -3
  236. data/lib/rubocop/cop/naming/method_name.rb +1 -2
  237. data/lib/rubocop/cop/naming/predicate_name.rb +1 -2
  238. data/lib/rubocop/cop/offense.rb +3 -8
  239. data/lib/rubocop/cop/registry.rb +3 -11
  240. data/lib/rubocop/cop/style/access_modifier_declarations.rb +2 -4
  241. data/lib/rubocop/cop/style/accessor_grouping.rb +1 -3
  242. data/lib/rubocop/cop/style/alias.rb +5 -12
  243. data/lib/rubocop/cop/style/and_or.rb +3 -1
  244. data/lib/rubocop/cop/style/arguments_forwarding.rb +1 -3
  245. data/lib/rubocop/cop/style/ascii_comments.rb +1 -2
  246. data/lib/rubocop/cop/style/attr.rb +1 -3
  247. data/lib/rubocop/cop/style/auto_resource_cleanup.rb +2 -5
  248. data/lib/rubocop/cop/style/bisected_attr_accessor/macro.rb +1 -3
  249. data/lib/rubocop/cop/style/case_like_if.rb +1 -2
  250. data/lib/rubocop/cop/style/character_literal.rb +2 -4
  251. data/lib/rubocop/cop/style/class_and_module_children.rb +19 -10
  252. data/lib/rubocop/cop/style/class_methods.rb +1 -3
  253. data/lib/rubocop/cop/style/collection_compact.rb +1 -3
  254. data/lib/rubocop/cop/style/colon_method_call.rb +1 -3
  255. data/lib/rubocop/cop/style/combinable_loops.rb +3 -2
  256. data/lib/rubocop/cop/style/command_literal.rb +3 -8
  257. data/lib/rubocop/cop/style/comment_annotation.rb +3 -6
  258. data/lib/rubocop/cop/style/commented_keyword.rb +7 -13
  259. data/lib/rubocop/cop/style/conditional_assignment.rb +10 -24
  260. data/lib/rubocop/cop/style/copyright.rb +3 -6
  261. data/lib/rubocop/cop/style/date_time.rb +2 -5
  262. data/lib/rubocop/cop/style/def_with_parentheses.rb +1 -2
  263. data/lib/rubocop/cop/style/each_for_simple_loop.rb +1 -2
  264. data/lib/rubocop/cop/style/empty_case_condition.rb +2 -7
  265. data/lib/rubocop/cop/style/empty_else.rb +3 -9
  266. data/lib/rubocop/cop/style/empty_literal.rb +12 -9
  267. data/lib/rubocop/cop/style/empty_method.rb +3 -7
  268. data/lib/rubocop/cop/style/end_block.rb +1 -2
  269. data/lib/rubocop/cop/style/endless_method.rb +1 -3
  270. data/lib/rubocop/cop/style/eval_with_location.rb +2 -4
  271. data/lib/rubocop/cop/style/expand_path_arguments.rb +1 -3
  272. data/lib/rubocop/cop/style/explicit_block_argument.rb +1 -4
  273. data/lib/rubocop/cop/style/format_string_token.rb +1 -4
  274. data/lib/rubocop/cop/style/frozen_string_literal_comment.rb +3 -11
  275. data/lib/rubocop/cop/style/guard_clause.rb +3 -7
  276. data/lib/rubocop/cop/style/hash_conversion.rb +31 -3
  277. data/lib/rubocop/cop/style/hash_each_methods.rb +19 -3
  278. data/lib/rubocop/cop/style/hash_like_case.rb +1 -2
  279. data/lib/rubocop/cop/style/hash_syntax.rb +4 -9
  280. data/lib/rubocop/cop/style/identical_conditional_branches.rb +27 -8
  281. data/lib/rubocop/cop/style/if_unless_modifier.rb +40 -13
  282. data/lib/rubocop/cop/style/in_pattern_then.rb +56 -0
  283. data/lib/rubocop/cop/style/infinite_loop.rb +2 -5
  284. data/lib/rubocop/cop/style/inverse_methods.rb +3 -7
  285. data/lib/rubocop/cop/style/ip_addresses.rb +1 -2
  286. data/lib/rubocop/cop/style/lambda.rb +2 -4
  287. data/lib/rubocop/cop/style/lambda_call.rb +1 -2
  288. data/lib/rubocop/cop/style/line_end_concatenation.rb +5 -12
  289. data/lib/rubocop/cop/style/method_call_with_args_parentheses.rb +7 -3
  290. data/lib/rubocop/cop/style/method_call_with_args_parentheses/omit_parentheses.rb +10 -18
  291. data/lib/rubocop/cop/style/method_call_without_args_parentheses.rb +1 -2
  292. data/lib/rubocop/cop/style/method_called_on_do_end_block.rb +2 -4
  293. data/lib/rubocop/cop/style/method_def_parentheses.rb +4 -8
  294. data/lib/rubocop/cop/style/min_max.rb +1 -2
  295. data/lib/rubocop/cop/style/missing_else.rb +2 -4
  296. data/lib/rubocop/cop/style/missing_respond_to_missing.rb +1 -2
  297. data/lib/rubocop/cop/style/mixin_grouping.rb +4 -10
  298. data/lib/rubocop/cop/style/mixin_usage.rb +1 -2
  299. data/lib/rubocop/cop/style/module_function.rb +3 -6
  300. data/lib/rubocop/cop/style/multiline_block_chain.rb +1 -2
  301. data/lib/rubocop/cop/style/multiline_in_pattern_then.rb +62 -0
  302. data/lib/rubocop/cop/style/multiline_method_signature.rb +11 -6
  303. data/lib/rubocop/cop/style/multiline_ternary_operator.rb +1 -2
  304. data/lib/rubocop/cop/style/multiple_comparison.rb +2 -4
  305. data/lib/rubocop/cop/style/mutable_constant.rb +4 -10
  306. data/lib/rubocop/cop/style/negated_if.rb +1 -2
  307. data/lib/rubocop/cop/style/negated_if_else_condition.rb +17 -9
  308. data/lib/rubocop/cop/style/negated_unless.rb +1 -2
  309. data/lib/rubocop/cop/style/nested_modifier.rb +3 -7
  310. data/lib/rubocop/cop/style/nested_ternary_operator.rb +2 -3
  311. data/lib/rubocop/cop/style/next.rb +4 -9
  312. data/lib/rubocop/cop/style/nil_lambda.rb +29 -12
  313. data/lib/rubocop/cop/style/non_nil_check.rb +2 -5
  314. data/lib/rubocop/cop/style/numeric_literals.rb +3 -11
  315. data/lib/rubocop/cop/style/numeric_predicate.rb +2 -7
  316. data/lib/rubocop/cop/style/one_line_conditional.rb +1 -2
  317. data/lib/rubocop/cop/style/option_hash.rb +1 -3
  318. data/lib/rubocop/cop/style/optional_arguments.rb +2 -5
  319. data/lib/rubocop/cop/style/or_assignment.rb +2 -6
  320. data/lib/rubocop/cop/style/parallel_assignment.rb +6 -9
  321. data/lib/rubocop/cop/style/percent_literal_delimiters.rb +1 -3
  322. data/lib/rubocop/cop/style/percent_q_literals.rb +1 -2
  323. data/lib/rubocop/cop/style/perl_backrefs.rb +2 -9
  324. data/lib/rubocop/cop/style/preferred_hash_methods.rb +1 -4
  325. data/lib/rubocop/cop/style/proc.rb +1 -2
  326. data/lib/rubocop/cop/style/quoted_symbols.rb +105 -0
  327. data/lib/rubocop/cop/style/raise_args.rb +4 -8
  328. data/lib/rubocop/cop/style/random_with_offset.rb +3 -8
  329. data/lib/rubocop/cop/style/redundant_argument.rb +2 -11
  330. data/lib/rubocop/cop/style/redundant_assignment.rb +1 -3
  331. data/lib/rubocop/cop/style/redundant_begin.rb +15 -4
  332. data/lib/rubocop/cop/style/redundant_capital_w.rb +1 -2
  333. data/lib/rubocop/cop/style/redundant_condition.rb +2 -5
  334. data/lib/rubocop/cop/style/redundant_conditional.rb +3 -6
  335. data/lib/rubocop/cop/style/redundant_exception.rb +3 -6
  336. data/lib/rubocop/cop/style/redundant_file_extension_in_require.rb +1 -1
  337. data/lib/rubocop/cop/style/redundant_freeze.rb +1 -2
  338. data/lib/rubocop/cop/style/redundant_interpolation.rb +1 -2
  339. data/lib/rubocop/cop/style/redundant_parentheses.rb +8 -20
  340. data/lib/rubocop/cop/style/redundant_percent_q.rb +1 -2
  341. data/lib/rubocop/cop/style/redundant_regexp_escape.rb +1 -4
  342. data/lib/rubocop/cop/style/redundant_return.rb +3 -5
  343. data/lib/rubocop/cop/style/redundant_self.rb +2 -6
  344. data/lib/rubocop/cop/style/redundant_self_assignment.rb +2 -2
  345. data/lib/rubocop/cop/style/redundant_sort.rb +2 -5
  346. data/lib/rubocop/cop/style/regexp_literal.rb +4 -8
  347. data/lib/rubocop/cop/style/rescue_modifier.rb +4 -0
  348. data/lib/rubocop/cop/style/rescue_standard_error.rb +3 -7
  349. data/lib/rubocop/cop/style/return_nil.rb +1 -2
  350. data/lib/rubocop/cop/style/safe_navigation.rb +10 -21
  351. data/lib/rubocop/cop/style/send.rb +1 -2
  352. data/lib/rubocop/cop/style/signal_exception.rb +3 -7
  353. data/lib/rubocop/cop/style/single_argument_dig.rb +1 -2
  354. data/lib/rubocop/cop/style/single_line_block_params.rb +2 -5
  355. data/lib/rubocop/cop/style/single_line_methods.rb +21 -4
  356. data/lib/rubocop/cop/style/sole_nested_conditional.rb +15 -7
  357. data/lib/rubocop/cop/style/special_global_vars.rb +6 -18
  358. data/lib/rubocop/cop/style/stabby_lambda_parentheses.rb +1 -2
  359. data/lib/rubocop/cop/style/stderr_puts.rb +2 -6
  360. data/lib/rubocop/cop/style/string_chars.rb +2 -1
  361. data/lib/rubocop/cop/style/string_concatenation.rb +8 -10
  362. data/lib/rubocop/cop/style/string_literals.rb +3 -5
  363. data/lib/rubocop/cop/style/string_literals_in_interpolation.rb +1 -0
  364. data/lib/rubocop/cop/style/struct_inheritance.rb +9 -1
  365. data/lib/rubocop/cop/style/symbol_literal.rb +1 -3
  366. data/lib/rubocop/cop/style/symbol_proc.rb +4 -9
  367. data/lib/rubocop/cop/style/ternary_parentheses.rb +3 -6
  368. data/lib/rubocop/cop/style/top_level_method_definition.rb +83 -0
  369. data/lib/rubocop/cop/style/trailing_body_on_method_definition.rb +1 -2
  370. data/lib/rubocop/cop/style/trailing_comma_in_block_args.rb +2 -6
  371. data/lib/rubocop/cop/style/trailing_method_end_statement.rb +2 -5
  372. data/lib/rubocop/cop/style/trailing_underscore_variable.rb +4 -10
  373. data/lib/rubocop/cop/style/trivial_accessors.rb +67 -4
  374. data/lib/rubocop/cop/style/unless_else.rb +1 -2
  375. data/lib/rubocop/cop/style/unless_logical_operators.rb +2 -2
  376. data/lib/rubocop/cop/style/variable_interpolation.rb +1 -1
  377. data/lib/rubocop/cop/style/when_then.rb +4 -2
  378. data/lib/rubocop/cop/style/while_until_modifier.rb +1 -2
  379. data/lib/rubocop/cop/style/word_array.rb +1 -2
  380. data/lib/rubocop/cop/style/yoda_condition.rb +3 -11
  381. data/lib/rubocop/cop/style/zero_length_predicate.rb +1 -2
  382. data/lib/rubocop/cop/team.rb +2 -5
  383. data/lib/rubocop/cop/util.rb +8 -11
  384. data/lib/rubocop/cop/utils/format_string.rb +1 -3
  385. data/lib/rubocop/cop/variable_force.rb +6 -15
  386. data/lib/rubocop/cop/variable_force/assignment.rb +1 -2
  387. data/lib/rubocop/cop/variable_force/branch.rb +16 -2
  388. data/lib/rubocop/cop/variable_force/reference.rb +1 -3
  389. data/lib/rubocop/cop/variable_force/scope.rb +4 -8
  390. data/lib/rubocop/cop/variable_force/variable.rb +2 -4
  391. data/lib/rubocop/cops_documentation_generator.rb +7 -21
  392. data/lib/rubocop/directive_comment.rb +10 -1
  393. data/lib/rubocop/file_finder.rb +1 -3
  394. data/lib/rubocop/formatter/clang_style_formatter.rb +4 -2
  395. data/lib/rubocop/formatter/disabled_config_formatter.rb +3 -8
  396. data/lib/rubocop/formatter/git_hub_actions_formatter.rb +1 -5
  397. data/lib/rubocop/formatter/html_formatter.rb +4 -10
  398. data/lib/rubocop/formatter/json_formatter.rb +1 -5
  399. data/lib/rubocop/formatter/junit_formatter.rb +23 -14
  400. data/lib/rubocop/formatter/progress_formatter.rb +1 -3
  401. data/lib/rubocop/formatter/tap_formatter.rb +4 -2
  402. data/lib/rubocop/options.rb +30 -50
  403. data/lib/rubocop/path_util.rb +1 -3
  404. data/lib/rubocop/rake_task.rb +3 -0
  405. data/lib/rubocop/remote_config.rb +4 -7
  406. data/lib/rubocop/result_cache.rb +5 -12
  407. data/lib/rubocop/rspec/cop_helper.rb +1 -1
  408. data/lib/rubocop/rspec/expect_offense.rb +4 -9
  409. data/lib/rubocop/rspec/shared_contexts.rb +8 -15
  410. data/lib/rubocop/runner.rb +7 -14
  411. data/lib/rubocop/target_finder.rb +18 -16
  412. data/lib/rubocop/target_ruby.rb +4 -8
  413. data/lib/rubocop/version.rb +1 -1
  414. metadata +16 -7
  415. data/lib/rubocop/core_ext/hash.rb +0 -20
@@ -26,23 +26,18 @@ module RuboCop
26
26
  include RangeHelp
27
27
  extend AutoCorrector
28
28
 
29
- MSG = 'Put one space between the method name and ' \
30
- 'the first argument.'
29
+ MSG = 'Put one space between the method name and the first argument.'
31
30
 
32
31
  def on_send(node)
33
32
  return unless regular_method_call_with_arguments?(node)
34
33
 
35
34
  first_arg = node.first_argument.source_range
36
- first_arg_with_space = range_with_surrounding_space(range: first_arg,
37
- side: :left)
38
- space = range_between(first_arg_with_space.begin_pos,
39
- first_arg.begin_pos)
35
+ first_arg_with_space = range_with_surrounding_space(range: first_arg, side: :left)
36
+ space = range_between(first_arg_with_space.begin_pos, first_arg.begin_pos)
40
37
  return if space.length == 1
41
38
  return unless expect_params_after_method_name?(node)
42
39
 
43
- add_offense(space) do |corrector|
44
- corrector.replace(space, ' ')
45
- end
40
+ add_offense(space) { |corrector| corrector.replace(space, ' ') }
46
41
  end
47
42
  alias on_csend on_send
48
43
 
@@ -59,8 +54,7 @@ module RuboCop
59
54
  first_arg = node.first_argument
60
55
 
61
56
  same_line?(first_arg, node) &&
62
- !(allow_for_alignment? &&
63
- aligned_with_something?(first_arg.source_range))
57
+ !(allow_for_alignment? && aligned_with_something?(first_arg.source_range))
64
58
  end
65
59
 
66
60
  def no_space_between_method_name_and_first_argument?(node)
@@ -24,10 +24,8 @@ module RuboCop
24
24
  include RangeHelp
25
25
  extend AutoCorrector
26
26
 
27
- MSG_REQUIRE_SPACE = 'Use a space between `->` and ' \
28
- '`(` in lambda literals.'
29
- MSG_REQUIRE_NO_SPACE = 'Do not use spaces between `->` and ' \
30
- '`(` in lambda literals.'
27
+ MSG_REQUIRE_SPACE = 'Use a space between `->` and `(` in lambda literals.'
28
+ MSG_REQUIRE_NO_SPACE = 'Do not use spaces between `->` and `(` in lambda literals.'
31
29
 
32
30
  def on_send(node)
33
31
  return unless arrow_lambda_with_args?(node)
@@ -142,11 +142,9 @@ module RuboCop
142
142
  case style
143
143
  when :no_space
144
144
  start_ok = next_to_comment?(node, left)
145
- no_space_offenses(node, left, right, MSG, start_ok: start_ok,
146
- end_ok: end_ok)
145
+ no_space_offenses(node, left, right, MSG, start_ok: start_ok, end_ok: end_ok)
147
146
  when :space
148
- space_offenses(node, left, right, MSG, start_ok: start_ok,
149
- end_ok: end_ok)
147
+ space_offenses(node, left, right, MSG, start_ok: start_ok, end_ok: end_ok)
150
148
  else
151
149
  compact_offenses(node, left, right, start_ok, end_ok)
152
150
  end
@@ -160,21 +158,18 @@ module RuboCop
160
158
  if qualifies_for_compact?(node, left, side: :left)
161
159
  compact_offense(node, left, side: :left)
162
160
  elsif !multi_dimensional_array?(node, left, side: :left)
163
- space_offenses(node, left, nil, MSG, start_ok: start_ok,
164
- end_ok: true)
161
+ space_offenses(node, left, nil, MSG, start_ok: start_ok, end_ok: true)
165
162
  end
166
163
  if qualifies_for_compact?(node, right)
167
164
  compact_offense(node, right)
168
165
  elsif !multi_dimensional_array?(node, right)
169
- space_offenses(node, nil, right, MSG, start_ok: true,
170
- end_ok: end_ok)
166
+ space_offenses(node, nil, right, MSG, start_ok: true, end_ok: end_ok)
171
167
  end
172
168
  end
173
169
 
174
170
  def qualifies_for_compact?(node, token, side: :right)
175
171
  if side == :right
176
- multi_dimensional_array?(node, token) &&
177
- !next_to_bracket?(token)
172
+ multi_dimensional_array?(node, token) && !next_to_bracket?(token)
178
173
  else
179
174
  multi_dimensional_array?(node, token, side: :left) &&
180
175
  !next_to_bracket?(token, side: :left)
@@ -18,8 +18,7 @@ module RuboCop
18
18
  extend AutoCorrector
19
19
 
20
20
  MSG = 'Use only a single space inside array percent literal.'
21
- MULTIPLE_SPACES_BETWEEN_ITEMS_REGEX =
22
- /(?:[\S&&[^\\]](?:\\ )*)( {2,})(?=\S)/.freeze
21
+ MULTIPLE_SPACES_BETWEEN_ITEMS_REGEX = /(?:[\S&&[^\\]](?:\\ )*)( {2,})(?=\S)/.freeze
23
22
 
24
23
  def on_array(node)
25
24
  process(node, '%i', '%I', '%w', '%W')
@@ -36,11 +35,7 @@ module RuboCop
36
35
  private
37
36
 
38
37
  def each_unnecessary_space_match(node, &blk)
39
- each_match_range(
40
- contents_range(node),
41
- MULTIPLE_SPACES_BETWEEN_ITEMS_REGEX,
42
- &blk
43
- )
38
+ each_match_range(contents_range(node), MULTIPLE_SPACES_BETWEEN_ITEMS_REGEX, &blk)
44
39
  end
45
40
  end
46
41
  end
@@ -129,8 +129,7 @@ module RuboCop
129
129
  args_delimiter = node.arguments.loc.begin # Can be ( | or nil.
130
130
 
131
131
  check_left_brace(inner, node.loc.begin, args_delimiter)
132
- check_right_brace(inner, node.loc.begin, node.loc.end,
133
- node.single_line?)
132
+ check_right_brace(inner, node.loc.begin, node.loc.end, node.single_line?)
134
133
  end
135
134
 
136
135
  def check_left_brace(inner, left_brace, args_delimiter)
@@ -143,8 +142,7 @@ module RuboCop
143
142
 
144
143
  def check_right_brace(inner, left_brace, right_brace, single_line)
145
144
  if single_line && /\S$/.match?(inner)
146
- no_space(right_brace.begin_pos, right_brace.end_pos,
147
- 'Space missing inside }.')
145
+ no_space(right_brace.begin_pos, right_brace.end_pos, 'Space missing inside }.')
148
146
  else
149
147
  return if multiline_block?(left_brace, right_brace) &&
150
148
  aligned_braces?(left_brace, right_brace)
@@ -174,8 +172,7 @@ module RuboCop
174
172
  # We indicate the position after the left brace. Otherwise it's
175
173
  # difficult to distinguish between space missing to the left and to
176
174
  # the right of the brace in autocorrect.
177
- no_space(left_brace.end_pos, left_brace.end_pos + 1,
178
- 'Space missing inside {.')
175
+ no_space(left_brace.end_pos, left_brace.end_pos + 1, 'Space missing inside {.')
179
176
  end
180
177
  end
181
178
 
@@ -188,8 +185,7 @@ module RuboCop
188
185
  'Space between { and | detected.')
189
186
  end
190
187
  else
191
- brace_with_space = range_with_surrounding_space(range: left_brace,
192
- side: :right)
188
+ brace_with_space = range_with_surrounding_space(range: left_brace, side: :right)
193
189
  space(brace_with_space.begin_pos + 1, brace_with_space.end_pos,
194
190
  'Space inside { detected.')
195
191
  end
@@ -200,8 +196,7 @@ module RuboCop
200
196
  end
201
197
 
202
198
  def space_inside_right_brace(right_brace)
203
- brace_with_space = range_with_surrounding_space(range: right_brace,
204
- side: :left)
199
+ brace_with_space = range_with_surrounding_space(range: right_brace, side: :left)
205
200
  space(brace_with_space.begin_pos, brace_with_space.end_pos - 1,
206
201
  'Space inside } detected.')
207
202
  end
@@ -90,8 +90,7 @@ module RuboCop
90
90
  expect_space = expect_space?(token1, token2)
91
91
 
92
92
  if offense?(token1, expect_space)
93
- incorrect_style_detected(token1, token2,
94
- expect_space, is_empty_braces)
93
+ incorrect_style_detected(token1, token2, expect_space, is_empty_braces)
95
94
  else
96
95
  correct_style_detected
97
96
  end
@@ -107,8 +107,7 @@ module RuboCop
107
107
  current_token = tokens.reverse.find(&:left_ref_bracket?)
108
108
  previous_token = previous_token(current_token)
109
109
 
110
- if node.method?(:[]=) ||
111
- previous_token && !previous_token.right_bracket?
110
+ if node.method?(:[]=) || previous_token && !previous_token.right_bracket?
112
111
  tokens.find(&:left_ref_bracket?)
113
112
  else
114
113
  current_token
@@ -11,11 +11,7 @@ module RuboCop
11
11
  end
12
12
 
13
13
  def <<(callable)
14
- suppress_clobbering do
15
- @corrector.transaction do
16
- callable.call(@corrector)
17
- end
18
- end
14
+ suppress_clobbering { @corrector.transaction { callable.call(@corrector) } }
19
15
  end
20
16
 
21
17
  def empty?
@@ -24,9 +20,7 @@ module RuboCop
24
20
 
25
21
  def concat(corrections)
26
22
  if corrections.is_a?(CorrectionsProxy)
27
- suppress_clobbering do
28
- corrector.merge!(corrections.corrector)
29
- end
23
+ suppress_clobbering { corrector.merge!(corrections.corrector) }
30
24
  else
31
25
  corrections.each { |correction| self << correction }
32
26
  end
@@ -13,9 +13,7 @@ module RuboCop
13
13
  merge!(corr.send(:corrector))
14
14
  else
15
15
  # warn "Corrector.new with corrections is deprecated." unless corr.empty? TODO
16
- corr.each do |c|
17
- corrections << c
18
- end
16
+ corr.each { |c| corrections << c }
19
17
  end
20
18
  end
21
19
 
@@ -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