rubocop-rspec 2.12.1 → 2.13.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 +110 -86
- data/config/default.yml +44 -6
- data/lib/rubocop/cop/rspec/align_left_let_brace.rb +8 -9
- data/lib/rubocop/cop/rspec/align_right_let_brace.rb +8 -9
- data/lib/rubocop/cop/rspec/any_instance.rb +1 -0
- data/lib/rubocop/cop/rspec/around_block.rb +26 -3
- data/lib/rubocop/cop/rspec/be.rb +0 -1
- data/lib/rubocop/cop/rspec/be_eq.rb +0 -1
- data/lib/rubocop/cop/rspec/be_eql.rb +0 -1
- data/lib/rubocop/cop/rspec/before_after_all.rb +1 -0
- data/lib/rubocop/cop/rspec/capybara/current_path_expectation.rb +9 -3
- data/lib/rubocop/cop/rspec/capybara/feature_methods.rb +2 -1
- data/lib/rubocop/cop/rspec/capybara/specific_finders.rb +86 -0
- data/lib/rubocop/cop/rspec/capybara/specific_matcher.rb +91 -10
- data/lib/rubocop/cop/rspec/capybara/visibility_matcher.rb +0 -1
- data/lib/rubocop/cop/rspec/change_by_zero.rb +60 -5
- data/lib/rubocop/cop/rspec/class_check.rb +101 -0
- data/lib/rubocop/cop/rspec/context_method.rb +2 -1
- data/lib/rubocop/cop/rspec/context_wording.rb +49 -18
- data/lib/rubocop/cop/rspec/describe_class.rb +1 -1
- data/lib/rubocop/cop/rspec/describe_method.rb +1 -0
- data/lib/rubocop/cop/rspec/described_class.rb +4 -14
- data/lib/rubocop/cop/rspec/dialect.rb +1 -0
- data/lib/rubocop/cop/rspec/empty_example_group.rb +19 -4
- data/lib/rubocop/cop/rspec/empty_hook.rb +2 -1
- data/lib/rubocop/cop/rspec/empty_line_after_example.rb +4 -9
- data/lib/rubocop/cop/rspec/empty_line_after_example_group.rb +1 -1
- data/lib/rubocop/cop/rspec/empty_line_after_final_let.rb +2 -1
- data/lib/rubocop/cop/rspec/empty_line_after_hook.rb +32 -2
- data/lib/rubocop/cop/rspec/empty_line_after_subject.rb +2 -1
- data/lib/rubocop/cop/rspec/example_length.rb +2 -1
- data/lib/rubocop/cop/rspec/example_without_description.rb +2 -1
- data/lib/rubocop/cop/rspec/example_wording.rb +2 -1
- data/lib/rubocop/cop/rspec/excessive_docstring_spacing.rb +1 -0
- data/lib/rubocop/cop/rspec/expect_actual.rb +3 -0
- data/lib/rubocop/cop/rspec/expect_change.rb +1 -1
- data/lib/rubocop/cop/rspec/expect_in_hook.rb +4 -1
- data/lib/rubocop/cop/rspec/expect_output.rb +1 -0
- data/lib/rubocop/cop/rspec/factory_bot/attribute_defined_statically.rb +2 -1
- data/lib/rubocop/cop/rspec/factory_bot/create_list.rb +26 -12
- data/lib/rubocop/cop/rspec/factory_bot/factory_class_name.rb +1 -0
- data/lib/rubocop/cop/rspec/file_path.rb +6 -3
- data/lib/rubocop/cop/rspec/focus.rb +18 -0
- data/lib/rubocop/cop/rspec/hook_argument.rb +7 -2
- data/lib/rubocop/cop/rspec/hooks_before_examples.rb +10 -9
- data/lib/rubocop/cop/rspec/identical_equality_assertion.rb +0 -1
- data/lib/rubocop/cop/rspec/implicit_block_expectation.rb +1 -0
- data/lib/rubocop/cop/rspec/implicit_expect.rb +0 -2
- data/lib/rubocop/cop/rspec/instance_spy.rb +1 -1
- data/lib/rubocop/cop/rspec/instance_variable.rb +0 -1
- data/lib/rubocop/cop/rspec/it_behaves_like.rb +1 -0
- data/lib/rubocop/cop/rspec/iterated_expectation.rb +16 -0
- data/lib/rubocop/cop/rspec/leading_subject.rb +15 -15
- data/lib/rubocop/cop/rspec/let_before_examples.rb +7 -8
- data/lib/rubocop/cop/rspec/let_setup.rb +4 -4
- data/lib/rubocop/cop/rspec/message_chain.rb +1 -1
- data/lib/rubocop/cop/rspec/missing_example_group_argument.rb +2 -1
- data/lib/rubocop/cop/rspec/mixin/css_selector.rb +99 -0
- data/lib/rubocop/cop/rspec/mixin/namespace.rb +23 -0
- data/lib/rubocop/cop/rspec/multiple_describes.rb +1 -0
- data/lib/rubocop/cop/rspec/multiple_expectations.rb +1 -5
- data/lib/rubocop/cop/rspec/multiple_memoized_helpers.rb +1 -3
- data/lib/rubocop/cop/rspec/multiple_subjects.rb +17 -2
- data/lib/rubocop/cop/rspec/named_subject.rb +2 -1
- data/lib/rubocop/cop/rspec/nested_groups.rb +45 -25
- data/lib/rubocop/cop/rspec/no_expectation_example.rb +64 -0
- data/lib/rubocop/cop/rspec/not_to_not.rb +1 -2
- data/lib/rubocop/cop/rspec/overwriting_setup.rb +2 -1
- data/lib/rubocop/cop/rspec/pending.rb +1 -0
- data/lib/rubocop/cop/rspec/predicate_matcher.rb +2 -1
- data/lib/rubocop/cop/rspec/rails/avoid_setup_hook.rb +1 -2
- data/lib/rubocop/cop/rspec/receive_counts.rb +14 -15
- data/lib/rubocop/cop/rspec/receive_never.rb +4 -5
- data/lib/rubocop/cop/rspec/repeated_description.rb +25 -26
- data/lib/rubocop/cop/rspec/repeated_example.rb +1 -1
- data/lib/rubocop/cop/rspec/repeated_example_group_body.rb +28 -29
- data/lib/rubocop/cop/rspec/repeated_example_group_description.rb +28 -29
- data/lib/rubocop/cop/rspec/repeated_include_example.rb +32 -33
- data/lib/rubocop/cop/rspec/return_from_stub.rb +1 -1
- data/lib/rubocop/cop/rspec/scattered_let.rb +1 -5
- data/lib/rubocop/cop/rspec/scattered_setup.rb +1 -1
- data/lib/rubocop/cop/rspec/shared_context.rb +1 -1
- data/lib/rubocop/cop/rspec/stubbed_mock.rb +0 -1
- data/lib/rubocop/cop/rspec/subject_declaration.rb +0 -1
- data/lib/rubocop/cop/rspec/subject_stub.rb +2 -2
- data/lib/rubocop/cop/rspec/unspecified_exception.rb +15 -15
- data/lib/rubocop/cop/rspec/variable_definition.rb +1 -0
- data/lib/rubocop/cop/rspec/variable_name.rb +6 -7
- data/lib/rubocop/cop/rspec/verified_doubles.rb +1 -0
- data/lib/rubocop/cop/rspec/void_expect.rb +2 -1
- data/lib/rubocop/cop/rspec/yield.rb +2 -1
- data/lib/rubocop/cop/rspec_cops.rb +3 -0
- data/lib/rubocop/rspec/config_formatter.rb +14 -3
- data/lib/rubocop/rspec/inject.rb +1 -3
- data/lib/rubocop/rspec/language/node_pattern.rb +4 -0
- data/lib/rubocop/rspec/language.rb +6 -1
- data/lib/rubocop/rspec/version.rb +1 -1
- data/lib/rubocop/rspec/wording.rb +2 -2
- data/lib/rubocop/rspec.rb +14 -0
- data/lib/rubocop-rspec.rb +3 -0
- metadata +10 -88
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 31d7e881e40be6a9b27f78f77789f1ecc5056bb073f5028a5c3dc0c6e1fe81ad
|
4
|
+
data.tar.gz: 7ad05e5a9ecfa1230aabfa54c7e6f9d7649f428017c405a9ed68d4da95218dd2
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: dfa4fca8f641da881b6014b91f5df8678af96c60e937339a81a64efd0bd87859ddc5876f977a995ae52a844e88bd53d46d50e0b37fd933b37e18da830991f245
|
7
|
+
data.tar.gz: f7779621a7c6fc6e33bf47b6823cfe7c4be08cc0f32ac02465cd4cbe35a1b8d4ed280a71c33f6fcfd7195a65191f68c9f9c13cdb0f8624a0a3e80be56af4dd50
|
data/CHANGELOG.md
CHANGED
@@ -2,6 +2,29 @@
|
|
2
2
|
|
3
3
|
## Master (Unreleased)
|
4
4
|
|
5
|
+
## 2.13.0 (2022-09-12)
|
6
|
+
|
7
|
+
* Fix `RSpec/FilePath` cop missing mismatched expanded namespace. ([@sl4vr][])
|
8
|
+
* Add new `AllowConsecutiveOneLiners` (default true) option for `Rspec/EmptyLineAfterHook` cop. ([@ngouy][])
|
9
|
+
* Add autocorrect support for `RSpec/EmptyExampleGroup`. ([@r7kamura][])
|
10
|
+
* Fix `RSpec/ChangeByZero` with compound expressions using `&` or `|` operators. ([@BrianHawley][])
|
11
|
+
* Add `RSpec/NoExpectationExample`. ([@r7kamura][])
|
12
|
+
* Add some expectation methods to default configuration. ([@r7kamura][])
|
13
|
+
* Fix a false positive for `RSpec/Capybara/SpecificMatcher`. ([@ydah][])
|
14
|
+
* Fix a false negative for `RSpec/Capybara/SpecificMatcher` for `have_field`. ([@ydah][])
|
15
|
+
* Fix a false positive for `RSpec/Capybara/SpecificMatcher` when may not have a `href` by `have_link`. ([@ydah][])
|
16
|
+
* Add `NegatedMatcher` configuration option to `RSpec/ChangeByZero`. ([@ydah][])
|
17
|
+
* Add new `RSpec/Capybara/SpecificFinders` cop. ([@ydah][])
|
18
|
+
* Add support for numblocks to `RSpec/AroundBlock`, `RSpec/EmptyLineAfterHook`, `RSpec/ExpectInHook`, `RSpec/HookArgument`, `RSpec/HooksBeforeExamples`, `RSpec/IteratedExpectation`, and `RSpec/NoExpectationExample`. ([@ydah][])
|
19
|
+
* Fix incorrect documentation URLs when using `rubocop --show-docs-url`. ([@r7kamura][])
|
20
|
+
* Add `AllowedGroups` configuration option to `RSpec/NestedGroups`. ([@ydah][])
|
21
|
+
* Deprecate `IgnoredPatterns` option in favor of the `AllowedPatterns` options. ([@ydah][])
|
22
|
+
* Add `AllowedPatterns` configuration option to `RSpec/ContextWording`. ([@ydah][])
|
23
|
+
* Add `RSpec/ClassCheck` cop. ([@r7kamura][])
|
24
|
+
* Fix a false positive for `RSpec/Capybara/SpecificMatcher` when pseudo-classes. ([@ydah][])
|
25
|
+
* Fix a false negative for `RSpec/SubjectStub` when the subject is declared with the `subject!` method and called by name. ([@eikes][])
|
26
|
+
* Support `Array.new(n)` on `RSpec/FactoryBot/CreateList` cop. ([@r7kamura][])
|
27
|
+
|
5
28
|
## 2.12.1 (2022-07-03)
|
6
29
|
|
7
30
|
* Fix a false positive for `RSpec/Capybara/SpecificMatcher`. ([@ydah][])
|
@@ -603,114 +626,115 @@ Compatibility release so users can upgrade RuboCop to 0.51.0. No new features.
|
|
603
626
|
* Split `UnitSpecNaming` cop into `RSpecDescribeClass`, `RSpecDescribeMethod` and `RSpecFileName` and enabled them all by default. ([@geniou][])
|
604
627
|
* Add `RSpecExampleWording` cop to prevent to use of should at the beginning of the spec description. ([@geniou][])
|
605
628
|
* Fix `RSpecFileName` cop for non-class specs. ([@geniou][])
|
606
|
-
* Adapt `RSpecFileName` cop to
|
629
|
+
* Adapt `RSpecFileName` cop to common naming convention and skip spec with multiple top level describes. ([@geniou][])
|
607
630
|
* Add `RSpecMultipleDescribes` cop to check for multiple top level describes. ([@geniou][])
|
608
631
|
* Add `RSpecDescribedClass` to promote the use of `described_class`. ([@geniou][])
|
609
632
|
* Add `RSpecInstanceVariable` cop to check for the usage of instance variables. ([@geniou][])
|
610
633
|
|
611
|
-
<!-- Contributors -->
|
634
|
+
<!-- Contributors (alphabetically) -->
|
612
635
|
|
636
|
+
[@abrom]: https://github.com/abrom
|
637
|
+
[@ahukkanen]: https://github.com/ahukkanen
|
638
|
+
[@akiomik]: https://github.com/akiomik
|
639
|
+
[@AlexWayfer]: https://github.com/AlexWayfer
|
640
|
+
[@andrykonchin]: https://github.com/andrykonchin
|
613
641
|
[@andyw8]: https://github.com/andyw8
|
642
|
+
[@anthony-robin]: https://github.com/anthony-robin
|
643
|
+
[@aried3r]: https://github.com/aried3r
|
644
|
+
[@baberthal]: https://github.com/baberthal
|
614
645
|
[@backus]: https://github.com/backus
|
646
|
+
[@biinari]: https://github.com/biinari
|
647
|
+
[@bmorrall]: https://github.com/bmorrall
|
615
648
|
[@bquorning]: https://github.com/bquorning
|
649
|
+
[@BrentWheeldon]: https://github.com/BrentWheeldon
|
650
|
+
[@BrianHawley]: https://github.com/BrianHawley
|
651
|
+
[@cfabianski]: https://github.com/cfabianski
|
652
|
+
[@clupprich]: https://github.com/clupprich
|
653
|
+
[@composerinteralia]: https://github.com/composerinteralia
|
654
|
+
[@Darhazer]: https://github.com/Darhazer
|
655
|
+
[@daveworth]: https://github.com/daveworth
|
656
|
+
[@dduugg]: https://github.com/dduugg
|
616
657
|
[@deivid-rodriguez]: https://github.com/deivid-rodriguez
|
658
|
+
[@dgollahon]: https://github.com/dgollahon
|
659
|
+
[@Drowze]: https://github.com/Drowze
|
660
|
+
[@dswij]: https://github.com/dswij
|
661
|
+
[@dvandersluis]: https://github.com/dvandersluis
|
662
|
+
[@edgibbs]: https://github.com/edgibbs
|
663
|
+
[@eikes]: https://github.com/eikes
|
664
|
+
[@eitoball]: https://github.com/eitoball
|
665
|
+
[@elebow]: https://github.com/elebow
|
666
|
+
[@EliseFitz15]: https://github.com/EliseFitz15
|
667
|
+
[@elliterate]: https://github.com/elliterate
|
668
|
+
[@foton]: https://github.com/foton
|
669
|
+
[@francois-ferrandis]: https://github.com/francois-ferrandis
|
670
|
+
[@G-Rath]: https://github.com/G-Rath
|
617
671
|
[@geniou]: https://github.com/geniou
|
672
|
+
[@gsamokovarov]: https://github.com/gsamokovarov
|
673
|
+
[@harry-graham]: https://github.com/harry-graham
|
674
|
+
[@harrylewis]: https://github.com/harrylewis
|
675
|
+
[@hosamaly]: https://github.com/hosamaly
|
618
676
|
[@jaredbeck]: https://github.com/jaredbeck
|
619
|
-
[@jawshooah]: https://github.com/jawshooah
|
620
|
-
[@nevir]: https://github.com/nevir
|
621
|
-
[@nijikon]: https://github.com/nijikon
|
622
|
-
[@pstengel]: https://github.com/pstengel
|
623
|
-
[@miguelfteixeira]: https://github.com/miguelfteixeira
|
624
|
-
[@mlarraz]: https://github.com/mlarraz
|
625
|
-
[@renanborgescampos]: https://github.com/renanborgescampos
|
626
677
|
[@jaredmoody]: https://github.com/jaredmoody
|
627
|
-
[@baberthal]: https://github.com/baberthal
|
628
678
|
[@jeffreyc]: https://github.com/jeffreyc
|
629
|
-
[@
|
630
|
-
[@
|
631
|
-
[@Darhazer]: https://github.com/Darhazer
|
632
|
-
[@redross]: https://github.com/redross
|
633
|
-
[@cfabianski]: https://github.com/cfabianski
|
634
|
-
[@dgollahon]: https://github.com/dgollahon
|
635
|
-
[@rspeicher]: https://github.com/rspeicher
|
636
|
-
[@jonatas]: https://github.com/jonatas
|
637
|
-
[@pocke]: https://github.com/pocke
|
638
|
-
[@bmorrall]: https://github.com/bmorrall
|
639
|
-
[@zverok]: https://github.com/zverok
|
640
|
-
[@timrogers]: https://github.com/timrogers
|
641
|
-
[@yevhene]: https://github.com/yevhene
|
642
|
-
[@walf443]: https://github.com/walf443
|
643
|
-
[@pirj]: https://github.com/pirj
|
644
|
-
[@telmofcosta]: https://github.com/telmofcosta
|
645
|
-
[@EliseFitz15]: https://github.com/EliseFitz15
|
646
|
-
[@anthony-robin]: https://github.com/anthony-robin
|
679
|
+
[@jfragoulis]: https://github.com/jfragoulis
|
680
|
+
[@johnny-miyake]: https://github.com/johnny-miyake
|
647
681
|
[@jojos003]: https://github.com/jojos003
|
648
|
-
[@
|
649
|
-
[@
|
650
|
-
[@
|
651
|
-
[@
|
652
|
-
[@
|
653
|
-
[@
|
654
|
-
[@
|
655
|
-
[@
|
656
|
-
[@
|
657
|
-
[@
|
682
|
+
[@jonatas]: https://github.com/jonatas
|
683
|
+
[@jtannas]: https://github.com/jtannas
|
684
|
+
[@kellysutton]: https://github.com/kellysutton
|
685
|
+
[@koic]: https://github.com/koic
|
686
|
+
[@lazycoder9]: https://github.com/lazycoder9
|
687
|
+
[@leoarnold]: https://github.com/leoarnold
|
688
|
+
[@lokhi]: https://github.com/lokhi
|
689
|
+
[@luke-hill]: https://github.com/luke-hill
|
690
|
+
[@M-Yamashita01]: https://github.com/M-Yamashita01
|
691
|
+
[@miguelfteixeira]: https://github.com/miguelfteixeira
|
658
692
|
[@mkenyon]: https://github.com/mkenyon
|
659
|
-
[@
|
660
|
-
[@
|
661
|
-
[@
|
693
|
+
[@mkrawc]: https://github.com/mkrawc
|
694
|
+
[@mlarraz]: https://github.com/mlarraz
|
695
|
+
[@mockdeep]: https://github.com/mockdeep
|
696
|
+
[@MothOnMars]: https://github.com/MothOnMars
|
662
697
|
[@nc-holodakg]: https://github.com/nc-holodakg
|
663
|
-
[@
|
698
|
+
[@nevir]: https://github.com/nevir
|
699
|
+
[@ngouy]: https://github.com/ngouy
|
664
700
|
[@nickcampbell18]: https://github.com/nickcampbell18
|
701
|
+
[@nijikon]: https://github.com/nijikon
|
702
|
+
[@onk]: https://github.com/onk
|
703
|
+
[@onumis]: https://github.com/onumis
|
704
|
+
[@oshiro3]: https://github.com/oshiro3
|
705
|
+
[@patrickomatic]: https://github.com/patrickomatic
|
706
|
+
[@paydaylight]: https://github.com/paydaylight
|
707
|
+
[@PhilCoggins]: https://github.com/PhilCoggins
|
708
|
+
[@pirj]: https://github.com/pirj
|
709
|
+
[@pocke]: https://github.com/pocke
|
710
|
+
[@pstengel]: https://github.com/pstengel
|
665
711
|
[@QQism]: https://github.com/QQism
|
666
|
-
[@
|
667
|
-
[@
|
668
|
-
[@
|
669
|
-
[@
|
670
|
-
[@dduugg]: https://github.com/dduugg
|
671
|
-
[@lazycoder9]: https://github.com/lazycoder9
|
672
|
-
[@elebow]: https://github.com/elebow
|
673
|
-
[@eitoball]: https://github.com/eitoball
|
674
|
-
[@aried3r]: https://github.com/aried3r
|
675
|
-
[@AlexWayfer]: https://github.com/AlexWayfer
|
676
|
-
[@tejasbubane]: https://github.com/tejasbubane
|
677
|
-
[@twalpole]: https://github.com/twalpole
|
678
|
-
[@zdennis]: https://github.com/zdennis
|
712
|
+
[@r7kamura]: https://github.com/r7kamura
|
713
|
+
[@Rafix02]: https://github.com/Rafix02
|
714
|
+
[@redross]: https://github.com/redross
|
715
|
+
[@renanborgescampos]: https://github.com/renanborgescampos
|
679
716
|
[@robotdana]: https://github.com/robotdana
|
680
717
|
[@rolfschmidt]: https://github.com/rolfschmidt
|
681
|
-
[@
|
682
|
-
[@
|
683
|
-
[@
|
684
|
-
[@
|
685
|
-
[@
|
686
|
-
[@biinari]: https://github.com/biinari
|
687
|
-
[@koic]: https://github.com/koic
|
688
|
-
[@Rafix02]: https://github.com/Rafix02
|
689
|
-
[@PhilCoggins]: https://github.com/PhilCoggins
|
718
|
+
[@rrosenblum]: https://github.com/rrosenblum
|
719
|
+
[@rspeicher]: https://github.com/rspeicher
|
720
|
+
[@RST-J]: https://github.com/RST-J
|
721
|
+
[@schmijos]: https://github.com/schmijos
|
722
|
+
[@seanpdoyle]: https://github.com/seanpdoyle
|
690
723
|
[@sl4vr]: https://github.com/sl4vr
|
691
|
-
[@ahukkanen]: https://github.com/ahukkanen
|
692
|
-
[@dvandersluis]: https://github.com/dvandersluis
|
693
|
-
[@hosamaly]: https://github.com/hosamaly
|
694
724
|
[@stephannv]: https://github.com/stephannv
|
725
|
+
[@t3h2mas]: https://github.com/t3h2mas
|
726
|
+
[@tdeo]: https://github.com/tdeo
|
727
|
+
[@tejasbubane]: https://github.com/tejasbubane
|
728
|
+
[@telmofcosta]: https://github.com/telmofcosta
|
695
729
|
[@Tietew]: https://github.com/Tietew
|
696
|
-
[@
|
697
|
-
[@paydaylight]: https://github.com/paydaylight
|
730
|
+
[@timrogers]: https://github.com/timrogers
|
698
731
|
[@topalovic]: https://github.com/topalovic
|
699
|
-
[@
|
700
|
-
[@
|
701
|
-
[@
|
702
|
-
[@
|
703
|
-
[@francois-ferrandis]: https://github.com/francois-ferrandis
|
704
|
-
[@r7kamura]: https://github.com/r7kamura
|
705
|
-
[@leoarnold]: https://github.com/leoarnold
|
706
|
-
[@harry-graham]: https://github.com/harry-graham
|
707
|
-
[@oshiro3]: https://github.com/oshiro3
|
732
|
+
[@twalpole]: https://github.com/twalpole
|
733
|
+
[@vzvu3k6k]: https://github.com/vzvu3k6k
|
734
|
+
[@walf443]: https://github.com/walf443
|
735
|
+
[@ybiquitous]: https://github.com/ybiquitous
|
708
736
|
[@ydah]: https://github.com/ydah
|
709
|
-
[@
|
710
|
-
[@
|
711
|
-
[@
|
712
|
-
[@
|
713
|
-
[@ngouy]: https://github.com/ngouy
|
714
|
-
[@edgibbs]: https://github.com/edgibbs
|
715
|
-
[@Drowze]: https://github.com/Drowze
|
716
|
-
[@akiomik]: https://github.com/akiomik
|
737
|
+
[@yevhene]: https://github.com/yevhene
|
738
|
+
[@ypresto]: https://github.com/ypresto
|
739
|
+
[@zdennis]: https://github.com/zdennis
|
740
|
+
[@zverok]: https://github.com/zverok
|
data/config/default.yml
CHANGED
@@ -2,6 +2,7 @@
|
|
2
2
|
RSpec:
|
3
3
|
Enabled: true
|
4
4
|
StyleGuideBaseURL: https://rspec.rubystyle.guide
|
5
|
+
DocumentationBaseURL: https://docs.rubocop.org/rubocop-rspec
|
5
6
|
Include: &1
|
6
7
|
- "**/*_spec.rb"
|
7
8
|
- "**/spec/**/*"
|
@@ -61,9 +62,14 @@ RSpec:
|
|
61
62
|
Pending:
|
62
63
|
- pending
|
63
64
|
Expectations:
|
65
|
+
- are_expected
|
64
66
|
- expect
|
65
|
-
- is_expected
|
66
67
|
- expect_any_instance_of
|
68
|
+
- is_expected
|
69
|
+
- should
|
70
|
+
- should_not
|
71
|
+
- should_not_receive
|
72
|
+
- should_receive
|
67
73
|
Helpers:
|
68
74
|
- let
|
69
75
|
- let!
|
@@ -187,8 +193,21 @@ RSpec/BeforeAfterAll:
|
|
187
193
|
RSpec/ChangeByZero:
|
188
194
|
Description: Prefer negated matchers over `to change.by(0)`.
|
189
195
|
Enabled: pending
|
190
|
-
VersionAdded: 2.11
|
196
|
+
VersionAdded: '2.11'
|
197
|
+
VersionChanged: '2.13'
|
191
198
|
Reference: https://www.rubydoc.info/gems/rubocop-rspec/RuboCop/Cop/RSpec/ChangeByZero
|
199
|
+
NegatedMatcher: ~
|
200
|
+
|
201
|
+
RSpec/ClassCheck:
|
202
|
+
Description: Enforces consistent use of `be_a` or `be_kind_of`.
|
203
|
+
StyleGuide: "#is-a-vs-kind-of"
|
204
|
+
Enabled: pending
|
205
|
+
VersionAdded: '2.13'
|
206
|
+
EnforcedStyle: be_a
|
207
|
+
SupportedStyles:
|
208
|
+
- be_a
|
209
|
+
- be_kind_of
|
210
|
+
Reference: https://www.rubydoc.info/gems/rubocop-rspec/RuboCop/Cop/RSpec/ClassCheck
|
192
211
|
|
193
212
|
RSpec/ContextMethod:
|
194
213
|
Description: "`context` should not be used for specifying methods."
|
@@ -204,8 +223,9 @@ RSpec/ContextWording:
|
|
204
223
|
- when
|
205
224
|
- with
|
206
225
|
- without
|
226
|
+
AllowedPatterns: []
|
207
227
|
VersionAdded: '1.20'
|
208
|
-
VersionChanged:
|
228
|
+
VersionChanged: '2.13'
|
209
229
|
StyleGuide: https://rspec.rubystyle.guide/#context-descriptions
|
210
230
|
Reference: https://www.rubydoc.info/gems/rubocop-rspec/RuboCop/Cop/RSpec/ContextWording
|
211
231
|
|
@@ -279,8 +299,9 @@ RSpec/Dialect:
|
|
279
299
|
RSpec/EmptyExampleGroup:
|
280
300
|
Description: Checks if an example group does not include any tests.
|
281
301
|
Enabled: true
|
302
|
+
SafeAutoCorrect: false
|
282
303
|
VersionAdded: '1.7'
|
283
|
-
VersionChanged: '2.
|
304
|
+
VersionChanged: '2.13'
|
284
305
|
Reference: https://www.rubydoc.info/gems/rubocop-rspec/RuboCop/Cop/RSpec/EmptyExampleGroup
|
285
306
|
|
286
307
|
RSpec/EmptyHook:
|
@@ -315,8 +336,10 @@ RSpec/EmptyLineAfterHook:
|
|
315
336
|
Description: Checks if there is an empty line after hook blocks.
|
316
337
|
Enabled: true
|
317
338
|
VersionAdded: '1.27'
|
339
|
+
VersionChanged: '2.13'
|
318
340
|
StyleGuide: https://rspec.rubystyle.guide/#empty-line-after-let
|
319
341
|
Reference: https://www.rubydoc.info/gems/rubocop-rspec/RuboCop/Cop/RSpec/EmptyLineAfterHook
|
342
|
+
AllowConsecutiveOneLiners: true
|
320
343
|
|
321
344
|
RSpec/EmptyLineAfterSubject:
|
322
345
|
Description: Checks if there is an empty line after subject block.
|
@@ -607,10 +630,18 @@ RSpec/NestedGroups:
|
|
607
630
|
Description: Checks for nested example groups.
|
608
631
|
Enabled: true
|
609
632
|
Max: 3
|
633
|
+
AllowedGroups: []
|
610
634
|
VersionAdded: '1.7'
|
611
|
-
VersionChanged: '
|
635
|
+
VersionChanged: '2.13'
|
612
636
|
Reference: https://www.rubydoc.info/gems/rubocop-rspec/RuboCop/Cop/RSpec/NestedGroups
|
613
637
|
|
638
|
+
RSpec/NoExpectationExample:
|
639
|
+
Description: Checks if an example contains any expectation.
|
640
|
+
Enabled: pending
|
641
|
+
Safe: false
|
642
|
+
VersionAdded: '2.13'
|
643
|
+
Reference: https://www.rubydoc.info/gems/rubocop-rspec/RuboCop/Cop/RSpec/NoExpectationExample
|
644
|
+
|
614
645
|
RSpec/NotToNot:
|
615
646
|
Description: Checks for consistent method usage for negating expectations.
|
616
647
|
Enabled: true
|
@@ -775,9 +806,10 @@ RSpec/VariableName:
|
|
775
806
|
SupportedStyles:
|
776
807
|
- snake_case
|
777
808
|
- camelCase
|
809
|
+
AllowedPatterns: []
|
778
810
|
IgnoredPatterns: []
|
779
811
|
VersionAdded: '1.40'
|
780
|
-
VersionChanged: '
|
812
|
+
VersionChanged: '2.13'
|
781
813
|
Reference: https://www.rubydoc.info/gems/rubocop-rspec/RuboCop/Cop/RSpec/VariableName
|
782
814
|
|
783
815
|
RSpec/VerifiedDoubleReference:
|
@@ -834,6 +866,12 @@ RSpec/Capybara/FeatureMethods:
|
|
834
866
|
VersionChanged: '2.0'
|
835
867
|
Reference: https://www.rubydoc.info/gems/rubocop-rspec/RuboCop/Cop/RSpec/Capybara/FeatureMethods
|
836
868
|
|
869
|
+
RSpec/Capybara/SpecificFinders:
|
870
|
+
Description: Checks if there is a more specific finder offered by Capybara.
|
871
|
+
Enabled: pending
|
872
|
+
VersionAdded: '2.13'
|
873
|
+
Reference: https://www.rubydoc.info/gems/rubocop-rspec/RuboCop/Cop/RSpec/Capybara/SpecificFinders
|
874
|
+
|
837
875
|
RSpec/Capybara/SpecificMatcher:
|
838
876
|
Description: Checks for there is a more specific matcher offered by Capybara.
|
839
877
|
Enabled: pending
|
@@ -6,16 +6,15 @@ module RuboCop
|
|
6
6
|
# Checks that left braces for adjacent single line lets are aligned.
|
7
7
|
#
|
8
8
|
# @example
|
9
|
+
# # bad
|
10
|
+
# let(:foobar) { blahblah }
|
11
|
+
# let(:baz) { bar }
|
12
|
+
# let(:a) { b }
|
9
13
|
#
|
10
|
-
#
|
11
|
-
#
|
12
|
-
#
|
13
|
-
#
|
14
|
-
#
|
15
|
-
# # good
|
16
|
-
# let(:foobar) { blahblah }
|
17
|
-
# let(:baz) { bar }
|
18
|
-
# let(:a) { b }
|
14
|
+
# # good
|
15
|
+
# let(:foobar) { blahblah }
|
16
|
+
# let(:baz) { bar }
|
17
|
+
# let(:a) { b }
|
19
18
|
#
|
20
19
|
class AlignLeftLetBrace < Base
|
21
20
|
extend AutoCorrector
|
@@ -6,16 +6,15 @@ module RuboCop
|
|
6
6
|
# Checks that right braces for adjacent single line lets are aligned.
|
7
7
|
#
|
8
8
|
# @example
|
9
|
+
# # bad
|
10
|
+
# let(:foobar) { blahblah }
|
11
|
+
# let(:baz) { bar }
|
12
|
+
# let(:a) { b }
|
9
13
|
#
|
10
|
-
#
|
11
|
-
#
|
12
|
-
#
|
13
|
-
#
|
14
|
-
#
|
15
|
-
# # good
|
16
|
-
# let(:foobar) { blahblah }
|
17
|
-
# let(:baz) { bar }
|
18
|
-
# let(:a) { b }
|
14
|
+
# # good
|
15
|
+
# let(:foobar) { blahblah }
|
16
|
+
# let(:baz) { bar }
|
17
|
+
# let(:a) { b }
|
19
18
|
#
|
20
19
|
class AlignRightLetBrace < Base
|
21
20
|
extend AutoCorrector
|
@@ -25,23 +25,29 @@ module RuboCop
|
|
25
25
|
# some_method
|
26
26
|
# test.run
|
27
27
|
# end
|
28
|
+
#
|
28
29
|
class AroundBlock < Base
|
29
30
|
MSG_NO_ARG = 'Test object should be passed to around block.'
|
30
31
|
MSG_UNUSED_ARG = 'You should call `%<arg>s.call` ' \
|
31
32
|
'or `%<arg>s.run`.'
|
32
33
|
|
33
|
-
# @!method
|
34
|
-
def_node_matcher :
|
34
|
+
# @!method hook_block(node)
|
35
|
+
def_node_matcher :hook_block, <<-PATTERN
|
35
36
|
(block (send nil? :around sym ?) (args $...) ...)
|
36
37
|
PATTERN
|
37
38
|
|
39
|
+
# @!method hook_numblock(node)
|
40
|
+
def_node_matcher :hook_numblock, <<-PATTERN
|
41
|
+
(numblock (send nil? :around sym ?) ...)
|
42
|
+
PATTERN
|
43
|
+
|
38
44
|
# @!method find_arg_usage(node)
|
39
45
|
def_node_search :find_arg_usage, <<-PATTERN
|
40
46
|
{(send $... {:call :run}) (send _ _ $...) (yield $...) (block-pass $...)}
|
41
47
|
PATTERN
|
42
48
|
|
43
49
|
def on_block(node)
|
44
|
-
|
50
|
+
hook_block(node) do |(example_proxy)|
|
45
51
|
if example_proxy.nil?
|
46
52
|
add_no_arg_offense(node)
|
47
53
|
else
|
@@ -50,6 +56,12 @@ module RuboCop
|
|
50
56
|
end
|
51
57
|
end
|
52
58
|
|
59
|
+
def on_numblock(node)
|
60
|
+
hook_numblock(node) do
|
61
|
+
check_for_numblock(node)
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
53
65
|
private
|
54
66
|
|
55
67
|
def add_no_arg_offense(node)
|
@@ -68,6 +80,17 @@ module RuboCop
|
|
68
80
|
message: format(MSG_UNUSED_ARG, arg: name)
|
69
81
|
)
|
70
82
|
end
|
83
|
+
|
84
|
+
def check_for_numblock(block)
|
85
|
+
find_arg_usage(block) do |usage|
|
86
|
+
return if usage.include?(s(:lvar, :_1))
|
87
|
+
end
|
88
|
+
|
89
|
+
add_offense(
|
90
|
+
block.children.last,
|
91
|
+
message: format(MSG_UNUSED_ARG, arg: :_1)
|
92
|
+
)
|
93
|
+
end
|
71
94
|
end
|
72
95
|
end
|
73
96
|
end
|
data/lib/rubocop/cop/rspec/be.rb
CHANGED
@@ -23,6 +23,7 @@ module RuboCop
|
|
23
23
|
# before(:each) { Widget.create }
|
24
24
|
# after(:each) { Widget.delete_all }
|
25
25
|
# end
|
26
|
+
#
|
26
27
|
class BeforeAfterAll < Base
|
27
28
|
MSG = 'Beware of using `%<hook>s` as it may cause state to leak ' \
|
28
29
|
'between tests. If you are using `rspec-rails`, and ' \
|
@@ -14,14 +14,20 @@ module RuboCop
|
|
14
14
|
# which ensures that preceding actions (like `click_link`) have
|
15
15
|
# completed.
|
16
16
|
#
|
17
|
+
# This cop does not support autocorrection in some cases.
|
18
|
+
#
|
17
19
|
# @example
|
18
20
|
# # bad
|
19
21
|
# expect(current_path).to eq('/callback')
|
20
|
-
# expect(page.current_path).to match(/widgets/)
|
21
22
|
#
|
22
23
|
# # good
|
23
|
-
# expect(page).to have_current_path(
|
24
|
-
#
|
24
|
+
# expect(page).to have_current_path('/callback')
|
25
|
+
#
|
26
|
+
# # bad (does not support autocorrection)
|
27
|
+
# expect(page.current_path).to match(variable)
|
28
|
+
#
|
29
|
+
# # good
|
30
|
+
# expect(page).to have_current_path('/callback')
|
25
31
|
#
|
26
32
|
class CurrentPathExpectation < Base
|
27
33
|
extend AutoCorrector
|
@@ -40,6 +40,7 @@ module RuboCop
|
|
40
40
|
# # ...
|
41
41
|
# end
|
42
42
|
# end
|
43
|
+
#
|
43
44
|
class FeatureMethods < Base
|
44
45
|
extend AutoCorrector
|
45
46
|
include InsideExampleGroup
|
@@ -68,7 +69,7 @@ module RuboCop
|
|
68
69
|
...)
|
69
70
|
PATTERN
|
70
71
|
|
71
|
-
def on_block(node)
|
72
|
+
def on_block(node) # rubocop:disable InternalAffairs/NumblockHandler
|
72
73
|
return unless inside_example_group?(node)
|
73
74
|
|
74
75
|
feature_method(node) do |send_node, match|
|
@@ -0,0 +1,86 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RuboCop
|
4
|
+
module Cop
|
5
|
+
module RSpec
|
6
|
+
module Capybara
|
7
|
+
# Checks if there is a more specific finder offered by Capybara.
|
8
|
+
#
|
9
|
+
# @example
|
10
|
+
# # bad
|
11
|
+
# find('#some-id')
|
12
|
+
# find('[visible][id=some-id]')
|
13
|
+
#
|
14
|
+
# # good
|
15
|
+
# find_by_id('some-id')
|
16
|
+
# find_by_id('some-id', visible: true)
|
17
|
+
#
|
18
|
+
class SpecificFinders < Base
|
19
|
+
extend AutoCorrector
|
20
|
+
|
21
|
+
include RangeHelp
|
22
|
+
|
23
|
+
MSG = 'Prefer `find_by` over `find`.'
|
24
|
+
RESTRICT_ON_SEND = %i[find].freeze
|
25
|
+
|
26
|
+
# @!method find_argument(node)
|
27
|
+
def_node_matcher :find_argument, <<~PATTERN
|
28
|
+
(send _ :find (str $_) ...)
|
29
|
+
PATTERN
|
30
|
+
|
31
|
+
def on_send(node)
|
32
|
+
find_argument(node) do |arg|
|
33
|
+
next if CssSelector.multiple_selectors?(arg)
|
34
|
+
|
35
|
+
on_attr(node, arg) if attribute?(arg)
|
36
|
+
on_id(node, arg) if CssSelector.id?(arg)
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
private
|
41
|
+
|
42
|
+
def on_attr(node, arg)
|
43
|
+
return unless (id = CssSelector.attributes(arg)['id'])
|
44
|
+
|
45
|
+
register_offense(node, replaced_arguments(arg, id))
|
46
|
+
end
|
47
|
+
|
48
|
+
def on_id(node, arg)
|
49
|
+
register_offense(node, "'#{arg.to_s.delete('#')}'")
|
50
|
+
end
|
51
|
+
|
52
|
+
def attribute?(arg)
|
53
|
+
CssSelector.attribute?(arg) &&
|
54
|
+
CssSelector.common_attributes?(arg)
|
55
|
+
end
|
56
|
+
|
57
|
+
def register_offense(node, arg_replacement)
|
58
|
+
add_offense(offense_range(node)) do |corrector|
|
59
|
+
corrector.replace(node.loc.selector, 'find_by_id')
|
60
|
+
corrector.replace(node.first_argument.loc.expression,
|
61
|
+
arg_replacement)
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
def replaced_arguments(arg, id)
|
66
|
+
options = to_options(CssSelector.attributes(arg))
|
67
|
+
options.empty? ? id : "#{id}, #{options}"
|
68
|
+
end
|
69
|
+
|
70
|
+
def to_options(attrs)
|
71
|
+
attrs.each.map do |key, value|
|
72
|
+
next if key == 'id'
|
73
|
+
|
74
|
+
"#{key}: #{value}"
|
75
|
+
end.compact.join(', ')
|
76
|
+
end
|
77
|
+
|
78
|
+
def offense_range(node)
|
79
|
+
range_between(node.loc.selector.begin_pos,
|
80
|
+
node.loc.end.end_pos)
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|
85
|
+
end
|
86
|
+
end
|