rubocop 0.48.1 → 0.49.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (184) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +4 -3
  3. data/config/default.yml +397 -357
  4. data/config/disabled.yml +29 -29
  5. data/config/enabled.yml +366 -326
  6. data/lib/rubocop.rb +85 -70
  7. data/lib/rubocop/ast/builder.rb +4 -1
  8. data/lib/rubocop/ast/node.rb +2 -2
  9. data/lib/rubocop/ast/node/and_node.rb +1 -1
  10. data/lib/rubocop/ast/node/args_node.rb +24 -0
  11. data/lib/rubocop/ast/node/block_node.rb +107 -0
  12. data/lib/rubocop/ast/node/case_node.rb +1 -1
  13. data/lib/rubocop/ast/node/ensure_node.rb +1 -1
  14. data/lib/rubocop/ast/node/for_node.rb +1 -1
  15. data/lib/rubocop/ast/node/if_node.rb +1 -1
  16. data/lib/rubocop/ast/node/mixin/parameterized_node.rb +74 -0
  17. data/lib/rubocop/ast/node/or_node.rb +1 -1
  18. data/lib/rubocop/ast/node/pair_node.rb +1 -1
  19. data/lib/rubocop/ast/node/resbody_node.rb +1 -1
  20. data/lib/rubocop/ast/node/send_node.rb +36 -57
  21. data/lib/rubocop/ast/node/super_node.rb +42 -0
  22. data/lib/rubocop/ast/node/until_node.rb +1 -1
  23. data/lib/rubocop/ast/node/when_node.rb +1 -1
  24. data/lib/rubocop/ast/node/while_node.rb +1 -1
  25. data/lib/rubocop/cli.rb +10 -0
  26. data/lib/rubocop/config.rb +23 -7
  27. data/lib/rubocop/config_loader.rb +19 -3
  28. data/lib/rubocop/cop/badge.rb +1 -1
  29. data/lib/rubocop/cop/bundler/duplicated_gem.rb +2 -2
  30. data/lib/rubocop/cop/commissioner.rb +1 -1
  31. data/lib/rubocop/cop/cop.rb +10 -0
  32. data/lib/rubocop/cop/{style → layout}/access_modifier_indentation.rb +33 -3
  33. data/lib/rubocop/cop/{style → layout}/align_array.rb +16 -1
  34. data/lib/rubocop/cop/{style → layout}/align_hash.rb +1 -1
  35. data/lib/rubocop/cop/{style → layout}/align_parameters.rb +29 -1
  36. data/lib/rubocop/cop/{style → layout}/block_end_newline.rb +10 -5
  37. data/lib/rubocop/cop/{style → layout}/case_indentation.rb +64 -1
  38. data/lib/rubocop/cop/{style → layout}/closing_parenthesis_indentation.rb +2 -2
  39. data/lib/rubocop/cop/{style → layout}/comment_indentation.rb +1 -1
  40. data/lib/rubocop/cop/{style → layout}/dot_position.rb +1 -1
  41. data/lib/rubocop/cop/{style → layout}/else_alignment.rb +1 -1
  42. data/lib/rubocop/cop/{style → layout}/empty_line_after_magic_comment.rb +1 -1
  43. data/lib/rubocop/cop/{style → layout}/empty_line_between_defs.rb +1 -1
  44. data/lib/rubocop/cop/{style → layout}/empty_lines.rb +1 -1
  45. data/lib/rubocop/cop/{style → layout}/empty_lines_around_access_modifier.rb +2 -7
  46. data/lib/rubocop/cop/{style → layout}/empty_lines_around_begin_body.rb +1 -1
  47. data/lib/rubocop/cop/{style → layout}/empty_lines_around_block_body.rb +2 -4
  48. data/lib/rubocop/cop/{style → layout}/empty_lines_around_class_body.rb +1 -1
  49. data/lib/rubocop/cop/{style → layout}/empty_lines_around_exception_handling_keywords.rb +1 -1
  50. data/lib/rubocop/cop/{style → layout}/empty_lines_around_method_body.rb +1 -1
  51. data/lib/rubocop/cop/{style → layout}/empty_lines_around_module_body.rb +1 -1
  52. data/lib/rubocop/cop/{style → layout}/end_of_line.rb +1 -1
  53. data/lib/rubocop/cop/{style → layout}/extra_spacing.rb +1 -1
  54. data/lib/rubocop/cop/{style → layout}/first_array_element_line_break.rb +1 -1
  55. data/lib/rubocop/cop/{style → layout}/first_hash_element_line_break.rb +1 -1
  56. data/lib/rubocop/cop/{style → layout}/first_method_argument_line_break.rb +1 -1
  57. data/lib/rubocop/cop/{style → layout}/first_method_parameter_line_break.rb +1 -1
  58. data/lib/rubocop/cop/{style → layout}/first_parameter_indentation.rb +1 -1
  59. data/lib/rubocop/cop/{style → layout}/indent_array.rb +1 -1
  60. data/lib/rubocop/cop/{style → layout}/indent_assignment.rb +1 -1
  61. data/lib/rubocop/cop/{style → layout}/indent_hash.rb +2 -2
  62. data/lib/rubocop/cop/{style → layout}/indent_heredoc.rb +3 -3
  63. data/lib/rubocop/cop/{style → layout}/indentation_consistency.rb +1 -1
  64. data/lib/rubocop/cop/{style → layout}/indentation_width.rb +10 -12
  65. data/lib/rubocop/cop/{style → layout}/initial_indentation.rb +1 -1
  66. data/lib/rubocop/cop/{style → layout}/leading_comment_space.rb +1 -1
  67. data/lib/rubocop/cop/{style → layout}/multiline_array_brace_layout.rb +1 -1
  68. data/lib/rubocop/cop/{style → layout}/multiline_assignment_layout.rb +1 -1
  69. data/lib/rubocop/cop/{style → layout}/multiline_block_layout.rb +21 -36
  70. data/lib/rubocop/cop/{style → layout}/multiline_hash_brace_layout.rb +5 -1
  71. data/lib/rubocop/cop/{style → layout}/multiline_method_call_brace_layout.rb +1 -1
  72. data/lib/rubocop/cop/{style → layout}/multiline_method_call_indentation.rb +3 -3
  73. data/lib/rubocop/cop/{style → layout}/multiline_method_definition_brace_layout.rb +1 -1
  74. data/lib/rubocop/cop/{style → layout}/multiline_operation_indentation.rb +6 -5
  75. data/lib/rubocop/cop/{style → layout}/rescue_ensure_alignment.rb +1 -1
  76. data/lib/rubocop/cop/{style → layout}/space_after_colon.rb +2 -2
  77. data/lib/rubocop/cop/{style → layout}/space_after_comma.rb +2 -2
  78. data/lib/rubocop/cop/{style → layout}/space_after_method_name.rb +1 -1
  79. data/lib/rubocop/cop/{style → layout}/space_after_not.rb +1 -1
  80. data/lib/rubocop/cop/{style → layout}/space_after_semicolon.rb +2 -2
  81. data/lib/rubocop/cop/{style → layout}/space_around_block_parameters.rb +7 -5
  82. data/lib/rubocop/cop/{style → layout}/space_around_equals_in_parameter_default.rb +1 -1
  83. data/lib/rubocop/cop/{style → layout}/space_around_keyword.rb +1 -1
  84. data/lib/rubocop/cop/{style → layout}/space_around_operators.rb +6 -2
  85. data/lib/rubocop/cop/{style → layout}/space_before_block_braces.rb +6 -2
  86. data/lib/rubocop/cop/{style → layout}/space_before_comma.rb +1 -1
  87. data/lib/rubocop/cop/{style → layout}/space_before_comment.rb +1 -1
  88. data/lib/rubocop/cop/{style → layout}/space_before_first_arg.rb +4 -2
  89. data/lib/rubocop/cop/{style → layout}/space_before_semicolon.rb +1 -1
  90. data/lib/rubocop/cop/{style → layout}/space_in_lambda_literal.rb +1 -1
  91. data/lib/rubocop/cop/{style → layout}/space_inside_array_percent_literal.rb +1 -1
  92. data/lib/rubocop/cop/{style → layout}/space_inside_block_braces.rb +3 -4
  93. data/lib/rubocop/cop/{style → layout}/space_inside_brackets.rb +1 -1
  94. data/lib/rubocop/cop/{style → layout}/space_inside_hash_literal_braces.rb +1 -1
  95. data/lib/rubocop/cop/{style → layout}/space_inside_parens.rb +1 -1
  96. data/lib/rubocop/cop/{style → layout}/space_inside_percent_literal_delimiters.rb +8 -7
  97. data/lib/rubocop/cop/{style → layout}/space_inside_range_literal.rb +1 -1
  98. data/lib/rubocop/cop/{style → layout}/space_inside_string_interpolation.rb +1 -1
  99. data/lib/rubocop/cop/{style → layout}/tab.rb +1 -1
  100. data/lib/rubocop/cop/{style → layout}/trailing_blank_lines.rb +1 -1
  101. data/lib/rubocop/cop/{style → layout}/trailing_whitespace.rb +2 -2
  102. data/lib/rubocop/cop/lint/ambiguous_block_association.rb +1 -1
  103. data/lib/rubocop/cop/lint/ambiguous_operator.rb +4 -4
  104. data/lib/rubocop/cop/lint/debugger.rb +0 -15
  105. data/lib/rubocop/cop/lint/duplicate_methods.rb +2 -1
  106. data/lib/rubocop/cop/lint/rescue_type.rb +81 -0
  107. data/lib/rubocop/cop/lint/script_permission.rb +42 -0
  108. data/lib/rubocop/cop/lint/useless_access_modifier.rb +1 -1
  109. data/lib/rubocop/cop/message_annotator.rb +23 -13
  110. data/lib/rubocop/cop/metrics/block_length.rb +1 -1
  111. data/lib/rubocop/cop/mixin/array_min_size.rb +59 -0
  112. data/lib/rubocop/cop/mixin/configurable_enforced_style.rb +10 -11
  113. data/lib/rubocop/cop/mixin/def_node.rb +1 -1
  114. data/lib/rubocop/cop/mixin/empty_lines_around_body.rb +1 -1
  115. data/lib/rubocop/cop/mixin/enforce_superclass.rb +36 -0
  116. data/lib/rubocop/cop/mixin/hash_alignment.rb +1 -1
  117. data/lib/rubocop/cop/mixin/multiline_expression_indentation.rb +7 -3
  118. data/lib/rubocop/cop/mixin/space_before_punctuation.rb +1 -1
  119. data/lib/rubocop/cop/performance/caller.rb +41 -0
  120. data/lib/rubocop/cop/performance/compare_with_block.rb +60 -14
  121. data/lib/rubocop/cop/performance/double_start_end_with.rb +2 -2
  122. data/lib/rubocop/cop/performance/redundant_merge.rb +2 -0
  123. data/lib/rubocop/cop/rails/action_filter.rb +1 -3
  124. data/lib/rubocop/cop/rails/application_job.rb +32 -0
  125. data/lib/rubocop/cop/rails/application_record.rb +32 -0
  126. data/lib/rubocop/cop/rails/blank.rb +9 -3
  127. data/lib/rubocop/cop/rails/output_safety.rb +59 -15
  128. data/lib/rubocop/cop/rails/present.rb +9 -3
  129. data/lib/rubocop/cop/rails/relative_date_constant.rb +35 -4
  130. data/lib/rubocop/cop/rails/reversible_migration.rb +82 -18
  131. data/lib/rubocop/cop/rails/save_bang.rb +7 -2
  132. data/lib/rubocop/cop/rails/skips_model_validations.rb +7 -0
  133. data/lib/rubocop/cop/registry.rb +4 -3
  134. data/lib/rubocop/cop/security/eval.rb +9 -3
  135. data/lib/rubocop/cop/style/and_or.rb +1 -1
  136. data/lib/rubocop/cop/style/block_delimiters.rb +11 -17
  137. data/lib/rubocop/cop/style/braces_around_hash_parameters.rb +1 -1
  138. data/lib/rubocop/cop/style/collection_methods.rb +1 -3
  139. data/lib/rubocop/cop/style/conditional_assignment.rb +1 -1
  140. data/lib/rubocop/cop/style/copyright.rb +2 -2
  141. data/lib/rubocop/cop/style/documentation_method.rb +1 -1
  142. data/lib/rubocop/cop/style/each_for_simple_loop.rb +2 -1
  143. data/lib/rubocop/cop/style/each_with_object.rb +10 -6
  144. data/lib/rubocop/cop/style/empty_case_condition.rb +2 -2
  145. data/lib/rubocop/cop/style/for.rb +4 -5
  146. data/lib/rubocop/cop/style/format_string.rb +49 -0
  147. data/lib/rubocop/cop/style/format_string_token.rb +141 -0
  148. data/lib/rubocop/cop/style/hash_syntax.rb +1 -1
  149. data/lib/rubocop/cop/style/identical_conditional_branches.rb +2 -2
  150. data/lib/rubocop/cop/style/if_unless_modifier_of_if_unless.rb +1 -1
  151. data/lib/rubocop/cop/style/inverse_methods.rb +10 -1
  152. data/lib/rubocop/cop/style/lambda.rb +9 -9
  153. data/lib/rubocop/cop/style/line_end_concatenation.rb +4 -0
  154. data/lib/rubocop/cop/style/method_call_with_args_parentheses.rb +3 -3
  155. data/lib/rubocop/cop/style/method_called_on_do_end_block.rb +1 -2
  156. data/lib/rubocop/cop/style/method_name.rb +8 -2
  157. data/lib/rubocop/cop/style/mixin_grouping.rb +41 -3
  158. data/lib/rubocop/cop/style/multiline_block_chain.rb +7 -11
  159. data/lib/rubocop/cop/style/multiple_comparison.rb +77 -0
  160. data/lib/rubocop/cop/style/next.rb +11 -22
  161. data/lib/rubocop/cop/style/parallel_assignment.rb +10 -19
  162. data/lib/rubocop/cop/style/percent_literal_delimiters.rb +2 -2
  163. data/lib/rubocop/cop/style/self_assignment.rb +4 -0
  164. data/lib/rubocop/cop/style/single_line_block_params.rb +23 -17
  165. data/lib/rubocop/cop/style/symbol_array.rb +24 -13
  166. data/lib/rubocop/cop/style/symbol_proc.rb +4 -0
  167. data/lib/rubocop/cop/style/ternary_parentheses.rb +1 -1
  168. data/lib/rubocop/cop/style/unneeded_interpolation.rb +4 -0
  169. data/lib/rubocop/cop/style/word_array.rb +33 -53
  170. data/lib/rubocop/cop/style/yoda_condition.rb +78 -0
  171. data/lib/rubocop/cop/team.rb +1 -14
  172. data/lib/rubocop/cop/util.rb +16 -0
  173. data/lib/rubocop/formatter/simple_text_formatter.rb +0 -11
  174. data/lib/rubocop/node_pattern.rb +52 -52
  175. data/lib/rubocop/options.rb +25 -0
  176. data/lib/rubocop/path_util.rb +17 -1
  177. data/lib/rubocop/result_cache.rb +8 -7
  178. data/lib/rubocop/rspec/expect_offense.rb +167 -0
  179. data/lib/rubocop/rspec/shared_examples.rb +0 -8
  180. data/lib/rubocop/rspec/support.rb +1 -0
  181. data/lib/rubocop/runner.rb +12 -2
  182. data/lib/rubocop/target_finder.rb +5 -0
  183. data/lib/rubocop/version.rb +1 -1
  184. metadata +101 -72
@@ -57,7 +57,7 @@ module RuboCop
57
57
  #
58
58
  # @return [Array<Node>] the different parts of the `case` statement
59
59
  def node_parts
60
- [*self]
60
+ to_a
61
61
  end
62
62
  end
63
63
  end
@@ -18,7 +18,7 @@ module RuboCop
18
18
  #
19
19
  # @return [Array<Node>] the different parts of the `ensure` statement
20
20
  def node_parts
21
- [*self]
21
+ to_a
22
22
  end
23
23
  end
24
24
  end
@@ -46,7 +46,7 @@ module RuboCop
46
46
  #
47
47
  # @return [Array<Node>] the different parts of the `until` statement
48
48
  def node_parts
49
- [*self]
49
+ to_a
50
50
  end
51
51
  end
52
52
  end
@@ -36,7 +36,7 @@ module RuboCop
36
36
  # Checks whether the `if` node has an `else` clause.
37
37
  #
38
38
  # @note This returns `true` for nodes containing an `elsif` clause.
39
- # This is legacy behaviour, and many cops rely on it.
39
+ # This is legacy behavior, and many cops rely on it.
40
40
  #
41
41
  # @return [Boolean] whether the node has an `else` clause
42
42
  def else?
@@ -0,0 +1,74 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ module AST
5
+ # Common functionality for nodes that are parameterized:
6
+ # `send`, `super`, `zsuper` ...
7
+ module ParameterizedNode
8
+ # Checks whether this super invocation's arguments are wrapped in
9
+ # parentheses.
10
+ #
11
+ # @return [Boolean] whether this super invocation's arguments are
12
+ # wrapped in parentheses
13
+ def parenthesized?
14
+ loc.end && loc.end.is?(')')
15
+ end
16
+
17
+ # A shorthand for getting the first argument of the method invocation.
18
+ # Equivalent to `arguments.first`.
19
+ #
20
+ # @return [Node, nil] the first argument of the method invocation,
21
+ # or `nil` if there are no arguments
22
+ def first_argument
23
+ arguments[0]
24
+ end
25
+
26
+ # A shorthand for getting the last argument of the method invocation.
27
+ # Equivalent to `arguments.last`.
28
+ #
29
+ # @return [Node, nil] the last argument of the method invocation,
30
+ # or `nil` if there are no arguments
31
+ def last_argument
32
+ arguments[-1]
33
+ end
34
+
35
+ # Checks whether this method was invoked with arguments.
36
+ #
37
+ # @return [Boolean] whether this method was invoked with arguments
38
+ def arguments?
39
+ !arguments.empty?
40
+ end
41
+
42
+ # Checks whether any argument of the method invocation is a splat
43
+ # argument, i.e. `*splat`.
44
+ #
45
+ # @return [Boolean] whether the invoked method is a splat argument
46
+ def splat_argument?
47
+ arguments? && arguments.any?(&:splat_type?)
48
+ end
49
+
50
+ # Whether the last argument of the method invocation is a block pass,
51
+ # i.e. `&block`.
52
+ #
53
+ # @return [Boolean] whether the invoked method is a block pass
54
+ def block_argument?
55
+ arguments? && last_argument.block_pass_type?
56
+ end
57
+
58
+ # Whether this method invocation has an explicit block.
59
+ #
60
+ # @return [Boolean] whether the invoked method has a block
61
+ def block_literal?
62
+ parent && parent.block_type? && eql?(parent.send_node)
63
+ end
64
+
65
+ # The block node associated with this method call, if any.
66
+ #
67
+ # @return [BlockNode, nil] the `block` node associated with this method
68
+ # call or `nil`
69
+ def block_node
70
+ parent if block_literal?
71
+ end
72
+ end
73
+ end
74
+ end
@@ -30,7 +30,7 @@ module RuboCop
30
30
  #
31
31
  # @return [Array<Node>] the different parts of the `or` predicate
32
32
  def node_parts
33
- [*self]
33
+ to_a
34
34
  end
35
35
  end
36
36
  end
@@ -57,7 +57,7 @@ module RuboCop
57
57
  #
58
58
  # @return [Array<Node>] the different parts of the `pair`
59
59
  def node_parts
60
- [*self]
60
+ to_a
61
61
  end
62
62
  end
63
63
  end
@@ -18,7 +18,7 @@ module RuboCop
18
18
  #
19
19
  # @return [Array<Node>] the different parts of the `resbody` statement
20
20
  def node_parts
21
- [*self]
21
+ to_a
22
22
  end
23
23
  end
24
24
  end
@@ -6,6 +6,13 @@ module RuboCop
6
6
  # node when the builder constructs the AST, making its methods available
7
7
  # to all `send` nodes within RuboCop.
8
8
  class SendNode < Node
9
+ include ParameterizedNode
10
+
11
+ ENUMERATOR_METHODS = %i[collect collect_concat detect downto each
12
+ find find_all find_index inject loop map!
13
+ map reduce reject reject! reverse_each select
14
+ select! times upto].freeze
15
+
9
16
  # The receiving node of the method invocation.
10
17
  #
11
18
  # @return [Node, nil] the receiver of the invoked method or `nil`
@@ -20,6 +27,13 @@ module RuboCop
20
27
  node_parts[1]
21
28
  end
22
29
 
30
+ # An array containing the arguments of the method invocation.
31
+ #
32
+ # @return [Array<Node>] the arguments of the method invocation or `nil`
33
+ def arguments
34
+ node_parts[2..-1]
35
+ end
36
+
23
37
  # Checks whether the method name matches the argument.
24
38
  #
25
39
  # @param [Symbol, String] name the method name to check for
@@ -48,59 +62,40 @@ module RuboCop
48
62
  !receiver && method?(name)
49
63
  end
50
64
 
51
- # An array containing the arguments of the method invocation.
52
- #
53
- # @return [Array<Node>] the arguments of the method invocation or `nil`
54
- def arguments
55
- node_parts[2..-1]
56
- end
57
-
58
- # A shorthand for getting the first argument of the method invocation.
59
- # Equivalent to `arguments.first`.
60
- #
61
- # @return [Node, nil] the first argument of the method invocation,
62
- # or `nil` if there are no arguments
63
- def first_argument
64
- arguments[0]
65
- end
66
-
67
- # A shorthand for getting the last argument of the method invocation.
68
- # Equivalent to `arguments.last`.
65
+ # Checks whether the invoked method is a setter method.
69
66
  #
70
- # @return [Node, nil] the last argument of the method invocation,
71
- # or `nil` if there are no arguments
72
- def last_argument
73
- arguments[-1]
67
+ # @return [Boolean] whether the invoked method is a setter
68
+ def setter_method?
69
+ loc.operator
74
70
  end
75
71
 
76
- # Checks whether this method was invoked with arguments.
72
+ # Checks whether the invoked method is an operator method.
77
73
  #
78
- # @return [Boolean] whether this method was invoked with arguments
79
- def arguments?
80
- !arguments.empty?
74
+ # @return [Boolean] whether the invoked method is an operator
75
+ def operator_method?
76
+ RuboCop::Cop::Util::OPERATOR_METHODS.include?(method_name)
81
77
  end
82
78
 
83
- # Checks whether this method invocation's arguments are wrapped in
84
- # parentheses.
79
+ # Checks whether the invoked method is a comparison method.
85
80
  #
86
- # @return [Boolean] whether this method invocation's arguments are
87
- # wrapped in parentheses
88
- def parenthesized?
89
- loc.end && loc.end.is?(')')
81
+ # @return [Boolean] whether the involed method is a comparison
82
+ def comparison_method?
83
+ COMPARISON_OPERATORS.include?(method_name)
90
84
  end
91
85
 
92
- # Checks whether the invoked method is a setter method.
86
+ # Checks whether the invoked method is an assignment method.
93
87
  #
94
- # @return [Boolean] whether the invoked method is a setter
95
- def setter_method?
96
- loc.operator
88
+ # @return [Boolean] whether the invoked method is an assignment.
89
+ def assignment_method?
90
+ !comparison_method? && method_name.to_s.end_with?('=')
97
91
  end
98
92
 
99
- # Checks whether the invoked method is an operator method.
93
+ # Checks whether the invoked method is an enumerator method.
100
94
  #
101
- # @return [Boolean] whether the invoked method is an operator
102
- def operator_method?
103
- RuboCop::Cop::Util::OPERATOR_METHODS.include?(method_name)
95
+ # @return [Boolean] whether the invoked method is an enumerator.
96
+ def enumerator_method?
97
+ ENUMERATOR_METHODS.include?(method_name) ||
98
+ method_name.to_s.start_with?('each_')
104
99
  end
105
100
 
106
101
  # Checks whether the method call uses a dot to connect the receiver and
@@ -160,28 +155,12 @@ module RuboCop
160
155
  method_name.to_s =~ /\A[A-Z]/
161
156
  end
162
157
 
163
- # Whether the last argument of the method invocation is a block pass,
164
- # i.e. `&block`.
165
- #
166
- # @return [Boolean] whether the invoked method is a block pass
167
- def block_argument?
168
- arguments? && last_argument.block_pass_type?
169
- end
170
-
171
- # Checks whether any argument of the method invocation is a splat
172
- # argument, i.e. `*splat`.
173
- #
174
- # @return [Boolean] whether the invoked method is a splat argument
175
- def splat_argument?
176
- arguments? && arguments.any?(&:splat_type?)
177
- end
178
-
179
158
  # Custom destructuring method. This can be used to normalize
180
159
  # destructuring for different variations of the node.
181
160
  #
182
161
  # @return [Array] the different parts of the `send` node
183
162
  def node_parts
184
- [*self]
163
+ to_a
185
164
  end
186
165
 
187
166
  private
@@ -0,0 +1,42 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ module AST
5
+ # A node extension for `super`- and `zsuper` nodes. This will be used in
6
+ # place of a plain node when the builder constructs the AST, making its
7
+ # methods available to all `super`- and `zsuper` nodes within RuboCop.
8
+ class SuperNode < Node
9
+ include ParameterizedNode
10
+
11
+ # The method name of this `super` node. Always `:super`.
12
+ #
13
+ # @return [Symbol] the method name of `super`
14
+ def method_name
15
+ :super
16
+ end
17
+
18
+ # An array containing the arguments of the super invocation.
19
+ #
20
+ # @return [Array<Node>] the arguments of the super invocation
21
+ def arguments
22
+ node_parts
23
+ end
24
+
25
+ # Checks whether the method name matches the argument.
26
+ #
27
+ # @param [Symbol, String] name the method name to check for
28
+ # @return [Boolean] whether the method name matches the argument
29
+ def method?(name)
30
+ method_name == name.to_sym
31
+ end
32
+
33
+ # Custom destructuring method. This can be used to normalize
34
+ # destructuring for different variations of the node.
35
+ #
36
+ # @return [Array] the different parts of the `block` node
37
+ def node_parts
38
+ to_a
39
+ end
40
+ end
41
+ end
42
+ end
@@ -36,7 +36,7 @@ module RuboCop
36
36
  #
37
37
  # @return [Array<Node>] the different parts of the `until` statement
38
38
  def node_parts
39
- [*self]
39
+ to_a
40
40
  end
41
41
  end
42
42
  end
@@ -54,7 +54,7 @@ module RuboCop
54
54
  #
55
55
  # @return [Array<Node>] the different parts of the `until` statement
56
56
  def node_parts
57
- [*self]
57
+ to_a
58
58
  end
59
59
  end
60
60
  end
@@ -36,7 +36,7 @@ module RuboCop
36
36
  #
37
37
  # @return [Array<Node>] the different parts of the `while` statement
38
38
  def node_parts
39
- [*self]
39
+ to_a
40
40
  end
41
41
  end
42
42
  end
@@ -21,6 +21,7 @@ module RuboCop
21
21
  # @return [Integer] UNIX exit code
22
22
  def run(args = ARGV)
23
23
  @options, paths = Options.new.parse(args)
24
+ validate_options_vs_config
24
25
  act_on_options
25
26
  apply_default_formatter
26
27
 
@@ -47,6 +48,15 @@ module RuboCop
47
48
 
48
49
  private
49
50
 
51
+ def validate_options_vs_config
52
+ if @options[:parallel] &&
53
+ !@config_store.for(Dir.pwd).for_all_cops['UseCache']
54
+ raise ArgumentError, '-P/--parallel uses caching to speed up ' \
55
+ 'execution, so combining with AllCops: ' \
56
+ 'UseCache: false is not allowed.'
57
+ end
58
+ end
59
+
50
60
  def act_on_options
51
61
  handle_exiting_options
52
62
 
@@ -28,25 +28,41 @@ module RuboCop
28
28
  'The `Rails/DefaultScope` cop no longer exists.',
29
29
  'Style/SingleSpaceBeforeFirstArg' =>
30
30
  'The `Style/SingleSpaceBeforeFirstArg` cop has been renamed to ' \
31
- '`Style/SpaceBeforeFirstArg`.',
31
+ '`Layout/SpaceBeforeFirstArg`.',
32
32
  'Lint/SpaceBeforeFirstArg' =>
33
33
  'The `Lint/SpaceBeforeFirstArg` cop has been removed, since it was a ' \
34
- 'duplicate of `Style/SpaceBeforeFirstArg`. Please use ' \
35
- '`Style/SpaceBeforeFirstArg` instead.',
34
+ 'duplicate of `Layout/SpaceBeforeFirstArg`. Please use ' \
35
+ '`Layout/SpaceBeforeFirstArg` instead.',
36
+ 'Layout/SpaceAfterControlKeyword' =>
37
+ 'The `Layout/SpaceAfterControlKeyword` cop has been removed. Please ' \
38
+ 'use `Layout/SpaceAroundKeyword` instead.',
39
+ 'Layout/SpaceBeforeModifierKeyword' =>
40
+ 'The `Layout/SpaceBeforeModifierKeyword` cop has been removed. ' \
41
+ 'Please use `Layout/SpaceAroundKeyword` instead.',
36
42
  'Style/SpaceAfterControlKeyword' =>
37
43
  'The `Style/SpaceAfterControlKeyword` cop has been removed. Please ' \
38
- 'use `Style/SpaceAroundKeyword` instead.',
44
+ 'use `Layout/SpaceAroundKeyword` instead.',
39
45
  'Style/SpaceBeforeModifierKeyword' =>
40
46
  'The `Style/SpaceBeforeModifierKeyword` cop has been removed. Please ' \
41
- 'use `Style/SpaceAroundKeyword` instead.',
47
+ 'use `Layout/SpaceAroundKeyword` instead.',
42
48
  'Style/MethodCallParentheses' =>
43
49
  'The `Style/MethodCallParentheses` cop has been renamed to ' \
44
50
  '`Style/MethodCallWithoutArgsParentheses`.',
45
51
  'Lint/Eval' =>
46
- 'The `Lint/Eval` cop has been renamed to `Security/Eval`.'
52
+ 'The `Lint/Eval` cop has been renamed to `Security/Eval`.',
53
+ 'Style/DeprecatedHashMethods' =>
54
+ 'The `Style/DeprecatedHashMethods` cop has been renamed to ' \
55
+ '`Style/PreferredHashMethods`.'
47
56
  }.freeze
48
57
 
49
58
  OBSOLETE_PARAMETERS = [
59
+ {
60
+ cop: 'Layout/SpaceAroundOperators',
61
+ parameter: 'MultiSpaceAllowedForOperators',
62
+ alternative: 'If your intention was to allow extra spaces ' \
63
+ 'for alignment, please use AllowForAlignment: ' \
64
+ 'true instead.'
65
+ },
50
66
  {
51
67
  cop: 'Style/SpaceAroundOperators',
52
68
  parameter: 'MultiSpaceAllowedForOperators',
@@ -61,7 +77,7 @@ module RuboCop
61
77
  "Rails:\n Enabled: true"
62
78
  },
63
79
  {
64
- cop: 'Style/CaseIndentation',
80
+ cop: 'Layout/CaseIndentation',
65
81
  parameter: 'IndentWhenRelativeTo',
66
82
  alternative: '`IndentWhenRelativeTo` has been renamed to ' \
67
83
  '`EnforcedStyle`'
@@ -147,9 +147,7 @@ module RuboCop
147
147
  end
148
148
 
149
149
  if disabled_by_default
150
- config = transform(config) do |params|
151
- { 'Enabled' => true }.merge(params) # Set true if not set.
152
- end
150
+ config = handle_disabled_by_default(config, default_configuration)
153
151
  end
154
152
 
155
153
  Config.new(merge(default_configuration, config), config_file)
@@ -164,6 +162,24 @@ module RuboCop
164
162
 
165
163
  private
166
164
 
165
+ def handle_disabled_by_default(config, new_default_configuration)
166
+ department_config = config.to_hash.reject { |cop| cop.include?('/') }
167
+ department_config.each do |dept, dept_params|
168
+ next unless dept_params['Enabled']
169
+
170
+ new_default_configuration.each do |cop, params|
171
+ next unless cop.start_with?(dept + '/')
172
+
173
+ # Retain original default configuration for cops in the department.
174
+ params['Enabled'] = default_configuration[cop]['Enabled']
175
+ end
176
+ end
177
+
178
+ transform(config) do |params|
179
+ { 'Enabled' => true }.merge(params) # Set true if not set.
180
+ end
181
+ end
182
+
167
183
  # Returns a new hash where the parameters of the given config hash have
168
184
  # been replaced by parameters returned by the given block.
169
185
  def transform(config)