rubocop-rspec 2.4.0 → 2.5.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/CHANGELOG.md +16 -0
- data/config/default.yml +21 -1
- data/lib/rubocop/cop/rspec/empty_hook.rb +4 -1
- data/lib/rubocop/cop/rspec/excessive_docstring_spacing.rb +96 -0
- data/lib/rubocop/cop/rspec/hook_argument.rb +1 -1
- data/lib/rubocop/cop/rspec/iterated_expectation.rb +2 -0
- data/lib/rubocop/cop/rspec/nested_groups.rb +1 -1
- data/lib/rubocop/cop/rspec/subject_declaration.rb +47 -0
- data/lib/rubocop/cop/rspec_cops.rb +2 -0
- data/lib/rubocop/rspec/version.rb +1 -1
- metadata +24 -22
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 22b3b217241494fa4c167f2e15e07a19d360d5807d0278d58b0a5504c9268b8d
|
4
|
+
data.tar.gz: 9111683fcaefd7c78675ce0549fa7e2a6a0c06a1b41e99b98472bd92b7459d03
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4276ab19bc2cbaad8649d0380b77be083d3afb21397ea63614b1a6275fc47b615c1f418d3ebbdf44e4bd674d3d663c896d74863798a1c2b208d06d5ac248e777
|
7
|
+
data.tar.gz: 0b95a2233468bd4cd06596fe0a7c37d1f36e9481815cda16aa287eb8d479274e0aac813ceb2eede688853506fb023e7e469292713e4288271049573536ccbe94
|
data/CHANGELOG.md
CHANGED
@@ -2,6 +2,17 @@
|
|
2
2
|
|
3
3
|
## Master (Unreleased)
|
4
4
|
|
5
|
+
## 2.5.0 (2021-09-21)
|
6
|
+
|
7
|
+
* Declare autocorrect as unsafe for `ExpectChange`. ([@francois-ferrandis][])
|
8
|
+
* Fix each example for `RSpec/HookArgument`. ([@lokhi][])
|
9
|
+
* Exclude unrelated Rails directories from `RSpec/DescribeClass`. ([@MothOnMars][])
|
10
|
+
* Add `RSpec/ExcessiveDocstringSpacing` cop. ([@G-Rath][])
|
11
|
+
* Add `RSpec/SubjectDeclaration` cop. ([@dswij][])
|
12
|
+
* Fix excessive whitespace removal in `RSpec/EmptyHook` autocorrection. ([@pirj][])
|
13
|
+
* Bump RuboCop requirement to v1.19.0. ([@pirj][])
|
14
|
+
* Fix false positive in `RSpec/IteratedExpectation` when there is single, non-expectation statement in the block body. ([@Darhazer][])
|
15
|
+
|
5
16
|
## 2.4.0 (2021-06-09)
|
6
17
|
|
7
18
|
* Update `RSpec/FilePath` to check suffix when given a non-constant top-level node (e.g. features). ([@topalovic][])
|
@@ -625,3 +636,8 @@ Compatibility release so users can upgrade RuboCop to 0.51.0. No new features.
|
|
625
636
|
[@rrosenblum]: https://github.com/rrosenblum
|
626
637
|
[@paydaylight]: https://github.com/paydaylight
|
627
638
|
[@topalovic]: https://github.com/topalovic
|
639
|
+
[@lokhi]: https://github.com/lokhi
|
640
|
+
[@MothOnMars]: https://github.com/MothOnMars
|
641
|
+
[@G-Rath]: https://github.com/G-Rath
|
642
|
+
[@dswij]: https://github.com/dswij
|
643
|
+
[@francois-ferrandis]: https://github.com/francois-ferrandis
|
data/config/default.yml
CHANGED
@@ -148,6 +148,12 @@ RSpec/ContextWording:
|
|
148
148
|
RSpec/DescribeClass:
|
149
149
|
Description: Check that the first argument to the top-level describe is a constant.
|
150
150
|
Enabled: true
|
151
|
+
Exclude:
|
152
|
+
- "**/spec/features/**/*"
|
153
|
+
- "**/spec/requests/**/*"
|
154
|
+
- "**/spec/routing/**/*"
|
155
|
+
- "**/spec/system/**/*"
|
156
|
+
- "**/spec/views/**/*"
|
151
157
|
IgnoredMetadata:
|
152
158
|
type:
|
153
159
|
- channel
|
@@ -164,7 +170,7 @@ RSpec/DescribeClass:
|
|
164
170
|
- mailbox
|
165
171
|
- aruba
|
166
172
|
VersionAdded: '1.0'
|
167
|
-
VersionChanged: '
|
173
|
+
VersionChanged: '2.5'
|
168
174
|
StyleGuide: https://www.rubydoc.info/gems/rubocop-rspec/RuboCop/Cop/RSpec/DescribeClass
|
169
175
|
|
170
176
|
RSpec/DescribeMethod:
|
@@ -269,6 +275,12 @@ RSpec/ExampleWithoutDescription:
|
|
269
275
|
VersionAdded: '1.22'
|
270
276
|
StyleGuide: https://www.rubydoc.info/gems/rubocop-rspec/RuboCop/Cop/RSpec/ExampleWithoutDescription
|
271
277
|
|
278
|
+
RSpec/ExcessiveDocstringSpacing:
|
279
|
+
Description: Checks for excessive whitespace in example descriptions.
|
280
|
+
Enabled: pending
|
281
|
+
VersionAdded: '2.5'
|
282
|
+
StyleGuide: https://www.rubydoc.info/gems/rubocop-rspec/RuboCop/Cop/RSpec/ExcessiveDocstringSpacing
|
283
|
+
|
272
284
|
RSpec/ExampleWording:
|
273
285
|
Description: Checks for common mistakes in example descriptions.
|
274
286
|
Enabled: true
|
@@ -297,7 +309,9 @@ RSpec/ExpectChange:
|
|
297
309
|
SupportedStyles:
|
298
310
|
- method_call
|
299
311
|
- block
|
312
|
+
SafeAutoCorrect: false
|
300
313
|
VersionAdded: '1.22'
|
314
|
+
VersionChanged: '2.5'
|
301
315
|
StyleGuide: https://www.rubydoc.info/gems/rubocop-rspec/RuboCop/Cop/RSpec/ExpectChange
|
302
316
|
|
303
317
|
RSpec/ExpectInHook:
|
@@ -643,6 +657,12 @@ RSpec/StubbedMock:
|
|
643
657
|
VersionAdded: '1.44'
|
644
658
|
StyleGuide: https://www.rubydoc.info/gems/rubocop-rspec/RuboCop/Cop/RSpec/StubbedMock
|
645
659
|
|
660
|
+
RSpec/SubjectDeclaration:
|
661
|
+
Description: Ensure that subject is defined using subject helper.
|
662
|
+
Enabled: pending
|
663
|
+
VersionAdded: '2.5'
|
664
|
+
StyleGuide: https://www.rubydoc.info/gems/rubocop-rspec/RuboCop/Cop/RSpec/SubjectDeclaration
|
665
|
+
|
646
666
|
RSpec/SubjectStub:
|
647
667
|
Description: Checks for stubbed test subjects.
|
648
668
|
Enabled: true
|
@@ -36,7 +36,10 @@ module RuboCop
|
|
36
36
|
def on_block(node)
|
37
37
|
empty_hook?(node) do |hook|
|
38
38
|
add_offense(hook) do |corrector|
|
39
|
-
range = range_with_surrounding_space(
|
39
|
+
range = range_with_surrounding_space(
|
40
|
+
range: node.loc.expression,
|
41
|
+
side: :left
|
42
|
+
)
|
40
43
|
corrector.remove(range)
|
41
44
|
end
|
42
45
|
end
|
@@ -0,0 +1,96 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RuboCop
|
4
|
+
module Cop
|
5
|
+
module RSpec
|
6
|
+
# Checks for excessive whitespace in example descriptions.
|
7
|
+
#
|
8
|
+
# @example
|
9
|
+
# # bad
|
10
|
+
# it ' has excessive spacing ' do
|
11
|
+
# end
|
12
|
+
#
|
13
|
+
# # good
|
14
|
+
# it 'has excessive spacing' do
|
15
|
+
# end
|
16
|
+
#
|
17
|
+
# @example
|
18
|
+
# # bad
|
19
|
+
# context ' when a condition is met ' do
|
20
|
+
# end
|
21
|
+
#
|
22
|
+
# # good
|
23
|
+
# context 'when a condition is met' do
|
24
|
+
# end
|
25
|
+
class ExcessiveDocstringSpacing < Base
|
26
|
+
extend AutoCorrector
|
27
|
+
|
28
|
+
MSG = 'Excessive whitespace.'
|
29
|
+
|
30
|
+
# @!method example_description(node)
|
31
|
+
def_node_matcher :example_description, <<-PATTERN
|
32
|
+
(send _ {#Examples.all #ExampleGroups.all} ${
|
33
|
+
$str
|
34
|
+
$(dstr ({str dstr `sym} ...) ...)
|
35
|
+
} ...)
|
36
|
+
PATTERN
|
37
|
+
|
38
|
+
def on_send(node)
|
39
|
+
example_description(node) do |description_node, message|
|
40
|
+
text = text(message)
|
41
|
+
|
42
|
+
return unless excessive_whitespace?(text)
|
43
|
+
|
44
|
+
add_whitespace_offense(description_node, text)
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
private
|
49
|
+
|
50
|
+
# @param text [String]
|
51
|
+
def excessive_whitespace?(text)
|
52
|
+
text.start_with?(' ') || text.include?(' ') || text.end_with?(' ')
|
53
|
+
end
|
54
|
+
|
55
|
+
# @param text [String]
|
56
|
+
def strip_excessive_whitespace(text)
|
57
|
+
text.strip.gsub(/ +/, ' ')
|
58
|
+
end
|
59
|
+
|
60
|
+
# @param node [RuboCop::AST::Node]
|
61
|
+
# @param text [String]
|
62
|
+
def add_whitespace_offense(node, text)
|
63
|
+
docstring = docstring(node)
|
64
|
+
corrected = strip_excessive_whitespace(text)
|
65
|
+
|
66
|
+
add_offense(docstring) do |corrector|
|
67
|
+
corrector.replace(docstring, corrected)
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
def docstring(node)
|
72
|
+
expr = node.loc.expression
|
73
|
+
|
74
|
+
Parser::Source::Range.new(
|
75
|
+
expr.source_buffer,
|
76
|
+
expr.begin_pos + 1,
|
77
|
+
expr.end_pos - 1
|
78
|
+
)
|
79
|
+
end
|
80
|
+
|
81
|
+
# Recursive processing is required to process nested dstr nodes
|
82
|
+
# that is the case for \-separated multiline strings with interpolation.
|
83
|
+
def text(node)
|
84
|
+
case node.type
|
85
|
+
when :dstr
|
86
|
+
node.node_parts.map { |child_node| text(child_node) }.join
|
87
|
+
when :str, :sym
|
88
|
+
node.value
|
89
|
+
when :begin
|
90
|
+
node.source
|
91
|
+
end
|
92
|
+
end
|
93
|
+
end
|
94
|
+
end
|
95
|
+
end
|
96
|
+
end
|
@@ -0,0 +1,47 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RuboCop
|
4
|
+
module Cop
|
5
|
+
module RSpec
|
6
|
+
# Ensure that subject is defined using subject helper.
|
7
|
+
#
|
8
|
+
# @example
|
9
|
+
#
|
10
|
+
# # bad
|
11
|
+
# let(:subject) { foo }
|
12
|
+
# let!(:subject) { foo }
|
13
|
+
# subject(:subject) { foo }
|
14
|
+
# subject!(:subject) { foo }
|
15
|
+
#
|
16
|
+
# # bad
|
17
|
+
# block = -> {}
|
18
|
+
# let(:subject, &block)
|
19
|
+
#
|
20
|
+
# # good
|
21
|
+
# subject(:test_subject) { foo }
|
22
|
+
#
|
23
|
+
class SubjectDeclaration < Base
|
24
|
+
MSG_LET = 'Use subject explicitly rather than using let'
|
25
|
+
MSG_REDUNDANT = 'Ambiguous declaration of subject'
|
26
|
+
|
27
|
+
# @!method offensive_subject_declaration?(node)
|
28
|
+
def_node_matcher :offensive_subject_declaration?, <<~PATTERN
|
29
|
+
(send nil? ${#Subjects.all #Helpers.all} {(sym :subject) (str "subject")} ...)
|
30
|
+
PATTERN
|
31
|
+
|
32
|
+
def on_send(node)
|
33
|
+
offense = offensive_subject_declaration?(node)
|
34
|
+
return unless offense
|
35
|
+
|
36
|
+
add_offense(node, message: message_for(offense))
|
37
|
+
end
|
38
|
+
|
39
|
+
private
|
40
|
+
|
41
|
+
def message_for(offense)
|
42
|
+
Helpers.all(offense) ? MSG_LET : MSG_REDUNDANT
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
@@ -40,6 +40,7 @@ require_relative 'rspec/empty_line_after_subject'
|
|
40
40
|
require_relative 'rspec/example_length'
|
41
41
|
require_relative 'rspec/example_without_description'
|
42
42
|
require_relative 'rspec/example_wording'
|
43
|
+
require_relative 'rspec/excessive_docstring_spacing'
|
43
44
|
require_relative 'rspec/expect_actual'
|
44
45
|
require_relative 'rspec/expect_change'
|
45
46
|
require_relative 'rspec/expect_in_hook'
|
@@ -88,6 +89,7 @@ require_relative 'rspec/shared_context'
|
|
88
89
|
require_relative 'rspec/shared_examples'
|
89
90
|
require_relative 'rspec/single_argument_message_chain'
|
90
91
|
require_relative 'rspec/stubbed_mock'
|
92
|
+
require_relative 'rspec/subject_declaration'
|
91
93
|
require_relative 'rspec/subject_stub'
|
92
94
|
require_relative 'rspec/unspecified_exception'
|
93
95
|
require_relative 'rspec/variable_definition'
|
metadata
CHANGED
@@ -1,16 +1,16 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rubocop-rspec
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.
|
4
|
+
version: 2.5.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- John Backus
|
8
8
|
- Ian MacLeod
|
9
9
|
- Nils Gemeinhardt
|
10
|
-
autorequire:
|
10
|
+
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date: 2021-
|
13
|
+
date: 2021-09-21 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: rubocop
|
@@ -18,28 +18,14 @@ dependencies:
|
|
18
18
|
requirements:
|
19
19
|
- - "~>"
|
20
20
|
- !ruby/object:Gem::Version
|
21
|
-
version: '1.
|
21
|
+
version: '1.19'
|
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: '1.
|
29
|
-
- !ruby/object:Gem::Dependency
|
30
|
-
name: rubocop-ast
|
31
|
-
requirement: !ruby/object:Gem::Requirement
|
32
|
-
requirements:
|
33
|
-
- - ">="
|
34
|
-
- !ruby/object:Gem::Version
|
35
|
-
version: 1.1.0
|
36
|
-
type: :runtime
|
37
|
-
prerelease: false
|
38
|
-
version_requirements: !ruby/object:Gem::Requirement
|
39
|
-
requirements:
|
40
|
-
- - ">="
|
41
|
-
- !ruby/object:Gem::Version
|
42
|
-
version: 1.1.0
|
28
|
+
version: '1.19'
|
43
29
|
- !ruby/object:Gem::Dependency
|
44
30
|
name: rack
|
45
31
|
requirement: !ruby/object:Gem::Requirement
|
@@ -96,6 +82,20 @@ dependencies:
|
|
96
82
|
- - "~>"
|
97
83
|
- !ruby/object:Gem::Version
|
98
84
|
version: '1.7'
|
85
|
+
- !ruby/object:Gem::Dependency
|
86
|
+
name: rubocop-rake
|
87
|
+
requirement: !ruby/object:Gem::Requirement
|
88
|
+
requirements:
|
89
|
+
- - "~>"
|
90
|
+
- !ruby/object:Gem::Version
|
91
|
+
version: '0.6'
|
92
|
+
type: :development
|
93
|
+
prerelease: false
|
94
|
+
version_requirements: !ruby/object:Gem::Requirement
|
95
|
+
requirements:
|
96
|
+
- - "~>"
|
97
|
+
- !ruby/object:Gem::Version
|
98
|
+
version: '0.6'
|
99
99
|
- !ruby/object:Gem::Dependency
|
100
100
|
name: simplecov
|
101
101
|
requirement: !ruby/object:Gem::Requirement
|
@@ -172,6 +172,7 @@ files:
|
|
172
172
|
- lib/rubocop/cop/rspec/example_length.rb
|
173
173
|
- lib/rubocop/cop/rspec/example_without_description.rb
|
174
174
|
- lib/rubocop/cop/rspec/example_wording.rb
|
175
|
+
- lib/rubocop/cop/rspec/excessive_docstring_spacing.rb
|
175
176
|
- lib/rubocop/cop/rspec/expect_actual.rb
|
176
177
|
- lib/rubocop/cop/rspec/expect_change.rb
|
177
178
|
- lib/rubocop/cop/rspec/expect_in_hook.rb
|
@@ -230,6 +231,7 @@ files:
|
|
230
231
|
- lib/rubocop/cop/rspec/shared_examples.rb
|
231
232
|
- lib/rubocop/cop/rspec/single_argument_message_chain.rb
|
232
233
|
- lib/rubocop/cop/rspec/stubbed_mock.rb
|
234
|
+
- lib/rubocop/cop/rspec/subject_declaration.rb
|
233
235
|
- lib/rubocop/cop/rspec/subject_stub.rb
|
234
236
|
- lib/rubocop/cop/rspec/unspecified_exception.rb
|
235
237
|
- lib/rubocop/cop/rspec/variable_definition.rb
|
@@ -259,7 +261,7 @@ licenses:
|
|
259
261
|
metadata:
|
260
262
|
changelog_uri: https://github.com/rubocop/rubocop-rspec/blob/master/CHANGELOG.md
|
261
263
|
documentation_uri: https://docs.rubocop.org/rubocop-rspec/
|
262
|
-
post_install_message:
|
264
|
+
post_install_message:
|
263
265
|
rdoc_options: []
|
264
266
|
require_paths:
|
265
267
|
- lib
|
@@ -274,8 +276,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
274
276
|
- !ruby/object:Gem::Version
|
275
277
|
version: '0'
|
276
278
|
requirements: []
|
277
|
-
rubygems_version: 3.2
|
278
|
-
signing_key:
|
279
|
+
rubygems_version: 3.1.2
|
280
|
+
signing_key:
|
279
281
|
specification_version: 4
|
280
282
|
summary: Code style checking for RSpec files
|
281
283
|
test_files: []
|