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
@@ -29,7 +29,7 @@ module RuboCop
29
29
 
30
30
  return unless offending_node
31
31
 
32
- add_offense(offending_node, :expression)
32
+ add_offense(offending_node)
33
33
  end
34
34
 
35
35
  private
@@ -22,9 +22,9 @@ module RuboCop
22
22
 
23
23
  MSG = 'Duplicate value `%s` found in `%s` enum declaration.'.freeze
24
24
 
25
- def_node_matcher :enum_declaration, <<-END
25
+ def_node_matcher :enum_declaration, <<-PATTERN
26
26
  (send nil :enum (hash (pair (_ $_) ${array hash})))
27
- END
27
+ PATTERN
28
28
 
29
29
  def on_send(node)
30
30
  enum_declaration(node) do |name, args|
@@ -43,7 +43,7 @@ module RuboCop
43
43
 
44
44
  def check_for_file_join_with_rails_root(node)
45
45
  return unless file_join_nodes?(node)
46
- return unless node.method_args.any? { |e| rails_root_nodes?(e) }
46
+ return unless node.arguments.any? { |e| rails_root_nodes?(e) }
47
47
 
48
48
  register_offense(node)
49
49
  end
@@ -51,7 +51,7 @@ module RuboCop
51
51
  def check_for_rails_root_join_with_slash_separated_path(node)
52
52
  return unless rails_root_nodes?(node)
53
53
  return unless rails_root_join_nodes?(node)
54
- return unless node.method_args.any? { |arg| string_with_slash?(arg) }
54
+ return unless node.arguments.any? { |arg| string_with_slash?(arg) }
55
55
 
56
56
  register_offense(node)
57
57
  end
@@ -65,8 +65,7 @@ module RuboCop
65
65
 
66
66
  add_offense(
67
67
  node,
68
- source_range(processed_source.buffer, node.loc.line, line_range),
69
- MSG
68
+ source_range(processed_source.buffer, node.loc.line, line_range)
70
69
  )
71
70
  end
72
71
  end
@@ -24,7 +24,7 @@ module RuboCop
24
24
  return unless SCOPE_METHODS.include?(node.receiver.method_name)
25
25
  return if method_chain(node).any? { |m| ignored_by_find_each?(m) }
26
26
 
27
- add_offense(node, node.loc.selector, MSG)
27
+ add_offense(node, :selector)
28
28
  end
29
29
 
30
30
  def autocorrect(node)
@@ -0,0 +1,48 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ module Cop
5
+ module Rails
6
+ # This cop looks for `has_many` or `has_one` associations that don't
7
+ # specify a `:dependent` option.
8
+ #
9
+ # @example
10
+ # # bad
11
+ # class User < ActiveRecord::Base
12
+ # has_many :comments
13
+ # has_one :avatar
14
+ # end
15
+ #
16
+ # # good
17
+ # class User < ActiveRecord::Base
18
+ # has_many :comments, dependent: :restrict_with_exception
19
+ # has_one :avatar, dependent: :destroy
20
+ # end
21
+ class HasManyOrHasOneDependent < Cop
22
+ MSG = 'Specify a `:dependent` option.'.freeze
23
+
24
+ def_node_matcher :is_has_many_or_has_one_without_options?, <<-PATTERN
25
+ (send nil {:has_many :has_one} _)
26
+ PATTERN
27
+
28
+ def_node_matcher :is_has_many_or_has_one_with_options?, <<-PATTERN
29
+ (send nil {:has_many :has_one} _ (hash $...))
30
+ PATTERN
31
+
32
+ def_node_matcher :has_dependent?, <<-PATTERN
33
+ (pair (sym :dependent) !(:nil))
34
+ PATTERN
35
+
36
+ def on_send(node)
37
+ unless is_has_many_or_has_one_without_options?(node)
38
+ pairs = is_has_many_or_has_one_with_options?(node)
39
+ return unless pairs
40
+ return if pairs.any? { |pair| has_dependent?(pair) }
41
+ end
42
+
43
+ add_offense(node, :selector)
44
+ end
45
+ end
46
+ end
47
+ end
48
+ end
@@ -6,7 +6,7 @@ module RuboCop
6
6
  # This cop is used to identify usages of http methods like `get`, `post`,
7
7
  # `put`, `patch` without the usage of keyword arguments in your tests and
8
8
  # change them to use keyword args. This cop only applies to Rails >= 5 .
9
- # If you are not running Rails < 5 you should disable # the
9
+ # If you are running Rails < 5 you should disable the
10
10
  # Rails/HttpPositionalArguments cop or set your TargetRailsVersion in your
11
11
  # .rubocop.yml file to 4.0, etc.
12
12
  #
@@ -28,9 +28,9 @@ module RuboCop
28
28
 
29
29
  minimum_target_rails_version 5.0
30
30
 
31
- def_node_matcher :http_request?, <<-END
31
+ def_node_matcher :http_request?, <<-PATTERN
32
32
  (send nil {#{HTTP_METHODS.map(&:inspect).join(' ')}} !nil $_data ...)
33
- END
33
+ PATTERN
34
34
 
35
35
  def on_send(node)
36
36
  data = http_request?(node)
@@ -39,7 +39,7 @@ module RuboCop
39
39
  return if data.nil?
40
40
  return unless needs_conversion?(data)
41
41
 
42
- add_offense(node, node.loc.selector, format(MSG, node.method_name))
42
+ add_offense(node, :selector, format(MSG, node.method_name))
43
43
  end
44
44
 
45
45
  # @return [Boolean] true if the line needs to be converted
@@ -81,7 +81,7 @@ module RuboCop
81
81
  # @return lambda of auto correct procedure
82
82
  # the result should look like:
83
83
  # get :new, params: { user_id: @user.id }, headers: {}
84
- # the http_method is the method use to call the controller
84
+ # the http_method is the method used to call the controller
85
85
  # the controller node can be a symbol, method, object or string
86
86
  # that represents the path/action on the Rails controller
87
87
  # the data is the http parameters and environment sent in
@@ -59,7 +59,7 @@ module RuboCop
59
59
  null_false = pairs.find { |pair| null_false?(pair) }
60
60
  return unless null_false
61
61
 
62
- add_offense(null_false, :expression)
62
+ add_offense(null_false)
63
63
  end
64
64
  end
65
65
  end
@@ -34,7 +34,7 @@ module RuboCop
34
34
 
35
35
  return unless offense?(node)
36
36
 
37
- add_offense(node, :expression)
37
+ add_offense(node)
38
38
  end
39
39
 
40
40
  private
@@ -77,7 +77,7 @@ module RuboCop
77
77
  end
78
78
 
79
79
  def singular_receiver?(number)
80
- number == 1
80
+ number.abs == 1
81
81
  end
82
82
 
83
83
  def plural_receiver?(number)
@@ -71,7 +71,7 @@ module RuboCop
71
71
  def relative_date_method?(node)
72
72
  node.send_type? &&
73
73
  RELATIVE_DATE_METHODS.include?(node.method_name) &&
74
- node.method_args.empty?
74
+ !node.arguments?
75
75
  end
76
76
 
77
77
  def autocorrect(node)
@@ -33,7 +33,7 @@ module RuboCop
33
33
  referer?(node) do
34
34
  return unless node.method?(wrong_method_name)
35
35
 
36
- add_offense(node.source_range, node.source_range, message)
36
+ add_offense(node.source_range, node.source_range)
37
37
  end
38
38
  end
39
39
 
@@ -43,7 +43,7 @@ module RuboCop
43
43
 
44
44
  private
45
45
 
46
- def message
46
+ def message(_node)
47
47
  format(MSG, style, wrong_method_name)
48
48
  end
49
49
 
@@ -131,29 +131,29 @@ module RuboCop
131
131
  change change_default remove
132
132
  ].freeze
133
133
 
134
- def_node_matcher :irreversible_schema_statement_call, <<-END
134
+ def_node_matcher :irreversible_schema_statement_call, <<-PATTERN
135
135
  (send nil ${:change_table_comment :execute :remove_belongs_to} ...)
136
- END
136
+ PATTERN
137
137
 
138
- def_node_matcher :drop_table_call, <<-END
138
+ def_node_matcher :drop_table_call, <<-PATTERN
139
139
  (send nil :drop_table ...)
140
- END
140
+ PATTERN
141
141
 
142
- def_node_matcher :change_column_default_call, <<-END
142
+ def_node_matcher :change_column_default_call, <<-PATTERN
143
143
  (send nil :change_column_default _ _ $...)
144
- END
144
+ PATTERN
145
145
 
146
- def_node_matcher :remove_column_call, <<-END
146
+ def_node_matcher :remove_column_call, <<-PATTERN
147
147
  (send nil :remove_column $...)
148
- END
148
+ PATTERN
149
149
 
150
- def_node_matcher :remove_foreign_key_call, <<-END
150
+ def_node_matcher :remove_foreign_key_call, <<-PATTERN
151
151
  (send nil :remove_foreign_key _ $_)
152
- END
152
+ PATTERN
153
153
 
154
- def_node_matcher :change_table_call, <<-END
154
+ def_node_matcher :change_table_call, <<-PATTERN
155
155
  (send nil :change_table $_ ...)
156
- END
156
+ PATTERN
157
157
 
158
158
  def on_send(node)
159
159
  return unless within_change_method?(node)
@@ -56,7 +56,7 @@ module RuboCop
56
56
  end
57
57
 
58
58
  def after_leaving_scope(scope, _variable_table)
59
- scope.variables.each do |_name, variable|
59
+ scope.variables.each_value do |variable|
60
60
  variable.assignments.each do |assignment|
61
61
  check_assignment(assignment)
62
62
  end
@@ -70,7 +70,7 @@ module RuboCop
70
70
  return unless expected_signature?(node)
71
71
  return if persisted_referenced?(assignment)
72
72
 
73
- add_offense(node, node.loc.selector,
73
+ add_offense(node, :selector,
74
74
  format(CREATE_MSG,
75
75
  "#{node.method_name}!",
76
76
  node.method_name.to_s,
@@ -84,7 +84,7 @@ module RuboCop
84
84
  return if check_used_in_conditional(node)
85
85
  return if last_call_of_method?(node)
86
86
 
87
- add_offense(node, node.loc.selector,
87
+ add_offense(node, :selector,
88
88
  format(MSG,
89
89
  "#{node.method_name}!",
90
90
  node.method_name.to_s))
@@ -121,7 +121,7 @@ module RuboCop
121
121
  return false unless conditional?(node)
122
122
 
123
123
  unless MODIFY_PERSIST_METHODS.include?(node.method_name)
124
- add_offense(node, node.loc.selector,
124
+ add_offense(node, :selector,
125
125
  format(CREATE_CONDITIONAL_MSG,
126
126
  node.method_name.to_s))
127
127
  end
@@ -130,8 +130,10 @@ module RuboCop
130
130
  end
131
131
 
132
132
  def conditional?(node)
133
- node.parent && (node.parent.if_type? && node.sibling_index.zero? ||
134
- conditional?(node.parent))
133
+ node.parent && (
134
+ node.parent.if_type? || node.parent.case_type? ||
135
+ node.parent.or_type? || node.parent.and_type?
136
+ )
135
137
  end
136
138
 
137
139
  def last_call_of_method?(node)
@@ -20,7 +20,7 @@ module RuboCop
20
20
 
21
21
  def on_send(node)
22
22
  scope?(node) do |second_arg|
23
- add_offense(second_arg, :expression)
23
+ add_offense(second_arg)
24
24
  end
25
25
  end
26
26
  end
@@ -14,9 +14,9 @@ module RuboCop
14
14
  class Eval < Cop
15
15
  MSG = 'The use of `eval` is a serious security risk.'.freeze
16
16
 
17
- def_node_matcher :eval?, <<-END
17
+ def_node_matcher :eval?, <<-PATTERN
18
18
  (send {nil (send nil :binding)} :eval $!str ...)
19
- END
19
+ PATTERN
20
20
 
21
21
  def on_send(node)
22
22
  eval?(node) do |code|
@@ -25,9 +25,9 @@ module RuboCop
25
25
  class JSONLoad < Cop
26
26
  MSG = 'Prefer `JSON.parse` over `JSON.%s`.'.freeze
27
27
 
28
- def_node_matcher :json_load, <<-END
28
+ def_node_matcher :json_load, <<-PATTERN
29
29
  (send (const {nil cbase} :JSON) ${:load :restore} ...)
30
- END
30
+ PATTERN
31
31
 
32
32
  def on_send(node)
33
33
  json_load(node) do |method|
@@ -21,10 +21,10 @@ module RuboCop
21
21
  class MarshalLoad < Cop
22
22
  MSG = 'Avoid using `Marshal.%s`.'.freeze
23
23
 
24
- def_node_matcher :marshal_load, <<-END
24
+ def_node_matcher :marshal_load, <<-PATTERN
25
25
  (send (const {nil cbase} :Marshal) ${:load :restore}
26
26
  !(send (const {nil cbase} :Marshal) :dump ...))
27
- END
27
+ PATTERN
28
28
 
29
29
  def on_send(node)
30
30
  marshal_load(node) do |method|
@@ -18,9 +18,9 @@ module RuboCop
18
18
  class YAMLLoad < Cop
19
19
  MSG = 'Prefer using `YAML.safe_load` over `YAML.load`.'.freeze
20
20
 
21
- def_node_matcher :yaml_load, <<-END
21
+ def_node_matcher :yaml_load, <<-PATTERN
22
22
  (send (const {nil cbase} :YAML) :load ...)
23
- END
23
+ PATTERN
24
24
 
25
25
  def on_send(node)
26
26
  yaml_load(node) do
@@ -3,10 +3,30 @@
3
3
  module RuboCop
4
4
  module Cop
5
5
  module Style
6
- # This cop finds uses of `alias` where `alias_method` would be more
7
- # appropriate (or is simply preferred due to configuration), and vice
8
- # versa.
9
- # It also finds uses of `alias :symbol` rather than `alias bareword`.
6
+ # This cop enforces the use of either `#alias` or `#alias_method`
7
+ # depending on configuration.
8
+ # It also flags uses of `alias :symbol` rather than `alias bareword`.
9
+ #
10
+ # @example
11
+ #
12
+ # # EnforcedStyle: prefer_alias
13
+ #
14
+ # # good
15
+ # alias bar foo
16
+ #
17
+ # # bad
18
+ # alias_method :bar, :foo
19
+ # alias :bar :foo
20
+ #
21
+ # @example
22
+ #
23
+ # # EnforcedStyle: prefer_alias_method
24
+ #
25
+ # # good
26
+ # alias_method :bar, :foo
27
+ #
28
+ # # bad
29
+ # alias bar foo
10
30
  class Alias < Cop
11
31
  include ConfigurableEnforcedStyle
12
32
 
@@ -16,34 +36,31 @@ module RuboCop
16
36
 
17
37
  def on_send(node)
18
38
  return unless node.command?(:alias_method)
19
- return if style == :prefer_alias_method
20
- return if scope_type(node) == :dynamic
39
+ return unless style == :prefer_alias && alias_keyword_possible?(node)
21
40
 
22
41
  msg = format(MSG_ALIAS_METHOD, lexical_scope_type(node))
23
42
  add_offense(node, :selector, msg)
24
43
  end
25
44
 
26
45
  def on_alias(node)
27
- # alias_method can't be used with global variables
28
- return if node.each_child_node(:gvar).any?
29
- # alias_method can't be used in instance_eval blocks
30
- scope_type = scope_type(node)
31
- return if scope_type == :instance_eval
46
+ return unless alias_method_possible?(node)
32
47
 
33
- if scope_type == :dynamic || style == :prefer_alias_method
48
+ if scope_type(node) == :dynamic || style == :prefer_alias_method
34
49
  add_offense(node, :keyword, MSG_ALIAS)
35
50
  elsif node.children.none? { |arg| bareword?(arg) }
36
51
  add_offense_for_args(node)
37
52
  end
38
53
  end
39
54
 
40
- def add_offense_for_args(node)
41
- existing_args = node.children.map(&:source).join(' ')
42
- preferred_args = node.children.map { |a| a.source[1..-1] }.join(' ')
43
- arg_ranges = node.children.map(&:source_range)
44
- msg = format(MSG_SYMBOL_ARGS, preferred_args,
45
- existing_args)
46
- add_offense(node, arg_ranges.reduce(&:join), msg)
55
+ private
56
+
57
+ def alias_keyword_possible?(node)
58
+ scope_type(node) != :dynamic && node.arguments.all?(&:sym_type?)
59
+ end
60
+
61
+ def alias_method_possible?(node)
62
+ scope_type(node) != :instance_eval &&
63
+ node.children.none?(&:gvar_type?)
47
64
  end
48
65
 
49
66
  def autocorrect(node)
@@ -56,7 +73,14 @@ module RuboCop
56
73
  end
57
74
  end
58
75
 
59
- private
76
+ def add_offense_for_args(node)
77
+ existing_args = node.children.map(&:source).join(' ')
78
+ preferred_args = node.children.map { |a| a.source[1..-1] }.join(' ')
79
+ arg_ranges = node.children.map(&:source_range)
80
+ msg = format(MSG_SYMBOL_ARGS, preferred_args,
81
+ existing_args)
82
+ add_offense(node, arg_ranges.reduce(&:join), msg)
83
+ end
60
84
 
61
85
  # In this expression, will `self` be the same as the innermost enclosing
62
86
  # class or module block (:lexical)? Or will it be something else