rubocop 0.86.0 → 0.87.1

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 (104) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +1 -1
  3. data/config/default.yml +46 -4
  4. data/lib/rubocop.rb +8 -1
  5. data/lib/rubocop/cli.rb +0 -2
  6. data/lib/rubocop/cli/command/auto_genenerate_config.rb +40 -5
  7. data/lib/rubocop/cli/command/show_cops.rb +1 -1
  8. data/lib/rubocop/config_loader.rb +21 -62
  9. data/lib/rubocop/config_obsoletion.rb +0 -1
  10. data/lib/rubocop/cop/autocorrect_logic.rb +13 -23
  11. data/lib/rubocop/cop/base.rb +399 -0
  12. data/lib/rubocop/cop/bundler/insecure_protocol_source.rb +10 -20
  13. data/lib/rubocop/cop/commissioner.rb +48 -50
  14. data/lib/rubocop/cop/cop.rb +85 -236
  15. data/lib/rubocop/cop/corrector.rb +38 -115
  16. data/lib/rubocop/cop/gemspec/ruby_version_globals_usage.rb +1 -1
  17. data/lib/rubocop/cop/generator.rb +1 -1
  18. data/lib/rubocop/cop/internal_affairs/node_type_predicate.rb +11 -14
  19. data/lib/rubocop/cop/layout/case_indentation.rb +18 -19
  20. data/lib/rubocop/cop/layout/class_structure.rb +2 -37
  21. data/lib/rubocop/cop/layout/empty_lines_around_attribute_accessor.rb +1 -8
  22. data/lib/rubocop/cop/layout/first_argument_indentation.rb +4 -0
  23. data/lib/rubocop/cop/layout/hash_alignment.rb +1 -2
  24. data/lib/rubocop/cop/layout/multiline_block_layout.rb +0 -1
  25. data/lib/rubocop/cop/layout/space_around_block_parameters.rb +19 -25
  26. data/lib/rubocop/cop/legacy/corrections_proxy.rb +49 -0
  27. data/lib/rubocop/cop/legacy/corrector.rb +29 -0
  28. data/lib/rubocop/cop/lint/deprecated_open_ssl_constant.rb +4 -4
  29. data/lib/rubocop/cop/lint/interpolation_check.rb +13 -0
  30. data/lib/rubocop/cop/lint/nested_method_definition.rb +1 -1
  31. data/lib/rubocop/cop/lint/non_deterministic_require_order.rb +2 -2
  32. data/lib/rubocop/cop/lint/parentheses_as_grouped_expression.rb +8 -3
  33. data/lib/rubocop/cop/lint/rand_one.rb +1 -1
  34. data/lib/rubocop/cop/lint/redundant_cop_disable_directive.rb +27 -23
  35. data/lib/rubocop/cop/lint/redundant_splat_expansion.rb +2 -2
  36. data/lib/rubocop/cop/lint/safe_navigation_with_empty.rb +8 -0
  37. data/lib/rubocop/cop/lint/syntax.rb +11 -26
  38. data/lib/rubocop/cop/lint/unused_method_argument.rb +1 -1
  39. data/lib/rubocop/cop/lint/useless_access_modifier.rb +1 -1
  40. data/lib/rubocop/cop/metrics/block_length.rb +22 -0
  41. data/lib/rubocop/cop/metrics/class_length.rb +25 -2
  42. data/lib/rubocop/cop/metrics/method_length.rb +23 -0
  43. data/lib/rubocop/cop/metrics/module_length.rb +25 -2
  44. data/lib/rubocop/cop/metrics/utils/code_length_calculator.rb +129 -0
  45. data/lib/rubocop/cop/mixin/allowed_methods.rb +19 -0
  46. data/lib/rubocop/cop/mixin/auto_corrector.rb +12 -0
  47. data/lib/rubocop/cop/mixin/code_length.rb +4 -0
  48. data/lib/rubocop/cop/mixin/configurable_formatting.rb +1 -1
  49. data/lib/rubocop/cop/mixin/enforce_superclass.rb +3 -1
  50. data/lib/rubocop/cop/mixin/nil_methods.rb +3 -5
  51. data/lib/rubocop/cop/mixin/ordered_gem_node.rb +6 -1
  52. data/lib/rubocop/cop/mixin/surrounding_space.rb +7 -2
  53. data/lib/rubocop/cop/mixin/too_many_lines.rb +3 -13
  54. data/lib/rubocop/cop/mixin/uncommunicative_name.rb +4 -2
  55. data/lib/rubocop/cop/mixin/visibility_help.rb +50 -0
  56. data/lib/rubocop/cop/naming/ascii_identifiers.rb +27 -4
  57. data/lib/rubocop/cop/naming/binary_operator_parameter_name.rb +2 -2
  58. data/lib/rubocop/cop/naming/method_name.rb +1 -1
  59. data/lib/rubocop/cop/naming/method_parameter_name.rb +1 -1
  60. data/lib/rubocop/cop/naming/predicate_name.rb +3 -5
  61. data/lib/rubocop/cop/naming/variable_name.rb +1 -1
  62. data/lib/rubocop/cop/naming/variable_number.rb +1 -1
  63. data/lib/rubocop/cop/offense.rb +16 -2
  64. data/lib/rubocop/cop/style/accessor_grouping.rb +140 -0
  65. data/lib/rubocop/cop/style/bisected_attr_accessor.rb +145 -0
  66. data/lib/rubocop/cop/style/class_vars.rb +21 -0
  67. data/lib/rubocop/cop/style/date_time.rb +1 -1
  68. data/lib/rubocop/cop/style/dir.rb +2 -2
  69. data/lib/rubocop/cop/style/empty_literal.rb +5 -5
  70. data/lib/rubocop/cop/style/expand_path_arguments.rb +2 -2
  71. data/lib/rubocop/cop/style/if_unless_modifier_of_if_unless.rb +12 -0
  72. data/lib/rubocop/cop/style/multiline_block_chain.rb +10 -1
  73. data/lib/rubocop/cop/style/mutable_constant.rb +4 -4
  74. data/lib/rubocop/cop/style/nested_parenthesized_calls.rb +2 -5
  75. data/lib/rubocop/cop/style/proc.rb +1 -1
  76. data/lib/rubocop/cop/style/random_with_offset.rb +4 -10
  77. data/lib/rubocop/cop/style/redundant_assignment.rb +117 -0
  78. data/lib/rubocop/cop/style/redundant_exception.rb +14 -10
  79. data/lib/rubocop/cop/style/redundant_fetch_block.rb +26 -7
  80. data/lib/rubocop/cop/style/redundant_freeze.rb +1 -1
  81. data/lib/rubocop/cop/style/redundant_parentheses.rb +7 -1
  82. data/lib/rubocop/cop/style/redundant_regexp_character_class.rb +2 -1
  83. data/lib/rubocop/cop/style/redundant_regexp_escape.rb +2 -2
  84. data/lib/rubocop/cop/style/rescue_standard_error.rb +1 -1
  85. data/lib/rubocop/cop/style/signal_exception.rb +1 -1
  86. data/lib/rubocop/cop/style/stderr_puts.rb +1 -1
  87. data/lib/rubocop/cop/style/struct_inheritance.rb +2 -2
  88. data/lib/rubocop/cop/style/symbol_proc.rb +1 -1
  89. data/lib/rubocop/cop/style/trivial_accessors.rb +8 -7
  90. data/lib/rubocop/cop/style/zero_length_predicate.rb +2 -2
  91. data/lib/rubocop/cop/team.rb +97 -81
  92. data/lib/rubocop/cop/utils/format_string.rb +1 -2
  93. data/lib/rubocop/formatter/disabled_config_formatter.rb +1 -1
  94. data/lib/rubocop/name_similarity.rb +1 -3
  95. data/lib/rubocop/options.rb +15 -8
  96. data/lib/rubocop/rake_task.rb +6 -9
  97. data/lib/rubocop/rspec/cop_helper.rb +4 -4
  98. data/lib/rubocop/rspec/expect_offense.rb +22 -17
  99. data/lib/rubocop/rspec/shared_contexts.rb +7 -7
  100. data/lib/rubocop/runner.rb +31 -29
  101. data/lib/rubocop/target_ruby.rb +1 -1
  102. data/lib/rubocop/version.rb +1 -1
  103. metadata +16 -7
  104. data/lib/rubocop/cop/mixin/classish_length.rb +0 -37
@@ -34,10 +34,11 @@ module RuboCop
34
34
  \[ # Literal [
35
35
  (?!\#\{) # Not (the start of) an interpolation
36
36
  (?: # Either...
37
- \\. | # Any escaped character
37
+ \\[^b] | # Any escaped character except b (which would change behaviour)
38
38
  [^.*+?{}()|$] | # or one that doesn't require escaping outside the character class
39
39
  \\[upP]\{[^}]+\} # or a unicode code-point or property
40
40
  )
41
+ (?<!\\) # No \-prefix (i.e. not escaped)
41
42
  \] # Literal ]
42
43
  )
43
44
  /x.freeze
@@ -83,8 +83,8 @@ module RuboCop
83
83
 
84
84
  def delimiter?(node, char)
85
85
  delimiters = [
86
- node.loc.begin.source.chars.last,
87
- node.loc.end.source.chars.first
86
+ node.loc.begin.source[-1],
87
+ node.loc.end.source[0]
88
88
  ]
89
89
 
90
90
  delimiters.include?(char)
@@ -85,7 +85,7 @@ module RuboCop
85
85
  PATTERN
86
86
 
87
87
  def_node_matcher :rescue_standard_error?, <<~PATTERN
88
- (resbody $(array (const nil? :StandardError)) _ _)
88
+ (resbody $(array (const {nil? cbase} :StandardError)) _ _)
89
89
  PATTERN
90
90
 
91
91
  def on_resbody(node)
@@ -111,7 +111,7 @@ module RuboCop
111
111
  RAISE_MSG = 'Use `raise` instead of `fail` to ' \
112
112
  'rethrow exceptions.'
113
113
 
114
- def_node_matcher :kernel_call?, '(send (const nil? :Kernel) %1 ...)'
114
+ def_node_matcher :kernel_call?, '(send (const {nil? cbase} :Kernel) %1 ...)'
115
115
  def_node_search :custom_fail_methods,
116
116
  '{(def :fail ...) (defs _ :fail ...)}'
117
117
 
@@ -22,7 +22,7 @@ module RuboCop
22
22
 
23
23
  def_node_matcher :stderr_puts?, <<~PATTERN
24
24
  (send
25
- {(gvar #stderr_gvar?) (const nil? :STDERR)}
25
+ {(gvar #stderr_gvar?) (const {nil? cbase} :STDERR)}
26
26
  :puts $_
27
27
  ...)
28
28
  PATTERN
@@ -41,8 +41,8 @@ module RuboCop
41
41
  end
42
42
 
43
43
  def_node_matcher :struct_constructor?, <<~PATTERN
44
- {(send (const nil? :Struct) :new ...)
45
- (block (send (const nil? :Struct) :new ...) ...)}
44
+ {(send (const {nil? cbase} :Struct) :new ...)
45
+ (block (send (const {nil? cbase} :Struct) :new ...) ...)}
46
46
  PATTERN
47
47
 
48
48
  private
@@ -19,7 +19,7 @@ module RuboCop
19
19
  'instead of a block.'
20
20
  SUPER_TYPES = %i[super zsuper].freeze
21
21
 
22
- def_node_matcher :proc_node?, '(send (const nil? :Proc) :new)'
22
+ def_node_matcher :proc_node?, '(send (const {nil? cbase} :Proc) :new)'
23
23
  def_node_matcher :symbol_proc?, <<~PATTERN
24
24
  (block
25
25
  ${(send ...) (super ...) zsuper}
@@ -28,6 +28,8 @@ module RuboCop
28
28
  # attr_reader :baz
29
29
  # end
30
30
  class TrivialAccessors < Cop
31
+ include AllowedMethods
32
+
31
33
  MSG = 'Use `attr_%<kind>s` to define trivial %<kind>s methods.'
32
34
 
33
35
  def on_def(node)
@@ -95,9 +97,8 @@ module RuboCop
95
97
  cop_config['IgnoreClassMethods']
96
98
  end
97
99
 
98
- def allowed_methods
99
- allowed_methods = cop_config['AllowedMethods']
100
- Array(allowed_methods).map(&:to_sym) + [:initialize]
100
+ def allowed_method_names
101
+ allowed_methods.map(&:to_sym) + [:initialize]
101
102
  end
102
103
 
103
104
  def dsl_writer?(method_name)
@@ -106,7 +107,7 @@ module RuboCop
106
107
 
107
108
  def trivial_reader?(node)
108
109
  looks_like_trivial_reader?(node) &&
109
- !allowed_method?(node) && !allowed_reader?(node)
110
+ !allowed_method_name?(node) && !allowed_reader?(node)
110
111
  end
111
112
 
112
113
  def looks_like_trivial_reader?(node)
@@ -115,7 +116,7 @@ module RuboCop
115
116
 
116
117
  def trivial_writer?(node)
117
118
  looks_like_trivial_writer?(node) &&
118
- !allowed_method?(node) && !allowed_writer?(node.method_name)
119
+ !allowed_method_name?(node) && !allowed_writer?(node.method_name)
119
120
  end
120
121
 
121
122
  def_node_matcher :looks_like_trivial_writer?, <<~PATTERN
@@ -123,8 +124,8 @@ module RuboCop
123
124
  (defs _ _ (args (arg ...)) (ivasgn _ (lvar _)))}
124
125
  PATTERN
125
126
 
126
- def allowed_method?(node)
127
- allowed_methods.include?(node.method_name) ||
127
+ def allowed_method_name?(node)
128
+ allowed_method_names.include?(node.method_name) ||
128
129
  exact_name_match? && !names_match?(node)
129
130
  end
130
131
 
@@ -108,8 +108,8 @@ module RuboCop
108
108
  # implement `#size`, but not `#empty`. We ignore those to
109
109
  # reduce false positives.
110
110
  def_node_matcher :non_polymorphic_collection?, <<~PATTERN
111
- {(send (send (send (const nil? :File) :stat _) ...) ...)
112
- (send (send (send (const nil? {:Tempfile :StringIO}) {:new :open} ...) ...) ...)}
111
+ {(send (send (send (const {nil? cbase} :File) :stat _) ...) ...)
112
+ (send (send (send (const {nil? cbase} {:Tempfile :StringIO}) {:new :open} ...) ...) ...)}
113
113
  PATTERN
114
114
  end
115
115
  end
@@ -10,23 +10,16 @@ module RuboCop
10
10
  # first the ones needed for autocorrection (if any), then the rest
11
11
  # (unless autocorrections happened).
12
12
  class Team
13
- DEFAULT_OPTIONS = {
14
- auto_correct: false,
15
- debug: false
16
- }.freeze
17
-
18
- Investigation = Struct.new(:offenses, :errors)
19
-
20
13
  attr_reader :errors, :warnings, :updated_source_file, :cops
21
14
 
22
15
  alias updated_source_file? updated_source_file
23
16
 
24
- def initialize(cops, config = nil, options = nil)
17
+ def initialize(cops, config = nil, options = {})
25
18
  @cops = cops
26
19
  @config = config
27
- @options = options || DEFAULT_OPTIONS
28
- @errors = []
29
- @warnings = []
20
+ @options = options
21
+ reset
22
+ @ready = true
30
23
 
31
24
  validate_config
32
25
  end
@@ -40,15 +33,14 @@ module RuboCop
40
33
  end
41
34
 
42
35
  # @return [Team] with cops assembled from the given `cop_classes`
43
- def self.mobilize(cop_classes, config, options = nil)
44
- options ||= DEFAULT_OPTIONS
36
+ def self.mobilize(cop_classes, config, options = {})
45
37
  cops = mobilize_cops(cop_classes, config, options)
46
38
  new(cops, config, options)
47
39
  end
48
40
 
49
41
  # @return [Array<Cop::Cop>]
50
- def self.mobilize_cops(cop_classes, config, options = nil)
51
- options ||= DEFAULT_OPTIONS
42
+ def self.mobilize_cops(cop_classes, config, options = {})
43
+ cop_classes = Registry.new(cop_classes.to_a) unless cop_classes.is_a?(Registry)
52
44
  only = options.fetch(:only, [])
53
45
  safe = options.fetch(:safe, false)
54
46
  cop_classes.enabled(config, only, safe).map do |cop_class|
@@ -64,93 +56,102 @@ module RuboCop
64
56
  @options[:debug]
65
57
  end
66
58
 
59
+ # @deprecated. Use investigate
60
+ # @return Array<offenses>
67
61
  def inspect_file(processed_source)
68
- # If we got any syntax errors, return only the syntax offenses.
69
- unless processed_source.valid_syntax?
70
- return Lint::Syntax.offenses_from_processed_source(
71
- processed_source, @config, @options
72
- )
62
+ investigate(processed_source).offenses
63
+ end
64
+
65
+ # @return [Commissioner::InvestigationReport]
66
+ def investigate(processed_source)
67
+ be_ready
68
+
69
+ # The autocorrection process may have to be repeated multiple times
70
+ # until there are no corrections left to perform
71
+ # To speed things up, run auto-correcting cops by themselves, and only
72
+ # run the other cops when no corrections are left
73
+ on_duty = roundup_relevant_cops(processed_source.file_path)
74
+
75
+ autocorrect_cops, other_cops = on_duty.partition(&:autocorrect?)
76
+
77
+ report = investigate_partial(autocorrect_cops, processed_source)
78
+
79
+ unless autocorrect(processed_source, report)
80
+ # If we corrected some errors, another round of inspection will be
81
+ # done, and any other offenses will be caught then, so only need
82
+ # to check other_cops if no correction was done
83
+ report = report.merge(investigate_partial(other_cops, processed_source))
73
84
  end
74
85
 
75
- offenses(processed_source)
86
+ process_errors(processed_source.path, report.errors)
87
+
88
+ report
89
+ ensure
90
+ @ready = false
76
91
  end
77
92
 
93
+ # @deprecated
78
94
  def forces
79
- @forces ||= forces_for(cops)
95
+ @forces ||= self.class.forces_for(cops)
80
96
  end
81
97
 
82
- def forces_for(cops)
83
- Force.all.each_with_object([]) do |force_class, forces|
84
- joining_cops = cops.select { |cop| cop.join_force?(force_class) }
85
- next if joining_cops.empty?
98
+ # @return [Array<Force>] needed for the given cops
99
+ def self.forces_for(cops)
100
+ needed = Hash.new { |h, k| h[k] = [] }
101
+ cops.each do |cop|
102
+ Array(cop.class.joining_forces).each { |force| needed[force] << cop }
103
+ end
86
104
 
87
- forces << force_class.new(joining_cops)
105
+ needed.map do |force_class, joining_cops|
106
+ force_class.new(joining_cops)
88
107
  end
89
108
  end
90
109
 
91
- def autocorrect(buffer, cops)
110
+ def external_dependency_checksum
111
+ keys = cops.map(&:external_dependency_checksum).compact
112
+ Digest::SHA1.hexdigest(keys.join)
113
+ end
114
+
115
+ private
116
+
117
+ def autocorrect(processed_source, report)
92
118
  @updated_source_file = false
93
119
  return unless autocorrect?
94
120
 
95
- new_source = autocorrect_all_cops(buffer, cops)
121
+ new_source = autocorrect_report(report)
96
122
 
97
- return if new_source == buffer.source
123
+ return unless new_source
98
124
 
99
125
  if @options[:stdin]
100
126
  # holds source read in from stdin, when --stdin option is used
101
127
  @options[:stdin] = new_source
102
128
  else
103
- filename = buffer.name
129
+ filename = processed_source.buffer.name
104
130
  File.open(filename, 'w') { |f| f.write(new_source) }
105
131
  end
106
132
  @updated_source_file = true
107
- rescue RuboCop::ErrorWithAnalyzedFileLocation => e
108
- process_errors(buffer.name, [e])
109
- raise e.cause
110
- end
111
-
112
- def external_dependency_checksum
113
- keys = cops.map(&:external_dependency_checksum).compact
114
- Digest::SHA1.hexdigest(keys.join)
115
133
  end
116
134
 
117
- private
118
-
119
- def offenses(processed_source) # rubocop:disable Metrics/AbcSize
120
- # The autocorrection process may have to be repeated multiple times
121
- # until there are no corrections left to perform
122
- # To speed things up, run auto-correcting cops by themselves, and only
123
- # run the other cops when no corrections are left
124
- on_duty = roundup_relevant_cops(processed_source.file_path)
125
-
126
- autocorrect_cops, other_cops = on_duty.partition(&:autocorrect?)
127
-
128
- autocorrect = investigate(autocorrect_cops, processed_source)
129
-
130
- if autocorrect(processed_source.buffer, autocorrect_cops)
131
- # We corrected some errors. Another round of inspection will be
132
- # done, and any other offenses will be caught then, so we don't
133
- # need to continue.
134
- return autocorrect.offenses
135
- end
136
-
137
- other = investigate(other_cops, processed_source)
135
+ def be_ready
136
+ return if @ready
138
137
 
139
- errors = [*autocorrect.errors, *other.errors]
140
- process_errors(processed_source.path, errors)
141
-
142
- autocorrect.offenses.concat(other.offenses)
138
+ reset
139
+ @cops.map!(&:ready)
140
+ @ready = true
143
141
  end
144
142
 
145
- def investigate(cops, processed_source)
146
- return Investigation.new([], {}) if cops.empty?
147
-
148
- commissioner = Commissioner.new(cops, forces_for(cops), @options)
149
- offenses = commissioner.investigate(processed_source)
143
+ def reset
144
+ @errors = []
145
+ @warnings = []
146
+ end
150
147
 
151
- Investigation.new(offenses, commissioner.errors)
148
+ # @return [Commissioner::InvestigationReport]
149
+ def investigate_partial(cops, processed_source)
150
+ commissioner = Commissioner.new(cops, self.class.forces_for(cops), @options)
151
+ commissioner.investigate(processed_source)
152
152
  end
153
153
 
154
+ # @return [Array<cop>]
154
155
  def roundup_relevant_cops(filename)
155
156
  cops.reject do |cop|
156
157
  cop.excluded_file?(filename) ||
@@ -171,30 +172,45 @@ module RuboCop
171
172
  cop.class.support_target_rails_version?(cop.target_rails_version)
172
173
  end
173
174
 
174
- def autocorrect_all_cops(buffer, cops)
175
- corrector = Corrector.new(buffer)
175
+ def autocorrect_report(report)
176
+ corrector = collate_corrections(report)
176
177
 
177
- collate_corrections(corrector, cops)
178
+ corrector.rewrite unless corrector.empty?
179
+ end
178
180
 
179
- if !corrector.corrections.empty?
180
- corrector.rewrite
181
- else
182
- buffer.source
181
+ def collate_corrections(report)
182
+ corrector = Corrector.new(report.processed_source)
183
+
184
+ each_corrector(report) do |to_merge|
185
+ suppress_clobbering do
186
+ corrector.merge!(to_merge)
187
+ end
183
188
  end
189
+
190
+ corrector
184
191
  end
185
192
 
186
- def collate_corrections(corrector, cops)
193
+ def each_corrector(report)
187
194
  skips = Set.new
195
+ report.cop_reports.each do |cop_report|
196
+ cop = cop_report.cop
197
+ corrector = cop_report.corrector
188
198
 
189
- cops.each do |cop|
190
- next if cop.corrections.empty?
199
+ next if corrector.nil? || corrector.empty?
191
200
  next if skips.include?(cop.class)
192
201
 
193
- corrector.corrections.concat(cop.corrections)
202
+ yield corrector
203
+
194
204
  skips.merge(cop.class.autocorrect_incompatible_with)
195
205
  end
196
206
  end
197
207
 
208
+ def suppress_clobbering
209
+ yield
210
+ rescue ::Parser::ClobberingError
211
+ # ignore Clobbering errors
212
+ end
213
+
198
214
  def validate_config
199
215
  cops.each do |cop|
200
216
  cop.validate_config if cop.respond_to?(:validate_config)
@@ -41,8 +41,7 @@ module RuboCop
41
41
  #
42
42
  # @see https://ruby-doc.org/core-2.6.3/Kernel.html#method-i-format
43
43
  class FormatSequence
44
- attr_reader :begin_pos, :end_pos
45
- attr_reader :flags, :width, :precision, :name, :type
44
+ attr_reader :begin_pos, :end_pos, :flags, :width, :precision, :name, :type
46
45
 
47
46
  def initialize(match)
48
47
  @source = match[0]
@@ -115,7 +115,7 @@ module RuboCop
115
115
  output_buffer.puts "# Offense count: #{offense_count}" if @show_offense_counts
116
116
 
117
117
  cop_class = Cop::Cop.registry.find_by_cop_name(cop_name)
118
- output_buffer.puts '# Cop supports --auto-correct.' if cop_class&.new&.support_autocorrect?
118
+ output_buffer.puts '# Cop supports --auto-correct.' if cop_class&.support_autocorrect?
119
119
 
120
120
  default_cfg = default_config(cop_name)
121
121
  return unless default_cfg
@@ -22,9 +22,7 @@ module RuboCop
22
22
  names.delete(target_name)
23
23
 
24
24
  spell_checker = DidYouMean::SpellChecker.new(dictionary: names)
25
- similar_names = spell_checker.correct(target_name)
26
-
27
- similar_names
25
+ spell_checker.correct(target_name)
28
26
  end
29
27
  end
30
28
  end
@@ -163,7 +163,7 @@ module RuboCop
163
163
  end
164
164
  end
165
165
 
166
- # rubocop:disable Metrics/MethodLength
166
+ # rubocop:disable Metrics/MethodLength, Metrics/AbcSize
167
167
  def add_boolean_flags(opts)
168
168
  option(opts, '-F', '--fail-fast')
169
169
  option(opts, '-C', '--cache FLAG')
@@ -171,7 +171,16 @@ module RuboCop
171
171
  option(opts, '-D', '--[no-]display-cop-names')
172
172
  option(opts, '-E', '--extra-details')
173
173
  option(opts, '-S', '--display-style-guide')
174
- option(opts, '-a', '--auto-correct')
174
+ option(opts, '-a', '--auto-correct') do
175
+ @options[:safe_auto_correct] = true
176
+ end
177
+ option(opts, '--safe-auto-correct') do
178
+ warn '--safe-auto-correct is deprecated; use --auto-correct'
179
+ @options[:safe_auto_correct] = @options[:auto_correct] = true
180
+ end
181
+ option(opts, '-A', '--auto-correct-all') do
182
+ @options[:auto_correct] = true
183
+ end
175
184
  option(opts, '--disable-pending-cops')
176
185
  option(opts, '--enable-pending-cops')
177
186
  option(opts, '--ignore-disable-comments')
@@ -184,7 +193,7 @@ module RuboCop
184
193
  option(opts, '-V', '--verbose-version')
185
194
  option(opts, '-P', '--parallel')
186
195
  end
187
- # rubocop:enable Metrics/MethodLength
196
+ # rubocop:enable Metrics/MethodLength, Metrics/AbcSize
188
197
 
189
198
  def add_aliases(opts)
190
199
  option(opts, '-l', '--lint') do
@@ -196,9 +205,6 @@ module RuboCop
196
205
  @options[:only] << 'Layout'
197
206
  @options[:auto_correct] = true
198
207
  end
199
- option(opts, '--safe-auto-correct') do
200
- @options[:auto_correct] = true
201
- end
202
208
  end
203
209
 
204
210
  def add_list_options(opts)
@@ -465,8 +471,9 @@ module RuboCop
465
471
  lint: 'Run only lint cops.',
466
472
  safe: 'Run only safe cops.',
467
473
  list_target_files: 'List all files RuboCop will inspect.',
468
- auto_correct: 'Auto-correct offenses.',
469
- safe_auto_correct: 'Run auto-correct only when it\'s safe.',
474
+ auto_correct: 'Auto-correct offenses (only when it\'s safe).',
475
+ safe_auto_correct: '(same, deprecated)',
476
+ auto_correct_all: 'Auto-correct offenses (safe and unsafe)',
470
477
  fix_layout: 'Run only layout cops, with auto-correct on.',
471
478
  color: 'Force color output on or off.',
472
479
  version: 'Display version.',