rubocop-rspec 1.26.0 → 1.27.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 +10 -0
- data/Gemfile +0 -4
- data/Rakefile +6 -2
- data/config/default.yml +11 -1
- data/lib/rubocop-rspec.rb +2 -0
- data/lib/rubocop/cop/rspec/describe_class.rb +4 -1
- data/lib/rubocop/cop/rspec/empty_line_after_example_group.rb +48 -0
- data/lib/rubocop/cop/rspec/empty_line_after_final_let.rb +2 -46
- data/lib/rubocop/cop/rspec/empty_line_after_hook.rb +58 -0
- data/lib/rubocop/cop/rspec/empty_line_after_subject.rb +5 -9
- data/lib/rubocop/cop/rspec/leading_subject.rb +42 -23
- data/lib/rubocop/cop/rspec/let_before_examples.rb +5 -15
- data/lib/rubocop/cop/rspec/not_to_not.rb +1 -1
- data/lib/rubocop/cop/rspec/overwriting_setup.rb +11 -5
- data/lib/rubocop/cop/rspec/receive_counts.rb +1 -1
- data/lib/rubocop/cop/rspec_cops.rb +2 -0
- data/lib/rubocop/rspec/blank_line_separation.rb +37 -0
- data/lib/rubocop/rspec/final_end_location.rb +15 -0
- data/lib/rubocop/rspec/version.rb +1 -1
- data/rubocop-rspec.gemspec +1 -1
- data/spec/rubocop/cop/rspec/describe_class_spec.rb +3 -0
- data/spec/rubocop/cop/rspec/empty_line_after_example_group_spec.rb +87 -0
- data/spec/rubocop/cop/rspec/empty_line_after_final_let_spec.rb +41 -1
- data/spec/rubocop/cop/rspec/empty_line_after_hook_spec.rb +128 -0
- data/spec/rubocop/cop/rspec/leading_subject_spec.rb +25 -1
- data/spec/rubocop/cop/rspec/not_to_not_spec.rb +44 -2
- data/spec/rubocop/cop/rspec/overwriting_setup_spec.rb +21 -0
- metadata +12 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 2cb62faf05dbb3d997032a8fbac1d3d1897542d7a98b1540c54afebc10a6a294
|
4
|
+
data.tar.gz: 6b1fae2d79e473c5e8295fe6ccb5e843e8801b2ec6ea3c54625e8ba16e7c522d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 2136057006988a3e05ab8be06f16125e76c520d1e46d656dd8aee9d7ae0c841fbc55d07e247e332120ab32b1f0a41e5b24827012104c8c3b75ac7e15de7e9395
|
7
|
+
data.tar.gz: 6a55cfcf03e4c2b15157e3292a89e161b3a25dc10ee45325912e9bf0fd4a13705b7d9b1e7c5f309c9a5ea9fc608a333af144a36844e95d6f20658cde5d290fd5
|
data/CHANGELOG.md
CHANGED
@@ -2,6 +2,16 @@
|
|
2
2
|
|
3
3
|
## Master (Unreleased)
|
4
4
|
|
5
|
+
## 1.27.0 (2018-06-14)
|
6
|
+
|
7
|
+
* `RSpec/LeadingSubject` now enforces subject to be before any examples, hooks or let declarations. ([@Darhazer][])
|
8
|
+
* Fix `RSpec/NotToNot` to highlight only the selector (`not_to` or `to_not`), so it works also on `expect { ... }` blocks. ([@bquorning][])
|
9
|
+
* Add `RSpec/EmptyLineAfterHook` cop. ([@bquorning][])
|
10
|
+
* Add `RSpec/EmptyLineAfterExampleGroup` cop to check that there is an empty line after example group blocks. ([@bquorning][])
|
11
|
+
* Fix `RSpec/DescribeClass` crashing on `RSpec.describe` without arguments. ([@Darhazer][])
|
12
|
+
* Bump RuboCop requirement to v0.56.0. ([@bquorning][])
|
13
|
+
* Fix `RSpec/OverwritingSetup` crashing if a variable is used as an argument for `let`. ([@Darhazer][])
|
14
|
+
|
5
15
|
## 1.26.0 (2018-06-06)
|
6
16
|
|
7
17
|
* Fix false positive in `RSpec/EmptyExampleGroup` cop when methods named like a RSpec method are used. ([@Darhazer][])
|
data/Gemfile
CHANGED
data/Rakefile
CHANGED
@@ -51,7 +51,8 @@ task confirm_documentation: :generate_cops_documentation do
|
|
51
51
|
Open3.popen3('git diff --exit-code manual/')
|
52
52
|
|
53
53
|
unless process.value.success?
|
54
|
-
raise '
|
54
|
+
raise 'Please run `rake generate_cops_documentation` ' \
|
55
|
+
'and add manual/ to the commit.'
|
55
56
|
end
|
56
57
|
end
|
57
58
|
|
@@ -70,7 +71,10 @@ task :new_cop, [:cop] do |_task, args|
|
|
70
71
|
exit!
|
71
72
|
end
|
72
73
|
|
73
|
-
|
74
|
+
github_user = `git config github.user`.chop
|
75
|
+
github_user = 'your_id' if github_user.empty?
|
76
|
+
|
77
|
+
generator = RuboCop::Cop::Generator.new(cop_name, github_user)
|
74
78
|
|
75
79
|
generator.write_source
|
76
80
|
generator.write_spec
|
data/config/default.yml
CHANGED
@@ -93,11 +93,21 @@ RSpec/EmptyExampleGroup:
|
|
93
93
|
CustomIncludeMethods: []
|
94
94
|
StyleGuide: http://www.rubydoc.info/gems/rubocop-rspec/RuboCop/Cop/RSpec/EmptyExampleGroup
|
95
95
|
|
96
|
+
RSpec/EmptyLineAfterExampleGroup:
|
97
|
+
Description: Checks if there is an empty line after example group blocks.
|
98
|
+
Enabled: true
|
99
|
+
StyleGuide: http://www.rubydoc.info/gems/rubocop-rspec/RuboCop/Cop/RSpec/EmptyLineAfterExampleGroup
|
100
|
+
|
96
101
|
RSpec/EmptyLineAfterFinalLet:
|
97
102
|
Description: Checks if there is an empty line after the last let block.
|
98
103
|
Enabled: true
|
99
104
|
StyleGuide: http://www.rubydoc.info/gems/rubocop-rspec/RuboCop/Cop/RSpec/EmptyLineAfterFinalLet
|
100
105
|
|
106
|
+
RSpec/EmptyLineAfterHook:
|
107
|
+
Description: Checks if there is an empty line after hook blocks.
|
108
|
+
Enabled: true
|
109
|
+
StyleGuide: http://www.rubydoc.info/gems/rubocop-rspec/RuboCop/Cop/RSpec/EmptyLineAfterHook
|
110
|
+
|
101
111
|
RSpec/EmptyLineAfterSubject:
|
102
112
|
Description: Checks if there is an empty line after subject block.
|
103
113
|
Enabled: true
|
@@ -215,7 +225,7 @@ RSpec/ItBehavesLike:
|
|
215
225
|
StyleGuide: http://www.rubydoc.info/gems/rubocop-rspec/RuboCop/Cop/RSpec/ItBehavesLike
|
216
226
|
|
217
227
|
RSpec/LeadingSubject:
|
218
|
-
Description:
|
228
|
+
Description: Enforce that subject is the first definition in the test.
|
219
229
|
Enabled: true
|
220
230
|
StyleGuide: http://www.rubydoc.info/gems/rubocop-rspec/RuboCop/Cop/RSpec/LeadingSubject
|
221
231
|
|
data/lib/rubocop-rspec.rb
CHANGED
@@ -20,6 +20,8 @@ require_relative 'rubocop/cop/rspec/cop'
|
|
20
20
|
require_relative 'rubocop/rspec/align_let_brace'
|
21
21
|
require_relative 'rubocop/rspec/capybara'
|
22
22
|
require_relative 'rubocop/rspec/factory_bot'
|
23
|
+
require_relative 'rubocop/rspec/final_end_location'
|
24
|
+
require_relative 'rubocop/rspec/blank_line_separation'
|
23
25
|
|
24
26
|
RuboCop::RSpec::Inject.defaults!
|
25
27
|
|
@@ -23,7 +23,10 @@ module RuboCop
|
|
23
23
|
'the class or module being tested.'.freeze
|
24
24
|
|
25
25
|
def_node_matcher :valid_describe?, <<-PATTERN
|
26
|
-
{
|
26
|
+
{
|
27
|
+
(send {(const nil? :RSpec) nil?} :describe const ...)
|
28
|
+
(send {(const nil? :RSpec) nil?} :describe)
|
29
|
+
}
|
27
30
|
PATTERN
|
28
31
|
|
29
32
|
def_node_matcher :describe_with_metadata, <<-PATTERN
|
@@ -0,0 +1,48 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RuboCop
|
4
|
+
module Cop
|
5
|
+
module RSpec
|
6
|
+
# Checks if there is an empty line after example group blocks.
|
7
|
+
#
|
8
|
+
# @example
|
9
|
+
# # bad
|
10
|
+
# RSpec.describe Foo do
|
11
|
+
# describe '#bar' do
|
12
|
+
# end
|
13
|
+
# describe '#baz' do
|
14
|
+
# end
|
15
|
+
# end
|
16
|
+
#
|
17
|
+
# # good
|
18
|
+
# RSpec.describe Foo do
|
19
|
+
# describe '#bar' do
|
20
|
+
# end
|
21
|
+
#
|
22
|
+
# describe '#baz' do
|
23
|
+
# end
|
24
|
+
# end
|
25
|
+
#
|
26
|
+
class EmptyLineAfterExampleGroup < Cop
|
27
|
+
include RuboCop::RSpec::BlankLineSeparation
|
28
|
+
|
29
|
+
MSG = 'Add an empty line after `%<example_group>s`.'.freeze
|
30
|
+
|
31
|
+
def_node_matcher :example_group, ExampleGroups::ALL.block_pattern
|
32
|
+
|
33
|
+
def on_block(node)
|
34
|
+
return unless example_group(node)
|
35
|
+
return if node.parent && node.equal?(node.parent.children.last)
|
36
|
+
|
37
|
+
missing_separating_line(node) do |location|
|
38
|
+
add_offense(
|
39
|
+
node,
|
40
|
+
location: location,
|
41
|
+
message: format(MSG, example_group: node.method_name)
|
42
|
+
)
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
@@ -17,7 +17,7 @@ module RuboCop
|
|
17
17
|
#
|
18
18
|
# it { does_something }
|
19
19
|
class EmptyLineAfterFinalLet < Cop
|
20
|
-
include
|
20
|
+
include RuboCop::RSpec::BlankLineSeparation
|
21
21
|
|
22
22
|
MSG = 'Add an empty line after the last `let` block.'.freeze
|
23
23
|
|
@@ -31,54 +31,10 @@ module RuboCop
|
|
31
31
|
return if latest_let.nil?
|
32
32
|
return if latest_let.equal?(node.body.children.last)
|
33
33
|
|
34
|
-
|
34
|
+
missing_separating_line(latest_let) do |location|
|
35
35
|
add_offense(latest_let, location: location)
|
36
36
|
end
|
37
37
|
end
|
38
|
-
|
39
|
-
def autocorrect(node)
|
40
|
-
lambda do |corrector|
|
41
|
-
no_new_line_after(node) do |location|
|
42
|
-
corrector.insert_after(location.end, "\n")
|
43
|
-
end
|
44
|
-
end
|
45
|
-
end
|
46
|
-
|
47
|
-
private
|
48
|
-
|
49
|
-
def no_new_line_after(node)
|
50
|
-
loc = last_node_loc(node)
|
51
|
-
line = loc.line
|
52
|
-
line += 1 while comment_line?(processed_source[line])
|
53
|
-
|
54
|
-
return if processed_source[line].blank?
|
55
|
-
yield offending_loc(node, line)
|
56
|
-
end
|
57
|
-
|
58
|
-
def last_node_loc(node)
|
59
|
-
last_line = node.loc.end.line
|
60
|
-
heredoc_line(node) do |loc|
|
61
|
-
return loc if loc.line > last_line
|
62
|
-
end
|
63
|
-
node.loc.end
|
64
|
-
end
|
65
|
-
|
66
|
-
def heredoc_line(node, &block)
|
67
|
-
yield node.loc.heredoc_end if node.loc.respond_to?(:heredoc_end)
|
68
|
-
|
69
|
-
node.each_child_node { |child| heredoc_line(child, &block) }
|
70
|
-
end
|
71
|
-
|
72
|
-
def offending_loc(node, last_line)
|
73
|
-
offending_line = processed_source[last_line - 1]
|
74
|
-
if comment_line?(offending_line)
|
75
|
-
start = offending_line.index('#')
|
76
|
-
length = offending_line.length - start
|
77
|
-
source_range(processed_source.buffer, last_line, start, length)
|
78
|
-
else
|
79
|
-
node.loc.expression
|
80
|
-
end
|
81
|
-
end
|
82
38
|
end
|
83
39
|
end
|
84
40
|
end
|
@@ -0,0 +1,58 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RuboCop
|
4
|
+
module Cop
|
5
|
+
module RSpec
|
6
|
+
# Checks if there is an empty line after hook blocks.
|
7
|
+
#
|
8
|
+
# @example
|
9
|
+
# # bad
|
10
|
+
# before { do_something }
|
11
|
+
# it { does_something }
|
12
|
+
#
|
13
|
+
# # bad
|
14
|
+
# after { do_something }
|
15
|
+
# it { does_something }
|
16
|
+
#
|
17
|
+
# # bad
|
18
|
+
# around { |test| test.run }
|
19
|
+
# it { does_something }
|
20
|
+
#
|
21
|
+
# # good
|
22
|
+
# before { do_something }
|
23
|
+
#
|
24
|
+
# it { does_something }
|
25
|
+
#
|
26
|
+
# # good
|
27
|
+
# after { do_something }
|
28
|
+
#
|
29
|
+
# it { does_something }
|
30
|
+
#
|
31
|
+
# # good
|
32
|
+
# around { |test| test.run }
|
33
|
+
#
|
34
|
+
# it { does_something }
|
35
|
+
#
|
36
|
+
class EmptyLineAfterHook < Cop
|
37
|
+
include RuboCop::RSpec::BlankLineSeparation
|
38
|
+
|
39
|
+
MSG = 'Add an empty line after `%<hook>s`.'.freeze
|
40
|
+
|
41
|
+
def_node_matcher :hook?, Hooks::ALL.block_pattern
|
42
|
+
|
43
|
+
def on_block(node)
|
44
|
+
return unless hook?(node)
|
45
|
+
return if node.equal?(node.parent.children.last)
|
46
|
+
|
47
|
+
missing_separating_line(node) do |location|
|
48
|
+
add_offense(
|
49
|
+
node,
|
50
|
+
location: location,
|
51
|
+
message: format(MSG, hook: node.method_name)
|
52
|
+
)
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
@@ -15,6 +15,8 @@ module RuboCop
|
|
15
15
|
#
|
16
16
|
# let(:foo) { bar }
|
17
17
|
class EmptyLineAfterSubject < Cop
|
18
|
+
include RuboCop::RSpec::BlankLineSeparation
|
19
|
+
|
18
20
|
MSG = 'Add empty line after `subject`.'.freeze
|
19
21
|
|
20
22
|
def_node_matcher :subject?, Subject::ALL.block_pattern
|
@@ -23,15 +25,9 @@ module RuboCop
|
|
23
25
|
return unless subject?(node) && !in_spec_block?(node)
|
24
26
|
return if node.equal?(node.parent.children.last)
|
25
27
|
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
add_offense(node, location: :expression, message: MSG)
|
31
|
-
end
|
32
|
-
|
33
|
-
def autocorrect(node)
|
34
|
-
->(corrector) { corrector.insert_after(node.loc.end, "\n") }
|
28
|
+
missing_separating_line(node) do |location|
|
29
|
+
add_offense(node, location: location, message: MSG)
|
30
|
+
end
|
35
31
|
end
|
36
32
|
|
37
33
|
private
|
@@ -3,64 +3,83 @@
|
|
3
3
|
module RuboCop
|
4
4
|
module Cop
|
5
5
|
module RSpec
|
6
|
-
#
|
6
|
+
# Enforce that subject is the first definition in the test.
|
7
7
|
#
|
8
8
|
# @example
|
9
9
|
# # bad
|
10
|
-
# RSpec.describe User do
|
11
10
|
# let(:params) { blah }
|
12
11
|
# subject { described_class.new(params) }
|
13
12
|
#
|
14
|
-
#
|
15
|
-
#
|
16
|
-
# end
|
17
|
-
# end
|
13
|
+
# before { do_something }
|
14
|
+
# subject { described_class.new(params) }
|
18
15
|
#
|
19
|
-
#
|
20
|
-
# RSpec.describe User do
|
16
|
+
# it { expect_something }
|
21
17
|
# subject { described_class.new(params) }
|
18
|
+
# it { expect_something_else }
|
22
19
|
#
|
20
|
+
#
|
21
|
+
# # good
|
22
|
+
# subject { described_class.new(params) }
|
23
23
|
# let(:params) { blah }
|
24
24
|
#
|
25
|
-
#
|
26
|
-
#
|
27
|
-
#
|
28
|
-
#
|
25
|
+
# # good
|
26
|
+
# subject { described_class.new(params) }
|
27
|
+
# before { do_something }
|
28
|
+
#
|
29
|
+
# # good
|
30
|
+
# subject { described_class.new(params) }
|
31
|
+
# it { expect_something }
|
32
|
+
# it { expect_something_else }
|
33
|
+
#
|
29
34
|
class LeadingSubject < Cop
|
30
35
|
include RangeHelp
|
31
36
|
|
32
|
-
MSG = 'Declare `subject` above any other `
|
37
|
+
MSG = 'Declare `subject` above any other `%<offending>s` ' \
|
38
|
+
'declarations.'.freeze
|
33
39
|
|
34
40
|
def_node_matcher :subject?, Subject::ALL.block_pattern
|
41
|
+
def_node_matcher :let?, Helpers::ALL.block_pattern
|
42
|
+
def_node_matcher :hook?, Hooks::ALL.block_pattern
|
43
|
+
def_node_matcher :example?, Examples::ALL.block_pattern
|
35
44
|
|
36
45
|
def on_block(node)
|
37
46
|
return unless subject?(node) && !in_spec_block?(node)
|
38
47
|
|
48
|
+
check_previous_nodes(node)
|
49
|
+
end
|
50
|
+
|
51
|
+
def check_previous_nodes(node)
|
39
52
|
node.parent.each_child_node do |sibling|
|
40
|
-
|
53
|
+
if offending?(sibling)
|
54
|
+
add_offense(
|
55
|
+
node,
|
56
|
+
location: :expression,
|
57
|
+
message: format(MSG, offending: sibling.method_name)
|
58
|
+
)
|
59
|
+
end
|
41
60
|
|
42
|
-
break
|
61
|
+
break if offending?(sibling) || sibling.equal?(node)
|
43
62
|
end
|
44
63
|
end
|
45
64
|
|
46
65
|
def autocorrect(node)
|
47
66
|
lambda do |corrector|
|
48
|
-
|
49
|
-
|
50
|
-
indent = "\n" + ' ' *
|
51
|
-
corrector.insert_before(
|
67
|
+
first_node = find_first_offending_node(node)
|
68
|
+
first_node_position = first_node.loc.expression
|
69
|
+
indent = "\n" + ' ' * first_node.loc.column
|
70
|
+
corrector.insert_before(first_node_position, node.source + indent)
|
52
71
|
corrector.remove(node_range(node))
|
53
72
|
end
|
54
73
|
end
|
55
74
|
|
56
75
|
private
|
57
76
|
|
58
|
-
def
|
59
|
-
|
77
|
+
def offending?(node)
|
78
|
+
let?(node) || hook?(node) || example?(node)
|
60
79
|
end
|
61
80
|
|
62
|
-
def
|
63
|
-
node.parent.children.find { |sibling|
|
81
|
+
def find_first_offending_node(node)
|
82
|
+
node.parent.children.find { |sibling| offending?(sibling) }
|
64
83
|
end
|
65
84
|
|
66
85
|
def node_range(node)
|
@@ -32,6 +32,7 @@ module RuboCop
|
|
32
32
|
# end
|
33
33
|
class LetBeforeExamples < Cop
|
34
34
|
include RangeHelp
|
35
|
+
include RuboCop::RSpec::FinalEndLocation
|
35
36
|
|
36
37
|
MSG = 'Move `let` before the examples in the group.'.freeze
|
37
38
|
|
@@ -91,21 +92,10 @@ module RuboCop
|
|
91
92
|
end
|
92
93
|
|
93
94
|
def node_range(node)
|
94
|
-
range_between(
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
heredoc = heredoc_lines(node).last
|
99
|
-
|
100
|
-
if heredoc
|
101
|
-
heredoc.loc.heredoc_end.end_pos
|
102
|
-
else
|
103
|
-
node.loc.end.end_pos
|
104
|
-
end
|
105
|
-
end
|
106
|
-
|
107
|
-
def heredoc_lines(node)
|
108
|
-
node.body.child_nodes.select { |n| n.loc.respond_to?(:heredoc_end) }
|
95
|
+
range_between(
|
96
|
+
node.loc.expression.begin_pos,
|
97
|
+
final_end_location(node).end_pos
|
98
|
+
)
|
109
99
|
end
|
110
100
|
end
|
111
101
|
end
|
@@ -22,11 +22,10 @@ module RuboCop
|
|
22
22
|
# let(:baz) { baz }
|
23
23
|
# let!(:other) { other }
|
24
24
|
class OverwritingSetup < Cop
|
25
|
-
include RuboCop::RSpec::Util
|
26
|
-
|
27
25
|
MSG = '`%<name>s` is already defined.'.freeze
|
28
26
|
|
29
27
|
def_node_matcher :setup?, (Helpers::ALL + Subject::ALL).block_pattern
|
28
|
+
def_node_matcher :first_argument_name, '(send _ _ ({str sym} $_))'
|
30
29
|
|
31
30
|
def on_block(node)
|
32
31
|
return unless example_group_with_body?(node)
|
@@ -44,11 +43,11 @@ module RuboCop
|
|
44
43
|
|
45
44
|
def find_duplicates(node)
|
46
45
|
setup_expressions = Set.new
|
47
|
-
node.each_child_node do |child|
|
48
|
-
next unless
|
46
|
+
node.each_child_node(:block) do |child|
|
47
|
+
next unless common_setup?(child)
|
49
48
|
|
50
49
|
name = if child.send_node.arguments?
|
51
|
-
child.send_node.
|
50
|
+
first_argument_name(child.send_node).to_sym
|
52
51
|
else
|
53
52
|
:subject
|
54
53
|
end
|
@@ -56,6 +55,13 @@ module RuboCop
|
|
56
55
|
yield child, name unless setup_expressions.add?(name)
|
57
56
|
end
|
58
57
|
end
|
58
|
+
|
59
|
+
def common_setup?(node)
|
60
|
+
return false unless setup?(node)
|
61
|
+
# Search only for setup with basic_literal arguments (e.g. :sym, :str)
|
62
|
+
# or no arguments at all.
|
63
|
+
node.send_node.arguments.all?(&:basic_literal?)
|
64
|
+
end
|
59
65
|
end
|
60
66
|
end
|
61
67
|
end
|
@@ -24,7 +24,9 @@ require_relative 'rspec/described_class'
|
|
24
24
|
require_relative 'rspec/describe_method'
|
25
25
|
require_relative 'rspec/describe_symbol'
|
26
26
|
require_relative 'rspec/empty_example_group'
|
27
|
+
require_relative 'rspec/empty_line_after_example_group'
|
27
28
|
require_relative 'rspec/empty_line_after_final_let'
|
29
|
+
require_relative 'rspec/empty_line_after_hook'
|
28
30
|
require_relative 'rspec/empty_line_after_subject'
|
29
31
|
require_relative 'rspec/example_length'
|
30
32
|
require_relative 'rspec/example_without_description'
|
@@ -0,0 +1,37 @@
|
|
1
|
+
module RuboCop
|
2
|
+
module RSpec
|
3
|
+
# Helps determine the offending location if there is not a blank line
|
4
|
+
# following the node. Allows comments to follow directly after.
|
5
|
+
module BlankLineSeparation
|
6
|
+
include FinalEndLocation
|
7
|
+
include RuboCop::Cop::RangeHelp
|
8
|
+
|
9
|
+
def missing_separating_line(node)
|
10
|
+
line = final_end_location(node).line
|
11
|
+
|
12
|
+
line += 1 while comment_line?(processed_source[line])
|
13
|
+
|
14
|
+
return if processed_source[line].blank?
|
15
|
+
|
16
|
+
yield offending_loc(line)
|
17
|
+
end
|
18
|
+
|
19
|
+
def offending_loc(last_line)
|
20
|
+
offending_line = processed_source[last_line - 1]
|
21
|
+
|
22
|
+
content_length = offending_line.lstrip.length
|
23
|
+
start = offending_line.length - content_length
|
24
|
+
|
25
|
+
source_range(processed_source.buffer, last_line, start, content_length)
|
26
|
+
end
|
27
|
+
|
28
|
+
def autocorrect(node)
|
29
|
+
lambda do |corrector|
|
30
|
+
missing_separating_line(node) do |location|
|
31
|
+
corrector.insert_after(location.end, "\n")
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
module RuboCop
|
2
|
+
module RSpec
|
3
|
+
# Helps find the true end location of nodes which might contain heredocs.
|
4
|
+
module FinalEndLocation
|
5
|
+
def final_end_location(start_node)
|
6
|
+
heredoc_endings =
|
7
|
+
start_node.each_node(:str, :dstr, :xstr)
|
8
|
+
.select(&:heredoc?)
|
9
|
+
.map { |node| node.loc.heredoc_end }
|
10
|
+
|
11
|
+
[start_node.loc.end, *heredoc_endings].max_by(&:line)
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
data/rubocop-rspec.gemspec
CHANGED
@@ -37,7 +37,7 @@ Gem::Specification.new do |spec|
|
|
37
37
|
'documentation_uri' => 'https://rubocop-rspec.readthedocs.io/'
|
38
38
|
}
|
39
39
|
|
40
|
-
spec.add_runtime_dependency 'rubocop', '>= 0.
|
40
|
+
spec.add_runtime_dependency 'rubocop', '>= 0.56.0'
|
41
41
|
|
42
42
|
spec.add_development_dependency 'rack'
|
43
43
|
spec.add_development_dependency 'rake'
|
@@ -0,0 +1,87 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
RSpec.describe RuboCop::Cop::RSpec::EmptyLineAfterExampleGroup do
|
4
|
+
subject(:cop) { described_class.new }
|
5
|
+
|
6
|
+
it 'checks for empty line after describe' do
|
7
|
+
expect_offense(<<-RUBY)
|
8
|
+
RSpec.describe Foo do
|
9
|
+
describe '#bar' do
|
10
|
+
end
|
11
|
+
^^^ Add an empty line after `describe`.
|
12
|
+
describe '#baz' do
|
13
|
+
end
|
14
|
+
end
|
15
|
+
RUBY
|
16
|
+
end
|
17
|
+
|
18
|
+
it 'highlights single line formulations correctly' do
|
19
|
+
expect_offense(<<-RUBY)
|
20
|
+
RSpec.describe Foo do
|
21
|
+
describe('#bar') { }
|
22
|
+
^^^^^^^^^^^^^^^^^^^^ Add an empty line after `describe`.
|
23
|
+
describe '#baz' do
|
24
|
+
end
|
25
|
+
end
|
26
|
+
RUBY
|
27
|
+
end
|
28
|
+
|
29
|
+
it 'checks for empty line after context' do
|
30
|
+
expect_offense(<<-RUBY)
|
31
|
+
RSpec.context 'foo' do
|
32
|
+
context 'bar' do
|
33
|
+
end
|
34
|
+
^^^ Add an empty line after `context`.
|
35
|
+
context 'baz' do
|
36
|
+
end
|
37
|
+
end
|
38
|
+
RUBY
|
39
|
+
end
|
40
|
+
|
41
|
+
it 'approves empty line after describe' do
|
42
|
+
expect_no_offenses(<<-RUBY)
|
43
|
+
RSpec.describe Foo do
|
44
|
+
describe '#bar' do
|
45
|
+
end
|
46
|
+
|
47
|
+
describe '#baz' do
|
48
|
+
end
|
49
|
+
end
|
50
|
+
RUBY
|
51
|
+
end
|
52
|
+
|
53
|
+
it 'approves empty line after context' do
|
54
|
+
expect_no_offenses(<<-RUBY)
|
55
|
+
RSpec.context 'foo' do
|
56
|
+
context 'bar' do
|
57
|
+
end
|
58
|
+
|
59
|
+
context 'baz' do
|
60
|
+
end
|
61
|
+
end
|
62
|
+
RUBY
|
63
|
+
end
|
64
|
+
|
65
|
+
bad_example = <<-RUBY
|
66
|
+
RSpec.describe Foo do
|
67
|
+
describe '#bar' do
|
68
|
+
end
|
69
|
+
describe '#baz' do
|
70
|
+
end
|
71
|
+
end
|
72
|
+
RUBY
|
73
|
+
|
74
|
+
good_example = <<-RUBY
|
75
|
+
RSpec.describe Foo do
|
76
|
+
describe '#bar' do
|
77
|
+
end
|
78
|
+
|
79
|
+
describe '#baz' do
|
80
|
+
end
|
81
|
+
end
|
82
|
+
RUBY
|
83
|
+
|
84
|
+
include_examples 'autocorrect',
|
85
|
+
bad_example,
|
86
|
+
good_example
|
87
|
+
end
|
@@ -19,9 +19,9 @@ RSpec.describe RuboCop::Cop::RSpec::EmptyLineAfterFinalLet do
|
|
19
19
|
RSpec.describe User do
|
20
20
|
let(:a) { a }
|
21
21
|
let!(:b) do
|
22
|
-
^^^^^^^^^^^ Add an empty line after the last `let` block.
|
23
22
|
b
|
24
23
|
end
|
24
|
+
^^^ Add an empty line after the last `let` block.
|
25
25
|
it { expect(a).to eq(b) }
|
26
26
|
end
|
27
27
|
RUBY
|
@@ -143,6 +143,21 @@ RSpec.describe RuboCop::Cop::RSpec::EmptyLineAfterFinalLet do
|
|
143
143
|
RUBY
|
144
144
|
end
|
145
145
|
|
146
|
+
it 'handles silly HEREDOC offense' do
|
147
|
+
expect_offense(<<-RUBY)
|
148
|
+
RSpec.describe 'silly heredoc syntax' do
|
149
|
+
let(:foo) { <<-BAR }
|
150
|
+
hello
|
151
|
+
world
|
152
|
+
BAR
|
153
|
+
^^^ Add an empty line after the last `let` block.
|
154
|
+
it 'has tricky syntax' do
|
155
|
+
expect(foo).to eql(" hello\n world\n")
|
156
|
+
end
|
157
|
+
end
|
158
|
+
RUBY
|
159
|
+
end
|
160
|
+
|
146
161
|
bad_example = <<-RUBY
|
147
162
|
RSpec.describe User do
|
148
163
|
let(:params) { foo }
|
@@ -185,6 +200,31 @@ RSpec.describe RuboCop::Cop::RSpec::EmptyLineAfterFinalLet do
|
|
185
200
|
end
|
186
201
|
RUBY
|
187
202
|
|
203
|
+
include_examples 'autocorrect',
|
204
|
+
bad_example,
|
205
|
+
good_example
|
206
|
+
|
207
|
+
bad_example = <<-RUBY
|
208
|
+
RSpec.describe User do
|
209
|
+
let(:params) { <<-DOC }
|
210
|
+
I'm super annoying!
|
211
|
+
DOC
|
212
|
+
it 'has a new line' do
|
213
|
+
end
|
214
|
+
end
|
215
|
+
RUBY
|
216
|
+
|
217
|
+
good_example = <<-RUBY
|
218
|
+
RSpec.describe User do
|
219
|
+
let(:params) { <<-DOC }
|
220
|
+
I'm super annoying!
|
221
|
+
DOC
|
222
|
+
|
223
|
+
it 'has a new line' do
|
224
|
+
end
|
225
|
+
end
|
226
|
+
RUBY
|
227
|
+
|
188
228
|
include_examples 'autocorrect',
|
189
229
|
bad_example,
|
190
230
|
good_example
|
@@ -0,0 +1,128 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
RSpec.describe RuboCop::Cop::RSpec::EmptyLineAfterHook do
|
4
|
+
subject(:cop) { described_class.new }
|
5
|
+
|
6
|
+
it 'checks for empty line after `before` hook' do
|
7
|
+
expect_offense(<<-RUBY)
|
8
|
+
RSpec.describe User do
|
9
|
+
before { do_something }
|
10
|
+
^^^^^^^^^^^^^^^^^^^^^^^ Add an empty line after `before`.
|
11
|
+
it { does_something }
|
12
|
+
end
|
13
|
+
RUBY
|
14
|
+
end
|
15
|
+
|
16
|
+
it 'checks for empty line after `after` hook' do
|
17
|
+
expect_offense(<<-RUBY)
|
18
|
+
RSpec.describe User do
|
19
|
+
after { do_something }
|
20
|
+
^^^^^^^^^^^^^^^^^^^^^^ Add an empty line after `after`.
|
21
|
+
it { does_something }
|
22
|
+
end
|
23
|
+
RUBY
|
24
|
+
end
|
25
|
+
|
26
|
+
it 'checks for empty line after `around` hook' do
|
27
|
+
expect_offense(<<-RUBY)
|
28
|
+
RSpec.describe User do
|
29
|
+
around { |test| test.run }
|
30
|
+
^^^^^^^^^^^^^^^^^^^^^^^^^^ Add an empty line after `around`.
|
31
|
+
it { does_something }
|
32
|
+
end
|
33
|
+
RUBY
|
34
|
+
end
|
35
|
+
|
36
|
+
it 'approves empty line after `before` hook' do
|
37
|
+
expect_no_offenses(<<-RUBY)
|
38
|
+
RSpec.describe User do
|
39
|
+
before { do_something }
|
40
|
+
|
41
|
+
it { does_something }
|
42
|
+
end
|
43
|
+
RUBY
|
44
|
+
end
|
45
|
+
|
46
|
+
it 'approves empty line after `after` hook' do
|
47
|
+
expect_no_offenses(<<-RUBY)
|
48
|
+
RSpec.describe User do
|
49
|
+
after { do_something }
|
50
|
+
|
51
|
+
it { does_something }
|
52
|
+
end
|
53
|
+
RUBY
|
54
|
+
end
|
55
|
+
|
56
|
+
it 'approves empty line after `around` hook' do
|
57
|
+
expect_no_offenses(<<-RUBY)
|
58
|
+
RSpec.describe User do
|
59
|
+
around { |test| test.run }
|
60
|
+
|
61
|
+
it { does_something }
|
62
|
+
end
|
63
|
+
RUBY
|
64
|
+
end
|
65
|
+
|
66
|
+
it 'handles multiline `before` block' do
|
67
|
+
expect_no_offenses(<<-RUBY)
|
68
|
+
RSpec.describe User do
|
69
|
+
before do
|
70
|
+
do_something
|
71
|
+
end
|
72
|
+
|
73
|
+
it { does_something }
|
74
|
+
end
|
75
|
+
RUBY
|
76
|
+
end
|
77
|
+
|
78
|
+
it 'handles multiline `after` block' do
|
79
|
+
expect_no_offenses(<<-RUBY)
|
80
|
+
RSpec.describe User do
|
81
|
+
after do
|
82
|
+
do_something
|
83
|
+
end
|
84
|
+
|
85
|
+
it { does_something }
|
86
|
+
end
|
87
|
+
RUBY
|
88
|
+
end
|
89
|
+
|
90
|
+
it 'handles multiline `around` block' do
|
91
|
+
expect_no_offenses(<<-RUBY)
|
92
|
+
RSpec.describe User do
|
93
|
+
around do |test|
|
94
|
+
test.run
|
95
|
+
end
|
96
|
+
|
97
|
+
it { does_something }
|
98
|
+
end
|
99
|
+
RUBY
|
100
|
+
end
|
101
|
+
|
102
|
+
it 'handles `before` being the latest node' do
|
103
|
+
expect_no_offenses(<<-RUBY)
|
104
|
+
RSpec.describe User do
|
105
|
+
before { do_something }
|
106
|
+
end
|
107
|
+
RUBY
|
108
|
+
end
|
109
|
+
|
110
|
+
bad_example = <<-RUBY
|
111
|
+
RSpec.describe User do
|
112
|
+
before { do_something }
|
113
|
+
it { does_something }
|
114
|
+
end
|
115
|
+
RUBY
|
116
|
+
|
117
|
+
good_example = <<-RUBY
|
118
|
+
RSpec.describe User do
|
119
|
+
before { do_something }
|
120
|
+
|
121
|
+
it { does_something }
|
122
|
+
end
|
123
|
+
RUBY
|
124
|
+
|
125
|
+
include_examples 'autocorrect',
|
126
|
+
bad_example,
|
127
|
+
good_example
|
128
|
+
end
|
@@ -20,7 +20,7 @@ RSpec.describe RuboCop::Cop::RSpec::LeadingSubject do
|
|
20
20
|
let!(:params) { foo }
|
21
21
|
|
22
22
|
subject { described_class.new }
|
23
|
-
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Declare `subject` above any other `let
|
23
|
+
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Declare `subject` above any other `let!` declarations.
|
24
24
|
end
|
25
25
|
RUBY
|
26
26
|
end
|
@@ -63,8 +63,31 @@ RSpec.describe RuboCop::Cop::RSpec::LeadingSubject do
|
|
63
63
|
RUBY
|
64
64
|
end
|
65
65
|
|
66
|
+
it 'checks subject below hook' do
|
67
|
+
expect_offense(<<-RUBY)
|
68
|
+
RSpec.describe User do
|
69
|
+
before { allow(Foo).to receive(:bar) }
|
70
|
+
|
71
|
+
subject { described_class.new }
|
72
|
+
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Declare `subject` above any other `before` declarations.
|
73
|
+
end
|
74
|
+
RUBY
|
75
|
+
end
|
76
|
+
|
77
|
+
it 'checks subject below example' do
|
78
|
+
expect_offense(<<-RUBY)
|
79
|
+
RSpec.describe User do
|
80
|
+
it { is_expected.to be_present }
|
81
|
+
|
82
|
+
subject { described_class.new }
|
83
|
+
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Declare `subject` above any other `it` declarations.
|
84
|
+
end
|
85
|
+
RUBY
|
86
|
+
end
|
87
|
+
|
66
88
|
bad_code = <<-RUBY
|
67
89
|
RSpec.describe User do
|
90
|
+
before { allow(Foo).to receive(:bar) }
|
68
91
|
let(:params) { foo }
|
69
92
|
let(:bar) { baz }
|
70
93
|
|
@@ -76,6 +99,7 @@ RSpec.describe RuboCop::Cop::RSpec::LeadingSubject do
|
|
76
99
|
good_code = <<-RUBY
|
77
100
|
RSpec.describe User do
|
78
101
|
subject { described_class.new }
|
102
|
+
before { allow(Foo).to receive(:bar) }
|
79
103
|
let(:params) { foo }
|
80
104
|
let(:bar) { baz }
|
81
105
|
|
@@ -7,7 +7,16 @@ RSpec.describe RuboCop::Cop::RSpec::NotToNot, :config do
|
|
7
7
|
it 'detects the `to_not` offense' do
|
8
8
|
expect_offense(<<-RUBY)
|
9
9
|
it { expect(false).to_not be_true }
|
10
|
-
|
10
|
+
^^^^^^ Prefer `not_to` over `to_not`.
|
11
|
+
RUBY
|
12
|
+
end
|
13
|
+
|
14
|
+
it 'detects the `to_not` offense on an expect block' do
|
15
|
+
expect_offense(<<-RUBY)
|
16
|
+
expect {
|
17
|
+
2 + 2
|
18
|
+
}.to_not raise_error
|
19
|
+
^^^^^^ Prefer `not_to` over `to_not`.
|
11
20
|
RUBY
|
12
21
|
end
|
13
22
|
|
@@ -20,6 +29,18 @@ RSpec.describe RuboCop::Cop::RSpec::NotToNot, :config do
|
|
20
29
|
include_examples 'autocorrect',
|
21
30
|
'it { expect(0).to_not equal 1 }',
|
22
31
|
'it { expect(0).not_to equal 1 }'
|
32
|
+
|
33
|
+
original = <<-RUBY
|
34
|
+
expect {
|
35
|
+
2 + 2
|
36
|
+
}.to_not raise_error
|
37
|
+
RUBY
|
38
|
+
corrected = <<-RUBY
|
39
|
+
expect {
|
40
|
+
2 + 2
|
41
|
+
}.not_to raise_error
|
42
|
+
RUBY
|
43
|
+
include_examples 'autocorrect', original, corrected
|
23
44
|
end
|
24
45
|
|
25
46
|
context 'when AcceptedMethod is `to_not`' do
|
@@ -28,7 +49,16 @@ RSpec.describe RuboCop::Cop::RSpec::NotToNot, :config do
|
|
28
49
|
it 'detects the `not_to` offense' do
|
29
50
|
expect_offense(<<-RUBY)
|
30
51
|
it { expect(false).not_to be_true }
|
31
|
-
|
52
|
+
^^^^^^ Prefer `to_not` over `not_to`.
|
53
|
+
RUBY
|
54
|
+
end
|
55
|
+
|
56
|
+
it 'detects the `not_to` offense on an expect block' do
|
57
|
+
expect_offense(<<-RUBY)
|
58
|
+
expect {
|
59
|
+
2 + 2
|
60
|
+
}.not_to raise_error
|
61
|
+
^^^^^^ Prefer `to_not` over `not_to`.
|
32
62
|
RUBY
|
33
63
|
end
|
34
64
|
|
@@ -41,5 +71,17 @@ RSpec.describe RuboCop::Cop::RSpec::NotToNot, :config do
|
|
41
71
|
include_examples 'autocorrect',
|
42
72
|
'it { expect(0).not_to equal 1 }',
|
43
73
|
'it { expect(0).to_not equal 1 }'
|
74
|
+
|
75
|
+
original = <<-RUBY
|
76
|
+
expect {
|
77
|
+
2 + 2
|
78
|
+
}.not_to raise_error
|
79
|
+
RUBY
|
80
|
+
corrected = <<-RUBY
|
81
|
+
expect {
|
82
|
+
2 + 2
|
83
|
+
}.to_not raise_error
|
84
|
+
RUBY
|
85
|
+
include_examples 'autocorrect', original, corrected
|
44
86
|
end
|
45
87
|
end
|
@@ -66,6 +66,27 @@ RSpec.describe RuboCop::Cop::RSpec::OverwritingSetup do
|
|
66
66
|
RUBY
|
67
67
|
end
|
68
68
|
|
69
|
+
it 'handles dynamic names for `let`' do
|
70
|
+
expect_no_offenses(<<-RUBY)
|
71
|
+
RSpec.describe User do
|
72
|
+
subject(:name) { a }
|
73
|
+
|
74
|
+
let(name) { b }
|
75
|
+
end
|
76
|
+
RUBY
|
77
|
+
end
|
78
|
+
|
79
|
+
it 'handles string arguments' do
|
80
|
+
expect_offense(<<-RUBY)
|
81
|
+
RSpec.describe User do
|
82
|
+
subject(:name) { a }
|
83
|
+
|
84
|
+
let("name") { b }
|
85
|
+
^^^^^^^^^^^^^^^^^ `name` is already defined.
|
86
|
+
end
|
87
|
+
RUBY
|
88
|
+
end
|
89
|
+
|
69
90
|
it 'does not encounter an error when handling an empty describe' do
|
70
91
|
expect { inspect_source('RSpec.describe(User) do end', 'a_spec.rb') }
|
71
92
|
.not_to raise_error
|
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.27.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: 2018-06-
|
13
|
+
date: 2018-06-14 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.56.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.56.0
|
29
29
|
- !ruby/object:Gem::Dependency
|
30
30
|
name: rack
|
31
31
|
requirement: !ruby/object:Gem::Requirement
|
@@ -132,7 +132,9 @@ files:
|
|
132
132
|
- lib/rubocop/cop/rspec/describe_symbol.rb
|
133
133
|
- lib/rubocop/cop/rspec/described_class.rb
|
134
134
|
- lib/rubocop/cop/rspec/empty_example_group.rb
|
135
|
+
- lib/rubocop/cop/rspec/empty_line_after_example_group.rb
|
135
136
|
- lib/rubocop/cop/rspec/empty_line_after_final_let.rb
|
137
|
+
- lib/rubocop/cop/rspec/empty_line_after_hook.rb
|
136
138
|
- lib/rubocop/cop/rspec/empty_line_after_subject.rb
|
137
139
|
- lib/rubocop/cop/rspec/example_length.rb
|
138
140
|
- lib/rubocop/cop/rspec/example_without_description.rb
|
@@ -184,6 +186,7 @@ files:
|
|
184
186
|
- lib/rubocop/cop/rspec_cops.rb
|
185
187
|
- lib/rubocop/rspec.rb
|
186
188
|
- lib/rubocop/rspec/align_let_brace.rb
|
189
|
+
- lib/rubocop/rspec/blank_line_separation.rb
|
187
190
|
- lib/rubocop/rspec/capybara.rb
|
188
191
|
- lib/rubocop/rspec/concept.rb
|
189
192
|
- lib/rubocop/rspec/config_formatter.rb
|
@@ -191,6 +194,7 @@ files:
|
|
191
194
|
- lib/rubocop/rspec/example.rb
|
192
195
|
- lib/rubocop/rspec/example_group.rb
|
193
196
|
- lib/rubocop/rspec/factory_bot.rb
|
197
|
+
- lib/rubocop/rspec/final_end_location.rb
|
194
198
|
- lib/rubocop/rspec/hook.rb
|
195
199
|
- lib/rubocop/rspec/inject.rb
|
196
200
|
- lib/rubocop/rspec/language.rb
|
@@ -220,7 +224,9 @@ files:
|
|
220
224
|
- spec/rubocop/cop/rspec/describe_symbol_spec.rb
|
221
225
|
- spec/rubocop/cop/rspec/described_class_spec.rb
|
222
226
|
- spec/rubocop/cop/rspec/empty_example_group_spec.rb
|
227
|
+
- spec/rubocop/cop/rspec/empty_line_after_example_group_spec.rb
|
223
228
|
- spec/rubocop/cop/rspec/empty_line_after_final_let_spec.rb
|
229
|
+
- spec/rubocop/cop/rspec/empty_line_after_hook_spec.rb
|
224
230
|
- spec/rubocop/cop/rspec/empty_line_after_subject_spec.rb
|
225
231
|
- spec/rubocop/cop/rspec/example_length_spec.rb
|
226
232
|
- spec/rubocop/cop/rspec/example_without_description_spec.rb
|
@@ -327,7 +333,9 @@ test_files:
|
|
327
333
|
- spec/rubocop/cop/rspec/describe_symbol_spec.rb
|
328
334
|
- spec/rubocop/cop/rspec/described_class_spec.rb
|
329
335
|
- spec/rubocop/cop/rspec/empty_example_group_spec.rb
|
336
|
+
- spec/rubocop/cop/rspec/empty_line_after_example_group_spec.rb
|
330
337
|
- spec/rubocop/cop/rspec/empty_line_after_final_let_spec.rb
|
338
|
+
- spec/rubocop/cop/rspec/empty_line_after_hook_spec.rb
|
331
339
|
- spec/rubocop/cop/rspec/empty_line_after_subject_spec.rb
|
332
340
|
- spec/rubocop/cop/rspec/example_length_spec.rb
|
333
341
|
- spec/rubocop/cop/rspec/example_without_description_spec.rb
|