rubocop-rspec 1.41.0 → 1.42.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +4 -0
- data/lib/rubocop/cop/rspec/align_left_let_brace.rb +11 -18
- data/lib/rubocop/cop/rspec/align_right_let_brace.rb +11 -18
- data/lib/rubocop/cop/rspec/be.rb +1 -1
- data/lib/rubocop/cop/rspec/be_eql.rb +5 -5
- data/lib/rubocop/cop/rspec/capybara/current_path_expectation.rb +18 -16
- data/lib/rubocop/cop/rspec/capybara/feature_methods.rb +8 -9
- data/lib/rubocop/cop/rspec/context_method.rb +5 -7
- data/lib/rubocop/cop/rspec/cop.rb +1 -1
- data/lib/rubocop/cop/rspec/described_class.rb +10 -7
- data/lib/rubocop/cop/rspec/dialect.rb +4 -11
- data/lib/rubocop/cop/rspec/empty_hook.rb +5 -9
- data/lib/rubocop/cop/rspec/empty_line_after_example.rb +5 -3
- data/lib/rubocop/cop/rspec/empty_line_after_example_group.rb +5 -5
- data/lib/rubocop/cop/rspec/empty_line_after_final_let.rb +4 -1
- data/lib/rubocop/cop/rspec/empty_line_after_hook.rb +5 -5
- data/lib/rubocop/cop/rspec/empty_line_after_subject.rb +4 -1
- data/lib/rubocop/cop/rspec/example_wording.rb +6 -7
- data/lib/rubocop/cop/rspec/expect_actual.rb +7 -10
- data/lib/rubocop/cop/rspec/expect_change.rb +9 -34
- data/lib/rubocop/cop/rspec/expect_in_hook.rb +2 -2
- data/lib/rubocop/cop/rspec/expect_output.rb +1 -1
- data/lib/rubocop/cop/rspec/factory_bot/attribute_defined_statically.rb +18 -18
- data/lib/rubocop/cop/rspec/factory_bot/create_list.rb +10 -16
- data/lib/rubocop/cop/rspec/factory_bot/factory_class_name.rb +6 -7
- data/lib/rubocop/cop/rspec/hook_argument.rb +11 -17
- data/lib/rubocop/cop/rspec/hooks_before_examples.rb +12 -13
- data/lib/rubocop/cop/rspec/implicit_expect.rb +6 -14
- data/lib/rubocop/cop/rspec/implicit_subject.rb +8 -5
- data/lib/rubocop/cop/rspec/instance_spy.rb +17 -11
- data/lib/rubocop/cop/rspec/invalid_predicate_matcher.rb +2 -5
- data/lib/rubocop/cop/rspec/it_behaves_like.rb +4 -5
- data/lib/rubocop/cop/rspec/leading_subject.rb +13 -13
- data/lib/rubocop/cop/rspec/let_before_examples.rb +12 -10
- data/lib/rubocop/cop/rspec/message_chain.rb +6 -5
- data/lib/rubocop/cop/rspec/message_expectation.rb +1 -1
- data/lib/rubocop/cop/rspec/message_spies.rb +1 -2
- data/lib/rubocop/cop/rspec/multiple_subjects.rb +17 -18
- data/lib/rubocop/cop/rspec/named_subject.rb +1 -1
- data/lib/rubocop/cop/rspec/not_to_not.rb +4 -5
- data/lib/rubocop/cop/rspec/predicate_matcher.rb +23 -53
- data/lib/rubocop/cop/rspec/rails/http_status.rb +4 -8
- data/lib/rubocop/cop/rspec/receive_counts.rb +14 -16
- data/lib/rubocop/cop/rspec/receive_never.rb +10 -10
- data/lib/rubocop/cop/rspec/return_from_stub.rb +8 -19
- data/lib/rubocop/cop/rspec/scattered_let.rb +7 -10
- data/lib/rubocop/cop/rspec/shared_context.rb +7 -20
- data/lib/rubocop/cop/rspec/shared_examples.rb +5 -8
- data/lib/rubocop/cop/rspec/single_argument_message_chain.rb +14 -17
- data/lib/rubocop/cop/rspec/yield.rb +13 -10
- data/lib/rubocop/rspec/blank_line_separation.rb +0 -8
- data/lib/rubocop/rspec/version.rb +1 -1
- metadata +4 -4
@@ -31,6 +31,7 @@ module RuboCop
|
|
31
31
|
# it { is_expected.to have_http_status :error }
|
32
32
|
#
|
33
33
|
class HttpStatus < Cop
|
34
|
+
extend AutoCorrector
|
34
35
|
include ConfigurableEnforcedStyle
|
35
36
|
|
36
37
|
def_node_matcher :http_status, <<-PATTERN
|
@@ -42,14 +43,9 @@ module RuboCop
|
|
42
43
|
checker = checker_class.new(ast_node)
|
43
44
|
return unless checker.offensive?
|
44
45
|
|
45
|
-
add_offense(checker.node, message: checker.message)
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
def autocorrect(node)
|
50
|
-
lambda do |corrector|
|
51
|
-
checker = checker_class.new(node)
|
52
|
-
corrector.replace(node.loc.expression, checker.preferred_style)
|
46
|
+
add_offense(checker.node, message: checker.message) do |corrector|
|
47
|
+
corrector.replace(checker.node, checker.preferred_style)
|
48
|
+
end
|
53
49
|
end
|
54
50
|
end
|
55
51
|
|
@@ -24,6 +24,8 @@ module RuboCop
|
|
24
24
|
# expect(foo).to receive(:bar).at_most(:twice).times
|
25
25
|
#
|
26
26
|
class ReceiveCounts < Cop
|
27
|
+
extend AutoCorrector
|
28
|
+
|
27
29
|
MSG = 'Use `%<alternative>s` instead of `%<original>s`.'
|
28
30
|
|
29
31
|
def_node_matcher :receive_counts, <<-PATTERN
|
@@ -38,27 +40,23 @@ module RuboCop
|
|
38
40
|
|
39
41
|
offending_range = range(node, offending_node)
|
40
42
|
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
)
|
43
|
+
msg = message_for(offending_node, offending_range.source)
|
44
|
+
add_offense(offending_range, message: msg) do |corrector|
|
45
|
+
autocorrect(corrector, offending_node, offending_range)
|
46
|
+
end
|
46
47
|
end
|
47
48
|
end
|
48
49
|
|
49
|
-
|
50
|
-
lambda do |corrector|
|
51
|
-
replacement = matcher_for(
|
52
|
-
node.method_name,
|
53
|
-
node.first_argument.source.to_i
|
54
|
-
)
|
50
|
+
private
|
55
51
|
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
52
|
+
def autocorrect(corrector, node, range)
|
53
|
+
replacement = matcher_for(
|
54
|
+
node.method_name,
|
55
|
+
node.first_argument.source.to_i
|
56
|
+
)
|
60
57
|
|
61
|
-
|
58
|
+
corrector.replace(range, replacement)
|
59
|
+
end
|
62
60
|
|
63
61
|
def message_for(node, source)
|
64
62
|
alternative = matcher_for(
|
@@ -14,6 +14,7 @@ module RuboCop
|
|
14
14
|
# expect(foo).not_to receive(:bar)
|
15
15
|
#
|
16
16
|
class ReceiveNever < Cop
|
17
|
+
extend AutoCorrector
|
17
18
|
MSG = 'Use `not_to receive` instead of `never`.'
|
18
19
|
|
19
20
|
def_node_search :method_on_stub?, '(send nil? :receive ...)'
|
@@ -21,18 +22,17 @@ module RuboCop
|
|
21
22
|
def on_send(node)
|
22
23
|
return unless node.method_name == :never && method_on_stub?(node)
|
23
24
|
|
24
|
-
add_offense(
|
25
|
-
node
|
26
|
-
|
27
|
-
)
|
25
|
+
add_offense(node.loc.selector) do |corrector|
|
26
|
+
autocorrect(corrector, node)
|
27
|
+
end
|
28
28
|
end
|
29
29
|
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
30
|
+
private
|
31
|
+
|
32
|
+
def autocorrect(corrector, node)
|
33
|
+
corrector.replace(node.parent.loc.selector, 'not_to')
|
34
|
+
range = node.loc.dot.with(end_pos: node.loc.selector.end_pos)
|
35
|
+
corrector.remove(range)
|
36
36
|
end
|
37
37
|
end
|
38
38
|
end
|
@@ -34,6 +34,7 @@ module RuboCop
|
|
34
34
|
# allow(Foo).to receive(:bar) { bar.baz }
|
35
35
|
#
|
36
36
|
class ReturnFromStub < Cop
|
37
|
+
extend AutoCorrector
|
37
38
|
include ConfigurableEnforcedStyle
|
38
39
|
|
39
40
|
MSG_AND_RETURN = 'Use `and_return` for static values.'
|
@@ -59,24 +60,14 @@ module RuboCop
|
|
59
60
|
check_block_body(node)
|
60
61
|
end
|
61
62
|
|
62
|
-
def autocorrect(node)
|
63
|
-
if style == :block
|
64
|
-
AndReturnCallCorrector.new(node)
|
65
|
-
else
|
66
|
-
BlockBodyCorrector.new(node)
|
67
|
-
end
|
68
|
-
end
|
69
|
-
|
70
63
|
private
|
71
64
|
|
72
65
|
def check_and_return_call(node)
|
73
66
|
and_return_value(node) do |and_return, args|
|
74
67
|
unless dynamic?(args)
|
75
|
-
add_offense(
|
76
|
-
and_return
|
77
|
-
|
78
|
-
message: MSG_BLOCK
|
79
|
-
)
|
68
|
+
add_offense(and_return.loc.selector, message: MSG_BLOCK) do |corr|
|
69
|
+
AndReturnCallCorrector.new(and_return).call(corr)
|
70
|
+
end
|
80
71
|
end
|
81
72
|
end
|
82
73
|
end
|
@@ -84,11 +75,9 @@ module RuboCop
|
|
84
75
|
def check_block_body(block)
|
85
76
|
body = block.body
|
86
77
|
unless dynamic?(body) # rubocop:disable Style/GuardClause
|
87
|
-
add_offense(
|
88
|
-
block
|
89
|
-
|
90
|
-
message: MSG_AND_RETURN
|
91
|
-
)
|
78
|
+
add_offense(block.loc.begin, message: MSG_AND_RETURN) do |corrector|
|
79
|
+
BlockBodyCorrector.new(block).call(corrector)
|
80
|
+
end
|
92
81
|
end
|
93
82
|
end
|
94
83
|
|
@@ -153,7 +142,7 @@ module RuboCop
|
|
153
142
|
return if heredoc?
|
154
143
|
|
155
144
|
corrector.replace(
|
156
|
-
block
|
145
|
+
block,
|
157
146
|
"#{block.send_node.source}.and_return(#{body.source})"
|
158
147
|
)
|
159
148
|
end
|
@@ -27,6 +27,8 @@ module RuboCop
|
|
27
27
|
# end
|
28
28
|
#
|
29
29
|
class ScatteredLet < Cop
|
30
|
+
extend AutoCorrector
|
31
|
+
|
30
32
|
MSG = 'Group all let/let! blocks in the example group together.'
|
31
33
|
|
32
34
|
def on_block(node)
|
@@ -35,15 +37,6 @@ module RuboCop
|
|
35
37
|
check_let_declarations(node.body)
|
36
38
|
end
|
37
39
|
|
38
|
-
def autocorrect(node)
|
39
|
-
lambda do |corrector|
|
40
|
-
first_let = find_first_let(node.parent)
|
41
|
-
RuboCop::RSpec::Corrector::MoveNode.new(
|
42
|
-
node, corrector, processed_source
|
43
|
-
).move_after(first_let)
|
44
|
-
end
|
45
|
-
end
|
46
|
-
|
47
40
|
private
|
48
41
|
|
49
42
|
def check_let_declarations(body)
|
@@ -53,7 +46,11 @@ module RuboCop
|
|
53
46
|
lets.each_with_index do |node, idx|
|
54
47
|
next if node.sibling_index == first_let.sibling_index + idx
|
55
48
|
|
56
|
-
add_offense(node)
|
49
|
+
add_offense(node) do |corrector|
|
50
|
+
RuboCop::RSpec::Corrector::MoveNode.new(
|
51
|
+
node, corrector, processed_source
|
52
|
+
).move_after(first_let)
|
53
|
+
end
|
57
54
|
end
|
58
55
|
end
|
59
56
|
|
@@ -51,6 +51,8 @@ module RuboCop
|
|
51
51
|
# end
|
52
52
|
#
|
53
53
|
class SharedContext < Cop
|
54
|
+
extend AutoCorrector
|
55
|
+
|
54
56
|
MSG_EXAMPLES = "Use `shared_examples` when you don't "\
|
55
57
|
'define context.'
|
56
58
|
|
@@ -68,22 +70,14 @@ module RuboCop
|
|
68
70
|
|
69
71
|
def on_block(node)
|
70
72
|
context_with_only_examples(node) do
|
71
|
-
|
73
|
+
add_offense(node.send_node, message: MSG_EXAMPLES) do |corrector|
|
74
|
+
corrector.replace(node.send_node.loc.selector, 'shared_examples')
|
75
|
+
end
|
72
76
|
end
|
73
77
|
|
74
78
|
examples_with_only_context(node) do
|
75
|
-
|
76
|
-
|
77
|
-
end
|
78
|
-
|
79
|
-
def autocorrect(node)
|
80
|
-
lambda do |corrector|
|
81
|
-
context_with_only_examples(node.parent) do
|
82
|
-
corrector.replace(node.loc.selector, 'shared_examples')
|
83
|
-
end
|
84
|
-
|
85
|
-
examples_with_only_context(node.parent) do
|
86
|
-
corrector.replace(node.loc.selector, 'shared_context')
|
79
|
+
add_offense(node.send_node, message: MSG_CONTEXT) do |corrector|
|
80
|
+
corrector.replace(node.send_node.loc.selector, 'shared_context')
|
87
81
|
end
|
88
82
|
end
|
89
83
|
end
|
@@ -97,13 +91,6 @@ module RuboCop
|
|
97
91
|
def examples_with_only_context(node)
|
98
92
|
shared_example(node) { yield if context?(node) && !examples?(node) }
|
99
93
|
end
|
100
|
-
|
101
|
-
def add_shared_item_offense(node, message)
|
102
|
-
add_offense(
|
103
|
-
node,
|
104
|
-
message: message
|
105
|
-
)
|
106
|
-
end
|
107
94
|
end
|
108
95
|
end
|
109
96
|
end
|
@@ -21,6 +21,8 @@ module RuboCop
|
|
21
21
|
# include_examples 'foo bar baz'
|
22
22
|
#
|
23
23
|
class SharedExamples < Cop
|
24
|
+
extend AutoCorrector
|
25
|
+
|
24
26
|
def_node_matcher :shared_examples,
|
25
27
|
(SharedGroups::ALL + Includes::ALL).send_pattern
|
26
28
|
|
@@ -30,14 +32,9 @@ module RuboCop
|
|
30
32
|
next unless ast_node&.sym_type?
|
31
33
|
|
32
34
|
checker = Checker.new(ast_node)
|
33
|
-
add_offense(checker.node, message: checker.message)
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
def autocorrect(node)
|
38
|
-
lambda do |corrector|
|
39
|
-
checker = Checker.new(node)
|
40
|
-
corrector.replace(node.loc.expression, checker.preferred_style)
|
35
|
+
add_offense(checker.node, message: checker.message) do |corrector|
|
36
|
+
corrector.replace(checker.node, checker.preferred_style)
|
37
|
+
end
|
41
38
|
end
|
42
39
|
end
|
43
40
|
|
@@ -17,6 +17,8 @@ module RuboCop
|
|
17
17
|
# allow(foo).to receive("bar.baz")
|
18
18
|
#
|
19
19
|
class SingleArgumentMessageChain < Cop
|
20
|
+
extend AutoCorrector
|
21
|
+
|
20
22
|
MSG = 'Use `%<recommended>s` instead of calling '\
|
21
23
|
'`%<called>s` with a single argument.'
|
22
24
|
|
@@ -30,22 +32,23 @@ module RuboCop
|
|
30
32
|
message_chain(node) do |arg|
|
31
33
|
return if valid_usage?(arg)
|
32
34
|
|
33
|
-
|
34
|
-
|
35
|
-
end
|
35
|
+
method = node.method_name
|
36
|
+
msg = format(MSG, recommended: replacement(method), called: method)
|
36
37
|
|
37
|
-
|
38
|
-
|
39
|
-
corrector.replace(node.loc.selector, replacement(node.method_name))
|
40
|
-
message_chain(node) do |arg|
|
41
|
-
autocorrect_hash_arg(corrector, arg) if single_key_hash?(arg)
|
42
|
-
autocorrect_array_arg(corrector, arg) if arg.array_type?
|
38
|
+
add_offense(node.loc.selector, message: msg) do |corrector|
|
39
|
+
autocorrect(corrector, node, method, arg)
|
43
40
|
end
|
44
41
|
end
|
45
42
|
end
|
46
43
|
|
47
44
|
private
|
48
45
|
|
46
|
+
def autocorrect(corrector, node, method, arg)
|
47
|
+
corrector.replace(node.loc.selector, replacement(method))
|
48
|
+
autocorrect_hash_arg(corrector, arg) if single_key_hash?(arg)
|
49
|
+
autocorrect_array_arg(corrector, arg) if arg.array_type?
|
50
|
+
end
|
51
|
+
|
49
52
|
def valid_usage?(node)
|
50
53
|
return true unless node.literal? || node.array_type?
|
51
54
|
|
@@ -63,7 +66,7 @@ module RuboCop
|
|
63
66
|
def autocorrect_hash_arg(corrector, arg)
|
64
67
|
key, value = *arg.children.first
|
65
68
|
|
66
|
-
corrector.replace(arg
|
69
|
+
corrector.replace(arg, key_to_arg(key))
|
67
70
|
corrector.insert_after(arg.parent.loc.end,
|
68
71
|
".and_return(#{value.source})")
|
69
72
|
end
|
@@ -71,7 +74,7 @@ module RuboCop
|
|
71
74
|
def autocorrect_array_arg(corrector, arg)
|
72
75
|
value = arg.children.first
|
73
76
|
|
74
|
-
corrector.replace(arg
|
77
|
+
corrector.replace(arg, value.source)
|
75
78
|
end
|
76
79
|
|
77
80
|
def key_to_arg(node)
|
@@ -82,12 +85,6 @@ module RuboCop
|
|
82
85
|
def replacement(method)
|
83
86
|
method.equal?(:receive_message_chain) ? 'receive' : 'stub'
|
84
87
|
end
|
85
|
-
|
86
|
-
def message(node)
|
87
|
-
method = node.method_name
|
88
|
-
|
89
|
-
format(MSG, recommended: replacement(method), called: method)
|
90
|
-
end
|
91
88
|
end
|
92
89
|
end
|
93
90
|
end
|
@@ -12,6 +12,7 @@ module RuboCop
|
|
12
12
|
# # good
|
13
13
|
# expect(foo).to be(:bar).and_yield(1)
|
14
14
|
class Yield < Cop
|
15
|
+
extend AutoCorrector
|
15
16
|
include RangeHelp
|
16
17
|
|
17
18
|
MSG = 'Use `.and_yield`.'
|
@@ -27,22 +28,24 @@ module RuboCop
|
|
27
28
|
|
28
29
|
block_arg(node.arguments) do |block|
|
29
30
|
if calling_block?(node.body, block)
|
30
|
-
|
31
|
-
end
|
32
|
-
end
|
33
|
-
end
|
31
|
+
range = block_range(node)
|
34
32
|
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
)
|
40
|
-
corrector.replace(node_range, generate_replacement(node.body))
|
33
|
+
add_offense(range) do |corrector|
|
34
|
+
autocorrect(corrector, node, range)
|
35
|
+
end
|
36
|
+
end
|
41
37
|
end
|
42
38
|
end
|
43
39
|
|
44
40
|
private
|
45
41
|
|
42
|
+
def autocorrect(corrector, node, range)
|
43
|
+
corrector.replace(
|
44
|
+
range_with_surrounding_space(range: range, side: :left),
|
45
|
+
generate_replacement(node.body)
|
46
|
+
)
|
47
|
+
end
|
48
|
+
|
46
49
|
def calling_block?(node, block)
|
47
50
|
if node.begin_type?
|
48
51
|
node.each_child_node.all? { |child| block_call?(child, block) }
|
@@ -32,14 +32,6 @@ module RuboCop
|
|
32
32
|
|
33
33
|
node.equal?(node.parent.children.last)
|
34
34
|
end
|
35
|
-
|
36
|
-
def autocorrect(node)
|
37
|
-
lambda do |corrector|
|
38
|
-
missing_separating_line(node) do |location|
|
39
|
-
corrector.insert_after(location.end, "\n")
|
40
|
-
end
|
41
|
-
end
|
42
|
-
end
|
43
35
|
end
|
44
36
|
end
|
45
37
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rubocop-rspec
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.42.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- John Backus
|
@@ -10,7 +10,7 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date: 2020-07-
|
13
|
+
date: 2020-07-09 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: rubocop
|
@@ -18,14 +18,14 @@ dependencies:
|
|
18
18
|
requirements:
|
19
19
|
- - ">="
|
20
20
|
- !ruby/object:Gem::Version
|
21
|
-
version: 0.
|
21
|
+
version: 0.87.0
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
24
|
version_requirements: !ruby/object:Gem::Requirement
|
25
25
|
requirements:
|
26
26
|
- - ">="
|
27
27
|
- !ruby/object:Gem::Version
|
28
|
-
version: 0.
|
28
|
+
version: 0.87.0
|
29
29
|
- !ruby/object:Gem::Dependency
|
30
30
|
name: rack
|
31
31
|
requirement: !ruby/object:Gem::Requirement
|