rubocop-rspec 2.2.0 → 2.6.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 +48 -0
- data/README.md +3 -5
- data/config/default.yml +79 -3
- data/lib/rubocop/cop/rspec/around_block.rb +2 -0
- data/lib/rubocop/cop/rspec/be.rb +1 -0
- data/lib/rubocop/cop/rspec/be_eql.rb +1 -0
- data/lib/rubocop/cop/rspec/before_after_all.rb +1 -0
- data/lib/rubocop/cop/rspec/capybara/current_path_expectation.rb +3 -0
- data/lib/rubocop/cop/rspec/capybara/feature_methods.rb +3 -0
- data/lib/rubocop/cop/rspec/capybara/visibility_matcher.rb +2 -0
- data/lib/rubocop/cop/rspec/context_method.rb +1 -0
- data/lib/rubocop/cop/rspec/context_wording.rb +7 -1
- data/lib/rubocop/cop/rspec/describe_class.rb +3 -0
- data/lib/rubocop/cop/rspec/describe_method.rb +1 -0
- data/lib/rubocop/cop/rspec/describe_symbol.rb +1 -0
- data/lib/rubocop/cop/rspec/described_class.rb +6 -1
- data/lib/rubocop/cop/rspec/described_class_module_wrapping.rb +2 -1
- data/lib/rubocop/cop/rspec/dialect.rb +1 -0
- data/lib/rubocop/cop/rspec/empty_hook.rb +5 -1
- data/lib/rubocop/cop/rspec/example_length.rb +26 -12
- data/lib/rubocop/cop/rspec/example_without_description.rb +1 -0
- data/lib/rubocop/cop/rspec/example_wording.rb +4 -0
- data/lib/rubocop/cop/rspec/excessive_docstring_spacing.rb +100 -0
- data/lib/rubocop/cop/rspec/expect_actual.rb +1 -0
- data/lib/rubocop/cop/rspec/expect_change.rb +5 -3
- data/lib/rubocop/cop/rspec/expect_in_hook.rb +1 -0
- data/lib/rubocop/cop/rspec/factory_bot/attribute_defined_statically.rb +3 -0
- data/lib/rubocop/cop/rspec/factory_bot/create_list.rb +3 -0
- data/lib/rubocop/cop/rspec/factory_bot/factory_class_name.rb +1 -0
- data/lib/rubocop/cop/rspec/file_path.rb +13 -9
- data/lib/rubocop/cop/rspec/focus.rb +3 -0
- data/lib/rubocop/cop/rspec/hook_argument.rb +3 -1
- data/lib/rubocop/cop/rspec/hooks_before_examples.rb +1 -0
- data/lib/rubocop/cop/rspec/identical_equality_assertion.rb +38 -0
- data/lib/rubocop/cop/rspec/implicit_block_expectation.rb +3 -0
- data/lib/rubocop/cop/rspec/implicit_expect.rb +1 -0
- data/lib/rubocop/cop/rspec/implicit_subject.rb +18 -1
- data/lib/rubocop/cop/rspec/instance_spy.rb +2 -0
- data/lib/rubocop/cop/rspec/instance_variable.rb +4 -0
- data/lib/rubocop/cop/rspec/it_behaves_like.rb +1 -0
- data/lib/rubocop/cop/rspec/iterated_expectation.rb +4 -0
- data/lib/rubocop/cop/rspec/let_before_examples.rb +1 -0
- data/lib/rubocop/cop/rspec/let_setup.rb +3 -0
- data/lib/rubocop/cop/rspec/message_expectation.rb +2 -0
- data/lib/rubocop/cop/rspec/message_spies.rb +2 -0
- data/lib/rubocop/cop/rspec/mixin/variable.rb +1 -0
- data/lib/rubocop/cop/rspec/multiple_expectations.rb +3 -0
- data/lib/rubocop/cop/rspec/named_subject.rb +3 -0
- data/lib/rubocop/cop/rspec/nested_groups.rb +1 -1
- data/lib/rubocop/cop/rspec/not_to_not.rb +1 -0
- data/lib/rubocop/cop/rspec/overwriting_setup.rb +2 -0
- data/lib/rubocop/cop/rspec/pending.rb +4 -0
- data/lib/rubocop/cop/rspec/predicate_matcher.rb +5 -0
- data/lib/rubocop/cop/rspec/rails/avoid_setup_hook.rb +44 -0
- data/lib/rubocop/cop/rspec/rails/http_status.rb +1 -0
- data/lib/rubocop/cop/rspec/receive_counts.rb +2 -0
- data/lib/rubocop/cop/rspec/receive_never.rb +1 -0
- data/lib/rubocop/cop/rspec/repeated_example_group_body.rb +8 -1
- data/lib/rubocop/cop/rspec/repeated_example_group_description.rb +4 -0
- data/lib/rubocop/cop/rspec/repeated_include_example.rb +3 -0
- data/lib/rubocop/cop/rspec/return_from_stub.rb +5 -0
- data/lib/rubocop/cop/rspec/shared_context.rb +4 -0
- data/lib/rubocop/cop/rspec/shared_examples.rb +1 -0
- data/lib/rubocop/cop/rspec/single_argument_message_chain.rb +2 -0
- data/lib/rubocop/cop/rspec/stubbed_mock.rb +1 -0
- data/lib/rubocop/cop/rspec/subject_declaration.rb +47 -0
- data/lib/rubocop/cop/rspec/subject_stub.rb +1 -0
- data/lib/rubocop/cop/rspec/unspecified_exception.rb +1 -0
- data/lib/rubocop/cop/rspec/variable_definition.rb +19 -2
- data/lib/rubocop/cop/rspec/verified_doubles.rb +1 -0
- data/lib/rubocop/cop/rspec/void_expect.rb +2 -0
- data/lib/rubocop/cop/rspec/yield.rb +3 -0
- data/lib/rubocop/cop/rspec_cops.rb +4 -0
- data/lib/rubocop/rspec/align_let_brace.rb +2 -1
- data/lib/rubocop/rspec/config_formatter.rb +3 -0
- data/lib/rubocop/rspec/example.rb +5 -0
- data/lib/rubocop/rspec/hook.rb +1 -0
- data/lib/rubocop/rspec/language.rb +10 -0
- data/lib/rubocop/rspec/version.rb +1 -1
- metadata +17 -27
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ec6f02aa20957826bdff135547211062ac19bdac9b260d2a008c45973944ff16
|
4
|
+
data.tar.gz: 57454e8f60b40062ad5da0ef9e4ce83c8539aea78d13d8412af24f43c01c2e1d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 51333677ad7c458afd2446b21c6e900c5f4ba597d2659cc2e389e5c9e223fe1885e54c8d427a8213519bd9176c0bfbc146910d6cd3c5dea7c9a69450ac34ce97
|
7
|
+
data.tar.gz: 5f6cffcb89273ddca1615907f8de6e619697c63c1255b630320b3852a9266aef4d260d295a6ee57ea1c91e862ad584750fac2784a2a536aea37887f829a14bd5
|
data/CHANGELOG.md
CHANGED
@@ -2,6 +2,42 @@
|
|
2
2
|
|
3
3
|
## Master (Unreleased)
|
4
4
|
|
5
|
+
## 2.6.0 (2021-11-08)
|
6
|
+
|
7
|
+
* Fix merging RSpec DSL configuration from third-party gems. ([@pirj][])
|
8
|
+
* Fix `RSpec/ExcessiveDocstringSpacing` false positive for multi-line indented strings. ([@G-Rath][])
|
9
|
+
* Fix `Include` configuration for sub-departments. ([@pirj][])
|
10
|
+
* Ignore heredocs in `RSpec/ExcessiveDocstringSpacing`. ([@G-Rath][])
|
11
|
+
* Stop `RSpec/ExampleWording` from trying to correct heredocs. ([@G-Rath][])
|
12
|
+
* Add autocorrect support for `RSpec/VariableDefinition`. ([@r7kamura][])
|
13
|
+
|
14
|
+
## 2.5.0 (2021-09-21)
|
15
|
+
|
16
|
+
* Declare autocorrect as unsafe for `ExpectChange`. ([@francois-ferrandis][])
|
17
|
+
* Fix each example for `RSpec/HookArgument`. ([@lokhi][])
|
18
|
+
* Exclude unrelated Rails directories from `RSpec/DescribeClass`. ([@MothOnMars][])
|
19
|
+
* Add `RSpec/ExcessiveDocstringSpacing` cop. ([@G-Rath][])
|
20
|
+
* Add `RSpec/SubjectDeclaration` cop. ([@dswij][])
|
21
|
+
* Fix excessive whitespace removal in `RSpec/EmptyHook` autocorrection. ([@pirj][])
|
22
|
+
* Bump RuboCop requirement to v1.19.0. ([@pirj][])
|
23
|
+
* Fix false positive in `RSpec/IteratedExpectation` when there is single, non-expectation statement in the block body. ([@Darhazer][])
|
24
|
+
|
25
|
+
## 2.4.0 (2021-06-09)
|
26
|
+
|
27
|
+
* Update `RSpec/FilePath` to check suffix when given a non-constant top-level node (e.g. features). ([@topalovic][])
|
28
|
+
* Add missing documentation for `single_statement_only` style of `RSpec/ImplicitSubject` cop. ([@tejasbubane][])
|
29
|
+
* Fix an exception in `DescribedClass` when accessing a constant on a variable in a spec that is nested in a namespace. ([@rrosenblum][])
|
30
|
+
* Add new `RSpec/IdenticalEqualityAssertion` cop. ([@tejasbubane][])
|
31
|
+
* Add `RSpec/Rails/AvoidSetupHook` cop. ([@paydaylight][])
|
32
|
+
* Fix false negative in `RSpec/ExpectChange` cop with block style and chained method call. ([@tejasbubane][])
|
33
|
+
|
34
|
+
## 2.3.0 (2021-04-28)
|
35
|
+
|
36
|
+
* Allow `RSpec/ContextWording` to accept multi-word prefixes. ([@hosamaly][])
|
37
|
+
* Drop support for ruby 2.4. ([@bquorning][])
|
38
|
+
* Add `CountAsOne` configuration option to `RSpec/ExampleLength`. ([@stephannv][])
|
39
|
+
* Fix a false positive for `RSpec/RepeatedExampleGroupBody` when `pending` or `skip` have argument(s). ([@Tietew][])
|
40
|
+
|
5
41
|
## 2.2.0 (2021-02-02)
|
6
42
|
|
7
43
|
* Fix `HooksBeforeExamples`, `LeadingSubject`, `LetBeforeExamples` and `ScatteredLet` autocorrection to take into account inline comments and comments immediately before the moved node. ([@Darhazer][])
|
@@ -603,3 +639,15 @@ Compatibility release so users can upgrade RuboCop to 0.51.0. No new features.
|
|
603
639
|
[@sl4vr]: https://github.com/sl4vr
|
604
640
|
[@ahukkanen]: https://github.com/ahukkanen
|
605
641
|
[@dvandersluis]: https://github.com/dvandersluis
|
642
|
+
[@hosamaly]: https://github.com/hosamaly
|
643
|
+
[@stephannv]: https://github.com/stephannv
|
644
|
+
[@Tietew]: https://github.com/Tietew
|
645
|
+
[@rrosenblum]: https://github.com/rrosenblum
|
646
|
+
[@paydaylight]: https://github.com/paydaylight
|
647
|
+
[@topalovic]: https://github.com/topalovic
|
648
|
+
[@lokhi]: https://github.com/lokhi
|
649
|
+
[@MothOnMars]: https://github.com/MothOnMars
|
650
|
+
[@G-Rath]: https://github.com/G-Rath
|
651
|
+
[@dswij]: https://github.com/dswij
|
652
|
+
[@francois-ferrandis]: https://github.com/francois-ferrandis
|
653
|
+
[@r7kamura]: https://github.com/r7kamura
|
data/README.md
CHANGED
@@ -2,12 +2,10 @@
|
|
2
2
|
|
3
3
|
[](https://gitter.im/rubocop-rspec/Lobby)
|
4
4
|
[](https://rubygems.org/gems/rubocop-rspec)
|
5
|
-
|
6
|
-
[](https://codeclimate.com/github/rubocop-hq/rubocop-rspec/test_coverage)
|
7
|
-
[](https://codeclimate.com/github/rubocop-hq/rubocop-rspec/maintainability)
|
5
|
+

|
8
6
|
|
9
7
|
RSpec-specific analysis for your projects, as an extension to
|
10
|
-
[RuboCop](https://github.com/rubocop
|
8
|
+
[RuboCop](https://github.com/rubocop/rubocop).
|
11
9
|
|
12
10
|
## Installation
|
13
11
|
|
@@ -67,7 +65,7 @@ end
|
|
67
65
|
|
68
66
|
### Code Climate
|
69
67
|
|
70
|
-
rubocop-rspec is available on Code Climate as part of the rubocop engine. [Learn More](https://codeclimate.com/changelog/55a433bbe30ba00852000fac).
|
68
|
+
rubocop-rspec is available on Code Climate as part of the rubocop engine. [Learn More](https://marketing.codeclimate.com/changelog/55a433bbe30ba00852000fac/).
|
71
69
|
|
72
70
|
## Documentation
|
73
71
|
|
data/config/default.yml
CHANGED
@@ -1,11 +1,24 @@
|
|
1
1
|
---
|
2
2
|
RSpec:
|
3
3
|
Enabled: true
|
4
|
-
Include:
|
4
|
+
Include: &1
|
5
5
|
- "**/*_spec.rb"
|
6
6
|
- "**/spec/**/*"
|
7
|
-
Language:
|
7
|
+
Language: &2
|
8
|
+
inherit_mode:
|
9
|
+
merge:
|
10
|
+
- Expectations
|
11
|
+
- Helpers
|
12
|
+
- Hooks
|
13
|
+
- HookScopes
|
14
|
+
- Runners
|
15
|
+
- Subjects
|
8
16
|
ExampleGroups:
|
17
|
+
inherit_mode:
|
18
|
+
merge:
|
19
|
+
- Regular
|
20
|
+
- Skipped
|
21
|
+
- Focused
|
9
22
|
Regular:
|
10
23
|
- describe
|
11
24
|
- context
|
@@ -20,6 +33,12 @@ RSpec:
|
|
20
33
|
- fcontext
|
21
34
|
- ffeature
|
22
35
|
Examples:
|
36
|
+
inherit_mode:
|
37
|
+
merge:
|
38
|
+
- Regular
|
39
|
+
- Skipped
|
40
|
+
- Focused
|
41
|
+
- Pending
|
23
42
|
Regular:
|
24
43
|
- it
|
25
44
|
- specify
|
@@ -62,6 +81,10 @@ RSpec:
|
|
62
81
|
- all
|
63
82
|
- suite
|
64
83
|
Includes:
|
84
|
+
inherit_mode:
|
85
|
+
merge:
|
86
|
+
- Examples
|
87
|
+
- Context
|
65
88
|
Examples:
|
66
89
|
- it_behaves_like
|
67
90
|
- it_should_behave_like
|
@@ -73,6 +96,10 @@ RSpec:
|
|
73
96
|
- to_not
|
74
97
|
- not_to
|
75
98
|
SharedGroups:
|
99
|
+
inherit_mode:
|
100
|
+
merge:
|
101
|
+
- Examples
|
102
|
+
- Context
|
76
103
|
Examples:
|
77
104
|
- shared_examples
|
78
105
|
- shared_examples_for
|
@@ -148,6 +175,12 @@ RSpec/ContextWording:
|
|
148
175
|
RSpec/DescribeClass:
|
149
176
|
Description: Check that the first argument to the top-level describe is a constant.
|
150
177
|
Enabled: true
|
178
|
+
Exclude:
|
179
|
+
- "**/spec/features/**/*"
|
180
|
+
- "**/spec/requests/**/*"
|
181
|
+
- "**/spec/routing/**/*"
|
182
|
+
- "**/spec/system/**/*"
|
183
|
+
- "**/spec/views/**/*"
|
151
184
|
IgnoredMetadata:
|
152
185
|
type:
|
153
186
|
- channel
|
@@ -164,7 +197,7 @@ RSpec/DescribeClass:
|
|
164
197
|
- mailbox
|
165
198
|
- aruba
|
166
199
|
VersionAdded: '1.0'
|
167
|
-
VersionChanged: '
|
200
|
+
VersionChanged: '2.5'
|
168
201
|
StyleGuide: https://www.rubydoc.info/gems/rubocop-rspec/RuboCop/Cop/RSpec/DescribeClass
|
169
202
|
|
170
203
|
RSpec/DescribeMethod:
|
@@ -253,7 +286,9 @@ RSpec/ExampleLength:
|
|
253
286
|
Description: Checks for long examples.
|
254
287
|
Enabled: true
|
255
288
|
Max: 5
|
289
|
+
CountAsOne: []
|
256
290
|
VersionAdded: '1.5'
|
291
|
+
VersionChanged: '2.3'
|
257
292
|
StyleGuide: https://www.rubydoc.info/gems/rubocop-rspec/RuboCop/Cop/RSpec/ExampleLength
|
258
293
|
|
259
294
|
RSpec/ExampleWithoutDescription:
|
@@ -267,6 +302,12 @@ RSpec/ExampleWithoutDescription:
|
|
267
302
|
VersionAdded: '1.22'
|
268
303
|
StyleGuide: https://www.rubydoc.info/gems/rubocop-rspec/RuboCop/Cop/RSpec/ExampleWithoutDescription
|
269
304
|
|
305
|
+
RSpec/ExcessiveDocstringSpacing:
|
306
|
+
Description: Checks for excessive whitespace in example descriptions.
|
307
|
+
Enabled: pending
|
308
|
+
VersionAdded: '2.5'
|
309
|
+
StyleGuide: https://www.rubydoc.info/gems/rubocop-rspec/RuboCop/Cop/RSpec/ExcessiveDocstringSpacing
|
310
|
+
|
270
311
|
RSpec/ExampleWording:
|
271
312
|
Description: Checks for common mistakes in example descriptions.
|
272
313
|
Enabled: true
|
@@ -295,7 +336,9 @@ RSpec/ExpectChange:
|
|
295
336
|
SupportedStyles:
|
296
337
|
- method_call
|
297
338
|
- block
|
339
|
+
SafeAutoCorrect: false
|
298
340
|
VersionAdded: '1.22'
|
341
|
+
VersionChanged: '2.5'
|
299
342
|
StyleGuide: https://www.rubydoc.info/gems/rubocop-rspec/RuboCop/Cop/RSpec/ExpectChange
|
300
343
|
|
301
344
|
RSpec/ExpectInHook:
|
@@ -349,6 +392,12 @@ RSpec/HooksBeforeExamples:
|
|
349
392
|
VersionAdded: '1.29'
|
350
393
|
StyleGuide: https://www.rubydoc.info/gems/rubocop-rspec/RuboCop/Cop/RSpec/HooksBeforeExamples
|
351
394
|
|
395
|
+
RSpec/IdenticalEqualityAssertion:
|
396
|
+
Description: Checks for equality assertions with identical expressions on both sides.
|
397
|
+
Enabled: pending
|
398
|
+
VersionAdded: '2.4'
|
399
|
+
StyleGuide: https://www.rubydoc.info/gems/rubocop-rspec/RuboCop/Cop/RSpec/IdenticalEqualityAssertion
|
400
|
+
|
352
401
|
RSpec/ImplicitBlockExpectation:
|
353
402
|
Description: Check that implicit block expectation syntax is not used.
|
354
403
|
Enabled: true
|
@@ -635,6 +684,12 @@ RSpec/StubbedMock:
|
|
635
684
|
VersionAdded: '1.44'
|
636
685
|
StyleGuide: https://www.rubydoc.info/gems/rubocop-rspec/RuboCop/Cop/RSpec/StubbedMock
|
637
686
|
|
687
|
+
RSpec/SubjectDeclaration:
|
688
|
+
Description: Ensure that subject is defined using subject helper.
|
689
|
+
Enabled: pending
|
690
|
+
VersionAdded: '2.5'
|
691
|
+
StyleGuide: https://www.rubydoc.info/gems/rubocop-rspec/RuboCop/Cop/RSpec/SubjectDeclaration
|
692
|
+
|
638
693
|
RSpec/SubjectStub:
|
639
694
|
Description: Checks for stubbed test subjects.
|
640
695
|
Enabled: true
|
@@ -690,6 +745,11 @@ RSpec/Yield:
|
|
690
745
|
VersionAdded: '1.32'
|
691
746
|
StyleGuide: https://www.rubydoc.info/gems/rubocop-rspec/RuboCop/Cop/RSpec/Yield
|
692
747
|
|
748
|
+
RSpec/Capybara:
|
749
|
+
Enabled: true
|
750
|
+
Include: *1
|
751
|
+
Language: *2
|
752
|
+
|
693
753
|
RSpec/Capybara/CurrentPathExpectation:
|
694
754
|
Description: Checks that no expectations are set on Capybara's `current_path`.
|
695
755
|
Enabled: true
|
@@ -712,6 +772,11 @@ RSpec/Capybara/VisibilityMatcher:
|
|
712
772
|
VersionChanged: '2.0'
|
713
773
|
StyleGuide: https://www.rubydoc.info/gems/rubocop-rspec/RuboCop/Cop/RSpec/Capybara/VisibilityMatcher
|
714
774
|
|
775
|
+
RSpec/FactoryBot:
|
776
|
+
Enabled: true
|
777
|
+
Include: *1
|
778
|
+
Language: *2
|
779
|
+
|
715
780
|
RSpec/FactoryBot/AttributeDefinedStatically:
|
716
781
|
Description: Always declare attribute values as blocks.
|
717
782
|
Enabled: true
|
@@ -751,6 +816,17 @@ RSpec/FactoryBot/FactoryClassName:
|
|
751
816
|
VersionChanged: '2.0'
|
752
817
|
StyleGuide: https://www.rubydoc.info/gems/rubocop-rspec/RuboCop/Cop/RSpec/FactoryBot/FactoryClassName
|
753
818
|
|
819
|
+
RSpec/Rails:
|
820
|
+
Enabled: true
|
821
|
+
Include: *1
|
822
|
+
Language: *2
|
823
|
+
|
824
|
+
RSpec/Rails/AvoidSetupHook:
|
825
|
+
Description: Checks that tests use RSpec `before` hook over Rails `setup` method.
|
826
|
+
Enabled: pending
|
827
|
+
VersionAdded: '2.4'
|
828
|
+
StyleGuide: https://www.rubydoc.info/gems/rubocop-rspec/RuboCop/Cop/RSpec/Rails/AvoidSetupHook
|
829
|
+
|
754
830
|
RSpec/Rails/HttpStatus:
|
755
831
|
Description: Enforces use of symbolic or numeric value to describe HTTP status.
|
756
832
|
Enabled: true
|
@@ -30,10 +30,12 @@ module RuboCop
|
|
30
30
|
MSG_UNUSED_ARG = 'You should call `%<arg>s.call` ' \
|
31
31
|
'or `%<arg>s.run`.'
|
32
32
|
|
33
|
+
# @!method hook(node)
|
33
34
|
def_node_matcher :hook, <<-PATTERN
|
34
35
|
(block (send nil? :around sym ?) (args $...) ...)
|
35
36
|
PATTERN
|
36
37
|
|
38
|
+
# @!method find_arg_usage(node)
|
37
39
|
def_node_search :find_arg_usage, <<-PATTERN
|
38
40
|
{(send $... {:call :run}) (send _ _ $...) (yield $...) (block-pass $...)}
|
39
41
|
PATTERN
|
data/lib/rubocop/cop/rspec/be.rb
CHANGED
@@ -41,6 +41,7 @@ module RuboCop
|
|
41
41
|
MSG = 'Prefer `be` over `eql`.'
|
42
42
|
RESTRICT_ON_SEND = %i[to].freeze
|
43
43
|
|
44
|
+
# @!method eql_type_with_identity(node)
|
44
45
|
def_node_matcher :eql_type_with_identity, <<-PATTERN
|
45
46
|
(send _ :to $(send nil? :eql {true false int float sym nil_type?}))
|
46
47
|
PATTERN
|
@@ -32,17 +32,20 @@ module RuboCop
|
|
32
32
|
|
33
33
|
RESTRICT_ON_SEND = %i[expect].freeze
|
34
34
|
|
35
|
+
# @!method expectation_set_on_current_path(node)
|
35
36
|
def_node_matcher :expectation_set_on_current_path, <<-PATTERN
|
36
37
|
(send nil? :expect (send {(send nil? :page) nil?} :current_path))
|
37
38
|
PATTERN
|
38
39
|
|
39
40
|
# Supported matchers: eq(...) / match(/regexp/) / match('regexp')
|
41
|
+
# @!method as_is_matcher(node)
|
40
42
|
def_node_matcher :as_is_matcher, <<-PATTERN
|
41
43
|
(send
|
42
44
|
#expectation_set_on_current_path $#Runners.all
|
43
45
|
${(send nil? :eq ...) (send nil? :match (regexp ...))})
|
44
46
|
PATTERN
|
45
47
|
|
48
|
+
# @!method regexp_str_matcher(node)
|
46
49
|
def_node_matcher :regexp_str_matcher, <<-PATTERN
|
47
50
|
(send
|
48
51
|
#expectation_set_on_current_path $#Runners.all
|
@@ -55,16 +55,19 @@ module RuboCop
|
|
55
55
|
feature: :describe
|
56
56
|
}.freeze
|
57
57
|
|
58
|
+
# @!method capybara_speak(node)
|
58
59
|
def_node_matcher :capybara_speak, <<-PATTERN
|
59
60
|
{#{MAP.keys.map(&:inspect).join(' ')}}
|
60
61
|
PATTERN
|
61
62
|
|
63
|
+
# @!method spec?(node)
|
62
64
|
def_node_matcher :spec?, <<-PATTERN
|
63
65
|
(block
|
64
66
|
(send #rspec? {:describe :feature} ...)
|
65
67
|
...)
|
66
68
|
PATTERN
|
67
69
|
|
70
|
+
# @!method feature_method(node)
|
68
71
|
def_node_matcher :feature_method, <<-PATTERN
|
69
72
|
(block
|
70
73
|
$(send #rspec? $#capybara_speak ...)
|
@@ -46,10 +46,12 @@ module RuboCop
|
|
46
46
|
|
47
47
|
RESTRICT_ON_SEND = CAPYBARA_MATCHER_METHODS
|
48
48
|
|
49
|
+
# @!method visible_true?(node)
|
49
50
|
def_node_matcher :visible_true?, <<~PATTERN
|
50
51
|
(send nil? #capybara_matcher? ... (hash <$(pair (sym :visible) true) ...>))
|
51
52
|
PATTERN
|
52
53
|
|
54
|
+
# @!method visible_false?(node)
|
53
55
|
def_node_matcher :visible_false?, <<~PATTERN
|
54
56
|
(send nil? #capybara_matcher? ... (hash <$(pair (sym :visible) false) ...>))
|
55
57
|
PATTERN
|
@@ -8,6 +8,7 @@ module RuboCop
|
|
8
8
|
# The default list of prefixes is minimal. Users are encouraged to tailor
|
9
9
|
# the configuration to meet project needs. Other acceptable prefixes may
|
10
10
|
# include `if`, `unless`, `for`, `before`, `after`, or `during`.
|
11
|
+
# They may consist of multiple words if desired.
|
11
12
|
#
|
12
13
|
# @see https://rspec.rubystyle.guide/#context-descriptions
|
13
14
|
# @see http://www.betterspecs.org/#contexts
|
@@ -37,6 +38,7 @@ module RuboCop
|
|
37
38
|
class ContextWording < Base
|
38
39
|
MSG = 'Start context description with %<prefixes>s.'
|
39
40
|
|
41
|
+
# @!method context_wording(node)
|
40
42
|
def_node_matcher :context_wording, <<-PATTERN
|
41
43
|
(block (send #rspec? { :context :shared_context } $(str #bad_prefix?) ...) ...)
|
42
44
|
PATTERN
|
@@ -51,7 +53,7 @@ module RuboCop
|
|
51
53
|
private
|
52
54
|
|
53
55
|
def bad_prefix?(description)
|
54
|
-
!
|
56
|
+
!prefix_regex.match?(description)
|
55
57
|
end
|
56
58
|
|
57
59
|
def joined_prefixes
|
@@ -65,6 +67,10 @@ module RuboCop
|
|
65
67
|
def prefixes
|
66
68
|
cop_config['Prefixes'] || []
|
67
69
|
end
|
70
|
+
|
71
|
+
def prefix_regex
|
72
|
+
/^#{Regexp.union(prefixes)}\b/
|
73
|
+
end
|
68
74
|
end
|
69
75
|
end
|
70
76
|
end
|
@@ -40,14 +40,17 @@ module RuboCop
|
|
40
40
|
MSG = 'The first argument to describe should be ' \
|
41
41
|
'the class or module being tested.'
|
42
42
|
|
43
|
+
# @!method example_group_with_ignored_metadata?(node)
|
43
44
|
def_node_matcher :example_group_with_ignored_metadata?, <<~PATTERN
|
44
45
|
(send #rspec? :describe ... (hash <#ignored_metadata? ...>))
|
45
46
|
PATTERN
|
46
47
|
|
48
|
+
# @!method not_a_const_described(node)
|
47
49
|
def_node_matcher :not_a_const_described, <<~PATTERN
|
48
50
|
(send #rspec? :describe $[!const !#string_constant?] ...)
|
49
51
|
PATTERN
|
50
52
|
|
53
|
+
# @!method sym_pair(node)
|
51
54
|
def_node_matcher :sym_pair, <<~PATTERN
|
52
55
|
(pair $sym $sym)
|
53
56
|
PATTERN
|
@@ -22,6 +22,7 @@ module RuboCop
|
|
22
22
|
MSG = 'The second argument to describe should be the method ' \
|
23
23
|
"being tested. '#instance' or '.class'."
|
24
24
|
|
25
|
+
# @!method second_argument(node)
|
25
26
|
def_node_matcher :second_argument, <<~PATTERN
|
26
27
|
(block
|
27
28
|
(send #rspec? :describe _first_argument $(str _) ...) ...
|
@@ -61,18 +61,23 @@ module RuboCop
|
|
61
61
|
DESCRIBED_CLASS = 'described_class'
|
62
62
|
MSG = 'Use `%<replacement>s` instead of `%<src>s`.'
|
63
63
|
|
64
|
+
# @!method common_instance_exec_closure?(node)
|
64
65
|
def_node_matcher :common_instance_exec_closure?, <<-PATTERN
|
65
66
|
(block (send (const nil? {:Class :Module :Struct}) :new ...) ...)
|
66
67
|
PATTERN
|
67
68
|
|
69
|
+
# @!method rspec_block?(node)
|
68
70
|
def_node_matcher :rspec_block?, block_pattern('#ALL.all')
|
69
71
|
|
72
|
+
# @!method scope_changing_syntax?(node)
|
70
73
|
def_node_matcher :scope_changing_syntax?, '{def class module}'
|
71
74
|
|
75
|
+
# @!method described_constant(node)
|
72
76
|
def_node_matcher :described_constant, <<-PATTERN
|
73
77
|
(block (send _ :describe $(const ...) ...) (args) $_)
|
74
78
|
PATTERN
|
75
79
|
|
80
|
+
# @!method contains_described_class?(node)
|
76
81
|
def_node_search :contains_described_class?, <<-PATTERN
|
77
82
|
(send nil? :described_class)
|
78
83
|
PATTERN
|
@@ -198,7 +203,7 @@ module RuboCop
|
|
198
203
|
[name]
|
199
204
|
elsif namespace.const_type?
|
200
205
|
[*const_name(namespace), name]
|
201
|
-
elsif
|
206
|
+
elsif %i[lvar cbase send].include?(namespace.type)
|
202
207
|
[nil, name]
|
203
208
|
end
|
204
209
|
end
|
@@ -18,10 +18,11 @@ module RuboCop
|
|
18
18
|
# # ...
|
19
19
|
# end
|
20
20
|
#
|
21
|
-
# @see https://github.com/rubocop
|
21
|
+
# @see https://github.com/rubocop/rubocop-rspec/issues/735
|
22
22
|
class DescribedClassModuleWrapping < Base
|
23
23
|
MSG = 'Avoid opening modules and defining specs within them.'
|
24
24
|
|
25
|
+
# @!method find_rspec_blocks(node)
|
25
26
|
def_node_search :find_rspec_blocks, block_pattern('#ExampleGroups.all')
|
26
27
|
|
27
28
|
def on_module(node)
|
@@ -28,6 +28,7 @@ module RuboCop
|
|
28
28
|
|
29
29
|
MSG = 'Empty hook detected.'
|
30
30
|
|
31
|
+
# @!method empty_hook?(node)
|
31
32
|
def_node_matcher :empty_hook?, <<~PATTERN
|
32
33
|
(block $#{send_pattern('#Hooks.all')} _ nil?)
|
33
34
|
PATTERN
|
@@ -35,7 +36,10 @@ module RuboCop
|
|
35
36
|
def on_block(node)
|
36
37
|
empty_hook?(node) do |hook|
|
37
38
|
add_offense(hook) do |corrector|
|
38
|
-
range = range_with_surrounding_space(
|
39
|
+
range = range_with_surrounding_space(
|
40
|
+
range: node.loc.expression,
|
41
|
+
side: :left
|
42
|
+
)
|
39
43
|
corrector.remove(range)
|
40
44
|
end
|
41
45
|
end
|
@@ -25,29 +25,43 @@ module RuboCop
|
|
25
25
|
# result = service.call
|
26
26
|
# expect(result).to be(true)
|
27
27
|
# end
|
28
|
+
#
|
29
|
+
# You can set literals you want to fold with `CountAsOne`.
|
30
|
+
# Available are: 'array', 'hash', and 'heredoc'. Each literal
|
31
|
+
# will be counted as one line regardless of its actual size.
|
32
|
+
#
|
33
|
+
# @example CountAsOne: ['array', 'heredoc']
|
34
|
+
#
|
35
|
+
# it do
|
36
|
+
# array = [ # +1
|
37
|
+
# 1,
|
38
|
+
# 2
|
39
|
+
# ]
|
40
|
+
#
|
41
|
+
# hash = { # +3
|
42
|
+
# key: 'value'
|
43
|
+
# }
|
44
|
+
#
|
45
|
+
# msg = <<~HEREDOC # +1
|
46
|
+
# Heredoc
|
47
|
+
# content.
|
48
|
+
# HEREDOC
|
49
|
+
# end # 5 points
|
28
50
|
class ExampleLength < Base
|
29
51
|
include CodeLength
|
30
52
|
|
31
|
-
|
53
|
+
LABEL = 'Example'
|
32
54
|
|
33
55
|
def on_block(node)
|
34
56
|
return unless example?(node)
|
35
57
|
|
36
|
-
|
37
|
-
|
38
|
-
return unless length > max_length
|
39
|
-
|
40
|
-
add_offense(node, message: message(length))
|
58
|
+
check_code_length(node)
|
41
59
|
end
|
42
60
|
|
43
61
|
private
|
44
62
|
|
45
|
-
def
|
46
|
-
|
47
|
-
end
|
48
|
-
|
49
|
-
def message(length)
|
50
|
-
format(MSG, total: length, max: max_length)
|
63
|
+
def cop_label
|
64
|
+
LABEL
|
51
65
|
end
|
52
66
|
end
|
53
67
|
end
|
@@ -38,6 +38,7 @@ module RuboCop
|
|
38
38
|
SHOULD_PREFIX = /\Ashould(?:n't)?\b/i.freeze
|
39
39
|
IT_PREFIX = /\Ait /i.freeze
|
40
40
|
|
41
|
+
# @!method it_description(node)
|
41
42
|
def_node_matcher :it_description, <<-PATTERN
|
42
43
|
(block (send _ :it ${
|
43
44
|
(str $_)
|
@@ -59,7 +60,10 @@ module RuboCop
|
|
59
60
|
|
60
61
|
def add_wording_offense(node, message)
|
61
62
|
docstring = docstring(node)
|
63
|
+
|
62
64
|
add_offense(docstring, message: message) do |corrector|
|
65
|
+
next if node.heredoc?
|
66
|
+
|
63
67
|
corrector.replace(docstring, replacement_text(node))
|
64
68
|
end
|
65
69
|
end
|