rubocop 0.49.1 → 0.50.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 (292) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +5 -3
  3. data/bin/rubocop +1 -1
  4. data/config/default.yml +160 -99
  5. data/config/disabled.yml +4 -5
  6. data/config/enabled.yml +149 -47
  7. data/lib/rubocop.rb +41 -14
  8. data/lib/rubocop/ast/builder.rb +4 -1
  9. data/lib/rubocop/ast/node.rb +36 -42
  10. data/lib/rubocop/ast/node/args_node.rb +1 -13
  11. data/lib/rubocop/ast/node/array_node.rb +9 -0
  12. data/lib/rubocop/ast/node/block_node.rb +9 -0
  13. data/lib/rubocop/ast/node/def_node.rb +71 -0
  14. data/lib/rubocop/ast/node/for_node.rb +8 -0
  15. data/lib/rubocop/ast/node/if_node.rb +10 -2
  16. data/lib/rubocop/ast/node/mixin/collection_node.rb +15 -0
  17. data/lib/rubocop/ast/node/mixin/method_dispatch_node.rb +174 -0
  18. data/lib/rubocop/ast/node/mixin/method_identifier_predicates.rb +89 -0
  19. data/lib/rubocop/ast/node/mixin/parameterized_node.rb +18 -31
  20. data/lib/rubocop/ast/node/regexp_node.rb +35 -0
  21. data/lib/rubocop/ast/node/send_node.rb +1 -154
  22. data/lib/rubocop/ast/node/super_node.rb +3 -24
  23. data/lib/rubocop/ast/node/yield_node.rb +21 -0
  24. data/lib/rubocop/ast/traversal.rb +6 -6
  25. data/lib/rubocop/cli.rb +7 -3
  26. data/lib/rubocop/config.rb +45 -8
  27. data/lib/rubocop/config_loader.rb +7 -5
  28. data/lib/rubocop/cop/bundler/duplicated_gem.rb +3 -3
  29. data/lib/rubocop/cop/bundler/insecure_protocol_source.rb +64 -0
  30. data/lib/rubocop/cop/bundler/ordered_gems.rb +12 -12
  31. data/lib/rubocop/cop/commissioner.rb +8 -2
  32. data/lib/rubocop/cop/cop.rb +3 -1
  33. data/lib/rubocop/cop/generator.rb +94 -21
  34. data/lib/rubocop/cop/internal_affairs.rb +3 -0
  35. data/lib/rubocop/cop/internal_affairs/node_type_predicate.rb +14 -3
  36. data/lib/rubocop/cop/internal_affairs/offense_location_keyword.rb +43 -0
  37. data/lib/rubocop/cop/internal_affairs/redundant_location_argument.rb +46 -0
  38. data/lib/rubocop/cop/internal_affairs/redundant_message_argument.rb +49 -0
  39. data/lib/rubocop/cop/internal_affairs/useless_message_assertion.rb +1 -1
  40. data/lib/rubocop/cop/layout/access_modifier_indentation.rb +2 -3
  41. data/lib/rubocop/cop/layout/align_array.rb +2 -2
  42. data/lib/rubocop/cop/layout/align_hash.rb +2 -2
  43. data/lib/rubocop/cop/layout/align_parameters.rb +5 -11
  44. data/lib/rubocop/cop/layout/closing_parenthesis_indentation.rb +5 -5
  45. data/lib/rubocop/cop/layout/comment_indentation.rb +1 -1
  46. data/lib/rubocop/cop/layout/dot_position.rb +9 -0
  47. data/lib/rubocop/cop/layout/else_alignment.rb +30 -13
  48. data/lib/rubocop/cop/layout/empty_line_between_defs.rb +4 -0
  49. data/lib/rubocop/cop/layout/empty_lines_around_access_modifier.rb +20 -4
  50. data/lib/rubocop/cop/layout/empty_lines_around_exception_handling_keywords.rb +3 -3
  51. data/lib/rubocop/cop/layout/empty_lines_around_method_body.rb +3 -3
  52. data/lib/rubocop/cop/layout/first_method_parameter_line_break.rb +3 -3
  53. data/lib/rubocop/cop/layout/first_parameter_indentation.rb +5 -2
  54. data/lib/rubocop/cop/layout/indent_heredoc.rb +19 -24
  55. data/lib/rubocop/cop/layout/indentation_consistency.rb +1 -2
  56. data/lib/rubocop/cop/layout/indentation_width.rb +12 -8
  57. data/lib/rubocop/cop/layout/leading_comment_space.rb +33 -18
  58. data/lib/rubocop/cop/layout/multiline_method_call_indentation.rb +20 -17
  59. data/lib/rubocop/cop/layout/multiline_method_definition_brace_layout.rb +3 -3
  60. data/lib/rubocop/cop/layout/multiline_operation_indentation.rb +6 -0
  61. data/lib/rubocop/cop/layout/space_after_colon.rb +7 -0
  62. data/lib/rubocop/cop/layout/space_after_comma.rb +10 -0
  63. data/lib/rubocop/cop/layout/space_after_method_name.rb +5 -3
  64. data/lib/rubocop/cop/layout/space_after_not.rb +1 -1
  65. data/lib/rubocop/cop/layout/space_around_block_parameters.rb +13 -4
  66. data/lib/rubocop/cop/layout/space_around_keyword.rb +9 -5
  67. data/lib/rubocop/cop/layout/space_before_block_braces.rb +54 -5
  68. data/lib/rubocop/cop/layout/space_before_comment.rb +7 -0
  69. data/lib/rubocop/cop/layout/space_before_semicolon.rb +7 -0
  70. data/lib/rubocop/cop/layout/space_inside_array_percent_literal.rb +1 -1
  71. data/lib/rubocop/cop/layout/space_inside_percent_literal_delimiters.rb +1 -1
  72. data/lib/rubocop/cop/layout/space_inside_range_literal.rb +1 -1
  73. data/lib/rubocop/cop/layout/space_inside_string_interpolation.rb +8 -4
  74. data/lib/rubocop/cop/layout/tab.rb +1 -1
  75. data/lib/rubocop/cop/lint/ambiguous_block_association.rb +4 -2
  76. data/lib/rubocop/cop/lint/assignment_in_condition.rb +15 -1
  77. data/lib/rubocop/cop/lint/block_alignment.rb +15 -6
  78. data/lib/rubocop/cop/lint/boolean_symbol.rb +38 -0
  79. data/lib/rubocop/cop/lint/condition_position.rb +5 -1
  80. data/lib/rubocop/cop/lint/debugger.rb +16 -9
  81. data/lib/rubocop/cop/lint/def_end_alignment.rb +4 -4
  82. data/lib/rubocop/cop/lint/duplicate_case_condition.rb +3 -3
  83. data/lib/rubocop/cop/lint/duplicate_methods.rb +73 -5
  84. data/lib/rubocop/cop/lint/duplicated_key.rb +1 -1
  85. data/lib/rubocop/cop/lint/each_with_object_argument.rb +1 -1
  86. data/lib/rubocop/cop/lint/else_layout.rb +1 -1
  87. data/lib/rubocop/cop/lint/empty_expression.rb +1 -1
  88. data/lib/rubocop/cop/lint/empty_interpolation.rb +1 -1
  89. data/lib/rubocop/cop/lint/empty_when.rb +1 -1
  90. data/lib/rubocop/cop/lint/ensure_return.rb +1 -1
  91. data/lib/rubocop/cop/lint/float_out_of_range.rb +5 -5
  92. data/lib/rubocop/cop/lint/format_parameter_mismatch.rb +35 -40
  93. data/lib/rubocop/cop/lint/handle_exceptions.rb +1 -1
  94. data/lib/rubocop/cop/lint/ineffective_access_modifier.rb +18 -13
  95. data/lib/rubocop/cop/lint/inherit_exception.rb +8 -7
  96. data/lib/rubocop/cop/lint/interpolation_check.rb +36 -0
  97. data/lib/rubocop/cop/lint/literal_in_condition.rb +3 -3
  98. data/lib/rubocop/cop/lint/literal_in_interpolation.rb +1 -1
  99. data/lib/rubocop/cop/lint/multiple_compare.rb +1 -1
  100. data/lib/rubocop/cop/lint/nested_method_definition.rb +5 -7
  101. data/lib/rubocop/cop/lint/next_without_accumulator.rb +1 -1
  102. data/lib/rubocop/cop/lint/percent_string_array.rb +3 -12
  103. data/lib/rubocop/cop/lint/percent_symbol_array.rb +1 -1
  104. data/lib/rubocop/cop/lint/rand_one.rb +7 -1
  105. data/lib/rubocop/cop/lint/redundant_with_index.rb +77 -0
  106. data/lib/rubocop/cop/lint/require_parentheses.rb +1 -1
  107. data/lib/rubocop/cop/lint/rescue_exception.rb +1 -1
  108. data/lib/rubocop/cop/lint/rescue_type.rb +13 -6
  109. data/lib/rubocop/cop/lint/rescue_without_error_class.rb +38 -0
  110. data/lib/rubocop/cop/lint/return_in_void_context.rb +63 -0
  111. data/lib/rubocop/cop/lint/script_permission.rb +6 -0
  112. data/lib/rubocop/cop/lint/syntax.rb +17 -20
  113. data/lib/rubocop/cop/lint/unified_integer.rb +3 -2
  114. data/lib/rubocop/cop/lint/unneeded_disable.rb +1 -1
  115. data/lib/rubocop/cop/lint/unneeded_splat_expansion.rb +1 -1
  116. data/lib/rubocop/cop/lint/unreachable_code.rb +53 -8
  117. data/lib/rubocop/cop/lint/uri_escape_unescape.rb +74 -0
  118. data/lib/rubocop/cop/lint/uri_regexp.rb +73 -0
  119. data/lib/rubocop/cop/lint/useless_access_modifier.rb +4 -8
  120. data/lib/rubocop/cop/lint/useless_setter_call.rb +10 -11
  121. data/lib/rubocop/cop/lint/void.rb +29 -23
  122. data/lib/rubocop/cop/metrics/line_length.rb +2 -2
  123. data/lib/rubocop/cop/metrics/method_length.rb +8 -3
  124. data/lib/rubocop/cop/metrics/parameter_lists.rb +5 -2
  125. data/lib/rubocop/cop/mixin/autocorrect_alignment.rb +1 -1
  126. data/lib/rubocop/cop/mixin/enforce_superclass.rb +2 -2
  127. data/lib/rubocop/cop/mixin/first_element_line_break.rb +12 -3
  128. data/lib/rubocop/cop/mixin/heredoc.rb +28 -0
  129. data/lib/rubocop/cop/mixin/method_complexity.rb +9 -6
  130. data/lib/rubocop/cop/mixin/multiline_expression_indentation.rb +68 -31
  131. data/lib/rubocop/cop/mixin/multiline_literal_brace_layout.rb +18 -0
  132. data/lib/rubocop/cop/mixin/negative_conditional.rb +1 -1
  133. data/lib/rubocop/cop/mixin/percent_array.rb +52 -0
  134. data/lib/rubocop/cop/mixin/string_help.rb +1 -1
  135. data/lib/rubocop/cop/{style → naming}/accessor_method_name.rb +11 -12
  136. data/lib/rubocop/cop/{style → naming}/ascii_identifiers.rb +1 -1
  137. data/lib/rubocop/cop/{style/op_method.rb → naming/binary_operator_parameter_name.rb} +2 -2
  138. data/lib/rubocop/cop/{style → naming}/class_and_module_camel_case.rb +1 -1
  139. data/lib/rubocop/cop/{style → naming}/constant_name.rb +1 -1
  140. data/lib/rubocop/cop/{style → naming}/file_name.rb +8 -4
  141. data/lib/rubocop/cop/naming/heredoc_delimiter_case.rb +68 -0
  142. data/lib/rubocop/cop/naming/heredoc_delimiter_naming.rb +58 -0
  143. data/lib/rubocop/cop/{style → naming}/method_name.rb +1 -1
  144. data/lib/rubocop/cop/{style → naming}/predicate_name.rb +6 -7
  145. data/lib/rubocop/cop/{style → naming}/variable_name.rb +11 -15
  146. data/lib/rubocop/cop/{style → naming}/variable_number.rb +1 -1
  147. data/lib/rubocop/cop/performance/caller.rb +39 -11
  148. data/lib/rubocop/cop/performance/casecmp.rb +4 -4
  149. data/lib/rubocop/cop/performance/compare_with_block.rb +4 -4
  150. data/lib/rubocop/cop/performance/double_start_end_with.rb +4 -4
  151. data/lib/rubocop/cop/performance/end_with.rb +3 -3
  152. data/lib/rubocop/cop/performance/fixed_size.rb +1 -1
  153. data/lib/rubocop/cop/performance/hash_each_methods.rb +66 -25
  154. data/lib/rubocop/cop/performance/lstrip_rstrip.rb +2 -2
  155. data/lib/rubocop/cop/performance/range_include.rb +2 -2
  156. data/lib/rubocop/cop/performance/redundant_block_call.rb +6 -6
  157. data/lib/rubocop/cop/performance/redundant_match.rb +5 -5
  158. data/lib/rubocop/cop/performance/redundant_merge.rb +39 -23
  159. data/lib/rubocop/cop/performance/redundant_sort_by.rb +2 -2
  160. data/lib/rubocop/cop/performance/regexp_match.rb +13 -5
  161. data/lib/rubocop/cop/performance/size.rb +1 -1
  162. data/lib/rubocop/cop/performance/start_with.rb +3 -3
  163. data/lib/rubocop/cop/performance/times_map.rb +23 -12
  164. data/lib/rubocop/cop/performance/unfreeze_string.rb +50 -0
  165. data/lib/rubocop/cop/performance/uri_default_parser.rb +47 -0
  166. data/lib/rubocop/cop/rails/active_support_aliases.rb +1 -1
  167. data/lib/rubocop/cop/rails/delegate.rb +36 -7
  168. data/lib/rubocop/cop/rails/delegate_allow_blank.rb +1 -1
  169. data/lib/rubocop/cop/rails/enum_uniqueness.rb +2 -2
  170. data/lib/rubocop/cop/rails/file_path.rb +3 -4
  171. data/lib/rubocop/cop/rails/find_each.rb +1 -1
  172. data/lib/rubocop/cop/rails/has_many_or_has_one_dependent.rb +48 -0
  173. data/lib/rubocop/cop/rails/http_positional_arguments.rb +5 -5
  174. data/lib/rubocop/cop/rails/not_null_column.rb +1 -1
  175. data/lib/rubocop/cop/rails/pluralization_grammar.rb +2 -2
  176. data/lib/rubocop/cop/rails/relative_date_constant.rb +1 -1
  177. data/lib/rubocop/cop/rails/request_referer.rb +2 -2
  178. data/lib/rubocop/cop/rails/reversible_migration.rb +12 -12
  179. data/lib/rubocop/cop/rails/save_bang.rb +8 -6
  180. data/lib/rubocop/cop/rails/scope_args.rb +1 -1
  181. data/lib/rubocop/cop/security/eval.rb +2 -2
  182. data/lib/rubocop/cop/security/json_load.rb +2 -2
  183. data/lib/rubocop/cop/security/marshal_load.rb +2 -2
  184. data/lib/rubocop/cop/security/yaml_load.rb +2 -2
  185. data/lib/rubocop/cop/style/alias.rb +44 -20
  186. data/lib/rubocop/cop/style/and_or.rb +48 -34
  187. data/lib/rubocop/cop/style/auto_resource_cleanup.rb +1 -1
  188. data/lib/rubocop/cop/style/block_comments.rb +3 -1
  189. data/lib/rubocop/cop/style/block_delimiters.rb +2 -1
  190. data/lib/rubocop/cop/style/command_literal.rb +20 -9
  191. data/lib/rubocop/cop/style/conditional_assignment.rb +30 -28
  192. data/lib/rubocop/cop/style/copyright.rb +10 -10
  193. data/lib/rubocop/cop/style/def_with_parentheses.rb +6 -5
  194. data/lib/rubocop/cop/style/dir.rb +52 -0
  195. data/lib/rubocop/cop/style/documentation_method.rb +2 -6
  196. data/lib/rubocop/cop/style/empty_case_condition.rb +1 -1
  197. data/lib/rubocop/cop/style/empty_else.rb +3 -2
  198. data/lib/rubocop/cop/style/empty_literal.rb +1 -2
  199. data/lib/rubocop/cop/style/empty_method.rb +27 -17
  200. data/lib/rubocop/cop/style/flip_flop.rb +2 -2
  201. data/lib/rubocop/cop/style/frozen_string_literal_comment.rb +1 -1
  202. data/lib/rubocop/cop/style/guard_clause.rb +4 -2
  203. data/lib/rubocop/cop/style/hash_syntax.rb +10 -10
  204. data/lib/rubocop/cop/style/identical_conditional_branches.rb +5 -1
  205. data/lib/rubocop/cop/style/if_with_semicolon.rb +1 -1
  206. data/lib/rubocop/cop/style/implicit_runtime_error.rb +4 -3
  207. data/lib/rubocop/cop/style/inline_comment.rb +1 -1
  208. data/lib/rubocop/cop/style/inverse_methods.rb +20 -8
  209. data/lib/rubocop/cop/style/lambda.rb +19 -9
  210. data/lib/rubocop/cop/style/lambda_call.rb +22 -1
  211. data/lib/rubocop/cop/style/method_call_with_args_parentheses.rb +4 -20
  212. data/lib/rubocop/cop/style/method_call_without_args_parentheses.rb +6 -4
  213. data/lib/rubocop/cop/style/method_def_parentheses.rb +18 -26
  214. data/lib/rubocop/cop/style/method_missing.rb +5 -18
  215. data/lib/rubocop/cop/style/min_max.rb +67 -0
  216. data/lib/rubocop/cop/style/missing_else.rb +16 -3
  217. data/lib/rubocop/cop/style/mixin_grouping.rb +2 -2
  218. data/lib/rubocop/cop/style/module_function.rb +8 -4
  219. data/lib/rubocop/cop/style/multiline_if_modifier.rb +5 -1
  220. data/lib/rubocop/cop/style/multiline_memoization.rb +25 -3
  221. data/lib/rubocop/cop/style/multiline_ternary_operator.rb +1 -1
  222. data/lib/rubocop/cop/style/multiple_comparison.rb +1 -1
  223. data/lib/rubocop/cop/style/mutable_constant.rb +2 -6
  224. data/lib/rubocop/cop/style/negated_if.rb +8 -4
  225. data/lib/rubocop/cop/style/nested_parenthesized_calls.rb +8 -8
  226. data/lib/rubocop/cop/style/nested_ternary_operator.rb +1 -1
  227. data/lib/rubocop/cop/style/non_nil_check.rb +14 -14
  228. data/lib/rubocop/cop/style/numeric_literal_prefix.rb +6 -2
  229. data/lib/rubocop/cop/style/numeric_literals.rb +2 -2
  230. data/lib/rubocop/cop/style/numeric_predicate.rb +8 -4
  231. data/lib/rubocop/cop/style/one_line_conditional.rb +8 -3
  232. data/lib/rubocop/cop/style/option_hash.rb +1 -1
  233. data/lib/rubocop/cop/style/optional_arguments.rb +1 -2
  234. data/lib/rubocop/cop/style/or_assignment.rb +88 -0
  235. data/lib/rubocop/cop/style/parallel_assignment.rb +2 -2
  236. data/lib/rubocop/cop/style/parentheses_around_condition.rb +12 -11
  237. data/lib/rubocop/cop/style/percent_literal_delimiters.rb +1 -1
  238. data/lib/rubocop/cop/style/percent_q_literals.rb +2 -2
  239. data/lib/rubocop/cop/style/perl_backrefs.rb +1 -1
  240. data/lib/rubocop/cop/style/proc.rb +1 -1
  241. data/lib/rubocop/cop/style/raise_args.rb +16 -17
  242. data/lib/rubocop/cop/style/redundant_begin.rb +6 -5
  243. data/lib/rubocop/cop/style/redundant_conditional.rb +95 -0
  244. data/lib/rubocop/cop/style/redundant_freeze.rb +1 -1
  245. data/lib/rubocop/cop/style/redundant_parentheses.rb +13 -11
  246. data/lib/rubocop/cop/style/redundant_return.rb +23 -11
  247. data/lib/rubocop/cop/style/redundant_self.rb +18 -9
  248. data/lib/rubocop/cop/style/regexp_literal.rb +12 -4
  249. data/lib/rubocop/cop/style/rescue_modifier.rb +1 -1
  250. data/lib/rubocop/cop/style/return_nil.rb +98 -0
  251. data/lib/rubocop/cop/style/safe_navigation.rb +80 -43
  252. data/lib/rubocop/cop/style/single_line_block_params.rb +14 -13
  253. data/lib/rubocop/cop/style/single_line_methods.rb +9 -13
  254. data/lib/rubocop/cop/style/special_global_vars.rb +3 -3
  255. data/lib/rubocop/cop/style/stabby_lambda_parentheses.rb +17 -39
  256. data/lib/rubocop/cop/style/string_literals_in_interpolation.rb +22 -1
  257. data/lib/rubocop/cop/style/struct_inheritance.rb +1 -1
  258. data/lib/rubocop/cop/style/symbol_array.rb +5 -25
  259. data/lib/rubocop/cop/style/symbol_literal.rb +1 -1
  260. data/lib/rubocop/cop/style/symbol_proc.rb +3 -18
  261. data/lib/rubocop/cop/style/ternary_parentheses.rb +14 -10
  262. data/lib/rubocop/cop/style/trailing_underscore_variable.rb +28 -9
  263. data/lib/rubocop/cop/style/trivial_accessors.rb +39 -56
  264. data/lib/rubocop/cop/style/unless_else.rb +1 -1
  265. data/lib/rubocop/cop/style/unneeded_capital_w.rb +1 -1
  266. data/lib/rubocop/cop/style/unneeded_interpolation.rb +1 -1
  267. data/lib/rubocop/cop/style/unneeded_percent_q.rb +1 -1
  268. data/lib/rubocop/cop/style/variable_interpolation.rb +8 -3
  269. data/lib/rubocop/cop/style/word_array.rb +7 -24
  270. data/lib/rubocop/cop/style/yoda_condition.rb +49 -14
  271. data/lib/rubocop/cop/style/zero_length_predicate.rb +25 -18
  272. data/lib/rubocop/cop/team.rb +16 -8
  273. data/lib/rubocop/cop/util.rb +11 -0
  274. data/lib/rubocop/formatter/disabled_config_formatter.rb +1 -1
  275. data/lib/rubocop/formatter/formatter_set.rb +2 -1
  276. data/lib/rubocop/formatter/offense_count_formatter.rb +2 -0
  277. data/lib/rubocop/formatter/simple_text_formatter.rb +1 -1
  278. data/lib/rubocop/formatter/tap_formatter.rb +71 -0
  279. data/lib/rubocop/formatter/worst_offenders_formatter.rb +2 -0
  280. data/lib/rubocop/node_pattern.rb +44 -26
  281. data/lib/rubocop/options.rb +1 -0
  282. data/lib/rubocop/processed_source.rb +3 -1
  283. data/lib/rubocop/remote_config.rb +5 -1
  284. data/lib/rubocop/result_cache.rb +1 -0
  285. data/lib/rubocop/rspec/cop_helper.rb +10 -10
  286. data/lib/rubocop/rspec/expect_offense.rb +6 -8
  287. data/lib/rubocop/rspec/shared_examples.rb +8 -8
  288. data/lib/rubocop/string_util.rb +2 -0
  289. data/lib/rubocop/version.rb +1 -1
  290. metadata +51 -18
  291. data/lib/rubocop/cop/mixin/access_modifier_node.rb +0 -41
  292. data/lib/rubocop/cop/mixin/on_method_def.rb +0 -44
@@ -0,0 +1,58 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ module Cop
5
+ module Naming
6
+ # This cop checks that your heredocs are using meaningful delimiters.
7
+ # By default it disallows `END` and `EO*`, and can be configured through
8
+ # blacklisting additional delimiters.
9
+ #
10
+ # @example
11
+ #
12
+ # # good
13
+ # <<-SQL
14
+ # SELECT * FROM foo
15
+ # SQL
16
+ #
17
+ # # bad
18
+ # <<-END
19
+ # SELECT * FROM foo
20
+ # END
21
+ #
22
+ # # bad
23
+ # <<-EOS
24
+ # SELECT * FROM foo
25
+ # EOS
26
+ class HeredocDelimiterNaming < Cop
27
+ include Heredoc
28
+
29
+ MSG = 'Use meaningful heredoc delimiters.'.freeze
30
+ OPENING_DELIMITER = /<<[~-]?'?(\w+)'?\b/
31
+
32
+ def on_heredoc(node)
33
+ return if meaningful_delimiters?(node)
34
+
35
+ add_offense(node, :heredoc_end)
36
+ end
37
+
38
+ private
39
+
40
+ def meaningful_delimiters?(node)
41
+ delimiters = delimiters(node)
42
+
43
+ blacklisted_delimiters.none? do |blacklisted_delimiter|
44
+ delimiters =~ Regexp.new(blacklisted_delimiter)
45
+ end
46
+ end
47
+
48
+ def delimiters(node)
49
+ node.source.match(OPENING_DELIMITER).captures.first
50
+ end
51
+
52
+ def blacklisted_delimiters
53
+ cop_config['Blacklist'] || []
54
+ end
55
+ end
56
+ end
57
+ end
58
+ end
@@ -2,7 +2,7 @@
2
2
 
3
3
  module RuboCop
4
4
  module Cop
5
- module Style
5
+ module Naming
6
6
  # This cop makes sure that all methods use the configured style,
7
7
  # snake_case or camelCase, for their names. Some special arrangements
8
8
  # have to be made for operator methods.
@@ -2,7 +2,7 @@
2
2
 
3
3
  module RuboCop
4
4
  module Cop
5
- module Style
5
+ module Naming
6
6
  # This cop makes sure that predicates are named properly.
7
7
  #
8
8
  # @example
@@ -18,13 +18,9 @@ module RuboCop
18
18
  # # good
19
19
  # def value? ...
20
20
  class PredicateName < Cop
21
- include OnMethodDef
22
-
23
- private
24
-
25
- def on_method_def(node, method_name, _args, _body)
21
+ def on_def(node)
26
22
  predicate_prefixes.each do |prefix|
27
- method_name = method_name.to_s
23
+ method_name = node.method_name.to_s
28
24
  next unless method_name.start_with?(prefix)
29
25
  next if method_name == expected_name(method_name, prefix)
30
26
  next if predicate_whitelist.include?(method_name)
@@ -35,6 +31,9 @@ module RuboCop
35
31
  )
36
32
  end
37
33
  end
34
+ alias on_defs on_def
35
+
36
+ private
38
37
 
39
38
  def expected_name(method_name, prefix)
40
39
  new_name = if prefix_blacklist.include?(prefix)
@@ -2,7 +2,7 @@
2
2
 
3
3
  module RuboCop
4
4
  module Cop
5
- module Style
5
+ module Naming
6
6
  # This cop makes sure that all variables use the configured style,
7
7
  # snake_case or camelCase, for their names.
8
8
  class VariableName < Cop
@@ -10,23 +10,19 @@ module RuboCop
10
10
 
11
11
  def on_lvasgn(node)
12
12
  name, = *node
13
+ return unless name
13
14
  check_name(node, name, node.loc.name)
14
15
  end
15
16
 
16
- def on_ivasgn(node)
17
- name, = *node
18
- check_name(node, name, node.loc.name)
19
- end
20
-
21
- def on_cvasgn(node)
22
- name, = *node
23
- check_name(node, name, node.loc.name)
24
- end
25
-
26
- def on_arg(node)
27
- name, = *node
28
- check_name(node, name, node.loc.name)
29
- end
17
+ alias on_ivasgn on_lvasgn
18
+ alias on_cvasgn on_lvasgn
19
+ alias on_arg on_lvasgn
20
+ alias on_optarg on_lvasgn
21
+ alias on_restarg on_lvasgn
22
+ alias on_kwoptarg on_lvasgn
23
+ alias on_kwarg on_lvasgn
24
+ alias on_kwrestarg on_lvasgn
25
+ alias on_blockarg on_lvasgn
30
26
 
31
27
  private
32
28
 
@@ -2,7 +2,7 @@
2
2
 
3
3
  module RuboCop
4
4
  module Cop
5
- module Style
5
+ module Naming
6
6
  # This cop makes sure that all numbered variables use the
7
7
  # configured style, snake_case, normalcase or non_integer,
8
8
  # for their numbering.
@@ -8,32 +8,60 @@ module RuboCop
8
8
  #
9
9
  # @example
10
10
  # # bad
11
- # caller[n]
11
+ # caller[1]
12
12
  # caller.first
13
+ # caller_locations[1]
14
+ # caller_locations.first
13
15
  #
14
16
  # # good
15
- # caller(n..n).first
17
+ # caller(2..2).first
16
18
  # caller(1..1).first
19
+ # caller_locations(2..2).first
20
+ # caller_locations(1..1).first
17
21
  class Caller < Cop
18
- MSG = 'Use `caller(n..n)` instead of `caller[n]`.'.freeze
19
- SCOPE_METHODS = %i[first []].freeze
22
+ MSG_BRACE = 'Use `%<method>s(%<n>d..%<n>d).first`' \
23
+ ' instead of `%<method>s[%<m>d]`.'.freeze
24
+ MSG_FIRST = 'Use `%<method>s(%<n>d..%<n>d).first`' \
25
+ ' instead of `%<method>s.first`.'.freeze
26
+
27
+ def_node_matcher :slow_caller?, <<-PATTERN
28
+ {
29
+ (send nil {:caller :caller_locations})
30
+ (send nil {:caller :caller_locations} int)
31
+ }
32
+ PATTERN
20
33
 
21
34
  def_node_matcher :caller_with_scope_method?, <<-PATTERN
22
- (send (send nil :caller ...) ${#{SCOPE_METHODS.map(&:inspect).join(' ')}} ...)
35
+ {
36
+ (send #slow_caller? :first)
37
+ (send #slow_caller? :[] int)
38
+ }
23
39
  PATTERN
24
40
 
25
41
  def on_send(node)
26
- return unless caller_with_scope_method?(node) && slow_caller?(node)
27
- add_offense(node, :selector)
42
+ return unless caller_with_scope_method?(node)
43
+
44
+ add_offense(node)
28
45
  end
29
46
 
30
47
  private
31
48
 
32
- def slow_caller?(node)
33
- arguments = node.receiver.arguments
49
+ def message(node)
50
+ method_name = node.receiver.method_name
51
+ caller_arg = node.receiver.first_argument
52
+ n = caller_arg ? int_value(caller_arg) : 1
53
+
54
+ if node.method_name == :[]
55
+ m = int_value(node.first_argument)
56
+ n += m
57
+ format(MSG_BRACE, n: n, m: m, method: method_name)
58
+ else
59
+ format(MSG_FIRST, n: n, method: method_name)
60
+ end
61
+ end
34
62
 
35
- arguments.empty? ||
36
- (arguments.length == 1 && arguments[0].int_type?)
63
+ def int_value(node)
64
+ node.children[0]
37
65
  end
38
66
  end
39
67
  end
@@ -21,19 +21,19 @@ module RuboCop
21
21
  MSG = 'Use `casecmp` instead of `%s %s`.'.freeze
22
22
  CASE_METHODS = %i[downcase upcase].freeze
23
23
 
24
- def_node_matcher :downcase_eq, <<-END
24
+ def_node_matcher :downcase_eq, <<-PATTERN
25
25
  (send
26
26
  $(send _ ${:downcase :upcase})
27
27
  ${:== :eql? :!=}
28
28
  ${str (send _ {:downcase :upcase} ...) (begin str)})
29
- END
29
+ PATTERN
30
30
 
31
- def_node_matcher :eq_downcase, <<-END
31
+ def_node_matcher :eq_downcase, <<-PATTERN
32
32
  (send
33
33
  {str (send _ {:downcase :upcase} ...) (begin str)}
34
34
  ${:== :eql? :!=}
35
35
  $(send _ ${:downcase :upcase}))
36
- END
36
+ PATTERN
37
37
 
38
38
  def on_send(node)
39
39
  return if part_of_ignored_node?(node)
@@ -27,19 +27,19 @@ module RuboCop
27
27
  MSG = 'Use `%s_by%s` instead of ' \
28
28
  '`%s { |%s, %s| %s <=> %s }`.'.freeze
29
29
 
30
- def_node_matcher :compare?, <<-END
30
+ def_node_matcher :compare?, <<-PATTERN
31
31
  (block
32
32
  $(send _ {:sort :min :max})
33
33
  (args (arg $_a) (arg $_b))
34
34
  $send)
35
- END
35
+ PATTERN
36
36
 
37
- def_node_matcher :replaceable_body?, <<-END
37
+ def_node_matcher :replaceable_body?, <<-PATTERN
38
38
  (send
39
39
  (send (lvar %1) $_method $...)
40
40
  :<=>
41
41
  (send (lvar %2) _method $...))
42
- END
42
+ PATTERN
43
43
 
44
44
  def on_block(node)
45
45
  compare?(node) do |send, var_a, var_b, body|
@@ -83,19 +83,19 @@ module RuboCop
83
83
  cop_config['IncludeActiveSupportAliases']
84
84
  end
85
85
 
86
- def_node_matcher :two_start_end_with_calls, <<-END
86
+ def_node_matcher :two_start_end_with_calls, <<-PATTERN
87
87
  (or
88
88
  (send $_recv [{:start_with? :end_with?} $_method] $...)
89
89
  (send _recv _method $...))
90
- END
90
+ PATTERN
91
91
 
92
- def_node_matcher :check_with_active_support_aliases, <<-END
92
+ def_node_matcher :check_with_active_support_aliases, <<-PATTERN
93
93
  (or
94
94
  (send $_recv
95
95
  [{:start_with? :starts_with? :end_with? :ends_with?} $_method]
96
96
  $...)
97
97
  (send _recv _method $...))
98
- END
98
+ PATTERN
99
99
  end
100
100
  end
101
101
  end
@@ -18,10 +18,10 @@ module RuboCop
18
18
  'the end of the string.'.freeze
19
19
  SINGLE_QUOTE = "'".freeze
20
20
 
21
- def_node_matcher :redundant_regex?, <<-END
21
+ def_node_matcher :redundant_regex?, <<-PATTERN
22
22
  {(send $!nil {:match :=~} (regexp (str $#literal_at_end?) (regopt)))
23
23
  (send (regexp (str $#literal_at_end?) (regopt)) {:match :=~} $_)}
24
- END
24
+ PATTERN
25
25
 
26
26
  def literal_at_end?(regex_str)
27
27
  # is this regexp 'literal' in the sense of only matching literal
@@ -33,7 +33,7 @@ module RuboCop
33
33
  def on_send(node)
34
34
  return unless redundant_regex?(node)
35
35
 
36
- add_offense(node, :expression)
36
+ add_offense(node)
37
37
  end
38
38
 
39
39
  def autocorrect(node)
@@ -17,7 +17,7 @@ module RuboCop
17
17
  counter(node) do |var, arg|
18
18
  return if allowed_variable?(var) || allowed_argument?(arg)
19
19
 
20
- add_offense(node, :expression)
20
+ add_offense(node)
21
21
  end
22
22
  end
23
23
 
@@ -20,26 +20,40 @@ module RuboCop
20
20
 
21
21
  MSG = 'Use `%s` instead of `%s`.'.freeze
22
22
 
23
- def_node_matcher :plain_each, <<-END
24
- (block $(send (send _ :hash) :each) (args (arg $_k) (arg $_v)) ...)
25
- END
23
+ def_node_matcher :plain_each, <<-PATTERN
24
+ (block $(send _ :each) (args (arg $_k) (arg $_v)) ...)
25
+ PATTERN
26
26
 
27
- def_node_matcher :kv_each, <<-END
28
- (block $(send (send (send _ :hash) ${:keys :values}) :each) ...)
29
- END
27
+ def_node_matcher :kv_each, <<-PATTERN
28
+ (block $(send (send _ ${:keys :values}) :each) ...)
29
+ PATTERN
30
30
 
31
31
  def on_block(node)
32
+ register_each_offense(node)
33
+ register_kv_offense(node)
34
+ end
35
+
36
+ private
37
+
38
+ def register_each_offense(node)
32
39
  plain_each(node) do |target, k, v|
33
40
  return if @args[k] && @args[v]
34
41
  used = @args[k] ? :key : :value
35
- add_offense(target, range(target), format(message,
36
- "each_#{used}",
37
- :each))
42
+ add_offense(
43
+ target, plain_range(target), format(message,
44
+ "each_#{used}",
45
+ :each)
46
+ )
38
47
  end
48
+ end
49
+
50
+ def register_kv_offense(node)
39
51
  kv_each(node) do |target, method|
40
- add_offense(target, range(target), format(message,
41
- "each_#{method[0..-2]}",
42
- "#{method}.each"))
52
+ add_offense(
53
+ target, kv_range(target), format(message,
54
+ "each_#{method[0..-2]}",
55
+ "#{method}.each")
56
+ )
43
57
  end
44
58
  end
45
59
 
@@ -50,31 +64,58 @@ module RuboCop
50
64
 
51
65
  def autocorrect(node)
52
66
  receiver, _second_method = *node
53
- caller, first_method = *receiver
67
+ _caller, first_method = *receiver
68
+
54
69
  lambda do |corrector|
55
- if first_method == :hash
56
- method = @args.values.first ? :key : :value
57
- new_source = receiver.source + ".each_#{method}"
58
- corrector.replace(node.loc.expression, new_source)
59
- correct_args(node, corrector)
70
+ case first_method
71
+ when :keys, :values
72
+ return correct_implicit(node, corrector) if receiver.receiver.nil?
73
+
74
+ correct_key_value_each(node, corrector)
60
75
  else
61
- new_source = caller.source + ".each_#{first_method[0..-2]}"
62
- corrector.replace(node.loc.expression, new_source)
76
+ return correct_implicit(node, corrector) if receiver.nil?
77
+
78
+ correct_plain_each(node, corrector)
63
79
  end
64
80
  end
65
81
  end
66
82
 
67
- private
83
+ def correct_implicit(node, corrector)
84
+ method = @args.include?(:k) ? :key : :value
85
+ new_source = "each_#{method}"
86
+
87
+ corrector.replace(node.loc.expression, new_source)
88
+ correct_args(node, corrector)
89
+ end
90
+
91
+ def correct_key_value_each(node, corrector)
92
+ receiver = node.receiver
93
+
94
+ new_source = receiver.receiver.source +
95
+ ".each_#{receiver.method_name[0..-2]}"
96
+ corrector.replace(node.loc.expression, new_source)
97
+ end
98
+
99
+ def correct_plain_each(node, corrector)
100
+ method = @args.include?(:k) ? :key : :value
101
+ new_source = node.receiver.source + ".each_#{method}"
102
+
103
+ corrector.replace(node.loc.expression, new_source)
104
+ correct_args(node, corrector)
105
+ end
68
106
 
69
107
  def correct_args(node, corrector)
70
108
  args = node.parent.children[1]
71
109
  used_arg = "|#{@args.detect { |_k, v| v }.first}|"
72
- args_range = range_between(args.loc.begin.begin_pos,
73
- args.loc.end.end_pos)
74
- corrector.replace(args_range, used_arg)
110
+
111
+ corrector.replace(args.source_range, used_arg)
112
+ end
113
+
114
+ def plain_range(outer_node)
115
+ outer_node.loc.selector
75
116
  end
76
117
 
77
- def range(outer_node)
118
+ def kv_range(outer_node)
78
119
  inner_node = outer_node.children.first
79
120
  inner_node.loc.selector.join(outer_node.loc.selector)
80
121
  end