rubocop-rspec 2.25.0 → 2.26.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 +12 -0
- data/config/default.yml +19 -2
- data/lib/rubocop/cop/rspec/around_block.rb +3 -3
- data/lib/rubocop/cop/rspec/be.rb +1 -1
- data/lib/rubocop/cop/rspec/be_eq.rb +1 -1
- data/lib/rubocop/cop/rspec/be_eql.rb +1 -1
- data/lib/rubocop/cop/rspec/be_nil.rb +2 -2
- data/lib/rubocop/cop/rspec/before_after_all.rb +7 -13
- data/lib/rubocop/cop/rspec/capybara/feature_methods.rb +2 -2
- data/lib/rubocop/cop/rspec/change_by_zero.rb +3 -3
- data/lib/rubocop/cop/rspec/context_method.rb +2 -2
- data/lib/rubocop/cop/rspec/context_wording.rb +1 -1
- data/lib/rubocop/cop/rspec/describe_symbol.rb +1 -1
- data/lib/rubocop/cop/rspec/described_class.rb +5 -5
- data/lib/rubocop/cop/rspec/empty_example_group.rb +2 -2
- data/lib/rubocop/cop/rspec/empty_line_after_example.rb +2 -2
- data/lib/rubocop/cop/rspec/example_wording.rb +11 -2
- data/lib/rubocop/cop/rspec/excessive_docstring_spacing.rb +1 -1
- data/lib/rubocop/cop/rspec/expect_change.rb +2 -2
- data/lib/rubocop/cop/rspec/focus.rb +2 -2
- data/lib/rubocop/cop/rspec/hook_argument.rb +2 -2
- data/lib/rubocop/cop/rspec/hooks_before_examples.rb +1 -1
- data/lib/rubocop/cop/rspec/implicit_block_expectation.rb +2 -2
- data/lib/rubocop/cop/rspec/implicit_expect.rb +1 -1
- data/lib/rubocop/cop/rspec/implicit_subject.rb +2 -2
- data/lib/rubocop/cop/rspec/instance_spy.rb +2 -2
- data/lib/rubocop/cop/rspec/instance_variable.rb +2 -2
- data/lib/rubocop/cop/rspec/iterated_expectation.rb +3 -3
- data/lib/rubocop/cop/rspec/let_before_examples.rb +1 -1
- data/lib/rubocop/cop/rspec/let_setup.rb +1 -1
- data/lib/rubocop/cop/rspec/message_expectation.rb +1 -1
- data/lib/rubocop/cop/rspec/mixin/skip_or_pending.rb +2 -2
- data/lib/rubocop/cop/rspec/multiple_expectations.rb +2 -2
- data/lib/rubocop/cop/rspec/pending.rb +1 -1
- data/lib/rubocop/cop/rspec/pending_without_reason.rb +1 -1
- data/lib/rubocop/cop/rspec/predicate_matcher.rb +6 -6
- data/lib/rubocop/cop/rspec/rails/avoid_setup_hook.rb +1 -1
- data/lib/rubocop/cop/rspec/rails/have_http_status.rb +1 -1
- data/lib/rubocop/cop/rspec/rails/http_status.rb +1 -1
- data/lib/rubocop/cop/rspec/rails/minitest_assertions.rb +2 -2
- data/lib/rubocop/cop/rspec/receive_counts.rb +1 -1
- data/lib/rubocop/cop/rspec/receive_messages.rb +1 -1
- data/lib/rubocop/cop/rspec/redundant_predicate_matcher.rb +65 -0
- data/lib/rubocop/cop/rspec/remove_const.rb +40 -0
- data/lib/rubocop/cop/rspec/repeated_example_group_body.rb +1 -1
- data/lib/rubocop/cop/rspec/repeated_example_group_description.rb +2 -2
- data/lib/rubocop/cop/rspec/repeated_include_example.rb +1 -1
- data/lib/rubocop/cop/rspec/return_from_stub.rb +1 -1
- data/lib/rubocop/cop/rspec/shared_context.rb +1 -1
- data/lib/rubocop/cop/rspec/shared_examples.rb +63 -16
- data/lib/rubocop/cop/rspec/single_argument_message_chain.rb +1 -1
- data/lib/rubocop/cop/rspec/stubbed_mock.rb +1 -1
- data/lib/rubocop/cop/rspec/subject_stub.rb +4 -4
- data/lib/rubocop/cop/rspec/unspecified_exception.rb +2 -2
- data/lib/rubocop/cop/rspec/variable_definition.rb +2 -2
- data/lib/rubocop/cop/rspec/verified_doubles.rb +1 -1
- data/lib/rubocop/cop/rspec/void_expect.rb +2 -2
- data/lib/rubocop/cop/rspec_cops.rb +2 -0
- data/lib/rubocop/rspec/language.rb +8 -8
- data/lib/rubocop/rspec/version.rb +1 -1
- data/lib/rubocop/rspec/wording.rb +8 -0
- metadata +8 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 5f2e44d1764d0cea711adf5ea346e895d6d6ff805de65da2a85ea842a046fce0
|
4
|
+
data.tar.gz: 382cbaeabb62b1fb6e11298d99800c0db8de3350eeec154194d8a018ac74f1ac
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ef7d2b26f8cee852c069f9d2f847c6041ae083fcb4a4940adde810687c8745a612d9abe7445ee3a8548b2047b7d13ac050f8589821f478d0443939ba38830901
|
7
|
+
data.tar.gz: ef690c9604c7d21cf95f997112052af66190569945a2065d8ac299f5b3b1aa960130c8f03a337482646983ec0b7632390074837723db23bd21047c51a1984ae8
|
data/CHANGELOG.md
CHANGED
@@ -2,6 +2,14 @@
|
|
2
2
|
|
3
3
|
## Master (Unreleased)
|
4
4
|
|
5
|
+
## 2.26.0 (2024-01-04)
|
6
|
+
|
7
|
+
- Add new `RSpec/RedundantPredicateMatcher` cop. ([@ydah])
|
8
|
+
- Add new `RSpec/RemoveConst` cop. ([@swelther])
|
9
|
+
- Add support for correcting "it will" (future tense) for `RSpec/ExampleWording`. ([@jdufresne])
|
10
|
+
- Add support for `symbol` style for `RSpec/SharedExamples`. ([@jessieay])
|
11
|
+
- Ensure `PendingWithoutReason` can detect violations inside shared groups. ([@robinaugh])
|
12
|
+
|
5
13
|
## 2.25.0 (2023-10-27)
|
6
14
|
|
7
15
|
- Add support single quoted string and percent string and heredoc for `RSpec/Rails/HttpStatus`. ([@ydah])
|
@@ -855,7 +863,9 @@ Compatibility release so users can upgrade RuboCop to 0.51.0. No new features.
|
|
855
863
|
[@ignaciovillaverde]: https://github.com/ignaciovillaverde
|
856
864
|
[@jaredbeck]: https://github.com/jaredbeck
|
857
865
|
[@jaredmoody]: https://github.com/jaredmoody
|
866
|
+
[@jdufresne]: https://github.com/jdufresne
|
858
867
|
[@jeffreyc]: https://github.com/jeffreyc
|
868
|
+
[@jessieay]: https://github.com/jessieay
|
859
869
|
[@jfragoulis]: https://github.com/jfragoulis
|
860
870
|
[@johnny-miyake]: https://github.com/johnny-miyake
|
861
871
|
[@jojos003]: https://github.com/jojos003
|
@@ -897,6 +907,7 @@ Compatibility release so users can upgrade RuboCop to 0.51.0. No new features.
|
|
897
907
|
[@rafix02]: https://github.com/Rafix02
|
898
908
|
[@redross]: https://github.com/redross
|
899
909
|
[@renanborgescampos]: https://github.com/renanborgescampos
|
910
|
+
[@robinaugh]: https://github.com/robinaugh
|
900
911
|
[@robotdana]: https://github.com/robotdana
|
901
912
|
[@rolfschmidt]: https://github.com/rolfschmidt
|
902
913
|
[@rrosenblum]: https://github.com/rrosenblum
|
@@ -909,6 +920,7 @@ Compatibility release so users can upgrade RuboCop to 0.51.0. No new features.
|
|
909
920
|
[@smcgivern]: https://github.com/smcgivern
|
910
921
|
[@splattael]: https://github.com/splattael
|
911
922
|
[@stephannv]: https://github.com/stephannv
|
923
|
+
[@swelther]: https://github.com/swelther
|
912
924
|
[@t3h2mas]: https://github.com/t3h2mas
|
913
925
|
[@tdeo]: https://github.com/tdeo
|
914
926
|
[@tejasbubane]: https://github.com/tejasbubane
|
data/config/default.yml
CHANGED
@@ -178,7 +178,7 @@ RSpec/BeNil:
|
|
178
178
|
Reference: https://www.rubydoc.info/gems/rubocop-rspec/RuboCop/Cop/RSpec/BeNil
|
179
179
|
|
180
180
|
RSpec/BeforeAfterAll:
|
181
|
-
Description: Check that before/after(:all) isn't being used.
|
181
|
+
Description: Check that before/after(:all/:context) isn't being used.
|
182
182
|
Enabled: true
|
183
183
|
Exclude:
|
184
184
|
- "**/spec/spec_helper.rb"
|
@@ -771,6 +771,18 @@ RSpec/RedundantAround:
|
|
771
771
|
VersionAdded: '2.19'
|
772
772
|
Reference: https://www.rubydoc.info/gems/rubocop-rspec/RuboCop/Cop/RSpec/RedundantAround
|
773
773
|
|
774
|
+
RSpec/RedundantPredicateMatcher:
|
775
|
+
Description: Checks for redundant predicate matcher.
|
776
|
+
Enabled: pending
|
777
|
+
VersionAdded: '2.26'
|
778
|
+
Reference: https://www.rubydoc.info/gems/rubocop-rspec/RuboCop/Cop/RSpec/RedundantPredicateMatcher
|
779
|
+
|
780
|
+
RSpec/RemoveConst:
|
781
|
+
Description: Checks that `remove_const` is not used in specs.
|
782
|
+
Enabled: pending
|
783
|
+
VersionAdded: '2.26'
|
784
|
+
Reference: https://www.rubydoc.info/gems/rubocop-rspec/RuboCop/Cop/RSpec/RemoveConst
|
785
|
+
|
774
786
|
RSpec/RepeatedDescription:
|
775
787
|
Description: Check for repeated description strings in example groups.
|
776
788
|
Enabled: true
|
@@ -832,9 +844,14 @@ RSpec/SharedContext:
|
|
832
844
|
Reference: https://www.rubydoc.info/gems/rubocop-rspec/RuboCop/Cop/RSpec/SharedContext
|
833
845
|
|
834
846
|
RSpec/SharedExamples:
|
835
|
-
Description:
|
847
|
+
Description: Checks for consistent style for shared example names.
|
836
848
|
Enabled: true
|
849
|
+
EnforcedStyle: string
|
850
|
+
SupportedStyles:
|
851
|
+
- string
|
852
|
+
- symbol
|
837
853
|
VersionAdded: '1.25'
|
854
|
+
VersionChanged: '2.26'
|
838
855
|
Reference: https://www.rubydoc.info/gems/rubocop-rspec/RuboCop/Cop/RSpec/SharedExamples
|
839
856
|
|
840
857
|
RSpec/SingleArgumentMessageChain:
|
@@ -32,17 +32,17 @@ module RuboCop
|
|
32
32
|
'or `%<arg>s.run`.'
|
33
33
|
|
34
34
|
# @!method hook_block(node)
|
35
|
-
def_node_matcher :hook_block,
|
35
|
+
def_node_matcher :hook_block, <<~PATTERN
|
36
36
|
(block (send nil? :around sym ?) (args $...) ...)
|
37
37
|
PATTERN
|
38
38
|
|
39
39
|
# @!method hook_numblock(node)
|
40
|
-
def_node_matcher :hook_numblock,
|
40
|
+
def_node_matcher :hook_numblock, <<~PATTERN
|
41
41
|
(numblock (send nil? :around sym ?) ...)
|
42
42
|
PATTERN
|
43
43
|
|
44
44
|
# @!method find_arg_usage(node)
|
45
|
-
def_node_search :find_arg_usage,
|
45
|
+
def_node_search :find_arg_usage, <<~PATTERN
|
46
46
|
{(send $... {:call :run}) (send _ _ $...) (yield $...) (block-pass $...)}
|
47
47
|
PATTERN
|
48
48
|
|
data/lib/rubocop/cop/rspec/be.rb
CHANGED
@@ -44,7 +44,7 @@ module RuboCop
|
|
44
44
|
RESTRICT_ON_SEND = %i[to].freeze
|
45
45
|
|
46
46
|
# @!method eql_type_with_identity(node)
|
47
|
-
def_node_matcher :eql_type_with_identity,
|
47
|
+
def_node_matcher :eql_type_with_identity, <<~PATTERN
|
48
48
|
(send _ :to $(send nil? :eql {true false int float sym nil}))
|
49
49
|
PATTERN
|
50
50
|
|
@@ -33,12 +33,12 @@ module RuboCop
|
|
33
33
|
RESTRICT_ON_SEND = %i[be be_nil].freeze
|
34
34
|
|
35
35
|
# @!method be_nil_matcher?(node)
|
36
|
-
def_node_matcher :be_nil_matcher?,
|
36
|
+
def_node_matcher :be_nil_matcher?, <<~PATTERN
|
37
37
|
(send nil? :be_nil)
|
38
38
|
PATTERN
|
39
39
|
|
40
40
|
# @!method nil_value_expectation?(node)
|
41
|
-
def_node_matcher :nil_value_expectation?,
|
41
|
+
def_node_matcher :nil_value_expectation?, <<~PATTERN
|
42
42
|
(send nil? :be nil)
|
43
43
|
PATTERN
|
44
44
|
|
@@ -3,22 +3,16 @@
|
|
3
3
|
module RuboCop
|
4
4
|
module Cop
|
5
5
|
module RSpec
|
6
|
-
# Check that before/after(:all) isn't being used.
|
6
|
+
# Check that before/after(:all/:context) isn't being used.
|
7
7
|
#
|
8
8
|
# @example
|
9
|
-
# # bad
|
10
|
-
# #
|
11
|
-
# # Faster but risk of state leaking between examples
|
12
|
-
# #
|
9
|
+
# # bad - Faster but risk of state leaking between examples
|
13
10
|
# describe MyClass do
|
14
11
|
# before(:all) { Widget.create }
|
15
|
-
# after(:
|
12
|
+
# after(:context) { Widget.delete_all }
|
16
13
|
# end
|
17
14
|
#
|
18
|
-
# # good
|
19
|
-
# #
|
20
|
-
# # Slower but examples are properly isolated
|
21
|
-
# #
|
15
|
+
# # good - Slower but examples are properly isolated
|
22
16
|
# describe MyClass do
|
23
17
|
# before(:each) { Widget.create }
|
24
18
|
# after(:each) { Widget.delete_all }
|
@@ -30,11 +24,11 @@ module RuboCop
|
|
30
24
|
'`use_transactional_fixtures` is enabled, then records created ' \
|
31
25
|
'in `%<hook>s` are not automatically rolled back.'
|
32
26
|
|
33
|
-
RESTRICT_ON_SEND =
|
27
|
+
RESTRICT_ON_SEND = Set[:before, :after].freeze
|
34
28
|
|
35
29
|
# @!method before_or_after_all(node)
|
36
|
-
def_node_matcher :before_or_after_all,
|
37
|
-
$(send _
|
30
|
+
def_node_matcher :before_or_after_all, <<~PATTERN
|
31
|
+
$(send _ RESTRICT_ON_SEND (sym {:all :context}))
|
38
32
|
PATTERN
|
39
33
|
|
40
34
|
def on_send(node)
|
@@ -58,12 +58,12 @@ module RuboCop
|
|
58
58
|
}.freeze
|
59
59
|
|
60
60
|
# @!method capybara_speak(node)
|
61
|
-
def_node_matcher :capybara_speak,
|
61
|
+
def_node_matcher :capybara_speak, <<~PATTERN
|
62
62
|
{#{MAP.keys.map(&:inspect).join(' ')}}
|
63
63
|
PATTERN
|
64
64
|
|
65
65
|
# @!method feature_method(node)
|
66
|
-
def_node_matcher :feature_method,
|
66
|
+
def_node_matcher :feature_method, <<~PATTERN
|
67
67
|
(block
|
68
68
|
$(send #rspec? $#capybara_speak ...)
|
69
69
|
...)
|
@@ -66,14 +66,14 @@ module RuboCop
|
|
66
66
|
RESTRICT_ON_SEND = CHANGE_METHODS.freeze
|
67
67
|
|
68
68
|
# @!method expect_change_with_arguments(node)
|
69
|
-
def_node_matcher :expect_change_with_arguments,
|
69
|
+
def_node_matcher :expect_change_with_arguments, <<~PATTERN
|
70
70
|
(send
|
71
71
|
$(send nil? CHANGE_METHODS ...) :by
|
72
72
|
(int 0))
|
73
73
|
PATTERN
|
74
74
|
|
75
75
|
# @!method expect_change_with_block(node)
|
76
|
-
def_node_matcher :expect_change_with_block,
|
76
|
+
def_node_matcher :expect_change_with_block, <<~PATTERN
|
77
77
|
(send
|
78
78
|
(block
|
79
79
|
$(send nil? CHANGE_METHODS)
|
@@ -83,7 +83,7 @@ module RuboCop
|
|
83
83
|
PATTERN
|
84
84
|
|
85
85
|
# @!method change_nodes(node)
|
86
|
-
def_node_search :change_nodes,
|
86
|
+
def_node_search :change_nodes, <<~PATTERN
|
87
87
|
$(send nil? CHANGE_METHODS ...)
|
88
88
|
PATTERN
|
89
89
|
|
@@ -30,7 +30,7 @@ module RuboCop
|
|
30
30
|
MSG = 'Use `describe` for testing methods.'
|
31
31
|
|
32
32
|
# @!method context_method(node)
|
33
|
-
def_node_matcher :context_method,
|
33
|
+
def_node_matcher :context_method, <<~PATTERN
|
34
34
|
(block
|
35
35
|
(send #rspec? :context
|
36
36
|
${(str #method_name?) (dstr (str #method_name?) ...)}
|
@@ -38,7 +38,7 @@ module RuboCop
|
|
38
38
|
...)
|
39
39
|
PATTERN
|
40
40
|
|
41
|
-
def on_block(node)
|
41
|
+
def on_block(node) # rubocop:disable InternalAffairs/NumblockHandler
|
42
42
|
context_method(node) do |context|
|
43
43
|
add_offense(context) do |corrector|
|
44
44
|
corrector.replace(node.send_node.loc.selector, 'describe')
|
@@ -61,7 +61,7 @@ module RuboCop
|
|
61
61
|
MSG = 'Context description should match %<patterns>s.'
|
62
62
|
|
63
63
|
# @!method context_wording(node)
|
64
|
-
def_node_matcher :context_wording,
|
64
|
+
def_node_matcher :context_wording, <<~PATTERN
|
65
65
|
(block (send #rspec? { :context :shared_context } $({str dstr xstr} ...) ...) ...)
|
66
66
|
PATTERN
|
67
67
|
|
@@ -63,7 +63,7 @@ module RuboCop
|
|
63
63
|
MSG = 'Use `%<replacement>s` instead of `%<src>s`.'
|
64
64
|
|
65
65
|
# @!method common_instance_exec_closure?(node)
|
66
|
-
def_node_matcher :common_instance_exec_closure?,
|
66
|
+
def_node_matcher :common_instance_exec_closure?, <<~PATTERN
|
67
67
|
(block (send (const nil? {:Class :Module :Struct}) :new ...) ...)
|
68
68
|
PATTERN
|
69
69
|
|
@@ -75,7 +75,7 @@ module RuboCop
|
|
75
75
|
def_node_matcher :scope_changing_syntax?, '{def class module}'
|
76
76
|
|
77
77
|
# @!method described_constant(node)
|
78
|
-
def_node_matcher :described_constant,
|
78
|
+
def_node_matcher :described_constant, <<~PATTERN
|
79
79
|
(block (send _ :describe $(const ...) ...) (args) $_)
|
80
80
|
PATTERN
|
81
81
|
|
@@ -148,15 +148,15 @@ module RuboCop
|
|
148
148
|
end
|
149
149
|
|
150
150
|
def offensive_described_class?(node)
|
151
|
-
return unless node.const_type?
|
151
|
+
return false unless node.const_type?
|
152
152
|
|
153
153
|
# E.g. `described_class::CONSTANT`
|
154
|
-
return if contains_described_class?(node)
|
154
|
+
return false if contains_described_class?(node)
|
155
155
|
|
156
156
|
nearest_described_class, = node.each_ancestor(:block)
|
157
157
|
.map { |ancestor| described_constant(ancestor) }.find(&:itself)
|
158
158
|
|
159
|
-
return if nearest_described_class.equal?(node)
|
159
|
+
return false if nearest_described_class.equal?(node)
|
160
160
|
|
161
161
|
full_const_name(nearest_described_class) == full_const_name(node)
|
162
162
|
end
|
@@ -162,7 +162,7 @@ module RuboCop
|
|
162
162
|
end
|
163
163
|
|
164
164
|
def conditionals_with_examples?(body)
|
165
|
-
return unless body.begin_type? || body.case_type?
|
165
|
+
return false unless body.begin_type? || body.case_type?
|
166
166
|
|
167
167
|
body.each_descendant(:if, :case).any? do |condition_node|
|
168
168
|
examples_in_branches?(condition_node)
|
@@ -170,7 +170,7 @@ module RuboCop
|
|
170
170
|
end
|
171
171
|
|
172
172
|
def examples_in_branches?(condition_node)
|
173
|
-
return if !condition_node.if_type? && !condition_node.case_type?
|
173
|
+
return false if !condition_node.if_type? && !condition_node.case_type?
|
174
174
|
|
175
175
|
condition_node.branches.any? { |branch| examples?(branch) }
|
176
176
|
end
|
@@ -71,8 +71,8 @@ module RuboCop
|
|
71
71
|
|
72
72
|
def next_one_line_example?(node)
|
73
73
|
next_sibling = node.right_sibling
|
74
|
-
return unless next_sibling
|
75
|
-
return unless example?(next_sibling)
|
74
|
+
return false unless next_sibling
|
75
|
+
return false unless example?(next_sibling)
|
76
76
|
|
77
77
|
next_sibling.single_line?
|
78
78
|
end
|
@@ -22,6 +22,9 @@ module RuboCop
|
|
22
22
|
# it 'should find nothing' do
|
23
23
|
# end
|
24
24
|
#
|
25
|
+
# it 'will find nothing' do
|
26
|
+
# end
|
27
|
+
#
|
25
28
|
# # good
|
26
29
|
# it 'finds nothing' do
|
27
30
|
# end
|
@@ -47,25 +50,30 @@ module RuboCop
|
|
47
50
|
extend AutoCorrector
|
48
51
|
|
49
52
|
MSG_SHOULD = 'Do not use should when describing your tests.'
|
53
|
+
MSG_WILL = 'Do not use the future tense when describing your tests.'
|
50
54
|
MSG_IT = "Do not repeat 'it' when describing your tests."
|
51
55
|
MSG_INSUFFICIENT_DESCRIPTION = 'Your example description is ' \
|
52
56
|
'insufficient.'
|
53
57
|
|
54
58
|
SHOULD_PREFIX = /\Ashould(?:n't)?\b/i.freeze
|
59
|
+
WILL_PREFIX = /\A(?:will|won't)\b/i.freeze
|
55
60
|
IT_PREFIX = /\Ait /i.freeze
|
56
61
|
|
57
62
|
# @!method it_description(node)
|
58
|
-
def_node_matcher :it_description,
|
63
|
+
def_node_matcher :it_description, <<~PATTERN
|
59
64
|
(block (send _ :it ${
|
60
65
|
(str $_)
|
61
66
|
(dstr (str $_ ) ...)
|
62
67
|
} ...) ...)
|
63
68
|
PATTERN
|
64
69
|
|
70
|
+
# rubocop:disable Metrics/MethodLength
|
65
71
|
def on_block(node) # rubocop:disable InternalAffairs/NumblockHandler
|
66
72
|
it_description(node) do |description_node, message|
|
67
73
|
if message.match?(SHOULD_PREFIX)
|
68
74
|
add_wording_offense(description_node, MSG_SHOULD)
|
75
|
+
elsif message.match?(WILL_PREFIX)
|
76
|
+
add_wording_offense(description_node, MSG_WILL)
|
69
77
|
elsif message.match?(IT_PREFIX)
|
70
78
|
add_wording_offense(description_node, MSG_IT)
|
71
79
|
elsif insufficient_docstring?(description_node)
|
@@ -74,6 +82,7 @@ module RuboCop
|
|
74
82
|
end
|
75
83
|
end
|
76
84
|
end
|
85
|
+
# rubocop:enable Metrics/MethodLength
|
77
86
|
|
78
87
|
private
|
79
88
|
|
@@ -100,7 +109,7 @@ module RuboCop
|
|
100
109
|
def replacement_text(node)
|
101
110
|
text = text(node)
|
102
111
|
|
103
|
-
if text.match?(SHOULD_PREFIX)
|
112
|
+
if text.match?(SHOULD_PREFIX) || text.match?(WILL_PREFIX)
|
104
113
|
RuboCop::RSpec::Wording.new(
|
105
114
|
text,
|
106
115
|
ignore: ignored_words,
|
@@ -29,7 +29,7 @@ module RuboCop
|
|
29
29
|
MSG = 'Excessive whitespace.'
|
30
30
|
|
31
31
|
# @!method example_description(node)
|
32
|
-
def_node_matcher :example_description,
|
32
|
+
def_node_matcher :example_description, <<~PATTERN
|
33
33
|
(send _ {#Examples.all #ExampleGroups.all} ${
|
34
34
|
$str
|
35
35
|
$(dstr ({str dstr `sym} ...) ...)
|
@@ -38,12 +38,12 @@ module RuboCop
|
|
38
38
|
RESTRICT_ON_SEND = %i[change].freeze
|
39
39
|
|
40
40
|
# @!method expect_change_with_arguments(node)
|
41
|
-
def_node_matcher :expect_change_with_arguments,
|
41
|
+
def_node_matcher :expect_change_with_arguments, <<~PATTERN
|
42
42
|
(send nil? :change $_ ({sym str} $_))
|
43
43
|
PATTERN
|
44
44
|
|
45
45
|
# @!method expect_change_with_block(node)
|
46
|
-
def_node_matcher :expect_change_with_block,
|
46
|
+
def_node_matcher :expect_change_with_block, <<~PATTERN
|
47
47
|
(block
|
48
48
|
(send nil? :change)
|
49
49
|
(args)
|
@@ -56,7 +56,7 @@ module RuboCop
|
|
56
56
|
MSG = 'Focused spec found.'
|
57
57
|
|
58
58
|
# @!method focusable_selector?(node)
|
59
|
-
def_node_matcher :focusable_selector?,
|
59
|
+
def_node_matcher :focusable_selector?, <<~PATTERN
|
60
60
|
{
|
61
61
|
#ExampleGroups.regular
|
62
62
|
#ExampleGroups.skipped
|
@@ -68,7 +68,7 @@ module RuboCop
|
|
68
68
|
PATTERN
|
69
69
|
|
70
70
|
# @!method metadata(node)
|
71
|
-
def_node_matcher :metadata,
|
71
|
+
def_node_matcher :metadata, <<~PATTERN
|
72
72
|
{(send #rspec? #focusable_selector? <$(sym :focus) ...>)
|
73
73
|
(send #rspec? #focusable_selector? ... (hash <$(pair (sym :focus) true) ...>))}
|
74
74
|
PATTERN
|
@@ -66,12 +66,12 @@ module RuboCop
|
|
66
66
|
EXPLICIT_MSG = 'Use `%<scope>p` for RSpec hooks.'
|
67
67
|
|
68
68
|
# @!method scoped_hook(node)
|
69
|
-
def_node_matcher :scoped_hook,
|
69
|
+
def_node_matcher :scoped_hook, <<~PATTERN
|
70
70
|
({block numblock} $(send _ #Hooks.all (sym ${:each :example})) ...)
|
71
71
|
PATTERN
|
72
72
|
|
73
73
|
# @!method unscoped_hook(node)
|
74
|
-
def_node_matcher :unscoped_hook,
|
74
|
+
def_node_matcher :unscoped_hook, <<~PATTERN
|
75
75
|
({block numblock} $(send _ #Hooks.all) ...)
|
76
76
|
PATTERN
|
77
77
|
|
@@ -28,7 +28,7 @@ module RuboCop
|
|
28
28
|
MSG = 'Move `%<hook>s` above the examples in the group.'
|
29
29
|
|
30
30
|
# @!method example_or_group?(node)
|
31
|
-
def_node_matcher :example_or_group?,
|
31
|
+
def_node_matcher :example_or_group?, <<~PATTERN
|
32
32
|
{
|
33
33
|
({block numblock} {
|
34
34
|
(send #rspec? #ExampleGroups.all ...)
|
@@ -22,7 +22,7 @@ module RuboCop
|
|
22
22
|
RESTRICT_ON_SEND = %i[is_expected should should_not].freeze
|
23
23
|
|
24
24
|
# @!method lambda?(node)
|
25
|
-
def_node_matcher :lambda?,
|
25
|
+
def_node_matcher :lambda?, <<~PATTERN
|
26
26
|
{
|
27
27
|
(send (const nil? :Proc) :new)
|
28
28
|
(send nil? {:proc :lambda})
|
@@ -33,7 +33,7 @@ module RuboCop
|
|
33
33
|
def_node_matcher :lambda_subject?, '(block #lambda? ...)'
|
34
34
|
|
35
35
|
# @!method implicit_expect(node)
|
36
|
-
def_node_matcher :implicit_expect,
|
36
|
+
def_node_matcher :implicit_expect, <<~PATTERN
|
37
37
|
$(send nil? {:is_expected :should :should_not} ...)
|
38
38
|
PATTERN
|
39
39
|
|
@@ -31,7 +31,7 @@ module RuboCop
|
|
31
31
|
RESTRICT_ON_SEND = Runners.all + %i[should should_not]
|
32
32
|
|
33
33
|
# @!method implicit_expect(node)
|
34
|
-
def_node_matcher :implicit_expect,
|
34
|
+
def_node_matcher :implicit_expect, <<~PATTERN
|
35
35
|
{
|
36
36
|
(send nil? ${:should :should_not} ...)
|
37
37
|
(send (send nil? $:is_expected) #Runners.all ...)
|
@@ -78,12 +78,12 @@ module RuboCop
|
|
78
78
|
].freeze
|
79
79
|
|
80
80
|
# @!method explicit_unnamed_subject?(node)
|
81
|
-
def_node_matcher :explicit_unnamed_subject?,
|
81
|
+
def_node_matcher :explicit_unnamed_subject?, <<~PATTERN
|
82
82
|
(send nil? :expect (send nil? :subject))
|
83
83
|
PATTERN
|
84
84
|
|
85
85
|
# @!method implicit_subject?(node)
|
86
|
-
def_node_matcher :implicit_subject?,
|
86
|
+
def_node_matcher :implicit_subject?, <<~PATTERN
|
87
87
|
(send nil? {:should :should_not :is_expected} ...)
|
88
88
|
PATTERN
|
89
89
|
|
@@ -25,7 +25,7 @@ module RuboCop
|
|
25
25
|
'with `have_received`.'
|
26
26
|
|
27
27
|
# @!method null_double(node)
|
28
|
-
def_node_search :null_double,
|
28
|
+
def_node_search :null_double, <<~PATTERN
|
29
29
|
(lvasgn $_
|
30
30
|
(send
|
31
31
|
$(send nil? :instance_double
|
@@ -33,7 +33,7 @@ module RuboCop
|
|
33
33
|
PATTERN
|
34
34
|
|
35
35
|
# @!method have_received_usage(node)
|
36
|
-
def_node_search :have_received_usage,
|
36
|
+
def_node_search :have_received_usage, <<~PATTERN
|
37
37
|
(send
|
38
38
|
(send nil? :expect
|
39
39
|
(lvar $_)) :to
|
@@ -52,12 +52,12 @@ module RuboCop
|
|
52
52
|
'a method call, or a local variable (if possible).'
|
53
53
|
|
54
54
|
# @!method dynamic_class?(node)
|
55
|
-
def_node_matcher :dynamic_class?,
|
55
|
+
def_node_matcher :dynamic_class?, <<~PATTERN
|
56
56
|
(block (send (const nil? :Class) :new ...) ...)
|
57
57
|
PATTERN
|
58
58
|
|
59
59
|
# @!method custom_matcher?(node)
|
60
|
-
def_node_matcher :custom_matcher?,
|
60
|
+
def_node_matcher :custom_matcher?, <<~PATTERN
|
61
61
|
(block {
|
62
62
|
(send nil? :matcher sym)
|
63
63
|
(send (const (const nil? :RSpec) :Matchers) :define sym)
|
@@ -21,7 +21,7 @@ module RuboCop
|
|
21
21
|
'of iterating over an array.'
|
22
22
|
|
23
23
|
# @!method each?(node)
|
24
|
-
def_node_matcher :each?,
|
24
|
+
def_node_matcher :each?, <<~PATTERN
|
25
25
|
(block
|
26
26
|
(send ... :each)
|
27
27
|
(args (arg $_))
|
@@ -30,14 +30,14 @@ module RuboCop
|
|
30
30
|
PATTERN
|
31
31
|
|
32
32
|
# @!method each_numblock?(node)
|
33
|
-
def_node_matcher :each_numblock?,
|
33
|
+
def_node_matcher :each_numblock?, <<~PATTERN
|
34
34
|
(numblock
|
35
35
|
(send ... :each) _ $(...)
|
36
36
|
)
|
37
37
|
PATTERN
|
38
38
|
|
39
39
|
# @!method expectation?(node)
|
40
|
-
def_node_matcher :expectation?,
|
40
|
+
def_node_matcher :expectation?, <<~PATTERN
|
41
41
|
(send (send nil? :expect (lvar %)) :to ...)
|
42
42
|
PATTERN
|
43
43
|
|
@@ -36,7 +36,7 @@ module RuboCop
|
|
36
36
|
MSG = 'Move `let` before the examples in the group.'
|
37
37
|
|
38
38
|
# @!method example_or_group?(node)
|
39
|
-
def_node_matcher :example_or_group?,
|
39
|
+
def_node_matcher :example_or_group?, <<~PATTERN
|
40
40
|
{
|
41
41
|
(block (send nil? {#ExampleGroups.all #Examples.all} ...) ...)
|
42
42
|
(send nil? #Includes.examples ...)
|
@@ -33,7 +33,7 @@ module RuboCop
|
|
33
33
|
RESTRICT_ON_SEND = %i[to].freeze
|
34
34
|
|
35
35
|
# @!method message_expectation(node)
|
36
|
-
def_node_matcher :message_expectation,
|
36
|
+
def_node_matcher :message_expectation, <<~PATTERN
|
37
37
|
(send $(send nil? {:expect :allow} ...) :to #receive_message?)
|
38
38
|
PATTERN
|
39
39
|
|
@@ -8,7 +8,7 @@ module RuboCop
|
|
8
8
|
extend RuboCop::NodePattern::Macros
|
9
9
|
|
10
10
|
# @!method skipped_in_metadata?(node)
|
11
|
-
def_node_matcher :skipped_in_metadata?,
|
11
|
+
def_node_matcher :skipped_in_metadata?, <<~PATTERN
|
12
12
|
{
|
13
13
|
(send _ _ <(sym {:skip :pending}) ...>)
|
14
14
|
(send _ _ ... (hash <(pair (sym {:skip :pending}) { true str dstr }) ...>))
|
@@ -30,7 +30,7 @@ module RuboCop
|
|
30
30
|
#
|
31
31
|
# @param node [RuboCop::AST::Node]
|
32
32
|
# @return [Array<RuboCop::AST::Node>] matching nodes
|
33
|
-
def_node_matcher :skip_or_pending_inside_block?,
|
33
|
+
def_node_matcher :skip_or_pending_inside_block?, <<~PATTERN
|
34
34
|
(block <(send nil? {:skip :pending} ...) ...>)
|
35
35
|
PATTERN
|
36
36
|
end
|