rubocop 0.86.0 → 0.87.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 (99) 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 +7 -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 +22 -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/empty_lines_around_attribute_accessor.rb +1 -8
  21. data/lib/rubocop/cop/layout/first_argument_indentation.rb +4 -0
  22. data/lib/rubocop/cop/layout/hash_alignment.rb +1 -2
  23. data/lib/rubocop/cop/layout/multiline_block_layout.rb +0 -1
  24. data/lib/rubocop/cop/layout/space_around_block_parameters.rb +19 -25
  25. data/lib/rubocop/cop/legacy/corrections_proxy.rb +49 -0
  26. data/lib/rubocop/cop/legacy/corrector.rb +29 -0
  27. data/lib/rubocop/cop/lint/interpolation_check.rb +13 -0
  28. data/lib/rubocop/cop/lint/nested_method_definition.rb +1 -1
  29. data/lib/rubocop/cop/lint/non_deterministic_require_order.rb +2 -2
  30. data/lib/rubocop/cop/lint/parentheses_as_grouped_expression.rb +8 -3
  31. data/lib/rubocop/cop/lint/rand_one.rb +1 -1
  32. data/lib/rubocop/cop/lint/redundant_cop_disable_directive.rb +27 -23
  33. data/lib/rubocop/cop/lint/redundant_splat_expansion.rb +2 -2
  34. data/lib/rubocop/cop/lint/safe_navigation_with_empty.rb +8 -0
  35. data/lib/rubocop/cop/lint/syntax.rb +11 -26
  36. data/lib/rubocop/cop/lint/unused_method_argument.rb +1 -1
  37. data/lib/rubocop/cop/lint/useless_access_modifier.rb +1 -1
  38. data/lib/rubocop/cop/metrics/block_length.rb +22 -0
  39. data/lib/rubocop/cop/metrics/class_length.rb +25 -2
  40. data/lib/rubocop/cop/metrics/method_length.rb +23 -0
  41. data/lib/rubocop/cop/metrics/module_length.rb +25 -2
  42. data/lib/rubocop/cop/metrics/utils/code_length_calculator.rb +129 -0
  43. data/lib/rubocop/cop/mixin/allowed_methods.rb +19 -0
  44. data/lib/rubocop/cop/mixin/auto_corrector.rb +12 -0
  45. data/lib/rubocop/cop/mixin/code_length.rb +4 -0
  46. data/lib/rubocop/cop/mixin/configurable_formatting.rb +1 -1
  47. data/lib/rubocop/cop/mixin/enforce_superclass.rb +3 -1
  48. data/lib/rubocop/cop/mixin/nil_methods.rb +3 -5
  49. data/lib/rubocop/cop/mixin/ordered_gem_node.rb +6 -1
  50. data/lib/rubocop/cop/mixin/surrounding_space.rb +7 -2
  51. data/lib/rubocop/cop/mixin/too_many_lines.rb +3 -13
  52. data/lib/rubocop/cop/mixin/uncommunicative_name.rb +4 -2
  53. data/lib/rubocop/cop/naming/ascii_identifiers.rb +27 -4
  54. data/lib/rubocop/cop/naming/binary_operator_parameter_name.rb +2 -2
  55. data/lib/rubocop/cop/naming/method_name.rb +1 -1
  56. data/lib/rubocop/cop/naming/method_parameter_name.rb +1 -1
  57. data/lib/rubocop/cop/naming/predicate_name.rb +3 -5
  58. data/lib/rubocop/cop/naming/variable_name.rb +1 -1
  59. data/lib/rubocop/cop/naming/variable_number.rb +1 -1
  60. data/lib/rubocop/cop/offense.rb +16 -2
  61. data/lib/rubocop/cop/style/accessor_grouping.rb +136 -0
  62. data/lib/rubocop/cop/style/bisected_attr_accessor.rb +121 -0
  63. data/lib/rubocop/cop/style/class_vars.rb +21 -0
  64. data/lib/rubocop/cop/style/date_time.rb +1 -1
  65. data/lib/rubocop/cop/style/dir.rb +2 -2
  66. data/lib/rubocop/cop/style/empty_literal.rb +5 -5
  67. data/lib/rubocop/cop/style/expand_path_arguments.rb +2 -2
  68. data/lib/rubocop/cop/style/if_unless_modifier_of_if_unless.rb +12 -0
  69. data/lib/rubocop/cop/style/multiline_block_chain.rb +10 -1
  70. data/lib/rubocop/cop/style/mutable_constant.rb +4 -4
  71. data/lib/rubocop/cop/style/nested_parenthesized_calls.rb +2 -5
  72. data/lib/rubocop/cop/style/proc.rb +1 -1
  73. data/lib/rubocop/cop/style/random_with_offset.rb +4 -10
  74. data/lib/rubocop/cop/style/redundant_assignment.rb +117 -0
  75. data/lib/rubocop/cop/style/redundant_exception.rb +14 -10
  76. data/lib/rubocop/cop/style/redundant_fetch_block.rb +26 -7
  77. data/lib/rubocop/cop/style/redundant_freeze.rb +1 -1
  78. data/lib/rubocop/cop/style/redundant_parentheses.rb +7 -1
  79. data/lib/rubocop/cop/style/redundant_regexp_character_class.rb +2 -1
  80. data/lib/rubocop/cop/style/rescue_standard_error.rb +1 -1
  81. data/lib/rubocop/cop/style/signal_exception.rb +1 -1
  82. data/lib/rubocop/cop/style/stderr_puts.rb +1 -1
  83. data/lib/rubocop/cop/style/struct_inheritance.rb +2 -2
  84. data/lib/rubocop/cop/style/symbol_proc.rb +1 -1
  85. data/lib/rubocop/cop/style/trivial_accessors.rb +8 -7
  86. data/lib/rubocop/cop/style/zero_length_predicate.rb +2 -2
  87. data/lib/rubocop/cop/team.rb +97 -81
  88. data/lib/rubocop/cop/utils/format_string.rb +1 -2
  89. data/lib/rubocop/name_similarity.rb +1 -3
  90. data/lib/rubocop/options.rb +15 -8
  91. data/lib/rubocop/rake_task.rb +6 -9
  92. data/lib/rubocop/rspec/cop_helper.rb +4 -4
  93. data/lib/rubocop/rspec/expect_offense.rb +10 -16
  94. data/lib/rubocop/rspec/shared_contexts.rb +7 -7
  95. data/lib/rubocop/runner.rb +31 -29
  96. data/lib/rubocop/target_ruby.rb +1 -1
  97. data/lib/rubocop/version.rb +1 -1
  98. metadata +15 -7
  99. data/lib/rubocop/cop/mixin/classish_length.rb +0 -37
@@ -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]
@@ -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-autocorrect') do
178
+ warn '--safe-autocorrect is deprecated; use --autocorrect'
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_autocorrect: '(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.',
@@ -8,14 +8,11 @@ module RuboCop
8
8
  #
9
9
  # require 'rubocop/rake_task'
10
10
  # RuboCop::RakeTask.new
11
- class RakeTask < Rake::TaskLib
12
- attr_accessor :name
13
- attr_accessor :verbose
14
- attr_accessor :fail_on_error
15
- attr_accessor :patterns
16
- attr_accessor :formatters
17
- attr_accessor :requires
18
- attr_accessor :options
11
+ #
12
+ # Use global Rake namespace here to avoid namespace issues with custom
13
+ # rubocop-rake tasks
14
+ class RakeTask < ::Rake::TaskLib
15
+ attr_accessor :name, :verbose, :fail_on_error, :patterns, :formatters, :requires, :options
19
16
 
20
17
  def initialize(name = :rubocop, *args, &task_block)
21
18
  setup_ivars(name)
@@ -69,7 +66,7 @@ module RuboCop
69
66
  task(:auto_correct, *args) do |_, task_args|
70
67
  RakeFileUtils.verbose(verbose) do
71
68
  yield(*[self, task_args].slice(0, task_block.arity)) if block_given?
72
- options = full_options.unshift('--auto-correct')
69
+ options = full_options.unshift('--auto-correct-all')
73
70
  options.delete('--parallel')
74
71
  run_cli(verbose, options)
75
72
  end
@@ -43,14 +43,14 @@ module CopHelper
43
43
  processed_source = parse_source(source, file)
44
44
  _investigate(cop, processed_source)
45
45
 
46
- corrector =
47
- RuboCop::Cop::Corrector.new(processed_source.buffer, cop.corrections)
48
- corrector.rewrite
46
+ @last_corrector.rewrite
49
47
  end
50
48
 
51
49
  def _investigate(cop, processed_source)
52
50
  team = RuboCop::Cop::Team.new([cop], nil, raise_error: true)
53
- team.inspect_file(processed_source)
51
+ report = team.investigate(processed_source)
52
+ @last_corrector = report.correctors.first || RuboCop::Cop::Corrector.new(processed_source)
53
+ report.offenses
54
54
  end
55
55
  end
56
56
 
@@ -100,7 +100,7 @@ module RuboCop
100
100
  end
101
101
 
102
102
  # rubocop:disable Metrics/AbcSize, Metrics/MethodLength
103
- def expect_offense(source, file = nil, **replacements)
103
+ def expect_offense(source, file = nil, severity: nil, **replacements)
104
104
  source = format_offense(source, **replacements)
105
105
  RuboCop::Formatter::DisabledConfigFormatter
106
106
  .config_to_allow_offenses = {}
@@ -118,11 +118,12 @@ module RuboCop
118
118
 
119
119
  raise 'Error parsing example code' unless @processed_source.valid_syntax?
120
120
 
121
- _investigate(cop, @processed_source)
121
+ offenses = _investigate(cop, @processed_source)
122
122
  actual_annotations =
123
- expected_annotations.with_offense_annotations(cop.offenses)
123
+ expected_annotations.with_offense_annotations(offenses)
124
124
 
125
125
  expect(actual_annotations.to_s).to eq(expected_annotations.to_s)
126
+ expect(offenses.map(&:severity).uniq).to eq([severity]) if severity
126
127
  end
127
128
 
128
129
  def expect_correction(correction, loop: true)
@@ -132,12 +133,10 @@ module RuboCop
132
133
  new_source = loop do
133
134
  iteration += 1
134
135
 
135
- corrector =
136
- RuboCop::Cop::Corrector.new(@processed_source.buffer, cop.corrections)
137
- corrected_source = corrector.rewrite
136
+ corrected_source = @last_corrector.rewrite
138
137
 
139
138
  break corrected_source unless loop
140
- break corrected_source if cop.corrections.empty?
139
+ break corrected_source if @last_corrector.empty?
141
140
  break corrected_source if corrected_source == @processed_source.buffer.source
142
141
 
143
142
  if iteration > RuboCop::Runner::MAX_ITERATIONS
@@ -145,9 +144,6 @@ module RuboCop
145
144
  end
146
145
 
147
146
  # Prepare for next loop
148
- cop.instance_variable_set(:@corrections, [])
149
- # Cache invalidation. This is bad!
150
- cop.instance_variable_set(:@token_table, nil)
151
147
  @processed_source = parse_source(corrected_source,
152
148
  @processed_source.path)
153
149
  _investigate(cop, @processed_source)
@@ -160,24 +156,22 @@ module RuboCop
160
156
  def expect_no_corrections
161
157
  raise '`expect_no_corrections` must follow `expect_offense`' unless @processed_source
162
158
 
163
- return if cop.corrections.empty?
159
+ return if @last_corrector.empty?
164
160
 
165
161
  # In order to print a nice diff, e.g. what source got corrected to,
166
162
  # we need to run the actual corrections
167
163
 
168
- corrector =
169
- RuboCop::Cop::Corrector.new(@processed_source.buffer, cop.corrections)
170
- new_source = corrector.rewrite
164
+ new_source = @last_corrector.rewrite
171
165
 
172
166
  expect(new_source).to eq(@processed_source.buffer.source)
173
167
  end
174
168
 
175
169
  def expect_no_offenses(source, file = nil)
176
- inspect_source(source, file)
170
+ offenses = inspect_source(source, file)
177
171
 
178
172
  expected_annotations = AnnotatedSource.parse(source)
179
173
  actual_annotations =
180
- expected_annotations.with_offense_annotations(cop.offenses)
174
+ expected_annotations.with_offense_annotations(offenses)
181
175
  expect(actual_annotations.to_s).to eq(source)
182
176
  end
183
177