rubocop 0.87.1 → 0.91.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 (515) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +2 -2
  3. data/bin/rubocop-profile +32 -0
  4. data/config/default.yml +267 -33
  5. data/lib/rubocop.rb +45 -5
  6. data/lib/rubocop/cached_data.rb +1 -0
  7. data/lib/rubocop/cli.rb +2 -2
  8. data/lib/rubocop/cli/command.rb +1 -0
  9. data/lib/rubocop/cli/command/auto_genenerate_config.rb +4 -3
  10. data/lib/rubocop/cli/command/base.rb +2 -0
  11. data/lib/rubocop/cli/command/execute_runner.rb +10 -1
  12. data/lib/rubocop/cli/command/init_dotfile.rb +1 -0
  13. data/lib/rubocop/cli/command/show_cops.rb +3 -2
  14. data/lib/rubocop/cli/command/version.rb +3 -2
  15. data/lib/rubocop/cli/environment.rb +1 -0
  16. data/lib/rubocop/comment_config.rb +10 -7
  17. data/lib/rubocop/config.rb +20 -3
  18. data/lib/rubocop/config_loader.rb +42 -18
  19. data/lib/rubocop/config_loader_resolver.rb +4 -3
  20. data/lib/rubocop/config_obsoletion.rb +7 -1
  21. data/lib/rubocop/config_store.rb +7 -3
  22. data/lib/rubocop/config_validator.rb +5 -4
  23. data/lib/rubocop/cop/autocorrect_logic.rb +1 -1
  24. data/lib/rubocop/cop/badge.rb +1 -1
  25. data/lib/rubocop/cop/base.rb +37 -6
  26. data/lib/rubocop/cop/bundler/duplicated_gem.rb +5 -1
  27. data/lib/rubocop/cop/bundler/gem_comment.rb +8 -3
  28. data/lib/rubocop/cop/bundler/insecure_protocol_source.rb +2 -0
  29. data/lib/rubocop/cop/commissioner.rb +47 -8
  30. data/lib/rubocop/cop/cop.rb +1 -1
  31. data/lib/rubocop/cop/correctors/alignment_corrector.rb +4 -4
  32. data/lib/rubocop/cop/correctors/condition_corrector.rb +3 -5
  33. data/lib/rubocop/cop/correctors/empty_line_corrector.rb +9 -10
  34. data/lib/rubocop/cop/correctors/line_break_corrector.rb +6 -6
  35. data/lib/rubocop/cop/correctors/multiline_literal_brace_corrector.rb +34 -3
  36. data/lib/rubocop/cop/correctors/parentheses_corrector.rb +5 -8
  37. data/lib/rubocop/cop/correctors/percent_literal_corrector.rb +6 -11
  38. data/lib/rubocop/cop/correctors/punctuation_corrector.rb +8 -10
  39. data/lib/rubocop/cop/correctors/unused_arg_corrector.rb +15 -18
  40. data/lib/rubocop/cop/documentation.rb +22 -0
  41. data/lib/rubocop/cop/force.rb +1 -0
  42. data/lib/rubocop/cop/gemspec/required_ruby_version.rb +38 -12
  43. data/lib/rubocop/cop/generator.rb +2 -1
  44. data/lib/rubocop/cop/generator/configuration_injector.rb +2 -2
  45. data/lib/rubocop/cop/internal_affairs/method_name_equal.rb +5 -12
  46. data/lib/rubocop/cop/internal_affairs/node_destructuring.rb +1 -1
  47. data/lib/rubocop/cop/internal_affairs/node_type_predicate.rb +1 -0
  48. data/lib/rubocop/cop/internal_affairs/offense_location_keyword.rb +9 -8
  49. data/lib/rubocop/cop/internal_affairs/redundant_location_argument.rb +11 -7
  50. data/lib/rubocop/cop/internal_affairs/redundant_message_argument.rb +8 -8
  51. data/lib/rubocop/cop/internal_affairs/useless_message_assertion.rb +2 -2
  52. data/lib/rubocop/cop/layout/begin_end_alignment.rb +77 -0
  53. data/lib/rubocop/cop/layout/block_alignment.rb +24 -20
  54. data/lib/rubocop/cop/layout/class_structure.rb +13 -16
  55. data/lib/rubocop/cop/layout/closing_heredoc_indentation.rb +4 -6
  56. data/lib/rubocop/cop/layout/comment_indentation.rb +1 -1
  57. data/lib/rubocop/cop/layout/condition_position.rb +13 -15
  58. data/lib/rubocop/cop/layout/def_end_alignment.rb +8 -5
  59. data/lib/rubocop/cop/layout/dot_position.rb +21 -17
  60. data/lib/rubocop/cop/layout/empty_comment.rb +30 -23
  61. data/lib/rubocop/cop/layout/empty_line_after_guard_clause.rb +19 -16
  62. data/lib/rubocop/cop/layout/empty_line_after_magic_comment.rb +13 -13
  63. data/lib/rubocop/cop/layout/empty_line_after_multiline_condition.rb +145 -0
  64. data/lib/rubocop/cop/layout/empty_line_between_defs.rb +21 -23
  65. data/lib/rubocop/cop/layout/empty_lines.rb +6 -9
  66. data/lib/rubocop/cop/layout/empty_lines_around_access_modifier.rb +5 -6
  67. data/lib/rubocop/cop/layout/empty_lines_around_arguments.rb +7 -8
  68. data/lib/rubocop/cop/layout/empty_lines_around_attribute_accessor.rb +3 -6
  69. data/lib/rubocop/cop/layout/empty_lines_around_begin_body.rb +2 -5
  70. data/lib/rubocop/cop/layout/empty_lines_around_block_body.rb +2 -5
  71. data/lib/rubocop/cop/layout/empty_lines_around_class_body.rb +2 -5
  72. data/lib/rubocop/cop/layout/empty_lines_around_exception_handling_keywords.rb +2 -5
  73. data/lib/rubocop/cop/layout/empty_lines_around_method_body.rb +2 -5
  74. data/lib/rubocop/cop/layout/empty_lines_around_module_body.rb +2 -5
  75. data/lib/rubocop/cop/layout/end_alignment.rb +14 -19
  76. data/lib/rubocop/cop/layout/extra_spacing.rb +22 -36
  77. data/lib/rubocop/cop/layout/first_array_element_line_break.rb +2 -5
  78. data/lib/rubocop/cop/layout/first_hash_element_line_break.rb +2 -5
  79. data/lib/rubocop/cop/layout/first_method_argument_line_break.rb +5 -9
  80. data/lib/rubocop/cop/layout/first_method_parameter_line_break.rb +2 -5
  81. data/lib/rubocop/cop/layout/hash_alignment.rb +17 -20
  82. data/lib/rubocop/cop/layout/heredoc_argument_closing_parenthesis.rb +15 -14
  83. data/lib/rubocop/cop/layout/heredoc_indentation.rb +16 -13
  84. data/lib/rubocop/cop/layout/indentation_style.rb +0 -2
  85. data/lib/rubocop/cop/layout/initial_indentation.rb +6 -7
  86. data/lib/rubocop/cop/layout/leading_comment_space.rb +12 -10
  87. data/lib/rubocop/cop/layout/leading_empty_lines.rb +6 -11
  88. data/lib/rubocop/cop/layout/multiline_array_brace_layout.rb +2 -5
  89. data/lib/rubocop/cop/layout/multiline_array_line_breaks.rb +2 -5
  90. data/lib/rubocop/cop/layout/multiline_assignment_layout.rb +10 -14
  91. data/lib/rubocop/cop/layout/multiline_block_layout.rb +37 -24
  92. data/lib/rubocop/cop/layout/multiline_hash_brace_layout.rb +2 -5
  93. data/lib/rubocop/cop/layout/multiline_hash_key_line_breaks.rb +2 -5
  94. data/lib/rubocop/cop/layout/multiline_method_argument_line_breaks.rb +5 -9
  95. data/lib/rubocop/cop/layout/multiline_method_call_brace_layout.rb +2 -5
  96. data/lib/rubocop/cop/layout/multiline_method_definition_brace_layout.rb +2 -5
  97. data/lib/rubocop/cop/layout/rescue_ensure_alignment.rb +32 -24
  98. data/lib/rubocop/cop/layout/space_after_colon.rb +11 -7
  99. data/lib/rubocop/cop/layout/space_after_comma.rb +2 -5
  100. data/lib/rubocop/cop/layout/space_after_method_name.rb +5 -6
  101. data/lib/rubocop/cop/layout/space_after_not.rb +9 -11
  102. data/lib/rubocop/cop/layout/space_after_semicolon.rb +2 -5
  103. data/lib/rubocop/cop/layout/space_around_block_parameters.rb +3 -2
  104. data/lib/rubocop/cop/layout/space_around_equals_in_parameter_default.rb +20 -15
  105. data/lib/rubocop/cop/layout/space_around_keyword.rb +17 -18
  106. data/lib/rubocop/cop/layout/space_around_method_call_operator.rb +33 -66
  107. data/lib/rubocop/cop/layout/space_around_operators.rb +17 -16
  108. data/lib/rubocop/cop/layout/space_before_block_braces.rb +23 -22
  109. data/lib/rubocop/cop/layout/space_before_comma.rb +3 -5
  110. data/lib/rubocop/cop/layout/space_before_comment.rb +10 -7
  111. data/lib/rubocop/cop/layout/space_before_first_arg.rb +7 -7
  112. data/lib/rubocop/cop/layout/space_before_semicolon.rb +2 -5
  113. data/lib/rubocop/cop/layout/space_in_lambda_literal.rb +9 -17
  114. data/lib/rubocop/cop/layout/space_inside_array_literal_brackets.rb +16 -18
  115. data/lib/rubocop/cop/layout/space_inside_array_percent_literal.rb +3 -8
  116. data/lib/rubocop/cop/layout/space_inside_block_braces.rb +17 -16
  117. data/lib/rubocop/cop/layout/space_inside_hash_literal_braces.rb +15 -19
  118. data/lib/rubocop/cop/layout/space_inside_parens.rb +9 -14
  119. data/lib/rubocop/cop/layout/space_inside_percent_literal_delimiters.rb +5 -10
  120. data/lib/rubocop/cop/layout/space_inside_range_literal.rb +8 -17
  121. data/lib/rubocop/cop/layout/space_inside_reference_brackets.rb +14 -22
  122. data/lib/rubocop/cop/layout/space_inside_string_interpolation.rb +10 -11
  123. data/lib/rubocop/cop/layout/trailing_empty_lines.rb +10 -15
  124. data/lib/rubocop/cop/layout/trailing_whitespace.rb +11 -11
  125. data/lib/rubocop/cop/lint/ambiguous_block_association.rb +7 -4
  126. data/lib/rubocop/cop/lint/ambiguous_operator.rb +17 -10
  127. data/lib/rubocop/cop/lint/ambiguous_regexp_literal.rb +11 -13
  128. data/lib/rubocop/cop/lint/assignment_in_condition.rb +2 -2
  129. data/lib/rubocop/cop/lint/big_decimal_new.rb +9 -10
  130. data/lib/rubocop/cop/lint/binary_operator_with_identical_operands.rb +50 -0
  131. data/lib/rubocop/cop/lint/boolean_symbol.rb +16 -11
  132. data/lib/rubocop/cop/lint/circular_argument_reference.rb +1 -1
  133. data/lib/rubocop/cop/lint/constant_definition_in_block.rb +54 -0
  134. data/lib/rubocop/cop/lint/constant_resolution.rb +2 -2
  135. data/lib/rubocop/cop/lint/debugger.rb +6 -1
  136. data/lib/rubocop/cop/lint/deprecated_class_methods.rb +7 -10
  137. data/lib/rubocop/cop/lint/deprecated_open_ssl_constant.rb +17 -13
  138. data/lib/rubocop/cop/lint/disjunctive_assignment_in_constructor.rb +8 -2
  139. data/lib/rubocop/cop/lint/duplicate_case_condition.rb +1 -1
  140. data/lib/rubocop/cop/lint/duplicate_elsif_condition.rb +39 -0
  141. data/lib/rubocop/cop/lint/duplicate_hash_key.rb +1 -1
  142. data/lib/rubocop/cop/lint/duplicate_methods.rb +7 -6
  143. data/lib/rubocop/cop/lint/duplicate_require.rb +46 -0
  144. data/lib/rubocop/cop/lint/duplicate_rescue_exception.rb +49 -0
  145. data/lib/rubocop/cop/lint/each_with_object_argument.rb +2 -1
  146. data/lib/rubocop/cop/lint/else_layout.rb +1 -1
  147. data/lib/rubocop/cop/lint/empty_conditional_body.rb +67 -0
  148. data/lib/rubocop/cop/lint/empty_ensure.rb +5 -5
  149. data/lib/rubocop/cop/lint/empty_expression.rb +2 -2
  150. data/lib/rubocop/cop/lint/empty_file.rb +50 -0
  151. data/lib/rubocop/cop/lint/empty_interpolation.rb +5 -6
  152. data/lib/rubocop/cop/lint/empty_when.rb +2 -2
  153. data/lib/rubocop/cop/lint/ensure_return.rb +27 -29
  154. data/lib/rubocop/cop/lint/erb_new_arguments.rb +13 -10
  155. data/lib/rubocop/cop/lint/flip_flop.rb +1 -1
  156. data/lib/rubocop/cop/lint/float_comparison.rb +93 -0
  157. data/lib/rubocop/cop/lint/float_out_of_range.rb +1 -1
  158. data/lib/rubocop/cop/lint/format_parameter_mismatch.rb +4 -3
  159. data/lib/rubocop/cop/lint/heredoc_method_call_position.rb +13 -14
  160. data/lib/rubocop/cop/lint/identity_comparison.rb +49 -0
  161. data/lib/rubocop/cop/lint/implicit_string_concatenation.rb +5 -4
  162. data/lib/rubocop/cop/lint/ineffective_access_modifier.rb +8 -8
  163. data/lib/rubocop/cop/lint/inherit_exception.rb +12 -7
  164. data/lib/rubocop/cop/lint/interpolation_check.rb +18 -15
  165. data/lib/rubocop/cop/lint/literal_as_condition.rb +14 -2
  166. data/lib/rubocop/cop/lint/literal_in_interpolation.rb +7 -7
  167. data/lib/rubocop/cop/lint/loop.rb +23 -2
  168. data/lib/rubocop/cop/lint/missing_cop_enable_directive.rb +6 -5
  169. data/lib/rubocop/cop/lint/missing_super.rb +99 -0
  170. data/lib/rubocop/cop/lint/mixed_regexp_capture_types.rb +3 -36
  171. data/lib/rubocop/cop/lint/multiple_comparison.rb +9 -10
  172. data/lib/rubocop/cop/lint/nested_method_definition.rb +14 -20
  173. data/lib/rubocop/cop/lint/nested_percent_literal.rb +1 -1
  174. data/lib/rubocop/cop/lint/next_without_accumulator.rb +1 -1
  175. data/lib/rubocop/cop/lint/non_deterministic_require_order.rb +82 -11
  176. data/lib/rubocop/cop/lint/non_local_exit_from_iterator.rb +2 -2
  177. data/lib/rubocop/cop/lint/number_conversion.rb +7 -9
  178. data/lib/rubocop/cop/lint/ordered_magic_comments.rb +11 -13
  179. data/lib/rubocop/cop/lint/out_of_range_regexp_ref.rb +79 -0
  180. data/lib/rubocop/cop/lint/parentheses_as_grouped_expression.rb +4 -10
  181. data/lib/rubocop/cop/lint/percent_string_array.rb +3 -6
  182. data/lib/rubocop/cop/lint/percent_symbol_array.rb +13 -12
  183. data/lib/rubocop/cop/lint/raise_exception.rb +13 -10
  184. data/lib/rubocop/cop/lint/rand_one.rb +2 -1
  185. data/lib/rubocop/cop/lint/redundant_cop_disable_directive.rb +16 -19
  186. data/lib/rubocop/cop/lint/redundant_cop_enable_directive.rb +7 -11
  187. data/lib/rubocop/cop/lint/redundant_require_statement.rb +5 -7
  188. data/lib/rubocop/cop/lint/redundant_splat_expansion.rb +13 -9
  189. data/lib/rubocop/cop/lint/redundant_string_coercion.rb +6 -13
  190. data/lib/rubocop/cop/lint/redundant_with_index.rb +11 -14
  191. data/lib/rubocop/cop/lint/redundant_with_object.rb +11 -14
  192. data/lib/rubocop/cop/lint/regexp_as_condition.rb +4 -6
  193. data/lib/rubocop/cop/lint/require_parentheses.rb +2 -2
  194. data/lib/rubocop/cop/lint/rescue_exception.rb +1 -1
  195. data/lib/rubocop/cop/lint/rescue_type.rb +8 -8
  196. data/lib/rubocop/cop/lint/return_in_void_context.rb +2 -4
  197. data/lib/rubocop/cop/lint/safe_navigation_chain.rb +3 -6
  198. data/lib/rubocop/cop/lint/safe_navigation_consistency.rb +14 -10
  199. data/lib/rubocop/cop/lint/safe_navigation_with_empty.rb +7 -7
  200. data/lib/rubocop/cop/lint/script_permission.rb +10 -7
  201. data/lib/rubocop/cop/lint/self_assignment.rb +78 -0
  202. data/lib/rubocop/cop/lint/send_with_mixin_argument.rb +8 -12
  203. data/lib/rubocop/cop/lint/shadowed_argument.rb +3 -3
  204. data/lib/rubocop/cop/lint/shadowed_exception.rb +2 -2
  205. data/lib/rubocop/cop/lint/shadowing_outer_local_variable.rb +7 -7
  206. data/lib/rubocop/cop/lint/struct_new_override.rb +2 -1
  207. data/lib/rubocop/cop/lint/suppressed_exception.rb +4 -7
  208. data/lib/rubocop/cop/lint/to_json.rb +20 -11
  209. data/lib/rubocop/cop/lint/top_level_return_with_argument.rb +34 -0
  210. data/lib/rubocop/cop/lint/trailing_comma_in_attribute_declaration.rb +57 -0
  211. data/lib/rubocop/cop/lint/underscore_prefixed_variable_name.rb +4 -4
  212. data/lib/rubocop/cop/lint/unified_integer.rb +4 -6
  213. data/lib/rubocop/cop/lint/unreachable_code.rb +1 -1
  214. data/lib/rubocop/cop/lint/unreachable_loop.rb +175 -0
  215. data/lib/rubocop/cop/lint/unused_block_argument.rb +8 -3
  216. data/lib/rubocop/cop/lint/unused_method_argument.rb +8 -3
  217. data/lib/rubocop/cop/lint/uri_escape_unescape.rb +4 -2
  218. data/lib/rubocop/cop/lint/uri_regexp.rb +12 -47
  219. data/lib/rubocop/cop/lint/useless_access_modifier.rb +25 -15
  220. data/lib/rubocop/cop/lint/useless_assignment.rb +4 -4
  221. data/lib/rubocop/cop/lint/useless_else_without_rescue.rb +6 -15
  222. data/lib/rubocop/cop/lint/useless_method_definition.rb +70 -0
  223. data/lib/rubocop/cop/lint/useless_setter_call.rb +4 -6
  224. data/lib/rubocop/cop/lint/useless_times.rb +97 -0
  225. data/lib/rubocop/cop/lint/void.rb +3 -7
  226. data/lib/rubocop/cop/metrics/abc_size.rb +1 -1
  227. data/lib/rubocop/cop/metrics/block_length.rb +2 -2
  228. data/lib/rubocop/cop/metrics/block_nesting.rb +2 -2
  229. data/lib/rubocop/cop/metrics/class_length.rb +2 -2
  230. data/lib/rubocop/cop/metrics/cyclomatic_complexity.rb +2 -1
  231. data/lib/rubocop/cop/metrics/method_length.rb +2 -2
  232. data/lib/rubocop/cop/metrics/module_length.rb +2 -2
  233. data/lib/rubocop/cop/metrics/parameter_lists.rb +2 -6
  234. data/lib/rubocop/cop/metrics/perceived_complexity.rb +7 -8
  235. data/lib/rubocop/cop/metrics/utils/abc_size_calculator.rb +50 -5
  236. data/lib/rubocop/cop/metrics/utils/code_length_calculator.rb +53 -24
  237. data/lib/rubocop/cop/metrics/utils/repeated_csend_discount.rb +37 -0
  238. data/lib/rubocop/cop/migration/department_name.rb +14 -16
  239. data/lib/rubocop/cop/mixin/alignment.rb +5 -1
  240. data/lib/rubocop/cop/mixin/allowed_methods.rb +2 -0
  241. data/lib/rubocop/cop/mixin/annotation_comment.rb +5 -0
  242. data/lib/rubocop/cop/mixin/array_min_size.rb +1 -1
  243. data/lib/rubocop/cop/mixin/check_line_breakable.rb +17 -8
  244. data/lib/rubocop/cop/mixin/code_length.rb +22 -5
  245. data/lib/rubocop/cop/mixin/comments_help.rb +48 -0
  246. data/lib/rubocop/cop/mixin/configurable_naming.rb +2 -2
  247. data/lib/rubocop/cop/mixin/empty_lines_around_body.rb +8 -7
  248. data/lib/rubocop/cop/mixin/empty_parameter.rb +3 -1
  249. data/lib/rubocop/cop/mixin/end_keyword_alignment.rb +12 -1
  250. data/lib/rubocop/cop/mixin/first_element_line_break.rb +3 -1
  251. data/lib/rubocop/cop/mixin/hash_transform_method.rb +31 -12
  252. data/lib/rubocop/cop/mixin/line_length_help.rb +1 -3
  253. data/lib/rubocop/cop/mixin/method_complexity.rb +10 -2
  254. data/lib/rubocop/cop/mixin/multiline_element_line_breaks.rb +3 -1
  255. data/lib/rubocop/cop/mixin/multiline_literal_brace_layout.rb +13 -12
  256. data/lib/rubocop/cop/mixin/negative_conditional.rb +2 -2
  257. data/lib/rubocop/cop/mixin/percent_array.rb +16 -9
  258. data/lib/rubocop/cop/mixin/range_help.rb +18 -4
  259. data/lib/rubocop/cop/mixin/regexp_literal_help.rb +1 -1
  260. data/lib/rubocop/cop/mixin/rescue_node.rb +10 -1
  261. data/lib/rubocop/cop/mixin/space_after_punctuation.rb +4 -3
  262. data/lib/rubocop/cop/mixin/space_before_punctuation.rb +4 -3
  263. data/lib/rubocop/cop/mixin/statement_modifier.rb +39 -10
  264. data/lib/rubocop/cop/mixin/surrounding_space.rb +8 -29
  265. data/lib/rubocop/cop/mixin/trailing_comma.rb +9 -11
  266. data/lib/rubocop/cop/mixin/uncommunicative_name.rb +6 -13
  267. data/lib/rubocop/cop/mixin/unused_argument.rb +4 -6
  268. data/lib/rubocop/cop/naming/accessor_method_name.rb +4 -2
  269. data/lib/rubocop/cop/naming/ascii_identifiers.rb +3 -3
  270. data/lib/rubocop/cop/naming/binary_operator_parameter_name.rb +2 -2
  271. data/lib/rubocop/cop/naming/block_parameter_name.rb +1 -1
  272. data/lib/rubocop/cop/naming/class_and_module_camel_case.rb +2 -2
  273. data/lib/rubocop/cop/naming/constant_name.rb +2 -2
  274. data/lib/rubocop/cop/naming/file_name.rb +4 -4
  275. data/lib/rubocop/cop/naming/heredoc_delimiter_case.rb +2 -2
  276. data/lib/rubocop/cop/naming/heredoc_delimiter_naming.rb +2 -2
  277. data/lib/rubocop/cop/naming/memoized_instance_variable_name.rb +2 -2
  278. data/lib/rubocop/cop/naming/method_parameter_name.rb +1 -1
  279. data/lib/rubocop/cop/naming/predicate_name.rb +3 -5
  280. data/lib/rubocop/cop/naming/rescued_exceptions_variable_name.rb +12 -11
  281. data/lib/rubocop/cop/offense.rb +1 -0
  282. data/lib/rubocop/cop/registry.rb +3 -3
  283. data/lib/rubocop/cop/security/eval.rb +3 -2
  284. data/lib/rubocop/cop/security/json_load.rb +7 -8
  285. data/lib/rubocop/cop/security/marshal_load.rb +3 -4
  286. data/lib/rubocop/cop/security/open.rb +3 -2
  287. data/lib/rubocop/cop/security/yaml_load.rb +7 -6
  288. data/lib/rubocop/cop/severity.rb +0 -8
  289. data/lib/rubocop/cop/style/access_modifier_declarations.rb +7 -8
  290. data/lib/rubocop/cop/style/accessor_grouping.rb +29 -20
  291. data/lib/rubocop/cop/style/alias.rb +43 -36
  292. data/lib/rubocop/cop/style/and_or.rb +9 -11
  293. data/lib/rubocop/cop/style/array_coercion.rb +63 -0
  294. data/lib/rubocop/cop/style/array_join.rb +7 -8
  295. data/lib/rubocop/cop/style/ascii_comments.rb +4 -4
  296. data/lib/rubocop/cop/style/attr.rb +12 -9
  297. data/lib/rubocop/cop/style/auto_resource_cleanup.rb +7 -7
  298. data/lib/rubocop/cop/style/bare_percent_literals.rb +10 -12
  299. data/lib/rubocop/cop/style/begin_block.rb +2 -2
  300. data/lib/rubocop/cop/style/bisected_attr_accessor.rb +14 -18
  301. data/lib/rubocop/cop/style/block_comments.rb +14 -18
  302. data/lib/rubocop/cop/style/block_delimiters.rb +23 -23
  303. data/lib/rubocop/cop/style/case_equality.rb +32 -5
  304. data/lib/rubocop/cop/style/case_like_if.rb +236 -0
  305. data/lib/rubocop/cop/style/class_and_module_children.rb +16 -11
  306. data/lib/rubocop/cop/style/class_check.rb +6 -11
  307. data/lib/rubocop/cop/style/class_methods.rb +7 -11
  308. data/lib/rubocop/cop/style/class_methods_definitions.rb +157 -0
  309. data/lib/rubocop/cop/style/class_vars.rb +7 -12
  310. data/lib/rubocop/cop/style/collection_methods.rb +11 -17
  311. data/lib/rubocop/cop/style/colon_method_call.rb +8 -9
  312. data/lib/rubocop/cop/style/colon_method_definition.rb +6 -6
  313. data/lib/rubocop/cop/style/combinable_loops.rb +89 -0
  314. data/lib/rubocop/cop/style/command_literal.rb +23 -24
  315. data/lib/rubocop/cop/style/comment_annotation.rb +15 -15
  316. data/lib/rubocop/cop/style/commented_keyword.rb +6 -3
  317. data/lib/rubocop/cop/style/conditional_assignment.rb +62 -64
  318. data/lib/rubocop/cop/style/constant_visibility.rb +3 -2
  319. data/lib/rubocop/cop/style/copyright.rb +12 -12
  320. data/lib/rubocop/cop/style/date_time.rb +1 -1
  321. data/lib/rubocop/cop/style/def_with_parentheses.rb +8 -10
  322. data/lib/rubocop/cop/style/dir.rb +8 -10
  323. data/lib/rubocop/cop/style/disable_cops_within_source_code_directive.rb +7 -9
  324. data/lib/rubocop/cop/style/documentation.rb +6 -8
  325. data/lib/rubocop/cop/style/documentation_method.rb +1 -1
  326. data/lib/rubocop/cop/style/double_cop_disable_directive.rb +12 -15
  327. data/lib/rubocop/cop/style/double_negation.rb +3 -2
  328. data/lib/rubocop/cop/style/each_for_simple_loop.rb +5 -8
  329. data/lib/rubocop/cop/style/each_with_object.rb +16 -19
  330. data/lib/rubocop/cop/style/empty_block_parameter.rb +9 -10
  331. data/lib/rubocop/cop/style/empty_case_condition.rb +19 -20
  332. data/lib/rubocop/cop/style/empty_else.rb +17 -19
  333. data/lib/rubocop/cop/style/empty_lambda_parameter.rb +9 -10
  334. data/lib/rubocop/cop/style/empty_literal.rb +18 -17
  335. data/lib/rubocop/cop/style/empty_method.rb +10 -13
  336. data/lib/rubocop/cop/style/encoding.rb +5 -9
  337. data/lib/rubocop/cop/style/end_block.rb +4 -6
  338. data/lib/rubocop/cop/style/eval_with_location.rb +7 -7
  339. data/lib/rubocop/cop/style/even_odd.rb +8 -11
  340. data/lib/rubocop/cop/style/expand_path_arguments.rb +22 -21
  341. data/lib/rubocop/cop/style/explicit_block_argument.rb +102 -0
  342. data/lib/rubocop/cop/style/exponential_notation.rb +7 -9
  343. data/lib/rubocop/cop/style/float_division.rb +10 -11
  344. data/lib/rubocop/cop/style/for.rb +11 -15
  345. data/lib/rubocop/cop/style/format_string.rb +18 -19
  346. data/lib/rubocop/cop/style/format_string_token.rb +10 -12
  347. data/lib/rubocop/cop/style/frozen_string_literal_comment.rb +19 -41
  348. data/lib/rubocop/cop/style/global_std_stream.rb +65 -0
  349. data/lib/rubocop/cop/style/global_vars.rb +2 -2
  350. data/lib/rubocop/cop/style/guard_clause.rb +6 -6
  351. data/lib/rubocop/cop/style/hash_as_last_array_item.rb +79 -0
  352. data/lib/rubocop/cop/style/hash_each_methods.rb +5 -8
  353. data/lib/rubocop/cop/style/hash_like_case.rb +76 -0
  354. data/lib/rubocop/cop/style/hash_syntax.rb +10 -8
  355. data/lib/rubocop/cop/style/hash_transform_keys.rb +19 -11
  356. data/lib/rubocop/cop/style/hash_transform_values.rb +18 -10
  357. data/lib/rubocop/cop/style/identical_conditional_branches.rb +2 -2
  358. data/lib/rubocop/cop/style/if_inside_else.rb +3 -3
  359. data/lib/rubocop/cop/style/if_unless_modifier.rb +19 -41
  360. data/lib/rubocop/cop/style/if_unless_modifier_of_if_unless.rb +3 -7
  361. data/lib/rubocop/cop/style/if_with_semicolon.rb +3 -6
  362. data/lib/rubocop/cop/style/implicit_runtime_error.rb +2 -1
  363. data/lib/rubocop/cop/style/infinite_loop.rb +24 -24
  364. data/lib/rubocop/cop/style/inline_comment.rb +3 -3
  365. data/lib/rubocop/cop/style/inverse_methods.rb +22 -32
  366. data/lib/rubocop/cop/style/keyword_parameters_order.rb +58 -0
  367. data/lib/rubocop/cop/style/lambda.rb +7 -12
  368. data/lib/rubocop/cop/style/lambda_call.rb +17 -14
  369. data/lib/rubocop/cop/style/line_end_concatenation.rb +19 -16
  370. data/lib/rubocop/cop/style/method_call_with_args_parentheses.rb +2 -1
  371. data/lib/rubocop/cop/style/method_call_with_args_parentheses/omit_parentheses.rb +16 -11
  372. data/lib/rubocop/cop/style/method_call_with_args_parentheses/require_parentheses.rb +4 -8
  373. data/lib/rubocop/cop/style/method_call_without_args_parentheses.rb +8 -7
  374. data/lib/rubocop/cop/style/method_called_on_do_end_block.rb +12 -3
  375. data/lib/rubocop/cop/style/method_def_parentheses.rb +11 -16
  376. data/lib/rubocop/cop/style/min_max.rb +8 -12
  377. data/lib/rubocop/cop/style/missing_else.rb +11 -21
  378. data/lib/rubocop/cop/style/missing_respond_to_missing.rb +10 -3
  379. data/lib/rubocop/cop/style/mixin_grouping.rb +24 -27
  380. data/lib/rubocop/cop/style/mixin_usage.rb +2 -1
  381. data/lib/rubocop/cop/style/module_function.rb +10 -13
  382. data/lib/rubocop/cop/style/multiline_if_modifier.rb +3 -10
  383. data/lib/rubocop/cop/style/multiline_if_then.rb +4 -10
  384. data/lib/rubocop/cop/style/multiline_memoization.rb +14 -12
  385. data/lib/rubocop/cop/style/multiline_method_signature.rb +2 -2
  386. data/lib/rubocop/cop/style/multiline_ternary_operator.rb +17 -6
  387. data/lib/rubocop/cop/style/multiline_when_then.rb +9 -11
  388. data/lib/rubocop/cop/style/multiple_comparison.rb +1 -1
  389. data/lib/rubocop/cop/style/mutable_constant.rb +23 -20
  390. data/lib/rubocop/cop/style/negated_if.rb +6 -6
  391. data/lib/rubocop/cop/style/negated_unless.rb +6 -6
  392. data/lib/rubocop/cop/style/negated_while.rb +7 -15
  393. data/lib/rubocop/cop/style/nested_modifier.rb +10 -13
  394. data/lib/rubocop/cop/style/nested_parenthesized_calls.rb +14 -12
  395. data/lib/rubocop/cop/style/nested_ternary_operator.rb +14 -16
  396. data/lib/rubocop/cop/style/next.rb +10 -14
  397. data/lib/rubocop/cop/style/nil_comparison.rb +13 -11
  398. data/lib/rubocop/cop/style/non_nil_check.rb +34 -26
  399. data/lib/rubocop/cop/style/not.rb +20 -26
  400. data/lib/rubocop/cop/style/numeric_literal_prefix.rb +4 -9
  401. data/lib/rubocop/cop/style/numeric_predicate.rb +9 -15
  402. data/lib/rubocop/cop/style/one_line_conditional.rb +71 -23
  403. data/lib/rubocop/cop/style/option_hash.rb +1 -1
  404. data/lib/rubocop/cop/style/optional_arguments.rb +1 -1
  405. data/lib/rubocop/cop/style/optional_boolean_parameter.rb +42 -0
  406. data/lib/rubocop/cop/style/or_assignment.rb +13 -10
  407. data/lib/rubocop/cop/style/parallel_assignment.rb +18 -18
  408. data/lib/rubocop/cop/style/parentheses_around_condition.rb +6 -6
  409. data/lib/rubocop/cop/style/percent_literal_delimiters.rb +14 -20
  410. data/lib/rubocop/cop/style/percent_q_literals.rb +8 -10
  411. data/lib/rubocop/cop/style/perl_backrefs.rb +8 -10
  412. data/lib/rubocop/cop/style/preferred_hash_methods.rb +11 -14
  413. data/lib/rubocop/cop/style/proc.rb +6 -6
  414. data/lib/rubocop/cop/style/raise_args.rb +15 -24
  415. data/lib/rubocop/cop/style/random_with_offset.rb +17 -16
  416. data/lib/rubocop/cop/style/redundant_assignment.rb +8 -10
  417. data/lib/rubocop/cop/style/redundant_begin.rb +7 -9
  418. data/lib/rubocop/cop/style/redundant_capital_w.rb +6 -9
  419. data/lib/rubocop/cop/style/redundant_condition.rb +20 -9
  420. data/lib/rubocop/cop/style/redundant_exception.rb +2 -0
  421. data/lib/rubocop/cop/style/redundant_fetch_block.rb +3 -12
  422. data/lib/rubocop/cop/style/redundant_file_extension_in_require.rb +51 -0
  423. data/lib/rubocop/cop/style/redundant_freeze.rb +5 -7
  424. data/lib/rubocop/cop/style/redundant_interpolation.rb +25 -24
  425. data/lib/rubocop/cop/style/redundant_parentheses.rb +19 -12
  426. data/lib/rubocop/cop/style/redundant_regexp_character_class.rb +6 -13
  427. data/lib/rubocop/cop/style/redundant_regexp_escape.rb +14 -23
  428. data/lib/rubocop/cop/style/redundant_self.rb +2 -2
  429. data/lib/rubocop/cop/style/redundant_self_assignment.rb +116 -0
  430. data/lib/rubocop/cop/style/redundant_sort.rb +21 -13
  431. data/lib/rubocop/cop/style/regexp_literal.rb +10 -21
  432. data/lib/rubocop/cop/style/rescue_modifier.rb +29 -9
  433. data/lib/rubocop/cop/style/return_nil.rb +5 -5
  434. data/lib/rubocop/cop/style/safe_navigation.rb +22 -16
  435. data/lib/rubocop/cop/style/sample.rb +12 -14
  436. data/lib/rubocop/cop/style/self_assignment.rb +26 -22
  437. data/lib/rubocop/cop/style/semicolon.rb +6 -9
  438. data/lib/rubocop/cop/style/send.rb +4 -5
  439. data/lib/rubocop/cop/style/signal_exception.rb +25 -19
  440. data/lib/rubocop/cop/style/single_argument_dig.rb +55 -0
  441. data/lib/rubocop/cop/style/single_line_block_params.rb +4 -2
  442. data/lib/rubocop/cop/style/single_line_methods.rb +18 -17
  443. data/lib/rubocop/cop/style/slicing_with_range.rb +6 -8
  444. data/lib/rubocop/cop/style/sole_nested_conditional.rb +66 -0
  445. data/lib/rubocop/cop/style/special_global_vars.rb +10 -15
  446. data/lib/rubocop/cop/style/stabby_lambda_parentheses.rb +17 -20
  447. data/lib/rubocop/cop/style/stderr_puts.rb +5 -6
  448. data/lib/rubocop/cop/style/string_concatenation.rb +106 -0
  449. data/lib/rubocop/cop/style/string_hash_keys.rb +6 -7
  450. data/lib/rubocop/cop/style/string_methods.rb +7 -17
  451. data/lib/rubocop/cop/style/strip.rb +9 -14
  452. data/lib/rubocop/cop/style/struct_inheritance.rb +4 -7
  453. data/lib/rubocop/cop/style/symbol_array.rb +6 -17
  454. data/lib/rubocop/cop/style/symbol_literal.rb +4 -6
  455. data/lib/rubocop/cop/style/symbol_proc.rb +15 -19
  456. data/lib/rubocop/cop/style/ternary_parentheses.rb +21 -20
  457. data/lib/rubocop/cop/style/trailing_body_on_class.rb +3 -6
  458. data/lib/rubocop/cop/style/trailing_body_on_method_definition.rb +4 -7
  459. data/lib/rubocop/cop/style/trailing_body_on_module.rb +3 -6
  460. data/lib/rubocop/cop/style/trailing_comma_in_arguments.rb +2 -5
  461. data/lib/rubocop/cop/style/trailing_comma_in_array_literal.rb +2 -5
  462. data/lib/rubocop/cop/style/trailing_comma_in_block_args.rb +7 -6
  463. data/lib/rubocop/cop/style/trailing_comma_in_hash_literal.rb +2 -5
  464. data/lib/rubocop/cop/style/trailing_method_end_statement.rb +9 -32
  465. data/lib/rubocop/cop/style/trailing_underscore_variable.rb +8 -17
  466. data/lib/rubocop/cop/style/trivial_accessors.rb +26 -30
  467. data/lib/rubocop/cop/style/unless_else.rb +5 -8
  468. data/lib/rubocop/cop/style/unpack_first.rb +5 -8
  469. data/lib/rubocop/cop/style/variable_interpolation.rb +7 -10
  470. data/lib/rubocop/cop/style/when_then.rb +4 -6
  471. data/lib/rubocop/cop/style/while_until_do.rb +6 -16
  472. data/lib/rubocop/cop/style/while_until_modifier.rb +6 -20
  473. data/lib/rubocop/cop/style/word_array.rb +5 -23
  474. data/lib/rubocop/cop/style/yoda_condition.rb +4 -15
  475. data/lib/rubocop/cop/style/zero_length_predicate.rb +17 -19
  476. data/lib/rubocop/cop/team.rb +2 -1
  477. data/lib/rubocop/cop/tokens_util.rb +84 -0
  478. data/lib/rubocop/cop/util.rb +3 -13
  479. data/lib/rubocop/cop/utils/format_string.rb +3 -5
  480. data/lib/rubocop/cop/variable_force.rb +2 -2
  481. data/lib/rubocop/cop/variable_force/branch.rb +1 -0
  482. data/lib/rubocop/cop/variable_force/variable.rb +7 -5
  483. data/lib/rubocop/cops_documentation_generator.rb +284 -0
  484. data/lib/rubocop/core_ext/string.rb +2 -2
  485. data/lib/rubocop/error.rb +1 -0
  486. data/lib/rubocop/ext/regexp_node.rb +46 -0
  487. data/lib/rubocop/file_finder.rb +13 -12
  488. data/lib/rubocop/formatter/auto_gen_config_formatter.rb +2 -1
  489. data/lib/rubocop/formatter/disabled_config_formatter.rb +1 -1
  490. data/lib/rubocop/formatter/formatter_set.rb +1 -0
  491. data/lib/rubocop/formatter/html_formatter.rb +2 -0
  492. data/lib/rubocop/formatter/junit_formatter.rb +1 -1
  493. data/lib/rubocop/formatter/progress_formatter.rb +2 -1
  494. data/lib/rubocop/formatter/quiet_formatter.rb +1 -1
  495. data/lib/rubocop/formatter/simple_text_formatter.rb +36 -6
  496. data/lib/rubocop/name_similarity.rb +1 -0
  497. data/lib/rubocop/options.rb +25 -4
  498. data/lib/rubocop/path_util.rb +17 -17
  499. data/lib/rubocop/rake_task.rb +1 -0
  500. data/lib/rubocop/remote_config.rb +1 -0
  501. data/lib/rubocop/result_cache.rb +37 -15
  502. data/lib/rubocop/rspec/cop_helper.rb +4 -1
  503. data/lib/rubocop/rspec/expect_offense.rb +37 -6
  504. data/lib/rubocop/rspec/shared_contexts.rb +25 -14
  505. data/lib/rubocop/runner.rb +36 -21
  506. data/lib/rubocop/string_interpreter.rb +3 -0
  507. data/lib/rubocop/target_finder.rb +14 -10
  508. data/lib/rubocop/target_ruby.rb +6 -0
  509. data/lib/rubocop/version.rb +3 -2
  510. data/lib/rubocop/yaml_duplication_checker.rb +1 -0
  511. metadata +45 -8
  512. data/lib/rubocop/cop/lint/useless_comparison.rb +0 -28
  513. data/lib/rubocop/cop/mixin/parser_diagnostic.rb +0 -37
  514. data/lib/rubocop/cop/mixin/too_many_lines.rb +0 -25
  515. data/lib/rubocop/cop/style/method_missing_super.rb +0 -34
@@ -11,6 +11,7 @@ module RuboCop
11
11
  end
12
12
 
13
13
  def self.inherited(subclass)
14
+ super
14
15
  all << subclass
15
16
  end
16
17
 
@@ -3,8 +3,8 @@
3
3
  module RuboCop
4
4
  module Cop
5
5
  module Gemspec
6
- # Checks that `required_ruby_version` of gemspec and `TargetRubyVersion`
7
- # of .rubocop.yml are equal.
6
+ # Checks that `required_ruby_version` of gemspec is specified and
7
+ # equal to `TargetRubyVersion` of .rubocop.yml.
8
8
  # Thereby, RuboCop to perform static analysis working on the version
9
9
  # required by gemspec.
10
10
  #
@@ -13,6 +13,11 @@ module RuboCop
13
13
  #
14
14
  # # bad
15
15
  # Gem::Specification.new do |spec|
16
+ # # no `required_ruby_version` specified
17
+ # end
18
+ #
19
+ # # bad
20
+ # Gem::Specification.new do |spec|
16
21
  # spec.required_ruby_version = '>= 2.4.0'
17
22
  # end
18
23
  #
@@ -35,18 +40,35 @@ module RuboCop
35
40
  # Gem::Specification.new do |spec|
36
41
  # spec.required_ruby_version = ['>= 2.5.0', '< 2.7.0']
37
42
  # end
43
+ #
44
+ # # good
45
+ # Gem::Specification.new do |spec|
46
+ # spec.required_ruby_version = '~> 2.5'
47
+ # end
38
48
  class RequiredRubyVersion < Cop
39
- MSG = '`required_ruby_version` (%<required_ruby_version>s, ' \
40
- 'declared in %<gemspec_filename>s) and `TargetRubyVersion` ' \
41
- '(%<target_ruby_version>s, which may be specified in ' \
42
- '.rubocop.yml) should be equal.'
49
+ include RangeHelp
50
+
51
+ NOT_EQUAL_MSG = '`required_ruby_version` (%<required_ruby_version>s, ' \
52
+ 'declared in %<gemspec_filename>s) and `TargetRubyVersion` ' \
53
+ '(%<target_ruby_version>s, which may be specified in ' \
54
+ '.rubocop.yml) should be equal.'
55
+ MISSING_MSG = '`required_ruby_version` should be specified.'
43
56
 
44
57
  def_node_search :required_ruby_version, <<~PATTERN
45
- (send _ :required_ruby_version= ${(str _) (array (str _))})
58
+ (send _ :required_ruby_version= $_)
59
+ PATTERN
60
+
61
+ def_node_matcher :string_version?, <<~PATTERN
62
+ {(str _) (array (str _))}
46
63
  PATTERN
47
64
 
65
+ # rubocop:disable Metrics/AbcSize
48
66
  def investigate(processed_source)
49
- required_ruby_version(processed_source.ast) do |version|
67
+ version = required_ruby_version(processed_source.ast).first
68
+
69
+ if version
70
+ return unless string_version?(version)
71
+
50
72
  ruby_version = extract_ruby_version(version)
51
73
 
52
74
  return if ruby_version == target_ruby_version.to_s
@@ -54,10 +76,14 @@ module RuboCop
54
76
  add_offense(
55
77
  processed_source.ast,
56
78
  location: version.loc.expression,
57
- message: message(ruby_version, target_ruby_version)
79
+ message: not_equal_message(ruby_version, target_ruby_version)
58
80
  )
81
+ else
82
+ range = source_range(processed_source.buffer, 1, 0)
83
+ add_offense(nil, location: range, message: MISSING_MSG)
59
84
  end
60
85
  end
86
+ # rubocop:enable Metrics/AbcSize
61
87
 
62
88
  private
63
89
 
@@ -68,12 +94,12 @@ module RuboCop
68
94
  end
69
95
  end
70
96
 
71
- required_ruby_version.str_content.match(/(\d\.\d)/)[1]
97
+ required_ruby_version.str_content.scan(/\d/).first(2).join('.')
72
98
  end
73
99
 
74
- def message(required_ruby_version, target_ruby_version)
100
+ def not_equal_message(required_ruby_version, target_ruby_version)
75
101
  format(
76
- MSG,
102
+ NOT_EQUAL_MSG,
77
103
  required_ruby_version: required_ruby_version,
78
104
  gemspec_filename: File.basename(processed_source.file_path),
79
105
  target_ruby_version: target_ruby_version
@@ -6,6 +6,7 @@ module RuboCop
6
6
  #
7
7
  # This generator will take a cop name and generate a source file
8
8
  # and spec file when given a valid qualified cop name.
9
+ # @api private
9
10
  class Generator
10
11
  # Note: RDoc 5.1.0 or lower has the following issue.
11
12
  # https://github.com/rubocop-hq/rubocop/issues/7043
@@ -58,7 +59,7 @@ module RuboCop
58
59
  # TODO: Implement the cop in here.
59
60
  #
60
61
  # In many cases, you can use a node matcher for matching node pattern.
61
- # See https://github.com/rubocop-hq/rubocop-ast/blob/master/lib/rubocop/node_pattern.rb
62
+ # See https://github.com/rubocop-hq/rubocop-ast/blob/master/lib/rubocop/ast/node_pattern.rb
62
63
  #
63
64
  # For example
64
65
  MSG = 'Use `#good_method` instead of `#bad_method`.'
@@ -25,9 +25,9 @@ module RuboCop
25
25
  target_line = find_target_line
26
26
  if target_line
27
27
  configuration_entries.insert(target_line,
28
- new_configuration_entry + "\n")
28
+ "#{new_configuration_entry}\n")
29
29
  else
30
- configuration_entries.push("\n" + new_configuration_entry)
30
+ configuration_entries.push("\n#{new_configuration_entry}")
31
31
  end
32
32
 
33
33
  File.write(configuration_file_path, configuration_entries.join)
@@ -12,11 +12,13 @@ module RuboCop
12
12
  # # good
13
13
  # node.method?(:do_something)
14
14
  #
15
- class MethodNameEqual < Cop
15
+ class MethodNameEqual < Base
16
16
  include RangeHelp
17
+ extend AutoCorrector
17
18
 
18
19
  MSG = 'Use `method?(%<method_name>s)` instead of ' \
19
20
  '`method_name == %<method_name>s`.'
21
+ RESTRICT_ON_SEND = %i[==].freeze
20
22
 
21
23
  def_node_matcher :method_name?, <<~PATTERN
22
24
  (send
@@ -31,17 +33,8 @@ module RuboCop
31
33
 
32
34
  range = range(method_name_node, node)
33
35
 
34
- add_offense(node, location: range, message: message)
35
- end
36
- end
37
-
38
- def autocorrect(node)
39
- lambda do |corrector|
40
- method_name?(node) do |method_name_node, method_name_arg|
41
- corrector.replace(
42
- range(method_name_node, node),
43
- "method?(#{method_name_arg.first.source})"
44
- )
36
+ add_offense(range, message: message) do |corrector|
37
+ corrector.replace(range, "method?(#{method_name_arg.first.source})")
45
38
  end
46
39
  end
47
40
  end
@@ -15,7 +15,7 @@ module RuboCop
15
15
  #
16
16
  # # good
17
17
  # method_name = send_node.method_name
18
- class NodeDestructuring < Cop
18
+ class NodeDestructuring < Base
19
19
  MSG = 'Use the methods provided with the node extensions instead ' \
20
20
  'of manually destructuring nodes.'
21
21
 
@@ -17,6 +17,7 @@ module RuboCop
17
17
  extend AutoCorrector
18
18
 
19
19
  MSG = 'Use `#%<type>s_type?` to check node type.'
20
+ RESTRICT_ON_SEND = %i[==].freeze
20
21
 
21
22
  def_node_matcher :node_type_check, <<~PATTERN
22
23
  (send (send $_ :type) :== (sym $_))
@@ -13,24 +13,25 @@ module RuboCop
13
13
  #
14
14
  # # good
15
15
  # add_offense(node, location: :selector)
16
- class OffenseLocationKeyword < Cop
16
+ class OffenseLocationKeyword < Base
17
+ extend AutoCorrector
18
+
17
19
  MSG = 'Use `:%<keyword>s` as the location argument to ' \
18
20
  '`#add_offense`.'
21
+ RESTRICT_ON_SEND = %i[add_offense].freeze
19
22
 
20
23
  def on_send(node)
21
24
  node_type_check(node) do |node_arg, kwargs|
22
25
  find_offending_argument(node_arg, kwargs) do |location, keyword|
23
- add_offense(location, message: format(MSG, keyword: keyword))
26
+ add_offense(location, message: format(MSG, keyword: keyword)) do |corrector|
27
+ (*, keyword) = offending_location_argument(location.parent)
28
+
29
+ corrector.replace(location, ":#{keyword}")
30
+ end
24
31
  end
25
32
  end
26
33
  end
27
34
 
28
- def autocorrect(node)
29
- (*, keyword) = offending_location_argument(node.parent)
30
-
31
- ->(corrector) { corrector.replace(node, ":#{keyword}") }
32
- end
33
-
34
35
  private
35
36
 
36
37
  def_node_matcher :node_type_check, <<~PATTERN
@@ -16,10 +16,12 @@ module RuboCop
16
16
  # add_offense(node)
17
17
  # add_offense(node, location: :selector)
18
18
  #
19
- class RedundantLocationArgument < Cop
19
+ class RedundantLocationArgument < Base
20
20
  include RangeHelp
21
+ extend AutoCorrector
21
22
 
22
23
  MSG = 'Redundant location argument to `#add_offense`.'
24
+ RESTRICT_ON_SEND = %i[add_offense].freeze
23
25
 
24
26
  def_node_matcher :redundant_location_argument, <<~PATTERN
25
27
  (send nil? :add_offense _
@@ -28,15 +30,17 @@ module RuboCop
28
30
  PATTERN
29
31
 
30
32
  def on_send(node)
31
- redundant_location_argument(node) { |argument| add_offense(argument) }
32
- end
33
-
34
- def autocorrect(node)
35
- range = offending_range(node)
33
+ redundant_location_argument(node) do |argument|
34
+ add_offense(argument) do |corrector|
35
+ range = offending_range(argument)
36
36
 
37
- ->(corrector) { corrector.remove(range) }
37
+ corrector.remove(range)
38
+ end
39
+ end
38
40
  end
39
41
 
42
+ private
43
+
40
44
  def offending_range(node)
41
45
  with_space = range_with_surrounding_space(range: node.loc.expression)
42
46
 
@@ -19,10 +19,12 @@ module RuboCop
19
19
  # add_offense(node, message: CUSTOM_MSG)
20
20
  # add_offense(node, message: message(other_node))
21
21
  #
22
- class RedundantMessageArgument < Cop
22
+ class RedundantMessageArgument < Base
23
23
  include RangeHelp
24
+ extend AutoCorrector
24
25
 
25
26
  MSG = 'Redundant message argument to `#add_offense`.'
27
+ RESTRICT_ON_SEND = %i[add_offense].freeze
26
28
 
27
29
  def_node_matcher :node_type_check, <<~PATTERN
28
30
  (send nil? :add_offense $_node $hash)
@@ -39,17 +41,15 @@ module RuboCop
39
41
  def on_send(node)
40
42
  node_type_check(node) do |node_arg, kwargs|
41
43
  find_offending_argument(node_arg, kwargs) do |pair|
42
- add_offense(pair)
44
+ add_offense(pair) do |corrector|
45
+ range = offending_range(pair)
46
+
47
+ corrector.remove(range)
48
+ end
43
49
  end
44
50
  end
45
51
  end
46
52
 
47
- def autocorrect(node)
48
- range = offending_range(node)
49
-
50
- ->(corrector) { corrector.remove(range) }
51
- end
52
-
53
53
  private
54
54
 
55
55
  def offending_range(node)
@@ -13,7 +13,7 @@ module RuboCop
13
13
  # # good
14
14
  # expect(cop.messages).to eq(['Do not write bad code like that.'])
15
15
  #
16
- class UselessMessageAssertion < Cop
16
+ class UselessMessageAssertion < Base
17
17
  MSG = 'Do not specify cop behavior using `described_class::MSG`.'
18
18
 
19
19
  def_node_search :described_class_msg, <<~PATTERN
@@ -24,7 +24,7 @@ module RuboCop
24
24
  (send (send nil? :expect #contains_described_class_msg?) :to ...)
25
25
  PATTERN
26
26
 
27
- def investigate(_processed_source)
27
+ def on_new_investigation
28
28
  assertions_using_described_class_msg.each do |node|
29
29
  add_offense(node)
30
30
  end
@@ -0,0 +1,77 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ module Cop
5
+ module Layout
6
+ # This cop checks whether the end keyword of `begin` is aligned properly.
7
+ #
8
+ # Two modes are supported through the `EnforcedStyleAlignWith` configuration
9
+ # parameter. If it's set to `start_of_line` (which is the default), the
10
+ # `end` shall be aligned with the start of the line where the `begin`
11
+ # keyword is. If it's set to `begin`, the `end` shall be aligned with the
12
+ # `begin` keyword.
13
+ #
14
+ # `Layout/EndAlignment` cop aligns with keywords (e.g. `if`, `while`, `case`)
15
+ # by default. On the other hand, `||= begin` that this cop targets tends to
16
+ # align with the start of the line, it defaults to `EnforcedStyleAlignWith: start_of_line`.
17
+ # These style can be configured by each cop.
18
+ #
19
+ # @example EnforcedStyleAlignWith: start_of_line (default)
20
+ # # bad
21
+ # foo ||= begin
22
+ # do_something
23
+ # end
24
+ #
25
+ # # good
26
+ # foo ||= begin
27
+ # do_something
28
+ # end
29
+ #
30
+ # @example EnforcedStyleAlignWith: begin
31
+ # # bad
32
+ # foo ||= begin
33
+ # do_something
34
+ # end
35
+ #
36
+ # # good
37
+ # foo ||= begin
38
+ # do_something
39
+ # end
40
+ #
41
+ class BeginEndAlignment < Base
42
+ include EndKeywordAlignment
43
+ include RangeHelp
44
+ extend AutoCorrector
45
+
46
+ MSG = '`end` at %d, %d is not aligned with `%s` at %d, %d.'
47
+
48
+ def on_kwbegin(node)
49
+ check_begin_alignment(node)
50
+ end
51
+
52
+ private
53
+
54
+ def check_begin_alignment(node)
55
+ align_with = {
56
+ begin: node.loc.begin,
57
+ start_of_line: start_line_range(node)
58
+ }
59
+ check_end_kw_alignment(node, align_with)
60
+ end
61
+
62
+ def autocorrect(corrector, node)
63
+ AlignmentCorrector.align_end(corrector, processed_source, node, alignment_node(node))
64
+ end
65
+
66
+ def alignment_node(node)
67
+ case style
68
+ when :begin
69
+ node
70
+ else
71
+ start_line_range(node)
72
+ end
73
+ end
74
+ end
75
+ end
76
+ end
77
+ end
@@ -61,9 +61,10 @@ module RuboCop
61
61
  # .each do
62
62
  # baz
63
63
  # end
64
- class BlockAlignment < Cop
64
+ class BlockAlignment < Base
65
65
  include ConfigurableEnforcedStyle
66
66
  include RangeHelp
67
+ extend AutoCorrector
67
68
 
68
69
  MSG = '%<current>s is not aligned with %<prefer>s%<alt_prefer>s.'
69
70
 
@@ -84,19 +85,6 @@ module RuboCop
84
85
  'EnforcedStyleAlignWith'
85
86
  end
86
87
 
87
- def autocorrect(node)
88
- ancestor_node = start_for_block_node(node)
89
- start_col = compute_start_col(ancestor_node, node)
90
- loc_end = node.loc.end
91
- delta = start_col - loc_end.column
92
-
93
- if delta.positive?
94
- add_space_before(loc_end, delta)
95
- elsif delta.negative?
96
- remove_space_before(loc_end.begin_pos, -delta)
97
- end
98
- end
99
-
100
88
  private
101
89
 
102
90
  def start_for_block_node(block_node)
@@ -163,7 +151,22 @@ module RuboCop
163
151
  message = format_message(start_loc, end_loc, do_source_line_column,
164
152
  error_source_line_column)
165
153
 
166
- add_offense(block_node, location: end_loc, message: message)
154
+ add_offense(end_loc, message: message) do |corrector|
155
+ autocorrect(corrector, block_node)
156
+ end
157
+ end
158
+
159
+ def autocorrect(corrector, node)
160
+ ancestor_node = start_for_block_node(node)
161
+ start_col = compute_start_col(ancestor_node, node)
162
+ loc_end = node.loc.end
163
+ delta = start_col - loc_end.column
164
+
165
+ if delta.positive?
166
+ add_space_before(corrector, loc_end, delta)
167
+ elsif delta.negative?
168
+ remove_space_before(corrector, loc_end.begin_pos, -delta)
169
+ end
167
170
  end
168
171
 
169
172
  def format_message(start_loc, end_loc, do_source_line_column,
@@ -213,7 +216,7 @@ module RuboCop
213
216
  start_loc.column == source_line_column[:column]
214
217
  ''
215
218
  else
216
- ' or ' + format_source_line_column(source_line_column)
219
+ " or #{format_source_line_column(source_line_column)}"
217
220
  end
218
221
  end
219
222
 
@@ -230,13 +233,14 @@ module RuboCop
230
233
  (ancestor_node || node).source_range.column
231
234
  end
232
235
 
233
- def add_space_before(loc, delta)
234
- ->(corrector) { corrector.insert_before(loc, ' ' * delta) }
236
+ def add_space_before(corrector, loc, delta)
237
+ corrector.insert_before(loc, ' ' * delta)
235
238
  end
236
239
 
237
- def remove_space_before(end_pos, delta)
240
+ def remove_space_before(corrector, end_pos, delta)
238
241
  range = range_between(end_pos - delta, end_pos)
239
- ->(corrector) { corrector.remove(range) }
242
+
243
+ corrector.remove(range)
240
244
  end
241
245
  end
242
246
  end