rubocop 0.85.1 → 0.89.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 (409) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +16 -4
  3. data/bin/rubocop-profile +32 -0
  4. data/config/default.yml +227 -26
  5. data/lib/rubocop/cli/command/auto_genenerate_config.rb +42 -7
  6. data/lib/rubocop/cli/command/base.rb +1 -0
  7. data/lib/rubocop/cli/command/execute_runner.rb +1 -1
  8. data/lib/rubocop/cli/command/init_dotfile.rb +1 -1
  9. data/lib/rubocop/cli/command/show_cops.rb +3 -3
  10. data/lib/rubocop/cli/command/version.rb +2 -2
  11. data/lib/rubocop/cli.rb +2 -4
  12. data/lib/rubocop/comment_config.rb +5 -7
  13. data/lib/rubocop/config.rb +21 -4
  14. data/lib/rubocop/config_loader.rb +41 -69
  15. data/lib/rubocop/config_loader_resolver.rb +4 -4
  16. data/lib/rubocop/config_obsoletion.rb +6 -2
  17. data/lib/rubocop/config_store.rb +4 -0
  18. data/lib/rubocop/config_validator.rb +2 -4
  19. data/lib/rubocop/cop/autocorrect_logic.rb +14 -24
  20. data/lib/rubocop/cop/badge.rb +1 -1
  21. data/lib/rubocop/cop/base.rb +407 -0
  22. data/lib/rubocop/cop/bundler/insecure_protocol_source.rb +10 -20
  23. data/lib/rubocop/cop/commissioner.rb +47 -50
  24. data/lib/rubocop/cop/cop.rb +85 -236
  25. data/lib/rubocop/cop/corrector.rb +38 -115
  26. data/lib/rubocop/cop/correctors/line_break_corrector.rb +4 -4
  27. data/lib/rubocop/cop/correctors/multiline_literal_brace_corrector.rb +26 -0
  28. data/lib/rubocop/cop/correctors/percent_literal_corrector.rb +2 -2
  29. data/lib/rubocop/cop/correctors/punctuation_corrector.rb +1 -1
  30. data/lib/rubocop/cop/correctors/unused_arg_corrector.rb +15 -18
  31. data/lib/rubocop/cop/force.rb +1 -0
  32. data/lib/rubocop/cop/gemspec/required_ruby_version.rb +39 -13
  33. data/lib/rubocop/cop/gemspec/ruby_version_globals_usage.rb +1 -1
  34. data/lib/rubocop/cop/generator/configuration_injector.rb +3 -3
  35. data/lib/rubocop/cop/generator.rb +1 -1
  36. data/lib/rubocop/cop/internal_affairs/method_name_equal.rb +4 -12
  37. data/lib/rubocop/cop/internal_affairs/node_destructuring.rb +1 -1
  38. data/lib/rubocop/cop/internal_affairs/node_type_predicate.rb +11 -14
  39. data/lib/rubocop/cop/internal_affairs/offense_location_keyword.rb +8 -8
  40. data/lib/rubocop/cop/internal_affairs/redundant_location_argument.rb +10 -7
  41. data/lib/rubocop/cop/internal_affairs/redundant_message_argument.rb +7 -8
  42. data/lib/rubocop/cop/internal_affairs/useless_message_assertion.rb +2 -2
  43. data/lib/rubocop/cop/layout/block_alignment.rb +1 -1
  44. data/lib/rubocop/cop/layout/case_indentation.rb +18 -19
  45. data/lib/rubocop/cop/layout/class_structure.rb +5 -44
  46. data/lib/rubocop/cop/layout/comment_indentation.rb +4 -4
  47. data/lib/rubocop/cop/layout/empty_comment.rb +1 -1
  48. data/lib/rubocop/cop/layout/empty_lines.rb +0 -2
  49. data/lib/rubocop/cop/layout/empty_lines_around_access_modifier.rb +1 -0
  50. data/lib/rubocop/cop/layout/empty_lines_around_attribute_accessor.rb +3 -8
  51. data/lib/rubocop/cop/layout/end_alignment.rb +3 -2
  52. data/lib/rubocop/cop/layout/end_of_line.rb +1 -1
  53. data/lib/rubocop/cop/layout/extra_spacing.rb +22 -36
  54. data/lib/rubocop/cop/layout/first_argument_indentation.rb +5 -1
  55. data/lib/rubocop/cop/layout/first_array_element_line_break.rb +1 -1
  56. data/lib/rubocop/cop/layout/first_method_argument_line_break.rb +1 -1
  57. data/lib/rubocop/cop/layout/hash_alignment.rb +2 -3
  58. data/lib/rubocop/cop/layout/heredoc_indentation.rb +2 -2
  59. data/lib/rubocop/cop/layout/indentation_style.rb +0 -2
  60. data/lib/rubocop/cop/layout/leading_comment_space.rb +1 -1
  61. data/lib/rubocop/cop/layout/multiline_block_layout.rb +17 -7
  62. data/lib/rubocop/cop/layout/multiline_method_argument_line_breaks.rb +1 -1
  63. data/lib/rubocop/cop/layout/rescue_ensure_alignment.rb +0 -2
  64. data/lib/rubocop/cop/layout/space_after_colon.rb +1 -1
  65. data/lib/rubocop/cop/layout/space_around_block_parameters.rb +22 -27
  66. data/lib/rubocop/cop/layout/space_around_keyword.rb +2 -2
  67. data/lib/rubocop/cop/layout/space_around_method_call_operator.rb +33 -66
  68. data/lib/rubocop/cop/layout/space_around_operators.rb +1 -1
  69. data/lib/rubocop/cop/layout/space_before_block_braces.rb +14 -0
  70. data/lib/rubocop/cop/layout/space_inside_array_literal_brackets.rb +4 -3
  71. data/lib/rubocop/cop/layout/space_inside_block_braces.rb +1 -1
  72. data/lib/rubocop/cop/layout/space_inside_hash_literal_braces.rb +2 -2
  73. data/lib/rubocop/cop/legacy/corrections_proxy.rb +49 -0
  74. data/lib/rubocop/cop/legacy/corrector.rb +29 -0
  75. data/lib/rubocop/cop/lint/ambiguous_block_association.rb +7 -4
  76. data/lib/rubocop/cop/lint/ambiguous_operator.rb +15 -10
  77. data/lib/rubocop/cop/lint/ambiguous_regexp_literal.rb +11 -13
  78. data/lib/rubocop/cop/lint/assignment_in_condition.rb +2 -2
  79. data/lib/rubocop/cop/lint/big_decimal_new.rb +10 -10
  80. data/lib/rubocop/cop/lint/binary_operator_with_identical_operands.rb +50 -0
  81. data/lib/rubocop/cop/lint/boolean_symbol.rb +16 -11
  82. data/lib/rubocop/cop/lint/circular_argument_reference.rb +1 -1
  83. data/lib/rubocop/cop/lint/constant_resolution.rb +89 -0
  84. data/lib/rubocop/cop/lint/debugger.rb +7 -1
  85. data/lib/rubocop/cop/lint/deprecated_class_methods.rb +9 -10
  86. data/lib/rubocop/cop/lint/deprecated_open_ssl_constant.rb +21 -17
  87. data/lib/rubocop/cop/lint/disjunctive_assignment_in_constructor.rb +8 -2
  88. data/lib/rubocop/cop/lint/duplicate_case_condition.rb +1 -1
  89. data/lib/rubocop/cop/lint/duplicate_elsif_condition.rb +39 -0
  90. data/lib/rubocop/cop/lint/duplicate_hash_key.rb +1 -1
  91. data/lib/rubocop/cop/lint/duplicate_methods.rb +9 -6
  92. data/lib/rubocop/cop/lint/duplicate_rescue_exception.rb +60 -0
  93. data/lib/rubocop/cop/lint/each_with_object_argument.rb +1 -1
  94. data/lib/rubocop/cop/lint/else_layout.rb +1 -1
  95. data/lib/rubocop/cop/lint/empty_conditional_body.rb +67 -0
  96. data/lib/rubocop/cop/lint/empty_ensure.rb +5 -5
  97. data/lib/rubocop/cop/lint/empty_expression.rb +2 -2
  98. data/lib/rubocop/cop/lint/empty_interpolation.rb +5 -6
  99. data/lib/rubocop/cop/lint/empty_when.rb +2 -2
  100. data/lib/rubocop/cop/lint/ensure_return.rb +27 -29
  101. data/lib/rubocop/cop/lint/erb_new_arguments.rb +11 -10
  102. data/lib/rubocop/cop/lint/flip_flop.rb +1 -1
  103. data/lib/rubocop/cop/lint/float_comparison.rb +93 -0
  104. data/lib/rubocop/cop/lint/float_out_of_range.rb +2 -2
  105. data/lib/rubocop/cop/lint/format_parameter_mismatch.rb +11 -5
  106. data/lib/rubocop/cop/lint/heredoc_method_call_position.rb +13 -14
  107. data/lib/rubocop/cop/lint/implicit_string_concatenation.rb +5 -4
  108. data/lib/rubocop/cop/lint/ineffective_access_modifier.rb +8 -8
  109. data/lib/rubocop/cop/lint/inherit_exception.rb +12 -7
  110. data/lib/rubocop/cop/lint/interpolation_check.rb +21 -5
  111. data/lib/rubocop/cop/lint/literal_as_condition.rb +14 -2
  112. data/lib/rubocop/cop/lint/literal_in_interpolation.rb +7 -7
  113. data/lib/rubocop/cop/lint/loop.rb +23 -2
  114. data/lib/rubocop/cop/lint/missing_cop_enable_directive.rb +6 -5
  115. data/lib/rubocop/cop/lint/missing_super.rb +99 -0
  116. data/lib/rubocop/cop/lint/mixed_regexp_capture_types.rb +1 -1
  117. data/lib/rubocop/cop/lint/multiple_comparison.rb +6 -9
  118. data/lib/rubocop/cop/lint/nested_method_definition.rb +15 -21
  119. data/lib/rubocop/cop/lint/nested_percent_literal.rb +1 -1
  120. data/lib/rubocop/cop/lint/next_without_accumulator.rb +1 -1
  121. data/lib/rubocop/cop/lint/non_deterministic_require_order.rb +84 -13
  122. data/lib/rubocop/cop/lint/non_local_exit_from_iterator.rb +2 -2
  123. data/lib/rubocop/cop/lint/number_conversion.rb +6 -9
  124. data/lib/rubocop/cop/lint/ordered_magic_comments.rb +11 -13
  125. data/lib/rubocop/cop/lint/out_of_range_regexp_ref.rb +90 -0
  126. data/lib/rubocop/cop/lint/parentheses_as_grouped_expression.rb +12 -13
  127. data/lib/rubocop/cop/lint/percent_string_array.rb +14 -13
  128. data/lib/rubocop/cop/lint/percent_symbol_array.rb +14 -13
  129. data/lib/rubocop/cop/lint/raise_exception.rb +15 -5
  130. data/lib/rubocop/cop/lint/rand_one.rb +3 -3
  131. data/lib/rubocop/cop/lint/redundant_cop_disable_directive.rb +43 -40
  132. data/lib/rubocop/cop/lint/redundant_cop_enable_directive.rb +7 -11
  133. data/lib/rubocop/cop/lint/redundant_require_statement.rb +4 -7
  134. data/lib/rubocop/cop/lint/redundant_splat_expansion.rb +15 -11
  135. data/lib/rubocop/cop/lint/redundant_string_coercion.rb +6 -13
  136. data/lib/rubocop/cop/lint/redundant_with_index.rb +11 -14
  137. data/lib/rubocop/cop/lint/redundant_with_object.rb +11 -14
  138. data/lib/rubocop/cop/lint/regexp_as_condition.rb +6 -2
  139. data/lib/rubocop/cop/lint/require_parentheses.rb +2 -2
  140. data/lib/rubocop/cop/lint/rescue_exception.rb +1 -1
  141. data/lib/rubocop/cop/lint/rescue_type.rb +8 -8
  142. data/lib/rubocop/cop/lint/return_in_void_context.rb +2 -4
  143. data/lib/rubocop/cop/lint/safe_navigation_chain.rb +3 -6
  144. data/lib/rubocop/cop/lint/safe_navigation_consistency.rb +14 -10
  145. data/lib/rubocop/cop/lint/safe_navigation_with_empty.rb +10 -2
  146. data/lib/rubocop/cop/lint/script_permission.rb +10 -7
  147. data/lib/rubocop/cop/lint/self_assignment.rb +78 -0
  148. data/lib/rubocop/cop/lint/send_with_mixin_argument.rb +5 -11
  149. data/lib/rubocop/cop/lint/shadowed_argument.rb +3 -3
  150. data/lib/rubocop/cop/lint/shadowed_exception.rb +2 -2
  151. data/lib/rubocop/cop/lint/shadowing_outer_local_variable.rb +3 -3
  152. data/lib/rubocop/cop/lint/struct_new_override.rb +1 -1
  153. data/lib/rubocop/cop/lint/suppressed_exception.rb +4 -7
  154. data/lib/rubocop/cop/lint/syntax.rb +11 -26
  155. data/lib/rubocop/cop/lint/to_json.rb +4 -6
  156. data/lib/rubocop/cop/lint/top_level_return_with_argument.rb +34 -0
  157. data/lib/rubocop/cop/lint/underscore_prefixed_variable_name.rb +4 -4
  158. data/lib/rubocop/cop/lint/unified_integer.rb +4 -6
  159. data/lib/rubocop/cop/lint/unreachable_code.rb +1 -1
  160. data/lib/rubocop/cop/lint/unreachable_loop.rb +174 -0
  161. data/lib/rubocop/cop/lint/unused_block_argument.rb +8 -3
  162. data/lib/rubocop/cop/lint/unused_method_argument.rb +9 -4
  163. data/lib/rubocop/cop/lint/uri_escape_unescape.rb +1 -1
  164. data/lib/rubocop/cop/lint/uri_regexp.rb +11 -47
  165. data/lib/rubocop/cop/lint/useless_access_modifier.rb +26 -16
  166. data/lib/rubocop/cop/lint/useless_assignment.rb +4 -4
  167. data/lib/rubocop/cop/lint/useless_else_without_rescue.rb +6 -15
  168. data/lib/rubocop/cop/lint/useless_setter_call.rb +4 -6
  169. data/lib/rubocop/cop/lint/void.rb +3 -7
  170. data/lib/rubocop/cop/metrics/abc_size.rb +1 -1
  171. data/lib/rubocop/cop/metrics/block_length.rb +24 -2
  172. data/lib/rubocop/cop/metrics/block_nesting.rb +2 -2
  173. data/lib/rubocop/cop/metrics/class_length.rb +26 -3
  174. data/lib/rubocop/cop/metrics/cyclomatic_complexity.rb +37 -4
  175. data/lib/rubocop/cop/metrics/method_length.rb +25 -2
  176. data/lib/rubocop/cop/metrics/module_length.rb +26 -3
  177. data/lib/rubocop/cop/metrics/parameter_lists.rb +2 -6
  178. data/lib/rubocop/cop/metrics/perceived_complexity.rb +7 -8
  179. data/lib/rubocop/cop/metrics/utils/abc_size_calculator.rb +47 -4
  180. data/lib/rubocop/cop/metrics/utils/code_length_calculator.rb +157 -0
  181. data/lib/rubocop/cop/metrics/utils/iterating_block.rb +61 -0
  182. data/lib/rubocop/cop/metrics/utils/repeated_csend_discount.rb +37 -0
  183. data/lib/rubocop/cop/migration/department_name.rb +14 -16
  184. data/lib/rubocop/cop/mixin/alignment.rb +2 -1
  185. data/lib/rubocop/cop/mixin/allowed_methods.rb +19 -0
  186. data/lib/rubocop/cop/mixin/array_min_size.rb +1 -1
  187. data/lib/rubocop/cop/mixin/auto_corrector.rb +12 -0
  188. data/lib/rubocop/cop/mixin/check_line_breakable.rb +2 -2
  189. data/lib/rubocop/cop/mixin/code_length.rb +26 -5
  190. data/lib/rubocop/cop/mixin/configurable_formatting.rb +1 -1
  191. data/lib/rubocop/cop/mixin/configurable_naming.rb +1 -1
  192. data/lib/rubocop/cop/mixin/documentation_comment.rb +2 -2
  193. data/lib/rubocop/cop/mixin/end_keyword_alignment.rb +1 -1
  194. data/lib/rubocop/cop/mixin/enforce_superclass.rb +3 -1
  195. data/lib/rubocop/cop/mixin/first_element_line_break.rb +1 -1
  196. data/lib/rubocop/cop/mixin/hash_transform_method.rb +5 -11
  197. data/lib/rubocop/cop/mixin/line_length_help.rb +1 -3
  198. data/lib/rubocop/cop/mixin/method_complexity.rb +10 -2
  199. data/lib/rubocop/cop/mixin/multiline_expression_indentation.rb +1 -1
  200. data/lib/rubocop/cop/mixin/multiline_literal_brace_layout.rb +1 -2
  201. data/lib/rubocop/cop/mixin/nil_methods.rb +3 -5
  202. data/lib/rubocop/cop/mixin/ordered_gem_node.rb +6 -1
  203. data/lib/rubocop/cop/mixin/parentheses.rb +1 -2
  204. data/lib/rubocop/cop/mixin/percent_array.rb +2 -6
  205. data/lib/rubocop/cop/mixin/preceding_following_alignment.rb +1 -1
  206. data/lib/rubocop/cop/mixin/range_help.rb +19 -5
  207. data/lib/rubocop/cop/mixin/regexp_literal_help.rb +27 -0
  208. data/lib/rubocop/cop/mixin/statement_modifier.rb +39 -10
  209. data/lib/rubocop/cop/mixin/string_literals_help.rb +1 -1
  210. data/lib/rubocop/cop/mixin/surrounding_space.rb +7 -27
  211. data/lib/rubocop/cop/mixin/trailing_comma.rb +3 -5
  212. data/lib/rubocop/cop/mixin/uncommunicative_name.rb +12 -17
  213. data/lib/rubocop/cop/mixin/unused_argument.rb +4 -6
  214. data/lib/rubocop/cop/mixin/visibility_help.rb +50 -0
  215. data/lib/rubocop/cop/naming/accessor_method_name.rb +4 -2
  216. data/lib/rubocop/cop/naming/ascii_identifiers.rb +29 -6
  217. data/lib/rubocop/cop/naming/binary_operator_parameter_name.rb +4 -4
  218. data/lib/rubocop/cop/naming/block_parameter_name.rb +1 -1
  219. data/lib/rubocop/cop/naming/class_and_module_camel_case.rb +2 -2
  220. data/lib/rubocop/cop/naming/constant_name.rb +2 -2
  221. data/lib/rubocop/cop/naming/file_name.rb +4 -6
  222. data/lib/rubocop/cop/naming/heredoc_delimiter_case.rb +2 -2
  223. data/lib/rubocop/cop/naming/heredoc_delimiter_naming.rb +3 -3
  224. data/lib/rubocop/cop/naming/memoized_instance_variable_name.rb +2 -2
  225. data/lib/rubocop/cop/naming/method_name.rb +1 -1
  226. data/lib/rubocop/cop/naming/method_parameter_name.rb +2 -2
  227. data/lib/rubocop/cop/naming/predicate_name.rb +6 -10
  228. data/lib/rubocop/cop/naming/rescued_exceptions_variable_name.rb +12 -11
  229. data/lib/rubocop/cop/naming/variable_name.rb +1 -1
  230. data/lib/rubocop/cop/naming/variable_number.rb +1 -1
  231. data/lib/rubocop/cop/offense.rb +16 -2
  232. data/lib/rubocop/cop/registry.rb +3 -3
  233. data/lib/rubocop/cop/security/eval.rb +2 -2
  234. data/lib/rubocop/cop/security/json_load.rb +6 -8
  235. data/lib/rubocop/cop/security/marshal_load.rb +2 -4
  236. data/lib/rubocop/cop/security/open.rb +2 -2
  237. data/lib/rubocop/cop/security/yaml_load.rb +6 -6
  238. data/lib/rubocop/cop/style/access_modifier_declarations.rb +16 -9
  239. data/lib/rubocop/cop/style/accessor_grouping.rb +149 -0
  240. data/lib/rubocop/cop/style/alias.rb +41 -36
  241. data/lib/rubocop/cop/style/and_or.rb +9 -11
  242. data/lib/rubocop/cop/style/array_coercion.rb +63 -0
  243. data/lib/rubocop/cop/style/array_join.rb +6 -8
  244. data/lib/rubocop/cop/style/ascii_comments.rb +4 -4
  245. data/lib/rubocop/cop/style/attr.rb +11 -9
  246. data/lib/rubocop/cop/style/auto_resource_cleanup.rb +5 -7
  247. data/lib/rubocop/cop/style/bare_percent_literals.rb +11 -13
  248. data/lib/rubocop/cop/style/begin_block.rb +2 -2
  249. data/lib/rubocop/cop/style/bisected_attr_accessor.rb +141 -0
  250. data/lib/rubocop/cop/style/block_comments.rb +14 -18
  251. data/lib/rubocop/cop/style/block_delimiters.rb +25 -27
  252. data/lib/rubocop/cop/style/case_equality.rb +22 -3
  253. data/lib/rubocop/cop/style/case_like_if.rb +220 -0
  254. data/lib/rubocop/cop/style/class_and_module_children.rb +15 -12
  255. data/lib/rubocop/cop/style/class_check.rb +7 -9
  256. data/lib/rubocop/cop/style/class_methods.rb +7 -11
  257. data/lib/rubocop/cop/style/class_vars.rb +24 -7
  258. data/lib/rubocop/cop/style/collection_methods.rb +11 -17
  259. data/lib/rubocop/cop/style/colon_method_call.rb +8 -9
  260. data/lib/rubocop/cop/style/colon_method_definition.rb +6 -6
  261. data/lib/rubocop/cop/style/command_literal.rb +24 -25
  262. data/lib/rubocop/cop/style/comment_annotation.rb +15 -15
  263. data/lib/rubocop/cop/style/commented_keyword.rb +6 -3
  264. data/lib/rubocop/cop/style/conditional_assignment.rb +12 -3
  265. data/lib/rubocop/cop/style/constant_visibility.rb +3 -2
  266. data/lib/rubocop/cop/style/copyright.rb +15 -15
  267. data/lib/rubocop/cop/style/date_time.rb +2 -2
  268. data/lib/rubocop/cop/style/def_with_parentheses.rb +8 -10
  269. data/lib/rubocop/cop/style/dir.rb +9 -12
  270. data/lib/rubocop/cop/style/disable_cops_within_source_code_directive.rb +8 -10
  271. data/lib/rubocop/cop/style/documentation.rb +8 -10
  272. data/lib/rubocop/cop/style/documentation_method.rb +1 -1
  273. data/lib/rubocop/cop/style/double_cop_disable_directive.rb +12 -15
  274. data/lib/rubocop/cop/style/double_negation.rb +2 -2
  275. data/lib/rubocop/cop/style/each_for_simple_loop.rb +5 -8
  276. data/lib/rubocop/cop/style/each_with_object.rb +16 -19
  277. data/lib/rubocop/cop/style/empty_case_condition.rb +27 -26
  278. data/lib/rubocop/cop/style/empty_else.rb +17 -19
  279. data/lib/rubocop/cop/style/empty_literal.rb +20 -21
  280. data/lib/rubocop/cop/style/empty_method.rb +10 -13
  281. data/lib/rubocop/cop/style/encoding.rb +6 -10
  282. data/lib/rubocop/cop/style/end_block.rb +4 -6
  283. data/lib/rubocop/cop/style/eval_with_location.rb +9 -7
  284. data/lib/rubocop/cop/style/even_odd.rb +7 -11
  285. data/lib/rubocop/cop/style/expand_path_arguments.rb +23 -22
  286. data/lib/rubocop/cop/style/explicit_block_argument.rb +102 -0
  287. data/lib/rubocop/cop/style/exponential_notation.rb +9 -11
  288. data/lib/rubocop/cop/style/float_division.rb +8 -11
  289. data/lib/rubocop/cop/style/for.rb +11 -15
  290. data/lib/rubocop/cop/style/format_string.rb +21 -19
  291. data/lib/rubocop/cop/style/format_string_token.rb +10 -12
  292. data/lib/rubocop/cop/style/frozen_string_literal_comment.rb +20 -42
  293. data/lib/rubocop/cop/style/global_std_stream.rb +65 -0
  294. data/lib/rubocop/cop/style/global_vars.rb +2 -2
  295. data/lib/rubocop/cop/style/guard_clause.rb +5 -6
  296. data/lib/rubocop/cop/style/hash_as_last_array_item.rb +69 -0
  297. data/lib/rubocop/cop/style/hash_each_methods.rb +5 -8
  298. data/lib/rubocop/cop/style/hash_like_case.rb +76 -0
  299. data/lib/rubocop/cop/style/hash_syntax.rb +4 -3
  300. data/lib/rubocop/cop/style/hash_transform_keys.rb +3 -2
  301. data/lib/rubocop/cop/style/hash_transform_values.rb +2 -1
  302. data/lib/rubocop/cop/style/identical_conditional_branches.rb +2 -2
  303. data/lib/rubocop/cop/style/if_inside_else.rb +2 -2
  304. data/lib/rubocop/cop/style/if_unless_modifier.rb +18 -40
  305. data/lib/rubocop/cop/style/if_unless_modifier_of_if_unless.rb +11 -3
  306. data/lib/rubocop/cop/style/if_with_semicolon.rb +3 -6
  307. data/lib/rubocop/cop/style/implicit_runtime_error.rb +1 -1
  308. data/lib/rubocop/cop/style/infinite_loop.rb +24 -24
  309. data/lib/rubocop/cop/style/inline_comment.rb +3 -3
  310. data/lib/rubocop/cop/style/inverse_methods.rb +23 -33
  311. data/lib/rubocop/cop/style/ip_addresses.rb +1 -1
  312. data/lib/rubocop/cop/style/lambda.rb +7 -12
  313. data/lib/rubocop/cop/style/lambda_call.rb +14 -13
  314. data/lib/rubocop/cop/style/line_end_concatenation.rb +19 -16
  315. data/lib/rubocop/cop/style/method_call_with_args_parentheses/omit_parentheses.rb +16 -11
  316. data/lib/rubocop/cop/style/method_call_with_args_parentheses/require_parentheses.rb +4 -8
  317. data/lib/rubocop/cop/style/method_call_with_args_parentheses.rb +2 -1
  318. data/lib/rubocop/cop/style/method_call_without_args_parentheses.rb +8 -7
  319. data/lib/rubocop/cop/style/method_called_on_do_end_block.rb +2 -2
  320. data/lib/rubocop/cop/style/method_def_parentheses.rb +11 -16
  321. data/lib/rubocop/cop/style/min_max.rb +8 -12
  322. data/lib/rubocop/cop/style/missing_else.rb +11 -21
  323. data/lib/rubocop/cop/style/missing_respond_to_missing.rb +10 -3
  324. data/lib/rubocop/cop/style/mixin_grouping.rb +24 -27
  325. data/lib/rubocop/cop/style/mixin_usage.rb +1 -1
  326. data/lib/rubocop/cop/style/module_function.rb +10 -13
  327. data/lib/rubocop/cop/style/multiline_block_chain.rb +10 -1
  328. data/lib/rubocop/cop/style/multiline_if_modifier.rb +3 -10
  329. data/lib/rubocop/cop/style/multiline_if_then.rb +5 -11
  330. data/lib/rubocop/cop/style/multiline_memoization.rb +14 -12
  331. data/lib/rubocop/cop/style/multiline_method_signature.rb +2 -2
  332. data/lib/rubocop/cop/style/multiline_ternary_operator.rb +17 -8
  333. data/lib/rubocop/cop/style/multiline_when_then.rb +7 -9
  334. data/lib/rubocop/cop/style/multiple_comparison.rb +1 -1
  335. data/lib/rubocop/cop/style/mutable_constant.rb +27 -24
  336. data/lib/rubocop/cop/style/nested_parenthesized_calls.rb +5 -6
  337. data/lib/rubocop/cop/style/nested_ternary_operator.rb +27 -0
  338. data/lib/rubocop/cop/style/next.rb +2 -2
  339. data/lib/rubocop/cop/style/numeric_literal_prefix.rb +2 -2
  340. data/lib/rubocop/cop/style/numeric_predicate.rb +7 -4
  341. data/lib/rubocop/cop/style/optional_boolean_parameter.rb +42 -0
  342. data/lib/rubocop/cop/style/parallel_assignment.rb +5 -5
  343. data/lib/rubocop/cop/style/percent_literal_delimiters.rb +2 -2
  344. data/lib/rubocop/cop/style/proc.rb +1 -1
  345. data/lib/rubocop/cop/style/random_with_offset.rb +5 -10
  346. data/lib/rubocop/cop/style/redundant_assignment.rb +117 -0
  347. data/lib/rubocop/cop/style/redundant_condition.rb +15 -3
  348. data/lib/rubocop/cop/style/redundant_exception.rb +18 -10
  349. data/lib/rubocop/cop/style/redundant_fetch_block.rb +122 -0
  350. data/lib/rubocop/cop/style/redundant_file_extension_in_require.rb +50 -0
  351. data/lib/rubocop/cop/style/redundant_freeze.rb +1 -1
  352. data/lib/rubocop/cop/style/redundant_parentheses.rb +8 -2
  353. data/lib/rubocop/cop/style/redundant_percent_q.rb +2 -2
  354. data/lib/rubocop/cop/style/redundant_regexp_character_class.rb +4 -3
  355. data/lib/rubocop/cop/style/redundant_regexp_escape.rb +23 -32
  356. data/lib/rubocop/cop/style/redundant_self.rb +6 -9
  357. data/lib/rubocop/cop/style/redundant_sort.rb +26 -12
  358. data/lib/rubocop/cop/style/rescue_standard_error.rb +1 -1
  359. data/lib/rubocop/cop/style/safe_navigation.rb +4 -4
  360. data/lib/rubocop/cop/style/sample.rb +1 -1
  361. data/lib/rubocop/cop/style/semicolon.rb +1 -1
  362. data/lib/rubocop/cop/style/signal_exception.rb +3 -1
  363. data/lib/rubocop/cop/style/single_argument_dig.rb +54 -0
  364. data/lib/rubocop/cop/style/single_line_methods.rb +1 -1
  365. data/lib/rubocop/cop/style/stabby_lambda_parentheses.rb +3 -2
  366. data/lib/rubocop/cop/style/stderr_puts.rb +1 -1
  367. data/lib/rubocop/cop/style/string_concatenation.rb +92 -0
  368. data/lib/rubocop/cop/style/struct_inheritance.rb +23 -2
  369. data/lib/rubocop/cop/style/symbol_array.rb +6 -6
  370. data/lib/rubocop/cop/style/symbol_proc.rb +2 -2
  371. data/lib/rubocop/cop/style/ternary_parentheses.rb +1 -1
  372. data/lib/rubocop/cop/style/trailing_method_end_statement.rb +9 -32
  373. data/lib/rubocop/cop/style/trivial_accessors.rb +8 -7
  374. data/lib/rubocop/cop/style/word_array.rb +1 -1
  375. data/lib/rubocop/cop/style/yoda_condition.rb +18 -1
  376. data/lib/rubocop/cop/style/zero_length_predicate.rb +12 -8
  377. data/lib/rubocop/cop/team.rb +98 -82
  378. data/lib/rubocop/cop/tokens_util.rb +84 -0
  379. data/lib/rubocop/cop/util.rb +5 -15
  380. data/lib/rubocop/cop/utils/format_string.rb +2 -3
  381. data/lib/rubocop/cop/variable_force/branch.rb +1 -0
  382. data/lib/rubocop/cop/variable_force/variable.rb +7 -5
  383. data/lib/rubocop/cop/variable_force.rb +0 -2
  384. data/lib/rubocop/cops_documentation_generator.rb +282 -0
  385. data/lib/rubocop/error.rb +1 -0
  386. data/lib/rubocop/file_finder.rb +12 -12
  387. data/lib/rubocop/formatter/disabled_config_formatter.rb +3 -3
  388. data/lib/rubocop/formatter/formatter_set.rb +2 -1
  389. data/lib/rubocop/formatter/junit_formatter.rb +1 -1
  390. data/lib/rubocop/name_similarity.rb +7 -3
  391. data/lib/rubocop/options.rb +18 -11
  392. data/lib/rubocop/path_util.rb +19 -19
  393. data/lib/rubocop/platform.rb +1 -1
  394. data/lib/rubocop/rake_task.rb +7 -9
  395. data/lib/rubocop/result_cache.rb +12 -8
  396. data/lib/rubocop/rspec/cop_helper.rb +4 -4
  397. data/lib/rubocop/rspec/expect_offense.rb +63 -22
  398. data/lib/rubocop/rspec/shared_contexts.rb +16 -17
  399. data/lib/rubocop/runner.rb +35 -34
  400. data/lib/rubocop/target_finder.rb +14 -11
  401. data/lib/rubocop/target_ruby.rb +2 -2
  402. data/lib/rubocop/version.rb +2 -2
  403. data/lib/rubocop.rb +33 -5
  404. metadata +49 -11
  405. data/lib/rubocop/cop/lint/useless_comparison.rb +0 -28
  406. data/lib/rubocop/cop/mixin/classish_length.rb +0 -37
  407. data/lib/rubocop/cop/mixin/parser_diagnostic.rb +0 -37
  408. data/lib/rubocop/cop/mixin/too_many_lines.rb +0 -35
  409. data/lib/rubocop/cop/style/method_missing_super.rb +0 -34
@@ -40,7 +40,7 @@ module RuboCop
40
40
  # class C
41
41
  # prepend M
42
42
  # end
43
- class MixinUsage < Cop
43
+ class MixinUsage < Base
44
44
  MSG = '`%<statement>s` is used at the top level. Use inside `class` ' \
45
45
  'or `module`.'
46
46
 
@@ -71,8 +71,9 @@ module RuboCop
71
71
  #
72
72
  # These offenses are not safe to auto-correct since there are different
73
73
  # implications to each approach.
74
- class ModuleFunction < Cop
74
+ class ModuleFunction < Base
75
75
  include ConfigurableEnforcedStyle
76
+ extend AutoCorrector
76
77
 
77
78
  MODULE_FUNCTION_MSG =
78
79
  'Use `module_function` instead of `extend self`.'
@@ -89,18 +90,14 @@ module RuboCop
89
90
  return unless node.body&.begin_type?
90
91
 
91
92
  each_wrong_style(node.body.children) do |child_node|
92
- add_offense(child_node)
93
- end
94
- end
95
-
96
- def autocorrect(node)
97
- return if style == :forbidden
93
+ add_offense(child_node) do |corrector|
94
+ next if style == :forbidden
98
95
 
99
- lambda do |corrector|
100
- if extend_self_node?(node)
101
- corrector.replace(node, 'module_function')
102
- else
103
- corrector.replace(node, 'extend self')
96
+ if extend_self_node?(child_node)
97
+ corrector.replace(child_node, 'module_function')
98
+ else
99
+ corrector.replace(child_node, 'extend self')
100
+ end
104
101
  end
105
102
  end
106
103
  end
@@ -139,7 +136,7 @@ module RuboCop
139
136
  end
140
137
  end
141
138
 
142
- def message(_node)
139
+ def message(_range)
143
140
  return FORBIDDEN_MSG if style == :forbidden
144
141
 
145
142
  style == :module_function ? MODULE_FUNCTION_MSG : EXTEND_SELF_MSG
@@ -8,11 +8,20 @@ module RuboCop
8
8
  #
9
9
  # @example
10
10
  #
11
- # Thread.list.find_all do |t|
11
+ # # bad
12
+ # Thread.list.select do |t|
12
13
  # t.alive?
13
14
  # end.map do |t|
14
15
  # t.object_id
15
16
  # end
17
+ #
18
+ # # good
19
+ # alive_threads = Thread.list.select do |t|
20
+ # t.alive?
21
+ # end
22
+ # alive_threads.map do |t|
23
+ # t.object_id
24
+ # end
16
25
  class MultilineBlockChain < Cop
17
26
  include RangeHelp
18
27
 
@@ -14,9 +14,10 @@ module RuboCop
14
14
  #
15
15
  # # good
16
16
  # { result: 'ok' } if cond
17
- class MultilineIfModifier < Cop
17
+ class MultilineIfModifier < Base
18
18
  include StatementModifier
19
19
  include Alignment
20
+ extend AutoCorrector
20
21
 
21
22
  MSG = 'Favor a normal %<keyword>s-statement over a modifier' \
22
23
  ' clause in a multiline statement.'
@@ -24,21 +25,13 @@ module RuboCop
24
25
  def on_if(node)
25
26
  return unless node.modifier_form? && node.body.multiline?
26
27
 
27
- add_offense(node)
28
- end
29
-
30
- def autocorrect(node)
31
- lambda do |corrector|
28
+ add_offense(node, message: format(MSG, keyword: node.keyword)) do |corrector|
32
29
  corrector.replace(node, to_normal_if(node))
33
30
  end
34
31
  end
35
32
 
36
33
  private
37
34
 
38
- def message(node)
39
- format(MSG, keyword: node.keyword)
40
- end
41
-
42
35
  def to_normal_if(node)
43
36
  indented_body = indented_body(node.body, node)
44
37
  condition = "#{node.keyword} #{node.condition.source}"
@@ -16,9 +16,10 @@ module RuboCop
16
16
  # if cond then a
17
17
  # elsif cond then b
18
18
  # end
19
- class MultilineIfThen < Cop
19
+ class MultilineIfThen < Base
20
20
  include OnNormalIfUnless
21
21
  include RangeHelp
22
+ extend AutoCorrector
22
23
 
23
24
  NON_MODIFIER_THEN = /then\s*(#.*)?$/.freeze
24
25
 
@@ -27,22 +28,15 @@ module RuboCop
27
28
  def on_normal_if_unless(node)
28
29
  return unless non_modifier_then?(node)
29
30
 
30
- add_offense(node, location: :begin,
31
- message: format(MSG, keyword: node.keyword))
32
- end
33
-
34
- def autocorrect(node)
35
- lambda do |corrector|
36
- corrector.remove(
37
- range_with_surrounding_space(range: node.loc.begin, side: :left)
38
- )
31
+ add_offense(node.loc.begin, message: format(MSG, keyword: node.keyword)) do |corrector|
32
+ corrector.remove(range_with_surrounding_space(range: node.loc.begin, side: :left))
39
33
  end
40
34
  end
41
35
 
42
36
  private
43
37
 
44
38
  def non_modifier_then?(node)
45
- node.loc.begin && node.loc.begin.source_line =~ NON_MODIFIER_THEN
39
+ NON_MODIFIER_THEN.match?(node.loc.begin&.source_line)
46
40
  end
47
41
  end
48
42
  end
@@ -30,30 +30,32 @@ module RuboCop
30
30
  # bar
31
31
  # baz
32
32
  # )
33
- class MultilineMemoization < Cop
33
+ class MultilineMemoization < Base
34
34
  include ConfigurableEnforcedStyle
35
+ extend AutoCorrector
35
36
 
36
- MSG = 'Wrap multiline memoization blocks in `begin` and `end`.'
37
+ KEYWORD_MSG = 'Wrap multiline memoization blocks in `begin` and `end`.'
38
+ BRACES_MSG = 'Wrap multiline memoization blocks in `(` and `)`.'
37
39
 
38
40
  def on_or_asgn(node)
39
41
  _lhs, rhs = *node
40
42
 
41
43
  return unless bad_rhs?(rhs)
42
44
 
43
- add_offense(rhs, location: node.source_range)
44
- end
45
-
46
- def autocorrect(node)
47
- lambda do |corrector|
45
+ add_offense(node.source_range) do |corrector|
48
46
  if style == :keyword
49
- keyword_autocorrect(node, corrector)
47
+ keyword_autocorrect(rhs, corrector)
50
48
  else
51
- corrector.replace(node.loc.begin, '(')
52
- corrector.replace(node.loc.end, ')')
49
+ corrector.replace(rhs.loc.begin, '(')
50
+ corrector.replace(rhs.loc.end, ')')
53
51
  end
54
52
  end
55
53
  end
56
54
 
55
+ def message(_node)
56
+ style == :braces ? BRACES_MSG : KEYWORD_MSG
57
+ end
58
+
57
59
  private
58
60
 
59
61
  def bad_rhs?(rhs)
@@ -77,13 +79,13 @@ module RuboCop
77
79
  if node_buf.source[node.loc.begin.end_pos] == "\n"
78
80
  'begin'
79
81
  else
80
- "begin\n" + (' ' * (node.loc.column + indent))
82
+ "begin\n#{' ' * (node.loc.column + indent)}"
81
83
  end
82
84
  end
83
85
 
84
86
  def keyword_end_str(node, node_buf)
85
87
  if /[^\s)]/.match?(node_buf.source_line(node.loc.end.line))
86
- "\n" + (' ' * node.loc.column) + 'end'
88
+ "\n#{' ' * node.loc.column}end"
87
89
  else
88
90
  'end'
89
91
  end
@@ -18,7 +18,7 @@ module RuboCop
18
18
  # baz)
19
19
  # end
20
20
  #
21
- class MultilineMethodSignature < Cop
21
+ class MultilineMethodSignature < Base
22
22
  MSG = 'Avoid multi-line method signatures.'
23
23
 
24
24
  def on_def(node)
@@ -53,7 +53,7 @@ module RuboCop
53
53
  end
54
54
 
55
55
  def max_line_length
56
- config.for_cop('Layout/LineLength')['Max'] || 80
56
+ config.for_cop('Layout/LineLength')['Max'] || 120
57
57
  end
58
58
  end
59
59
  end
@@ -17,20 +17,29 @@ module RuboCop
17
17
  #
18
18
  # # good
19
19
  # a = cond ? b : c
20
- # a =
21
- # if cond
22
- # b
23
- # else
24
- # c
25
- # end
26
- class MultilineTernaryOperator < Cop
20
+ # a = if cond
21
+ # b
22
+ # else
23
+ # c
24
+ # end
25
+ class MultilineTernaryOperator < Base
26
+ extend AutoCorrector
27
+
27
28
  MSG = 'Avoid multi-line ternary operators, ' \
28
29
  'use `if` or `unless` instead.'
29
30
 
30
31
  def on_if(node)
31
32
  return unless node.ternary? && node.multiline?
32
33
 
33
- add_offense(node)
34
+ add_offense(node) do |corrector|
35
+ corrector.replace(node, <<~RUBY.chop)
36
+ if #{node.condition.source}
37
+ #{node.if_branch.source}
38
+ else
39
+ #{node.else_branch.source}
40
+ end
41
+ RUBY
42
+ end
34
43
  end
35
44
  end
36
45
  end
@@ -28,8 +28,9 @@ module RuboCop
28
28
  # arg2)
29
29
  # end
30
30
  #
31
- class MultilineWhenThen < Cop
31
+ class MultilineWhenThen < Base
32
32
  include RangeHelp
33
+ extend AutoCorrector
33
34
 
34
35
  MSG = 'Do not use `then` for multiline `when` statement.'
35
36
 
@@ -46,19 +47,16 @@ module RuboCop
46
47
  # With more than one statements after then, there's not offense
47
48
  return if accept_node_type?(node.body)
48
49
 
49
- add_offense(node, location: :begin)
50
- end
51
-
52
- def autocorrect(node)
53
- lambda do |corrector|
50
+ range = node.loc.begin
51
+ add_offense(range) do |corrector|
54
52
  corrector.remove(
55
- range_with_surrounding_space(
56
- range: node.loc.begin, side: :left, newlines: false
57
- )
53
+ range_with_surrounding_space(range: range, side: :left, newlines: false)
58
54
  )
59
55
  end
60
56
  end
61
57
 
58
+ private
59
+
62
60
  def require_then?(when_node)
63
61
  return false unless when_node.body
64
62
 
@@ -14,7 +14,7 @@ module RuboCop
14
14
  # # good
15
15
  # a = 'a'
16
16
  # foo if ['a', 'b', 'c'].include?(a)
17
- class MultipleComparison < Cop
17
+ class MultipleComparison < Base
18
18
  MSG = 'Avoid comparing a variable with multiple items ' \
19
19
  'in a conditional, use `Array#include?` instead.'
20
20
 
@@ -50,9 +50,10 @@ module RuboCop
50
50
  # puts 1
51
51
  # end
52
52
  # end.freeze
53
- class MutableConstant < Cop
53
+ class MutableConstant < Base
54
54
  include FrozenStringLiteral
55
55
  include ConfigurableEnforcedStyle
56
+ extend AutoCorrector
56
57
 
57
58
  MSG = 'Freeze mutable objects assigned to constants.'
58
59
 
@@ -69,23 +70,6 @@ module RuboCop
69
70
  on_assignment(value)
70
71
  end
71
72
 
72
- def autocorrect(node)
73
- expr = node.source_range
74
-
75
- lambda do |corrector|
76
- splat_value = splat_value(node)
77
- if splat_value
78
- correct_splat_expansion(corrector, expr, splat_value)
79
- elsif node.array_type? && !node.bracketed?
80
- corrector.wrap(expr, '[', ']')
81
- elsif requires_parentheses?(node)
82
- corrector.wrap(expr, '(', ')')
83
- end
84
-
85
- corrector.insert_after(expr, '.freeze')
86
- end
87
- end
88
-
89
73
  private
90
74
 
91
75
  def on_assignment(value)
@@ -101,7 +85,9 @@ module RuboCop
101
85
  return if operation_produces_immutable_object?(value)
102
86
  return if frozen_string_literal?(value)
103
87
 
104
- add_offense(value)
88
+ add_offense(value) do |corrector|
89
+ autocorrect(corrector, value)
90
+ end
105
91
  end
106
92
 
107
93
  def check(value)
@@ -112,7 +98,24 @@ module RuboCop
112
98
  return if FROZEN_STRING_LITERAL_TYPES.include?(value.type) &&
113
99
  frozen_string_literals_enabled?
114
100
 
115
- add_offense(value)
101
+ add_offense(value) do |corrector|
102
+ autocorrect(corrector, value)
103
+ end
104
+ end
105
+
106
+ def autocorrect(corrector, node)
107
+ expr = node.source_range
108
+
109
+ splat_value = splat_value(node)
110
+ if splat_value
111
+ correct_splat_expansion(corrector, expr, splat_value)
112
+ elsif node.array_type? && !node.bracketed?
113
+ corrector.wrap(expr, '[', ']')
114
+ elsif requires_parentheses?(node)
115
+ corrector.wrap(expr, '(', ')')
116
+ end
117
+
118
+ corrector.insert_after(expr, '.freeze')
116
119
  end
117
120
 
118
121
  def mutable_literal?(value)
@@ -150,14 +153,14 @@ module RuboCop
150
153
  def_node_matcher :operation_produces_immutable_object?, <<~PATTERN
151
154
  {
152
155
  (const _ _)
153
- (send (const nil? :Struct) :new ...)
154
- (block (send (const nil? :Struct) :new ...) ...)
156
+ (send (const {nil? cbase} :Struct) :new ...)
157
+ (block (send (const {nil? cbase} :Struct) :new ...) ...)
155
158
  (send _ :freeze)
156
159
  (send {float int} {:+ :- :* :** :/ :% :<<} _)
157
160
  (send _ {:+ :- :* :** :/ :%} {float int})
158
161
  (send _ {:== :=== :!= :<= :>= :< :>} _)
159
- (send (const nil? :ENV) :[] _)
160
- (or (send (const nil? :ENV) :[] _) _)
162
+ (send (const {nil? cbase} :ENV) :[] _)
163
+ (or (send (const {nil? cbase} :ENV) :[] _) _)
161
164
  (send _ {:count :length :size} ...)
162
165
  (block (send _ {:count :length :size} ...) ...)
163
166
  }
@@ -14,6 +14,7 @@ module RuboCop
14
14
  # method1(method2 arg)
15
15
  class NestedParenthesizedCalls < Cop
16
16
  include RangeHelp
17
+ include AllowedMethods
17
18
 
18
19
  MSG = 'Add parentheses to nested method call `%<source>s`.'
19
20
 
@@ -36,7 +37,9 @@ module RuboCop
36
37
 
37
38
  leading_space =
38
39
  range_with_surrounding_space(range: first_arg.begin,
39
- side: :left)
40
+ side: :left,
41
+ whitespace: true,
42
+ continuations: true)
40
43
 
41
44
  lambda do |corrector|
42
45
  corrector.replace(leading_space, '(')
@@ -54,13 +57,9 @@ module RuboCop
54
57
 
55
58
  def allowed?(send_node)
56
59
  send_node.parent.arguments.one? &&
57
- allowed_methods.include?(send_node.method_name.to_s) &&
60
+ allowed_method?(send_node.method_name) &&
58
61
  send_node.arguments.one?
59
62
  end
60
-
61
- def allowed_methods
62
- cop_config['AllowedMethods'] || []
63
- end
64
63
  end
65
64
  end
66
65
  end
@@ -26,6 +26,33 @@ module RuboCop
26
26
  add_offense(nested_ternary)
27
27
  end
28
28
  end
29
+
30
+ def autocorrect(node)
31
+ if_node = if_node(node)
32
+
33
+ lambda do |corrector|
34
+ corrector.replace(if_node, <<~RUBY.chop)
35
+ if #{if_node.condition.source}
36
+ #{remove_parentheses(if_node.if_branch.source)}
37
+ else
38
+ #{if_node.else_branch.source}
39
+ end
40
+ RUBY
41
+ end
42
+ end
43
+
44
+ private
45
+
46
+ def if_node(node)
47
+ node = node.parent
48
+ return node if node.if_type?
49
+
50
+ if_node(node)
51
+ end
52
+
53
+ def remove_parentheses(source)
54
+ source.gsub(/\A\(/, '').gsub(/\)\z/, '')
55
+ end
29
56
  end
30
57
  end
31
58
  end
@@ -191,7 +191,7 @@ module RuboCop
191
191
  end
192
192
 
193
193
  def end_followed_by_whitespace_only?(source_buffer, end_pos)
194
- source_buffer.source[end_pos..-1] =~ /\A\s*$/
194
+ /\A\s*$/.match?(source_buffer.source[end_pos..-1])
195
195
  end
196
196
 
197
197
  def reindentable_lines(node)
@@ -201,7 +201,7 @@ module RuboCop
201
201
  lines = (node.source_range.line + 1)...node.loc.end.line
202
202
  lines = lines.to_a - heredoc_lines(node)
203
203
  # Skip blank lines
204
- lines.reject { |lineno| buffer.source_line(lineno) =~ /\A\s*\z/ }
204
+ lines.reject { |lineno| /\A\s*\z/.match?(buffer.source_line(lineno)) }
205
205
  end
206
206
 
207
207
  # Adjust indentation of `lines` to match `node`
@@ -77,9 +77,9 @@ module RuboCop
77
77
  end
78
78
 
79
79
  def octal_literal_type(literal)
80
- if literal =~ OCTAL_ZERO_ONLY_REGEX && octal_zero_only?
80
+ if OCTAL_ZERO_ONLY_REGEX.match?(literal) && octal_zero_only?
81
81
  :octal_zero_only
82
- elsif literal =~ OCTAL_REGEX && !octal_zero_only?
82
+ elsif OCTAL_REGEX.match?(literal) && !octal_zero_only?
83
83
  :octal
84
84
  end
85
85
  end
@@ -53,16 +53,19 @@ module RuboCop
53
53
  'negative?' => '<'
54
54
  }.freeze
55
55
 
56
+ COMPARISON_METHODS = %i[== > < positive? negative? zero?].to_set.freeze
57
+
56
58
  def on_send(node)
59
+ return unless COMPARISON_METHODS.include?(node.method_name)
60
+
61
+ numeric, replacement = check(node)
62
+ return unless numeric
63
+
57
64
  return if ignored_method?(node.method_name) ||
58
65
  node.each_ancestor(:send, :block).any? do |ancestor|
59
66
  ignored_method?(ancestor.method_name)
60
67
  end
61
68
 
62
- numeric, replacement = check(node)
63
-
64
- return unless numeric
65
-
66
69
  add_offense(node,
67
70
  message: format(MSG,
68
71
  prefer: replacement,
@@ -0,0 +1,42 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ module Cop
5
+ module Style
6
+ # This cop checks for places where keyword arguments can be used instead of
7
+ # boolean arguments when defining methods.
8
+ #
9
+ # @example
10
+ # # bad
11
+ # def some_method(bar = false)
12
+ # puts bar
13
+ # end
14
+ #
15
+ # # bad - common hack before keyword args were introduced
16
+ # def some_method(options = {})
17
+ # bar = options.fetch(:bar, false)
18
+ # puts bar
19
+ # end
20
+ #
21
+ # # good
22
+ # def some_method(bar: false)
23
+ # puts bar
24
+ # end
25
+ #
26
+ class OptionalBooleanParameter < Base
27
+ MSG = 'Use keyword arguments when defining method with boolean argument.'
28
+ BOOLEAN_TYPES = %i[true false].freeze
29
+
30
+ def on_def(node)
31
+ node.arguments.each do |arg|
32
+ next unless arg.optarg_type?
33
+
34
+ _name, value = *arg
35
+ add_offense(arg) if BOOLEAN_TYPES.include?(value.type)
36
+ end
37
+ end
38
+ alias on_defs on_def
39
+ end
40
+ end
41
+ end
42
+ end
@@ -30,7 +30,7 @@ module RuboCop
30
30
  def on_masgn(node)
31
31
  lhs, rhs = *node
32
32
  lhs_elements = *lhs
33
- rhs_elements = [*rhs].compact # edge case for one constant
33
+ rhs_elements = Array(rhs).compact # edge case for one constant
34
34
 
35
35
  return if allowed_lhs?(lhs) || allowed_rhs?(rhs) ||
36
36
  allowed_masign?(lhs_elements, rhs_elements)
@@ -42,7 +42,7 @@ module RuboCop
42
42
  lambda do |corrector|
43
43
  left, right = *node
44
44
  left_elements = *left
45
- right_elements = [*right].compact
45
+ right_elements = Array(right).compact
46
46
  order = find_valid_order(left_elements, right_elements)
47
47
  correction = assignment_corrector(node, order)
48
48
 
@@ -69,7 +69,7 @@ module RuboCop
69
69
 
70
70
  def allowed_rhs?(node)
71
71
  # Edge case for one constant
72
- elements = [*node].compact
72
+ elements = Array(node).compact
73
73
 
74
74
  # Account for edge case of `Constant::CONSTANT`
75
75
  !node.array_type? ||
@@ -131,8 +131,8 @@ module RuboCop
131
131
  @assignments = assignments
132
132
  end
133
133
 
134
- def tsort_each_node
135
- @assignments.each { |a| yield a }
134
+ def tsort_each_node(&block)
135
+ @assignments.each(&block)
136
136
  end
137
137
 
138
138
  def tsort_each_child(assignment)
@@ -102,12 +102,12 @@ module RuboCop
102
102
  delimiters_regexp = Regexp.union(delimiters)
103
103
  node
104
104
  .children.map { |n| string_source(n) }.compact
105
- .any? { |s| delimiters_regexp =~ s }
105
+ .any? { |s| delimiters_regexp.match?(s) }
106
106
  end
107
107
 
108
108
  def string_source(node)
109
109
  if node.is_a?(String)
110
- node
110
+ node.scrub
111
111
  elsif node.respond_to?(:type) && (node.str_type? || node.sym_type?)
112
112
  node.source
113
113
  end
@@ -17,7 +17,7 @@ module RuboCop
17
17
  MSG = 'Use `proc` instead of `Proc.new`.'
18
18
 
19
19
  def_node_matcher :proc_new?,
20
- '(block $(send (const nil? :Proc) :new) ...)'
20
+ '(block $(send (const {nil? cbase} :Proc) :new) ...)'
21
21
 
22
22
  def on_block(node)
23
23
  proc_new?(node) do |block_method|