rubocop 0.76.0 → 0.77.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (81) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +2 -2
  3. data/config/default.yml +252 -239
  4. data/lib/rubocop.rb +27 -20
  5. data/lib/rubocop/ast/node.rb +1 -1
  6. data/lib/rubocop/ast/node/block_node.rb +2 -0
  7. data/lib/rubocop/cli.rb +11 -230
  8. data/lib/rubocop/cli/command.rb +21 -0
  9. data/lib/rubocop/cli/command/auto_genenerate_config.rb +105 -0
  10. data/lib/rubocop/cli/command/base.rb +33 -0
  11. data/lib/rubocop/cli/command/execute_runner.rb +76 -0
  12. data/lib/rubocop/cli/command/init_dotfile.rb +45 -0
  13. data/lib/rubocop/cli/command/show_cops.rb +73 -0
  14. data/lib/rubocop/cli/command/version.rb +17 -0
  15. data/lib/rubocop/cli/environment.rb +21 -0
  16. data/lib/rubocop/config_obsoletion.rb +62 -9
  17. data/lib/rubocop/config_validator.rb +1 -3
  18. data/lib/rubocop/cop/bundler/gem_comment.rb +4 -4
  19. data/lib/rubocop/cop/cop.rb +19 -0
  20. data/lib/rubocop/cop/correctors/space_corrector.rb +1 -2
  21. data/lib/rubocop/cop/internal_affairs.rb +1 -0
  22. data/lib/rubocop/cop/internal_affairs/method_name_equal.rb +59 -0
  23. data/lib/rubocop/cop/layout/{align_arguments.rb → argument_alignment.rb} +1 -1
  24. data/lib/rubocop/cop/layout/{align_array.rb → array_alignment.rb} +1 -1
  25. data/lib/rubocop/cop/layout/{indent_assignment.rb → assignment_indentation.rb} +1 -1
  26. data/lib/rubocop/cop/layout/extra_spacing.rb +1 -1
  27. data/lib/rubocop/cop/layout/{indent_first_argument.rb → first_argument_indentation.rb} +3 -3
  28. data/lib/rubocop/cop/layout/{indent_first_array_element.rb → first_array_element_indentation.rb} +4 -4
  29. data/lib/rubocop/cop/layout/{indent_first_hash_element.rb → first_hash_element_indentation.rb} +3 -3
  30. data/lib/rubocop/cop/layout/{indent_first_parameter.rb → first_parameter_indentation.rb} +3 -3
  31. data/lib/rubocop/cop/layout/{align_hash.rb → hash_alignment.rb} +2 -2
  32. data/lib/rubocop/cop/layout/{indent_heredoc.rb → heredoc_indentation.rb} +1 -1
  33. data/lib/rubocop/cop/layout/{leading_blank_lines.rb → leading_empty_lines.rb} +1 -1
  34. data/lib/rubocop/cop/layout/multiline_method_argument_line_breaks.rb +1 -1
  35. data/lib/rubocop/cop/layout/{align_parameters.rb → parameter_alignment.rb} +1 -1
  36. data/lib/rubocop/cop/layout/space_around_keyword.rb +12 -0
  37. data/lib/rubocop/cop/layout/space_around_operators.rb +1 -1
  38. data/lib/rubocop/cop/layout/{trailing_blank_lines.rb → trailing_empty_lines.rb} +1 -1
  39. data/lib/rubocop/cop/lint/disjunctive_assignment_in_constructor.rb +1 -1
  40. data/lib/rubocop/cop/lint/{duplicated_key.rb → duplicate_hash_key.rb} +1 -1
  41. data/lib/rubocop/cop/lint/ineffective_access_modifier.rb +1 -1
  42. data/lib/rubocop/cop/lint/{multiple_compare.rb → multiple_comparison.rb} +1 -1
  43. data/lib/rubocop/cop/lint/redundant_splat_expansion.rb +1 -1
  44. data/lib/rubocop/cop/lint/{string_conversion_in_interpolation.rb → redundant_string_coercion.rb} +1 -1
  45. data/lib/rubocop/cop/lint/redundant_with_index.rb +2 -2
  46. data/lib/rubocop/cop/lint/redundant_with_object.rb +2 -2
  47. data/lib/rubocop/cop/lint/{handle_exceptions.rb → suppressed_exception.rb} +1 -1
  48. data/lib/rubocop/cop/lint/useless_access_modifier.rb +57 -23
  49. data/lib/rubocop/cop/lint/useless_setter_call.rb +1 -1
  50. data/lib/rubocop/cop/metrics/line_length.rb +41 -38
  51. data/lib/rubocop/cop/metrics/method_length.rb +1 -1
  52. data/lib/rubocop/cop/mixin/{hash_alignment.rb → hash_alignment_styles.rb} +1 -1
  53. data/lib/rubocop/cop/mixin/nil_methods.rb +4 -4
  54. data/lib/rubocop/cop/naming/{uncommunicative_block_param_name.rb → block_parameter_name.rb} +3 -3
  55. data/lib/rubocop/cop/naming/heredoc_delimiter_naming.rb +5 -5
  56. data/lib/rubocop/cop/naming/{uncommunicative_method_param_name.rb → method_parameter_name.rb} +3 -3
  57. data/lib/rubocop/cop/naming/predicate_name.rb +6 -6
  58. data/lib/rubocop/cop/style/alias.rb +1 -1
  59. data/lib/rubocop/cop/style/array_join.rb +1 -1
  60. data/lib/rubocop/cop/style/eval_with_location.rb +1 -1
  61. data/lib/rubocop/cop/style/even_odd.rb +1 -1
  62. data/lib/rubocop/cop/style/ip_addresses.rb +4 -4
  63. data/lib/rubocop/cop/style/mixin_grouping.rb +1 -1
  64. data/lib/rubocop/cop/style/nested_parenthesized_calls.rb +5 -5
  65. data/lib/rubocop/cop/style/next.rb +5 -5
  66. data/lib/rubocop/cop/style/numeric_literals.rb +7 -3
  67. data/lib/rubocop/cop/style/option_hash.rb +3 -3
  68. data/lib/rubocop/cop/style/redundant_parentheses.rb +3 -3
  69. data/lib/rubocop/cop/style/redundant_return.rb +2 -8
  70. data/lib/rubocop/cop/style/redundant_sort.rb +1 -1
  71. data/lib/rubocop/cop/style/trivial_accessors.rb +5 -5
  72. data/lib/rubocop/cop/team.rb +5 -0
  73. data/lib/rubocop/formatter/clang_style_formatter.rb +1 -3
  74. data/lib/rubocop/formatter/tap_formatter.rb +1 -3
  75. data/lib/rubocop/processed_source.rb +1 -1
  76. data/lib/rubocop/rake_task.rb +1 -0
  77. data/lib/rubocop/result_cache.rb +21 -7
  78. data/lib/rubocop/runner.rb +13 -1
  79. data/lib/rubocop/version.rb +1 -1
  80. metadata +30 -22
  81. data/lib/rubocop/cop/mixin/safe_mode.rb +0 -24
@@ -17,7 +17,7 @@ module RuboCop
17
17
  # # good
18
18
  #
19
19
  # "result is #{something}"
20
- class StringConversionInInterpolation < Cop
20
+ class RedundantStringCoercion < Cop
21
21
  include Interpolation
22
22
 
23
23
  MSG_DEFAULT = 'Redundant use of `Object#to_s` in interpolation.'
@@ -50,7 +50,7 @@ module RuboCop
50
50
  def autocorrect(node)
51
51
  lambda do |corrector|
52
52
  redundant_with_index?(node) do |send|
53
- if send.method_name == :each_with_index
53
+ if send.method?(:each_with_index)
54
54
  corrector.replace(send.loc.selector, 'each')
55
55
  else
56
56
  corrector.remove(with_index_range(send))
@@ -63,7 +63,7 @@ module RuboCop
63
63
  private
64
64
 
65
65
  def message(node)
66
- if node.method_name == :each_with_index
66
+ if node.method?(:each_with_index)
67
67
  MSG_EACH_WITH_INDEX
68
68
  else
69
69
  MSG_WITH_INDEX
@@ -51,7 +51,7 @@ module RuboCop
51
51
  def autocorrect(node)
52
52
  lambda do |corrector|
53
53
  redundant_with_object?(node) do |send|
54
- if send.method_name == :each_with_object
54
+ if send.method?(:each_with_object)
55
55
  corrector.replace(with_object_range(send), 'each')
56
56
  else
57
57
  corrector.remove(with_object_range(send))
@@ -64,7 +64,7 @@ module RuboCop
64
64
  private
65
65
 
66
66
  def message(node)
67
- if node.method_name == :each_with_object
67
+ if node.method?(:each_with_object)
68
68
  MSG_EACH_WITH_OBJECT
69
69
  else
70
70
  MSG_WITH_OBJECT
@@ -74,7 +74,7 @@ module RuboCop
74
74
  # rescue
75
75
  # # do nothing but comment
76
76
  # end
77
- class HandleExceptions < Cop
77
+ class SuppressedException < Cop
78
78
  MSG = 'Do not suppress exceptions.'
79
79
 
80
80
  def on_resbody(node)
@@ -9,23 +9,64 @@ module RuboCop
9
9
  # always being defined, and thus access modifiers guarding such methods
10
10
  # are not redundant.
11
11
  #
12
- # @example
12
+ # This cop has `ContextCreatingMethods` option. The default setting value
13
+ # is an empty array that means no method is specified.
14
+ # This setting is an array of methods which, when called, are known to
15
+ # create its own context in the module's current access context.
16
+ #
17
+ # It also has `MethodCreatingMethods` option. The default setting value
18
+ # is an empty array that means no method is specified.
19
+ # This setting is an array of methods which, when called, are known to
20
+ # create other methods in the module's current access context.
13
21
  #
22
+ # @example
23
+ # # bad
14
24
  # class Foo
15
25
  # public # this is redundant (default access is public)
16
26
  #
17
27
  # def method
18
28
  # end
29
+ # end
19
30
  #
20
- # private # this is not redundant (a method is defined)
21
- # def method2
31
+ # # bad
32
+ # class Foo
33
+ # # The following is redundant (methods defined on the class'
34
+ # # singleton class are not affected by the public modifier)
35
+ # public
36
+ #
37
+ # def self.method3
22
38
  # end
39
+ # end
23
40
  #
41
+ # # bad
42
+ # class Foo
43
+ # protected
44
+ #
45
+ # define_method(:method2) do
46
+ # end
47
+ #
48
+ # protected # this is redundant (repeated from previous modifier)
49
+ #
50
+ # [1,2,3].each do |i|
51
+ # define_method("foo#{i}") do
52
+ # end
53
+ # end
54
+ # end
55
+ #
56
+ # # bad
57
+ # class Foo
24
58
  # private # this is redundant (no following methods are defined)
25
59
  # end
26
60
  #
27
- # @example
61
+ # # good
62
+ # class Foo
63
+ # private # this is not redundant (a method is defined)
64
+ #
65
+ # def method2
66
+ # end
67
+ # end
28
68
  #
69
+ # # good
29
70
  # class Foo
30
71
  # # The following is not redundant (conditionally defined methods are
31
72
  # # considered as always defining a method)
@@ -35,31 +76,22 @@ module RuboCop
35
76
  # def method
36
77
  # end
37
78
  # end
79
+ # end
38
80
  #
39
- # protected # this is not redundant (method is defined)
81
+ # # good
82
+ # class Foo
83
+ # protected # this is not redundant (a method is defined)
40
84
  #
41
85
  # define_method(:method2) do
42
86
  # end
43
- #
44
- # protected # this is redundant (repeated from previous modifier)
45
- #
46
- # [1,2,3].each do |i|
47
- # define_method("foo#{i}") do
48
- # end
49
- # end
50
- #
51
- # # The following is redundant (methods defined on the class'
52
- # # singleton class are not affected by the public modifier)
53
- # public
54
- #
55
- # def self.method3
56
- # end
57
87
  # end
58
88
  #
59
- # @example
89
+ # @example ContextCreatingMethods: concerning
60
90
  # # Lint/UselessAccessModifier:
61
91
  # # ContextCreatingMethods:
62
92
  # # - concerning
93
+ #
94
+ # # good
63
95
  # require 'active_support/concern'
64
96
  # class Foo
65
97
  # concerning :Bar do
@@ -79,10 +111,12 @@ module RuboCop
79
111
  # end
80
112
  # end
81
113
  #
82
- # @example
114
+ # @example MethodCreatingMethods: delegate
83
115
  # # Lint/UselessAccessModifier:
84
116
  # # MethodCreatingMethods:
85
117
  # # - delegate
118
+ #
119
+ # # good
86
120
  # require 'active_support/core_ext/module/delegation'
87
121
  # class Foo
88
122
  # # this is not redundant because `delegate` creates methods
@@ -141,7 +175,7 @@ module RuboCop
141
175
 
142
176
  def access_modifier?(node)
143
177
  node.bare_access_modifier? ||
144
- node.method_name == :private_class_method
178
+ node.method?(:private_class_method)
145
179
  end
146
180
 
147
181
  def check_scope(node)
@@ -169,7 +203,7 @@ module RuboCop
169
203
  def check_send_node(node, cur_vis, unused)
170
204
  if node.bare_access_modifier?
171
205
  check_new_visibility(node, unused, node.method_name, cur_vis)
172
- elsif node.method_name == :private_class_method && !node.arguments?
206
+ elsif node.method?(:private_class_method) && !node.arguments?
173
207
  add_offense(node, message: format(MSG, current: node.method_name))
174
208
  [cur_vis, unused]
175
209
  end
@@ -155,7 +155,7 @@ module RuboCop
155
155
  return true if node.literal?
156
156
  return false unless node.send_type?
157
157
 
158
- node.method_name == :new
158
+ node.method?(:new)
159
159
  end
160
160
  end
161
161
  end
@@ -21,14 +21,14 @@ module RuboCop
21
21
  # If autocorrection is enabled, the following Layout cops
22
22
  # are recommended to further format the broken lines.
23
23
  #
24
- # - AlignArray
25
- # - AlignHash
26
- # - AlignParameters
24
+ # - ParameterAlignment
25
+ # - ArgumentAlignment
27
26
  # - ClosingParenthesisIndentation
28
- # - IndentFirstArgument
29
- # - IndentFirstArrayElement
30
- # - IndentFirstHashElement
31
- # - IndentFirstParameter
27
+ # - FirstArgumentIndentation
28
+ # - FirstArrayElementIndentation
29
+ # - FirstHashElementIndentation
30
+ # - FirstParameterIndentation
31
+ # - HashAlignment
32
32
  # - MultilineArrayLineBreaks
33
33
  # - MultilineHashBraceLayout
34
34
  # - MultilineHashKeyLineBreaks
@@ -68,6 +68,10 @@ module RuboCop
68
68
  alias on_hash on_potential_breakable_node
69
69
  alias on_send on_potential_breakable_node
70
70
 
71
+ def investigate(processed_source)
72
+ check_for_breakable_semicolons(processed_source)
73
+ end
74
+
71
75
  def investigate_post_walk(processed_source)
72
76
  processed_source.lines.each_with_index do |line, line_index|
73
77
  check_line(line, line_index)
@@ -89,11 +93,37 @@ module RuboCop
89
93
  return if breakable_node.nil?
90
94
 
91
95
  line_index = breakable_node.first_line - 1
92
- breakable_nodes_by_line_index[line_index] = breakable_node
96
+ range = breakable_node.source_range
97
+
98
+ existing = breakable_range_by_line_index[line_index]
99
+ return if existing
100
+
101
+ breakable_range_by_line_index[line_index] = range
102
+ end
103
+
104
+ def check_for_breakable_semicolons(processed_source)
105
+ tokens = processed_source.tokens.select { |t| t.type == :tSEMI }
106
+ tokens.reverse_each do |token|
107
+ range = breakable_range_after_semicolon(token)
108
+ breakable_range_by_line_index[range.line - 1] = range if range
109
+ end
110
+ end
111
+
112
+ def breakable_range_after_semicolon(semicolon_token)
113
+ range = semicolon_token.pos
114
+ end_pos = range.end_pos
115
+ next_range = range_between(end_pos, end_pos + 1)
116
+ return nil unless next_range.line == range.line
117
+
118
+ next_char = next_range.source
119
+ return nil if /[\r\n]/ =~ next_char
120
+ return nil if next_char == ';'
121
+
122
+ next_range
93
123
  end
94
124
 
95
- def breakable_nodes_by_line_index
96
- @breakable_nodes_by_line_index ||= {}
125
+ def breakable_range_by_line_index
126
+ @breakable_range_by_line_index ||= {}
97
127
  end
98
128
 
99
129
  def heredocs
@@ -147,33 +177,12 @@ module RuboCop
147
177
  def register_offense(loc, line, line_index)
148
178
  message = format(MSG, length: line_length(line), max: max)
149
179
 
150
- breakable_range = breakable_range(line, line_index)
180
+ breakable_range = breakable_range_by_line_index[line_index]
151
181
  add_offense(breakable_range, location: loc, message: message) do
152
182
  self.max = line_length(line)
153
183
  end
154
184
  end
155
185
 
156
- def breakable_range(line, line_index)
157
- return if line_in_heredoc?(line_index + 1)
158
-
159
- semicolon_range = breakable_semicolon_range(line, line_index)
160
- return semicolon_range if semicolon_range
161
-
162
- breakable_node = breakable_nodes_by_line_index[line_index]
163
- return breakable_node.source_range if breakable_node
164
- end
165
-
166
- def breakable_semicolon_range(line, line_index)
167
- semicolon_separated_parts = line.split(';')
168
- return if semicolon_separated_parts.length <= 1
169
-
170
- column = semicolon_separated_parts.first.length + 1
171
- range = source_range(processed_source.buffer, line_index, column, 1)
172
- return if processed_source.commented?(range)
173
-
174
- range
175
- end
176
-
177
186
  def excess_range(uri_range, line, line_index)
178
187
  excessive_position = if uri_range && uri_range.begin < max
179
188
  uri_range.end
@@ -216,12 +225,6 @@ module RuboCop
216
225
  end
217
226
  end
218
227
 
219
- def line_in_heredoc?(line_number)
220
- heredocs.any? do |range, _delimiter|
221
- range.cover?(line_number)
222
- end
223
- end
224
-
225
228
  def allow_uri?
226
229
  cop_config['AllowURI']
227
230
  end
@@ -20,7 +20,7 @@ module RuboCop
20
20
  alias on_defs on_def
21
21
 
22
22
  def on_block(node)
23
- return unless node.send_node.method_name == :define_method
23
+ return unless node.send_node.method?(:define_method)
24
24
 
25
25
  check_code_length(node)
26
26
  end
@@ -3,7 +3,7 @@
3
3
  module RuboCop
4
4
  module Cop
5
5
  # Common functionality for checking hash alignment.
6
- module HashAlignment
6
+ module HashAlignmentStyles
7
7
  # Handles calculation of deltas when the enforced style is 'key'.
8
8
  class KeyAlignment
9
9
  def checkable_layout?(_node)
@@ -5,20 +5,20 @@ module RuboCop
5
5
  # This module provides a list of methods that are:
6
6
  # 1. In the NilClass by default
7
7
  # 2. Added to NilClass by explicitly requiring any standard libraries
8
- # 3. Cop's configuration parameter Whitelist.
8
+ # 3. Cop's configuration parameter AllowedMethods.
9
9
  module NilMethods
10
10
  private
11
11
 
12
12
  def nil_methods
13
- nil.methods + other_stdlib_methods + whitelist
13
+ nil.methods + other_stdlib_methods + allowed_methods
14
14
  end
15
15
 
16
16
  def other_stdlib_methods
17
17
  [:to_d]
18
18
  end
19
19
 
20
- def whitelist
21
- cop_config['Whitelist'].map(&:to_sym)
20
+ def allowed_methods
21
+ cop_config['AllowedMethods'].map(&:to_sym)
22
22
  end
23
23
  end
24
24
  end
@@ -11,9 +11,9 @@ module RuboCop
11
11
  # The `AllowNamesEndingInNumbers` config option takes a boolean. When
12
12
  # set to false, this cop will register offenses for names ending with
13
13
  # numbers. Its default is false. The `AllowedNames` config option
14
- # takes an array of whitelisted names that will never register an
14
+ # takes an array of permitted names that will never register an
15
15
  # offense. The `ForbiddenNames` config option takes an array of
16
- # blacklisted names that will always register an offense.
16
+ # restricted names that will always register an offense.
17
17
  #
18
18
  # @example
19
19
  # # bad
@@ -35,7 +35,7 @@ module RuboCop
35
35
  # foo { |speed, distance| speed * distance }
36
36
  #
37
37
  # baz { |age, height, gender| do_stuff(age, height, gender) }
38
- class UncommunicativeBlockParamName < Cop
38
+ class BlockParameterName < Cop
39
39
  include UncommunicativeName
40
40
 
41
41
  def on_block(node)
@@ -5,7 +5,7 @@ module RuboCop
5
5
  module Naming
6
6
  # This cop checks that your heredocs are using meaningful delimiters.
7
7
  # By default it disallows `END` and `EO*`, and can be configured through
8
- # blacklisting additional delimiters.
8
+ # forbidden listing additional delimiters.
9
9
  #
10
10
  # @example
11
11
  #
@@ -41,13 +41,13 @@ module RuboCop
41
41
 
42
42
  return false unless delimiters =~ /\w/
43
43
 
44
- blacklisted_delimiters.none? do |blacklisted_delimiter|
45
- delimiters =~ Regexp.new(blacklisted_delimiter)
44
+ forbidden_delimiters.none? do |forbidden_delimiter|
45
+ delimiters =~ Regexp.new(forbidden_delimiter)
46
46
  end
47
47
  end
48
48
 
49
- def blacklisted_delimiters
50
- cop_config['Blacklist'] || []
49
+ def forbidden_delimiters
50
+ cop_config['ForbiddenDelimiters'] || []
51
51
  end
52
52
  end
53
53
  end
@@ -11,9 +11,9 @@ module RuboCop
11
11
  # The `AllowNamesEndingInNumbers` config option takes a boolean. When
12
12
  # set to false, this cop will register offenses for names ending with
13
13
  # numbers. Its default is false. The `AllowedNames` config option
14
- # takes an array of whitelisted names that will never register an
14
+ # takes an array of permitted names that will never register an
15
15
  # offense. The `ForbiddenNames` config option takes an array of
16
- # blacklisted names that will always register an offense.
16
+ # restricted names that will always register an offense.
17
17
  #
18
18
  # @example
19
19
  # # bad
@@ -43,7 +43,7 @@ module RuboCop
43
43
  # def baz(age_a, height_b, gender_c)
44
44
  # do_stuff(age_a, height_b, gender_c)
45
45
  # end
46
- class UncommunicativeMethodParamName < Cop
46
+ class MethodParameterName < Cop
47
47
  include UncommunicativeName
48
48
 
49
49
  def on_def(node)
@@ -70,11 +70,11 @@ module RuboCop
70
70
  !method_name.match(/^#{prefix}[^0-9]/) ||
71
71
  method_name == expected_name(method_name, prefix) ||
72
72
  method_name.end_with?('=') ||
73
- predicate_whitelist.include?(method_name)
73
+ allowed_methods.include?(method_name)
74
74
  end
75
75
 
76
76
  def expected_name(method_name, prefix)
77
- new_name = if prefix_blacklist.include?(prefix)
77
+ new_name = if forbidden_prefixes.include?(prefix)
78
78
  method_name.sub(prefix, '')
79
79
  else
80
80
  method_name.dup
@@ -87,16 +87,16 @@ module RuboCop
87
87
  "Rename `#{method_name}` to `#{new_name}`."
88
88
  end
89
89
 
90
- def prefix_blacklist
91
- cop_config['NamePrefixBlacklist']
90
+ def forbidden_prefixes
91
+ cop_config['ForbiddenPrefixes']
92
92
  end
93
93
 
94
94
  def predicate_prefixes
95
95
  cop_config['NamePrefix']
96
96
  end
97
97
 
98
- def predicate_whitelist
99
- cop_config['NameWhitelist']
98
+ def allowed_methods
99
+ cop_config['AllowedMethods']
100
100
  end
101
101
 
102
102
  def method_definition_macros(macro_name)