rubocop 0.76.0 → 0.77.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 (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)