rubocop 1.6.1 → 1.7.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.
- checksums.yaml +4 -4
- data/README.md +1 -1
- data/config/default.yml +48 -6
- data/lib/rubocop.rb +4 -0
- data/lib/rubocop/config.rb +8 -5
- data/lib/rubocop/config_loader.rb +10 -6
- data/lib/rubocop/config_loader_resolver.rb +21 -4
- data/lib/rubocop/config_obsoletion.rb +5 -3
- data/lib/rubocop/cop/gemspec/required_ruby_version.rb +3 -2
- data/lib/rubocop/cop/internal_affairs.rb +1 -0
- data/lib/rubocop/cop/internal_affairs/style_detected_api_use.rb +145 -0
- data/lib/rubocop/cop/layout/empty_line_between_defs.rb +19 -3
- data/lib/rubocop/cop/layout/heredoc_argument_closing_parenthesis.rb +14 -0
- data/lib/rubocop/cop/layout/rescue_ensure_alignment.rb +3 -10
- data/lib/rubocop/cop/layout/space_around_equals_in_parameter_default.rb +1 -0
- data/lib/rubocop/cop/layout/space_before_block_braces.rb +2 -0
- data/lib/rubocop/cop/layout/space_before_brackets.rb +64 -0
- data/lib/rubocop/cop/layout/space_inside_block_braces.rb +13 -10
- data/lib/rubocop/cop/layout/space_inside_hash_literal_braces.rb +2 -2
- data/lib/rubocop/cop/lint/ambiguous_assignment.rb +59 -0
- data/lib/rubocop/cop/lint/binary_operator_with_identical_operands.rb +7 -2
- data/lib/rubocop/cop/lint/duplicate_branch.rb +64 -2
- data/lib/rubocop/cop/lint/redundant_splat_expansion.rb +50 -17
- data/lib/rubocop/cop/lint/shadowed_exception.rb +1 -11
- data/lib/rubocop/cop/lint/unreachable_loop.rb +17 -0
- data/lib/rubocop/cop/metrics/utils/code_length_calculator.rb +1 -1
- data/lib/rubocop/cop/naming/memoized_instance_variable_name.rb +59 -5
- data/lib/rubocop/cop/registry.rb +10 -0
- data/lib/rubocop/cop/style/access_modifier_declarations.rb +3 -1
- data/lib/rubocop/cop/style/collection_methods.rb +14 -1
- data/lib/rubocop/cop/style/commented_keyword.rb +22 -5
- data/lib/rubocop/cop/style/for.rb +2 -0
- data/lib/rubocop/cop/style/hash_except.rb +95 -0
- data/lib/rubocop/cop/style/keyword_parameters_order.rb +12 -2
- data/lib/rubocop/cop/style/lambda_call.rb +2 -1
- data/lib/rubocop/cop/style/method_call_with_args_parentheses.rb +3 -0
- data/lib/rubocop/cop/style/method_call_with_args_parentheses/omit_parentheses.rb +16 -6
- data/lib/rubocop/cop/style/method_def_parentheses.rb +7 -0
- data/lib/rubocop/cop/style/multiline_method_signature.rb +26 -1
- data/lib/rubocop/cop/style/multiline_when_then.rb +3 -1
- data/lib/rubocop/cop/style/mutable_constant.rb +13 -3
- data/lib/rubocop/cop/style/raise_args.rb +2 -0
- data/lib/rubocop/cop/style/redundant_argument.rb +7 -1
- data/lib/rubocop/cop/style/redundant_freeze.rb +8 -4
- data/lib/rubocop/cop/style/single_line_methods.rb +4 -0
- data/lib/rubocop/cop/style/symbol_proc.rb +5 -4
- data/lib/rubocop/cop/util.rb +3 -1
- data/lib/rubocop/options.rb +9 -9
- data/lib/rubocop/rspec/cop_helper.rb +0 -4
- data/lib/rubocop/rspec/expect_offense.rb +34 -22
- data/lib/rubocop/runner.rb +16 -1
- data/lib/rubocop/target_finder.rb +4 -2
- data/lib/rubocop/util.rb +16 -0
- data/lib/rubocop/version.rb +8 -2
- metadata +8 -3
@@ -40,6 +40,9 @@ module RuboCop
|
|
40
40
|
# to `true` allows the presence of parentheses in such a method call
|
41
41
|
# even with arguments.
|
42
42
|
#
|
43
|
+
# NOTE: Parens are required around a method with arguments when inside an
|
44
|
+
# endless method definition (>= Ruby 3.0).
|
45
|
+
#
|
43
46
|
# @example EnforcedStyle: require_parentheses (default)
|
44
47
|
#
|
45
48
|
# # bad
|
@@ -14,25 +14,35 @@ module RuboCop
|
|
14
14
|
|
15
15
|
def omit_parentheses(node)
|
16
16
|
return unless node.parenthesized?
|
17
|
+
return if inside_endless_method_def?(node)
|
17
18
|
return if node.implicit_call?
|
18
19
|
return if super_call_without_arguments?(node)
|
19
20
|
return if allowed_camel_case_method_call?(node)
|
20
21
|
return if legitimate_call_with_parentheses?(node)
|
21
22
|
|
22
23
|
add_offense(offense_range(node), message: OMIT_MSG) do |corrector|
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
24
|
+
auto_correct(corrector, node)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
def auto_correct(corrector, node)
|
29
|
+
if parentheses_at_the_end_of_multiline_call?(node)
|
30
|
+
corrector.replace(args_begin(node), ' \\')
|
31
|
+
else
|
32
|
+
corrector.replace(args_begin(node), ' ')
|
29
33
|
end
|
34
|
+
corrector.remove(node.loc.end)
|
30
35
|
end
|
31
36
|
|
32
37
|
def offense_range(node)
|
33
38
|
node.loc.begin.join(node.loc.end)
|
34
39
|
end
|
35
40
|
|
41
|
+
def inside_endless_method_def?(node)
|
42
|
+
# parens are required around arguments inside an endless method
|
43
|
+
node.each_ancestor(:def).any?(&:endless?) && node.arguments.any?
|
44
|
+
end
|
45
|
+
|
36
46
|
def super_call_without_arguments?(node)
|
37
47
|
node.super_type? && node.arguments.none?
|
38
48
|
end
|
@@ -6,6 +6,9 @@ module RuboCop
|
|
6
6
|
# This cop checks for parentheses around the arguments in method
|
7
7
|
# definitions. Both instance and class/singleton methods are checked.
|
8
8
|
#
|
9
|
+
# This cop does not consider endless methods, since parentheses are
|
10
|
+
# always required for them.
|
11
|
+
#
|
9
12
|
# @example EnforcedStyle: require_parentheses (default)
|
10
13
|
# # The `require_parentheses` style requires method definitions
|
11
14
|
# # to always use parentheses
|
@@ -94,6 +97,8 @@ module RuboCop
|
|
94
97
|
'parameters.'
|
95
98
|
|
96
99
|
def on_def(node)
|
100
|
+
return if node.endless?
|
101
|
+
|
97
102
|
args = node.arguments
|
98
103
|
|
99
104
|
if require_parentheses?(args)
|
@@ -142,6 +147,7 @@ module RuboCop
|
|
142
147
|
|
143
148
|
add_offense(location, message: MSG_MISSING) do |corrector|
|
144
149
|
correct_definition(node, corrector)
|
150
|
+
unexpected_style_detected 'require_no_parentheses'
|
145
151
|
end
|
146
152
|
end
|
147
153
|
|
@@ -149,6 +155,7 @@ module RuboCop
|
|
149
155
|
add_offense(args, message: MSG_PRESENT) do |corrector|
|
150
156
|
# offense is registered on args node when parentheses are unwanted
|
151
157
|
correct_arguments(args, corrector)
|
158
|
+
unexpected_style_detected 'require_parentheses'
|
152
159
|
end
|
153
160
|
end
|
154
161
|
end
|
@@ -19,6 +19,9 @@ module RuboCop
|
|
19
19
|
# end
|
20
20
|
#
|
21
21
|
class MultilineMethodSignature < Base
|
22
|
+
include RangeHelp
|
23
|
+
extend AutoCorrector
|
24
|
+
|
22
25
|
MSG = 'Avoid multi-line method signatures.'
|
23
26
|
|
24
27
|
def on_def(node)
|
@@ -26,12 +29,34 @@ module RuboCop
|
|
26
29
|
return if opening_line(node) == closing_line(node)
|
27
30
|
return if correction_exceeds_max_line_length?(node)
|
28
31
|
|
29
|
-
add_offense(node)
|
32
|
+
add_offense(node) do |corrector|
|
33
|
+
autocorrect(corrector, node)
|
34
|
+
end
|
30
35
|
end
|
31
36
|
alias on_defs on_def
|
32
37
|
|
33
38
|
private
|
34
39
|
|
40
|
+
def autocorrect(corrector, node)
|
41
|
+
arguments = node.arguments
|
42
|
+
joined_arguments = arguments.map(&:source).join(', ')
|
43
|
+
last_line_source_of_arguments = processed_source[arguments.last_line - 1].strip
|
44
|
+
|
45
|
+
if last_line_source_of_arguments.start_with?(')')
|
46
|
+
joined_arguments = "#{joined_arguments}#{last_line_source_of_arguments}"
|
47
|
+
|
48
|
+
corrector.remove(range_by_whole_lines(arguments.loc.end, include_final_newline: true))
|
49
|
+
end
|
50
|
+
|
51
|
+
corrector.replace(arguments_range(node), joined_arguments)
|
52
|
+
end
|
53
|
+
|
54
|
+
def arguments_range(node)
|
55
|
+
range_between(
|
56
|
+
node.first_argument.source_range.begin_pos, node.last_argument.source_range.end_pos
|
57
|
+
)
|
58
|
+
end
|
59
|
+
|
35
60
|
def opening_line(node)
|
36
61
|
node.first_line
|
37
62
|
end
|
@@ -58,7 +58,9 @@ module RuboCop
|
|
58
58
|
private
|
59
59
|
|
60
60
|
def require_then?(when_node)
|
61
|
-
|
61
|
+
unless when_node.conditions.first.first_line == when_node.conditions.last.last_line
|
62
|
+
return true
|
63
|
+
end
|
62
64
|
return false unless when_node.body
|
63
65
|
|
64
66
|
when_node.loc.line == when_node.body.loc.line
|
@@ -14,6 +14,8 @@ module RuboCop
|
|
14
14
|
# positives. Luckily, there is no harm in freezing an already
|
15
15
|
# frozen object.
|
16
16
|
#
|
17
|
+
# NOTE: Regexp and Range literals are frozen objects since Ruby 3.0.
|
18
|
+
#
|
17
19
|
# @example EnforcedStyle: literals (default)
|
18
20
|
# # bad
|
19
21
|
# CONST = [1, 2, 3]
|
@@ -94,7 +96,8 @@ module RuboCop
|
|
94
96
|
range_enclosed_in_parentheses = range_enclosed_in_parentheses?(value)
|
95
97
|
|
96
98
|
return unless mutable_literal?(value) ||
|
97
|
-
range_enclosed_in_parentheses
|
99
|
+
target_ruby_version <= 2.7 && range_enclosed_in_parentheses
|
100
|
+
|
98
101
|
return if FROZEN_STRING_LITERAL_TYPES.include?(value.type) &&
|
99
102
|
frozen_string_literals_enabled?
|
100
103
|
|
@@ -119,11 +122,14 @@ module RuboCop
|
|
119
122
|
end
|
120
123
|
|
121
124
|
def mutable_literal?(value)
|
122
|
-
value
|
125
|
+
return false if value.nil?
|
126
|
+
return false if frozen_regexp_or_range_literals?(value)
|
127
|
+
|
128
|
+
value.mutable_literal?
|
123
129
|
end
|
124
130
|
|
125
131
|
def immutable_literal?(node)
|
126
|
-
node.nil? || node.immutable_literal?
|
132
|
+
node.nil? || frozen_regexp_or_range_literals?(node) || node.immutable_literal?
|
127
133
|
end
|
128
134
|
|
129
135
|
def frozen_string_literal?(node)
|
@@ -131,6 +137,10 @@ module RuboCop
|
|
131
137
|
frozen_string_literals_enabled?
|
132
138
|
end
|
133
139
|
|
140
|
+
def frozen_regexp_or_range_literals?(node)
|
141
|
+
target_ruby_version >= 3.0 && (node.regexp_type? || node.range_type?)
|
142
|
+
end
|
143
|
+
|
134
144
|
def requires_parentheses?(node)
|
135
145
|
node.range_type? ||
|
136
146
|
(node.send_type? && node.loc.dot.nil?)
|
@@ -95,6 +95,7 @@ module RuboCop
|
|
95
95
|
replacement = correction_exploded_to_compact(node)
|
96
96
|
|
97
97
|
corrector.replace(node, replacement)
|
98
|
+
opposite_style_detected
|
98
99
|
end
|
99
100
|
else
|
100
101
|
correct_style_detected
|
@@ -115,6 +116,7 @@ module RuboCop
|
|
115
116
|
replacement = correction_compact_to_exploded(node)
|
116
117
|
|
117
118
|
corrector.replace(node, replacement)
|
119
|
+
opposite_style_detected
|
118
120
|
end
|
119
121
|
end
|
120
122
|
|
@@ -12,7 +12,7 @@ module RuboCop
|
|
12
12
|
# 1. This cop matches for method names only and hence cannot tell apart
|
13
13
|
# methods with same name in different classes.
|
14
14
|
# 2. This cop is limited to methods with single parameter.
|
15
|
-
# 3. This cop is unsafe if certain special global variables (e.g.
|
15
|
+
# 3. This cop is unsafe if certain special global variables (e.g. `$;`, `$/`) are set.
|
16
16
|
# That depends on the nature of the target methods, of course.
|
17
17
|
#
|
18
18
|
# Method names and their redundant arguments can be configured like this:
|
@@ -20,6 +20,8 @@ module RuboCop
|
|
20
20
|
# Methods:
|
21
21
|
# join: ''
|
22
22
|
# split: ' '
|
23
|
+
# chomp: "\n"
|
24
|
+
# chomp!: "\n"
|
23
25
|
# foo: 2
|
24
26
|
#
|
25
27
|
# @example
|
@@ -28,6 +30,8 @@ module RuboCop
|
|
28
30
|
# [1, 2, 3].join("")
|
29
31
|
# string.split(" ")
|
30
32
|
# "first\nsecond".split(" ")
|
33
|
+
# string.chomp("\n")
|
34
|
+
# string.chomp!("\n")
|
31
35
|
# A.foo(2)
|
32
36
|
#
|
33
37
|
# # good
|
@@ -35,6 +39,8 @@ module RuboCop
|
|
35
39
|
# [1, 2, 3].join
|
36
40
|
# string.split
|
37
41
|
# "first second".split
|
42
|
+
# string.chomp
|
43
|
+
# string.chomp!
|
38
44
|
# A.foo
|
39
45
|
class RedundantArgument < Base
|
40
46
|
include RangeHelp
|
@@ -3,7 +3,9 @@
|
|
3
3
|
module RuboCop
|
4
4
|
module Cop
|
5
5
|
module Style
|
6
|
-
# This cop check for uses of Object#freeze on immutable objects.
|
6
|
+
# This cop check for uses of `Object#freeze` on immutable objects.
|
7
|
+
#
|
8
|
+
# NOTE: Regexp and Range literals are frozen objects since Ruby 3.0.
|
7
9
|
#
|
8
10
|
# @example
|
9
11
|
# # bad
|
@@ -37,8 +39,10 @@ module RuboCop
|
|
37
39
|
|
38
40
|
return true if node.immutable_literal?
|
39
41
|
|
40
|
-
FROZEN_STRING_LITERAL_TYPES.include?(node.type) &&
|
41
|
-
|
42
|
+
return true if FROZEN_STRING_LITERAL_TYPES.include?(node.type) &&
|
43
|
+
frozen_string_literals_enabled?
|
44
|
+
|
45
|
+
target_ruby_version >= 3.0 && (node.regexp_type? || node.range_type?)
|
42
46
|
end
|
43
47
|
|
44
48
|
def strip_parenthesis(node)
|
@@ -52,7 +56,7 @@ module RuboCop
|
|
52
56
|
def_node_matcher :operation_produces_immutable_object?, <<~PATTERN
|
53
57
|
{
|
54
58
|
(begin (send {float int} {:+ :- :* :** :/ :% :<<} _))
|
55
|
-
(begin (send !(str _) {:+ :- :* :** :/ :%} {float int}))
|
59
|
+
(begin (send !{(str _) array} {:+ :- :* :** :/ :%} {float int}))
|
56
60
|
(begin (send _ {:== :=== :!= :<= :>= :< :>} _))
|
57
61
|
(send (const {nil? cbase} :ENV) :[] _)
|
58
62
|
(send _ {:count :length :size} ...)
|
@@ -6,6 +6,8 @@ module RuboCop
|
|
6
6
|
# This cop checks for single-line method definitions that contain a body.
|
7
7
|
# It will accept single-line methods with no body.
|
8
8
|
#
|
9
|
+
# Endless methods added in Ruby 3.0 are also accepted by this cop.
|
10
|
+
#
|
9
11
|
# @example
|
10
12
|
# # bad
|
11
13
|
# def some_method; body end
|
@@ -15,6 +17,7 @@ module RuboCop
|
|
15
17
|
# # good
|
16
18
|
# def self.resource_class=(klass); end
|
17
19
|
# def @table.columns; end
|
20
|
+
# def some_method() = body
|
18
21
|
#
|
19
22
|
# @example AllowIfMethodIsEmpty: true (default)
|
20
23
|
# # good
|
@@ -32,6 +35,7 @@ module RuboCop
|
|
32
35
|
|
33
36
|
def on_def(node)
|
34
37
|
return unless node.single_line?
|
38
|
+
return if node.endless?
|
35
39
|
return if allow_empty? && !node.body
|
36
40
|
|
37
41
|
add_offense(node) do |corrector|
|
@@ -22,11 +22,12 @@ module RuboCop
|
|
22
22
|
SUPER_TYPES = %i[super zsuper].freeze
|
23
23
|
|
24
24
|
def_node_matcher :proc_node?, '(send (const {nil? cbase} :Proc) :new)'
|
25
|
+
def_node_matcher :symbol_proc_receiver?, '{(send ...) (super ...) zsuper}'
|
25
26
|
def_node_matcher :symbol_proc?, <<~PATTERN
|
26
|
-
|
27
|
-
$
|
28
|
-
$
|
29
|
-
|
27
|
+
{
|
28
|
+
(block $#symbol_proc_receiver? $(args (arg _var)) (send (lvar _var) $_))
|
29
|
+
(numblock $#symbol_proc_receiver? $1 (send (lvar :_1) $_))
|
30
|
+
}
|
30
31
|
PATTERN
|
31
32
|
|
32
33
|
def self.autocorrect_incompatible_with
|
data/lib/rubocop/cop/util.rb
CHANGED
@@ -33,7 +33,9 @@ module RuboCop
|
|
33
33
|
end
|
34
34
|
|
35
35
|
def add_parentheses(node, corrector)
|
36
|
-
if node.arguments
|
36
|
+
if !node.respond_to?(:arguments)
|
37
|
+
corrector.wrap(node, '(', ')')
|
38
|
+
elsif node.arguments.empty?
|
37
39
|
corrector.insert_after(node, '()')
|
38
40
|
else
|
39
41
|
corrector.replace(args_begin(node), '(')
|
data/lib/rubocop/options.rb
CHANGED
@@ -66,7 +66,7 @@ module RuboCop
|
|
66
66
|
add_configuration_options(opts)
|
67
67
|
add_formatting_options(opts)
|
68
68
|
|
69
|
-
option(opts, '-r', '--require FILE') { |f|
|
69
|
+
option(opts, '-r', '--require FILE') { |f| require_feature(f) }
|
70
70
|
|
71
71
|
add_severity_option(opts)
|
72
72
|
add_flags_with_optional_args(opts)
|
@@ -92,14 +92,7 @@ module RuboCop
|
|
92
92
|
raise OptionArgumentError, message
|
93
93
|
end
|
94
94
|
|
95
|
-
@options[:"#{option}"] =
|
96
|
-
if list.empty?
|
97
|
-
['']
|
98
|
-
else
|
99
|
-
list.split(',').map do |c|
|
100
|
-
Cop::Registry.qualified_cop_name(c, "--#{option} option")
|
101
|
-
end
|
102
|
-
end
|
95
|
+
@options[:"#{option}"] = list.empty? ? [''] : list.split(',')
|
103
96
|
end
|
104
97
|
end
|
105
98
|
|
@@ -239,6 +232,13 @@ module RuboCop
|
|
239
232
|
long_opt[2..-1].sub('[no-]', '').sub(/ .*/, '')
|
240
233
|
.tr('-', '_').gsub(/[\[\]]/, '').to_sym
|
241
234
|
end
|
235
|
+
|
236
|
+
def require_feature(file)
|
237
|
+
# If any features were added on the CLI from `--require`,
|
238
|
+
# add them to the config.
|
239
|
+
ConfigLoader.add_loaded_features(file)
|
240
|
+
require file
|
241
|
+
end
|
242
242
|
end
|
243
243
|
|
244
244
|
# Validates option arguments and the options' compatibility with each other.
|
@@ -9,10 +9,6 @@ module CopHelper
|
|
9
9
|
let(:ruby_version) { 2.4 }
|
10
10
|
let(:rails_version) { false }
|
11
11
|
|
12
|
-
def inspect_source_file(source)
|
13
|
-
Tempfile.open('tmp') { |f| inspect_source(source, f) }
|
14
|
-
end
|
15
|
-
|
16
12
|
def inspect_source(source, file = nil)
|
17
13
|
RuboCop::Formatter::DisabledConfigFormatter.config_to_allow_offenses = {}
|
18
14
|
RuboCop::Formatter::DisabledConfigFormatter.detected_styles = {}
|
@@ -111,28 +111,9 @@ module RuboCop
|
|
111
111
|
source
|
112
112
|
end
|
113
113
|
|
114
|
-
# rubocop:disable Metrics/AbcSize, Metrics/MethodLength
|
115
114
|
def expect_offense(source, file = nil, severity: nil, **replacements)
|
116
|
-
|
117
|
-
|
118
|
-
.config_to_allow_offenses = {}
|
119
|
-
RuboCop::Formatter::DisabledConfigFormatter.detected_styles = {}
|
120
|
-
cop.instance_variable_get(:@options)[:auto_correct] = true
|
121
|
-
|
122
|
-
expected_annotations = AnnotatedSource.parse(source)
|
123
|
-
|
124
|
-
if expected_annotations.plain_source == source
|
125
|
-
raise 'Use `expect_no_offenses` to assert that no offenses are found'
|
126
|
-
end
|
127
|
-
|
128
|
-
@processed_source = parse_source(expected_annotations.plain_source,
|
129
|
-
file)
|
130
|
-
|
131
|
-
unless @processed_source.valid_syntax?
|
132
|
-
raise 'Error parsing example code: ' \
|
133
|
-
"#{@processed_source.diagnostics.map(&:render).join("\n")}"
|
134
|
-
end
|
135
|
-
|
115
|
+
expected_annotations = parse_annotations(source, **replacements)
|
116
|
+
@processed_source = parse_processed_source(expected_annotations.plain_source, file)
|
136
117
|
@offenses = _investigate(cop, @processed_source)
|
137
118
|
actual_annotations =
|
138
119
|
expected_annotations.with_offense_annotations(@offenses)
|
@@ -143,7 +124,14 @@ module RuboCop
|
|
143
124
|
@offenses
|
144
125
|
end
|
145
126
|
|
146
|
-
|
127
|
+
# rubocop:disable Metrics/AbcSize, Metrics/MethodLength
|
128
|
+
def expect_correction(correction, loop: true, source: nil)
|
129
|
+
if source
|
130
|
+
expected_annotations = parse_annotations(source, raise_error: false)
|
131
|
+
@processed_source = parse_processed_source(expected_annotations.plain_source)
|
132
|
+
_investigate(cop, @processed_source)
|
133
|
+
end
|
134
|
+
|
147
135
|
raise '`expect_correction` must follow `expect_offense`' unless @processed_source
|
148
136
|
|
149
137
|
iteration = 0
|
@@ -192,6 +180,30 @@ module RuboCop
|
|
192
180
|
expect(actual_annotations.to_s).to eq(source)
|
193
181
|
end
|
194
182
|
|
183
|
+
def parse_annotations(source, raise_error: true, **replacements)
|
184
|
+
set_formatter_options
|
185
|
+
|
186
|
+
source = format_offense(source, **replacements)
|
187
|
+
annotations = AnnotatedSource.parse(source)
|
188
|
+
return annotations unless raise_error && annotations.plain_source == source
|
189
|
+
|
190
|
+
raise 'Use `expect_no_offenses` to assert that no offenses are found'
|
191
|
+
end
|
192
|
+
|
193
|
+
def parse_processed_source(source, file = nil)
|
194
|
+
processed_source = parse_source(source, file)
|
195
|
+
return processed_source if processed_source.valid_syntax?
|
196
|
+
|
197
|
+
raise 'Error parsing example code: ' \
|
198
|
+
"#{processed_source.diagnostics.map(&:render).join("\n")}"
|
199
|
+
end
|
200
|
+
|
201
|
+
def set_formatter_options
|
202
|
+
RuboCop::Formatter::DisabledConfigFormatter.config_to_allow_offenses = {}
|
203
|
+
RuboCop::Formatter::DisabledConfigFormatter.detected_styles = {}
|
204
|
+
cop.instance_variable_get(:@options)[:auto_correct] = true
|
205
|
+
end
|
206
|
+
|
195
207
|
# Parsed representation of code annotated with the `^^^ Message` style
|
196
208
|
class AnnotatedSource
|
197
209
|
ANNOTATION_PATTERN = /\A\s*(\^+|\^{}) /.freeze
|