rubocop-minitest 0.15.0 → 0.17.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.circleci/config.yml +2 -5
- data/.github/PULL_REQUEST_TEMPLATE.md +1 -1
- data/.github/workflows/spell_checking.yml +33 -0
- data/.rubocop.yml +6 -6
- data/.rubocop_todo.yml +2 -0
- data/.yardopts +3 -0
- data/CHANGELOG.md +30 -0
- data/CONTRIBUTING.md +3 -2
- data/Gemfile +1 -1
- data/Rakefile +4 -11
- data/codespell.txt +0 -0
- data/config/default.yml +13 -2
- data/docs/antora.yml +1 -1
- data/docs/modules/ROOT/pages/cops_minitest.adoc +133 -38
- data/lib/rubocop/cop/minitest/assert_empty.rb +12 -0
- data/lib/rubocop/cop/minitest/assert_empty_literal.rb +1 -1
- data/lib/rubocop/cop/minitest/assert_with_expected_argument.rb +3 -2
- data/lib/rubocop/cop/minitest/global_expectations.rb +109 -38
- data/lib/rubocop/cop/minitest/literal_as_actual_argument.rb +4 -5
- data/lib/rubocop/cop/minitest/refute_empty.rb +12 -0
- data/lib/rubocop/minitest/assert_offense.rb +183 -0
- data/lib/rubocop/minitest/support.rb +10 -0
- data/lib/rubocop/minitest/version.rb +1 -1
- data/relnotes/v0.15.1.md +5 -0
- data/relnotes/v0.15.2.md +5 -0
- data/relnotes/v0.16.0.md +11 -0
- data/relnotes/v0.17.0.md +5 -0
- data/rubocop-minitest.gemspec +2 -1
- data/tasks/changelog.rake +34 -0
- data/tasks/changelog.rb +166 -0
- data/tasks/cops_documentation.rake +4 -14
- data/tasks/cut_release.rake +18 -3
- metadata +16 -4
@@ -3,7 +3,7 @@
|
|
3
3
|
== Minitest/AssertEmpty
|
4
4
|
|
5
5
|
|===
|
6
|
-
| Enabled by default | Safe | Supports autocorrection |
|
6
|
+
| Enabled by default | Safe | Supports autocorrection | Version Added | Version Changed
|
7
7
|
|
8
8
|
| Enabled
|
9
9
|
| Yes
|
@@ -35,17 +35,17 @@ assert_empty(object, 'message')
|
|
35
35
|
== Minitest/AssertEmptyLiteral
|
36
36
|
|
37
37
|
|===
|
38
|
-
| Enabled by default | Safe | Supports autocorrection |
|
38
|
+
| Enabled by default | Safe | Supports autocorrection | Version Added | Version Changed
|
39
39
|
|
40
40
|
| Enabled
|
41
41
|
| Yes
|
42
|
-
| Yes
|
42
|
+
| Yes
|
43
43
|
| 0.5
|
44
44
|
| 0.11
|
45
45
|
|===
|
46
46
|
|
47
47
|
This cop enforces the test to use `assert_empty`
|
48
|
-
instead of using `assert_equal([], object)`.
|
48
|
+
instead of using `assert_equal([], object)` or `assert_equal({}, object)`.
|
49
49
|
|
50
50
|
=== Examples
|
51
51
|
|
@@ -62,7 +62,7 @@ assert_empty(object)
|
|
62
62
|
== Minitest/AssertEqual
|
63
63
|
|
64
64
|
|===
|
65
|
-
| Enabled by default | Safe | Supports autocorrection |
|
65
|
+
| Enabled by default | Safe | Supports autocorrection | Version Added | Version Changed
|
66
66
|
|
67
67
|
| Enabled
|
68
68
|
| Yes
|
@@ -92,7 +92,7 @@ assert_equal("rubocop-minitest", actual)
|
|
92
92
|
== Minitest/AssertInDelta
|
93
93
|
|
94
94
|
|===
|
95
|
-
| Enabled by default | Safe | Supports autocorrection |
|
95
|
+
| Enabled by default | Safe | Supports autocorrection | Version Added | Version Changed
|
96
96
|
|
97
97
|
| Pending
|
98
98
|
| Yes
|
@@ -124,7 +124,7 @@ assert_in_delta(0.2, actual, 0.001, 'message')
|
|
124
124
|
== Minitest/AssertIncludes
|
125
125
|
|
126
126
|
|===
|
127
|
-
| Enabled by default | Safe | Supports autocorrection |
|
127
|
+
| Enabled by default | Safe | Supports autocorrection | Version Added | Version Changed
|
128
128
|
|
129
129
|
| Enabled
|
130
130
|
| Yes
|
@@ -156,7 +156,7 @@ assert_includes(collection, object, 'message')
|
|
156
156
|
== Minitest/AssertInstanceOf
|
157
157
|
|
158
158
|
|===
|
159
|
-
| Enabled by default | Safe | Supports autocorrection |
|
159
|
+
| Enabled by default | Safe | Supports autocorrection | Version Added | Version Changed
|
160
160
|
|
161
161
|
| Enabled
|
162
162
|
| Yes
|
@@ -188,7 +188,7 @@ assert_instance_of(Class, object, 'message')
|
|
188
188
|
== Minitest/AssertKindOf
|
189
189
|
|
190
190
|
|===
|
191
|
-
| Enabled by default | Safe | Supports autocorrection |
|
191
|
+
| Enabled by default | Safe | Supports autocorrection | Version Added | Version Changed
|
192
192
|
|
193
193
|
| Pending
|
194
194
|
| Yes
|
@@ -220,7 +220,7 @@ assert_kind_of(Class, object, 'message')
|
|
220
220
|
== Minitest/AssertMatch
|
221
221
|
|
222
222
|
|===
|
223
|
-
| Enabled by default | Safe | Supports autocorrection |
|
223
|
+
| Enabled by default | Safe | Supports autocorrection | Version Added | Version Changed
|
224
224
|
|
225
225
|
| Enabled
|
226
226
|
| Yes
|
@@ -252,7 +252,7 @@ assert_match(matcher, string, 'message')
|
|
252
252
|
== Minitest/AssertNil
|
253
253
|
|
254
254
|
|===
|
255
|
-
| Enabled by default | Safe | Supports autocorrection |
|
255
|
+
| Enabled by default | Safe | Supports autocorrection | Version Added | Version Changed
|
256
256
|
|
257
257
|
| Enabled
|
258
258
|
| Yes
|
@@ -286,7 +286,7 @@ assert_nil(actual, 'message')
|
|
286
286
|
== Minitest/AssertOutput
|
287
287
|
|
288
288
|
|===
|
289
|
-
| Enabled by default | Safe | Supports autocorrection |
|
289
|
+
| Enabled by default | Safe | Supports autocorrection | Version Added | Version Changed
|
290
290
|
|
291
291
|
| Pending
|
292
292
|
| Yes
|
@@ -318,7 +318,7 @@ assert_output(expected) { puts object.method }
|
|
318
318
|
== Minitest/AssertPathExists
|
319
319
|
|
320
320
|
|===
|
321
|
-
| Enabled by default | Safe | Supports autocorrection |
|
321
|
+
| Enabled by default | Safe | Supports autocorrection | Version Added | Version Changed
|
322
322
|
|
323
323
|
| Pending
|
324
324
|
| Yes
|
@@ -350,7 +350,7 @@ assert_path_exists(path, 'message')
|
|
350
350
|
== Minitest/AssertRespondTo
|
351
351
|
|
352
352
|
|===
|
353
|
-
| Enabled by default | Safe | Supports autocorrection |
|
353
|
+
| Enabled by default | Safe | Supports autocorrection | Version Added | Version Changed
|
354
354
|
|
355
355
|
| Enabled
|
356
356
|
| Yes
|
@@ -384,7 +384,7 @@ assert_respond_to(self, :do_something)
|
|
384
384
|
== Minitest/AssertSilent
|
385
385
|
|
386
386
|
|===
|
387
|
-
| Enabled by default | Safe | Supports autocorrection |
|
387
|
+
| Enabled by default | Safe | Supports autocorrection | Version Added | Version Changed
|
388
388
|
|
389
389
|
| Pending
|
390
390
|
| Yes
|
@@ -414,7 +414,7 @@ assert_silent { puts object.do_something }
|
|
414
414
|
== Minitest/AssertTruthy
|
415
415
|
|
416
416
|
|===
|
417
|
-
| Enabled by default | Safe | Supports autocorrection |
|
417
|
+
| Enabled by default | Safe | Supports autocorrection | Version Added | Version Changed
|
418
418
|
|
419
419
|
| Enabled
|
420
420
|
| Yes
|
@@ -446,7 +446,7 @@ assert(actual, 'message')
|
|
446
446
|
== Minitest/AssertWithExpectedArgument
|
447
447
|
|
448
448
|
|===
|
449
|
-
| Enabled by default | Safe | Supports autocorrection |
|
449
|
+
| Enabled by default | Safe | Supports autocorrection | Version Added | Version Changed
|
450
450
|
|
451
451
|
| Pending
|
452
452
|
| No
|
@@ -458,7 +458,9 @@ assert(actual, 'message')
|
|
458
458
|
This cop tries to detect when a user accidentally used
|
459
459
|
`assert` when they meant to use `assert_equal`.
|
460
460
|
|
461
|
-
|
461
|
+
=== Safety
|
462
|
+
|
463
|
+
This cop is unsafe because it is not possible to determine
|
462
464
|
whether the second argument of `assert` is a message or not.
|
463
465
|
|
464
466
|
=== Examples
|
@@ -478,7 +480,7 @@ assert(foo, 'message')
|
|
478
480
|
== Minitest/AssertionInLifecycleHook
|
479
481
|
|
480
482
|
|===
|
481
|
-
| Enabled by default | Safe | Supports autocorrection |
|
483
|
+
| Enabled by default | Safe | Supports autocorrection | Version Added | Version Changed
|
482
484
|
|
483
485
|
| Pending
|
484
486
|
| Yes
|
@@ -511,13 +513,13 @@ end
|
|
511
513
|
== Minitest/GlobalExpectations
|
512
514
|
|
513
515
|
|===
|
514
|
-
| Enabled by default | Safe | Supports autocorrection |
|
516
|
+
| Enabled by default | Safe | Supports autocorrection | Version Added | Version Changed
|
515
517
|
|
516
518
|
| Enabled
|
517
519
|
| Yes
|
518
520
|
| Yes
|
519
521
|
| 0.7
|
520
|
-
|
|
522
|
+
| 0.16
|
521
523
|
|===
|
522
524
|
|
523
525
|
This cop checks for deprecated global expectations
|
@@ -525,6 +527,54 @@ and autocorrects them to use expect format.
|
|
525
527
|
|
526
528
|
=== Examples
|
527
529
|
|
530
|
+
==== EnforcedStyle: _
|
531
|
+
|
532
|
+
[source,ruby]
|
533
|
+
----
|
534
|
+
# bad
|
535
|
+
musts.must_equal expected_musts
|
536
|
+
wonts.wont_match expected_wonts
|
537
|
+
musts.must_raise TypeError
|
538
|
+
|
539
|
+
expect(musts).must_equal expected_musts
|
540
|
+
expect(wonts).wont_match expected_wonts
|
541
|
+
expect { musts }.must_raise TypeError
|
542
|
+
|
543
|
+
value(musts).must_equal expected_musts
|
544
|
+
value(wonts).wont_match expected_wonts
|
545
|
+
value { musts }.must_raise TypeError
|
546
|
+
|
547
|
+
# good
|
548
|
+
_(musts).must_equal expected_musts
|
549
|
+
_(wonts).wont_match expected_wonts
|
550
|
+
_ { musts }.must_raise TypeError
|
551
|
+
----
|
552
|
+
|
553
|
+
==== EnforcedStyle: any (default)
|
554
|
+
|
555
|
+
[source,ruby]
|
556
|
+
----
|
557
|
+
# bad
|
558
|
+
musts.must_equal expected_musts
|
559
|
+
wonts.wont_match expected_wonts
|
560
|
+
musts.must_raise TypeError
|
561
|
+
|
562
|
+
# good
|
563
|
+
_(musts).must_equal expected_musts
|
564
|
+
_(wonts).wont_match expected_wonts
|
565
|
+
_ { musts }.must_raise TypeError
|
566
|
+
|
567
|
+
expect(musts).must_equal expected_musts
|
568
|
+
expect(wonts).wont_match expected_wonts
|
569
|
+
expect { musts }.must_raise TypeError
|
570
|
+
|
571
|
+
value(musts).must_equal expected_musts
|
572
|
+
value(wonts).wont_match expected_wonts
|
573
|
+
value { musts }.must_raise TypeError
|
574
|
+
----
|
575
|
+
|
576
|
+
==== EnforcedStyle: expect
|
577
|
+
|
528
578
|
[source,ruby]
|
529
579
|
----
|
530
580
|
# bad
|
@@ -532,12 +582,57 @@ musts.must_equal expected_musts
|
|
532
582
|
wonts.wont_match expected_wonts
|
533
583
|
musts.must_raise TypeError
|
534
584
|
|
585
|
+
_(musts).must_equal expected_musts
|
586
|
+
_(wonts).wont_match expected_wonts
|
587
|
+
_ { musts }.must_raise TypeError
|
588
|
+
|
589
|
+
value(musts).must_equal expected_musts
|
590
|
+
value(wonts).wont_match expected_wonts
|
591
|
+
value { musts }.must_raise TypeError
|
592
|
+
|
535
593
|
# good
|
594
|
+
expect(musts).must_equal expected_musts
|
595
|
+
expect(wonts).wont_match expected_wonts
|
596
|
+
expect { musts }.must_raise TypeError
|
597
|
+
----
|
598
|
+
|
599
|
+
==== EnforcedStyle: value
|
600
|
+
|
601
|
+
[source,ruby]
|
602
|
+
----
|
603
|
+
# bad
|
604
|
+
musts.must_equal expected_musts
|
605
|
+
wonts.wont_match expected_wonts
|
606
|
+
musts.must_raise TypeError
|
607
|
+
|
536
608
|
_(musts).must_equal expected_musts
|
537
609
|
_(wonts).wont_match expected_wonts
|
538
610
|
_ { musts }.must_raise TypeError
|
611
|
+
|
612
|
+
expect(musts).must_equal expected_musts
|
613
|
+
expect(wonts).wont_match expected_wonts
|
614
|
+
expect { musts }.must_raise TypeError
|
615
|
+
|
616
|
+
# good
|
617
|
+
value(musts).must_equal expected_musts
|
618
|
+
value(wonts).wont_match expected_wonts
|
619
|
+
value { musts }.must_raise TypeError
|
539
620
|
----
|
540
621
|
|
622
|
+
=== Configurable attributes
|
623
|
+
|
624
|
+
|===
|
625
|
+
| Name | Default value | Configurable values
|
626
|
+
|
627
|
+
| EnforcedStyle
|
628
|
+
| `any`
|
629
|
+
| `_`, `any`, `expect`, `value`
|
630
|
+
|
631
|
+
| Include
|
632
|
+
| `+**/test/**/*+`, `+**/*_test.rb+`, `+**/spec/**/*+`, `+**/*_spec.rb+`
|
633
|
+
| Array
|
634
|
+
|===
|
635
|
+
|
541
636
|
=== References
|
542
637
|
|
543
638
|
* https://minitest.rubystyle.guide#global-expectations
|
@@ -545,7 +640,7 @@ _ { musts }.must_raise TypeError
|
|
545
640
|
== Minitest/LiteralAsActualArgument
|
546
641
|
|
547
642
|
|===
|
548
|
-
| Enabled by default | Safe | Supports autocorrection |
|
643
|
+
| Enabled by default | Safe | Supports autocorrection | Version Added | Version Changed
|
549
644
|
|
550
645
|
| Pending
|
551
646
|
| Yes
|
@@ -579,7 +674,7 @@ assert_equal [1, 2], foo, 'message'
|
|
579
674
|
== Minitest/MultipleAssertions
|
580
675
|
|
581
676
|
|===
|
582
|
-
| Enabled by default | Safe | Supports autocorrection |
|
677
|
+
| Enabled by default | Safe | Supports autocorrection | Version Added | Version Changed
|
583
678
|
|
584
679
|
| Pending
|
585
680
|
| Yes
|
@@ -630,7 +725,7 @@ end
|
|
630
725
|
== Minitest/NoAssertions
|
631
726
|
|
632
727
|
|===
|
633
|
-
| Enabled by default | Safe | Supports autocorrection |
|
728
|
+
| Enabled by default | Safe | Supports autocorrection | Version Added | Version Changed
|
634
729
|
|
635
730
|
| Disabled
|
636
731
|
| Yes
|
@@ -662,7 +757,7 @@ end
|
|
662
757
|
== Minitest/RefuteEmpty
|
663
758
|
|
664
759
|
|===
|
665
|
-
| Enabled by default | Safe | Supports autocorrection |
|
760
|
+
| Enabled by default | Safe | Supports autocorrection | Version Added | Version Changed
|
666
761
|
|
667
762
|
| Enabled
|
668
763
|
| Yes
|
@@ -694,7 +789,7 @@ refute_empty(object, 'message')
|
|
694
789
|
== Minitest/RefuteEqual
|
695
790
|
|
696
791
|
|===
|
697
|
-
| Enabled by default | Safe | Supports autocorrection |
|
792
|
+
| Enabled by default | Safe | Supports autocorrection | Version Added | Version Changed
|
698
793
|
|
699
794
|
| Enabled
|
700
795
|
| Yes
|
@@ -725,7 +820,7 @@ refute_equal("rubocop-minitest", actual)
|
|
725
820
|
== Minitest/RefuteFalse
|
726
821
|
|
727
822
|
|===
|
728
|
-
| Enabled by default | Safe | Supports autocorrection |
|
823
|
+
| Enabled by default | Safe | Supports autocorrection | Version Added | Version Changed
|
729
824
|
|
730
825
|
| Enabled
|
731
826
|
| Yes
|
@@ -760,7 +855,7 @@ refute(actual, 'message')
|
|
760
855
|
== Minitest/RefuteInDelta
|
761
856
|
|
762
857
|
|===
|
763
|
-
| Enabled by default | Safe | Supports autocorrection |
|
858
|
+
| Enabled by default | Safe | Supports autocorrection | Version Added | Version Changed
|
764
859
|
|
765
860
|
| Pending
|
766
861
|
| Yes
|
@@ -792,7 +887,7 @@ refute_in_delta(0.2, actual, 0.001, 'message')
|
|
792
887
|
== Minitest/RefuteIncludes
|
793
888
|
|
794
889
|
|===
|
795
|
-
| Enabled by default | Safe | Supports autocorrection |
|
890
|
+
| Enabled by default | Safe | Supports autocorrection | Version Added | Version Changed
|
796
891
|
|
797
892
|
| Enabled
|
798
893
|
| Yes
|
@@ -824,7 +919,7 @@ refute_includes(collection, object, 'message')
|
|
824
919
|
== Minitest/RefuteInstanceOf
|
825
920
|
|
826
921
|
|===
|
827
|
-
| Enabled by default | Safe | Supports autocorrection |
|
922
|
+
| Enabled by default | Safe | Supports autocorrection | Version Added | Version Changed
|
828
923
|
|
829
924
|
| Enabled
|
830
925
|
| Yes
|
@@ -856,7 +951,7 @@ refute_instance_of(Class, object, 'message')
|
|
856
951
|
== Minitest/RefuteKindOf
|
857
952
|
|
858
953
|
|===
|
859
|
-
| Enabled by default | Safe | Supports autocorrection |
|
954
|
+
| Enabled by default | Safe | Supports autocorrection | Version Added | Version Changed
|
860
955
|
|
861
956
|
| Pending
|
862
957
|
| Yes
|
@@ -888,7 +983,7 @@ refute_kind_of(Class, object, 'message')
|
|
888
983
|
== Minitest/RefuteMatch
|
889
984
|
|
890
985
|
|===
|
891
|
-
| Enabled by default | Safe | Supports autocorrection |
|
986
|
+
| Enabled by default | Safe | Supports autocorrection | Version Added | Version Changed
|
892
987
|
|
893
988
|
| Enabled
|
894
989
|
| Yes
|
@@ -920,7 +1015,7 @@ refute_match(matcher, string, 'message')
|
|
920
1015
|
== Minitest/RefuteNil
|
921
1016
|
|
922
1017
|
|===
|
923
|
-
| Enabled by default | Safe | Supports autocorrection |
|
1018
|
+
| Enabled by default | Safe | Supports autocorrection | Version Added | Version Changed
|
924
1019
|
|
925
1020
|
| Enabled
|
926
1021
|
| Yes
|
@@ -954,7 +1049,7 @@ refute_nil(actual, 'message')
|
|
954
1049
|
== Minitest/RefutePathExists
|
955
1050
|
|
956
1051
|
|===
|
957
|
-
| Enabled by default | Safe | Supports autocorrection |
|
1052
|
+
| Enabled by default | Safe | Supports autocorrection | Version Added | Version Changed
|
958
1053
|
|
959
1054
|
| Pending
|
960
1055
|
| Yes
|
@@ -986,7 +1081,7 @@ refute_path_exists(path, 'message')
|
|
986
1081
|
== Minitest/RefuteRespondTo
|
987
1082
|
|
988
1083
|
|===
|
989
|
-
| Enabled by default | Safe | Supports autocorrection |
|
1084
|
+
| Enabled by default | Safe | Supports autocorrection | Version Added | Version Changed
|
990
1085
|
|
991
1086
|
| Enabled
|
992
1087
|
| Yes
|
@@ -1020,7 +1115,7 @@ refute_respond_to(self, :do_something)
|
|
1020
1115
|
== Minitest/TestMethodName
|
1021
1116
|
|
1022
1117
|
|===
|
1023
|
-
| Enabled by default | Safe | Supports autocorrection |
|
1118
|
+
| Enabled by default | Safe | Supports autocorrection | Version Added | Version Changed
|
1024
1119
|
|
1025
1120
|
| Pending
|
1026
1121
|
| Yes
|
@@ -1060,7 +1155,7 @@ end
|
|
1060
1155
|
== Minitest/UnreachableAssertion
|
1061
1156
|
|
1062
1157
|
|===
|
1063
|
-
| Enabled by default | Safe | Supports autocorrection |
|
1158
|
+
| Enabled by default | Safe | Supports autocorrection | Version Added | Version Changed
|
1064
1159
|
|
1065
1160
|
| Pending
|
1066
1161
|
| Yes
|
@@ -1092,7 +1187,7 @@ assert_equal('foo', obj.bar)
|
|
1092
1187
|
== Minitest/UnspecifiedException
|
1093
1188
|
|
1094
1189
|
|===
|
1095
|
-
| Enabled by default | Safe | Supports autocorrection |
|
1190
|
+
| Enabled by default | Safe | Supports autocorrection | Version Added | Version Changed
|
1096
1191
|
|
1097
1192
|
| Pending
|
1098
1193
|
| Yes
|
@@ -19,6 +19,18 @@ module RuboCop
|
|
19
19
|
extend MinitestCopRule
|
20
20
|
|
21
21
|
define_rule :assert, target_method: :empty?
|
22
|
+
|
23
|
+
remove_method :on_send
|
24
|
+
def on_send(node)
|
25
|
+
return unless node.method?(:assert)
|
26
|
+
return unless (arguments = peel_redundant_parentheses_from(node.arguments))
|
27
|
+
return unless arguments.first.respond_to?(:method?) && arguments.first.method?(:empty?)
|
28
|
+
return unless arguments.first.arguments.empty?
|
29
|
+
|
30
|
+
add_offense(node, message: offense_message(arguments)) do |corrector|
|
31
|
+
autocorrect(corrector, node, arguments)
|
32
|
+
end
|
33
|
+
end
|
22
34
|
end
|
23
35
|
end
|
24
36
|
end
|
@@ -6,8 +6,9 @@ module RuboCop
|
|
6
6
|
# This cop tries to detect when a user accidentally used
|
7
7
|
# `assert` when they meant to use `assert_equal`.
|
8
8
|
#
|
9
|
-
#
|
10
|
-
#
|
9
|
+
# @safety
|
10
|
+
# This cop is unsafe because it is not possible to determine
|
11
|
+
# whether the second argument of `assert` is a message or not.
|
11
12
|
#
|
12
13
|
# @example
|
13
14
|
# # bad
|
@@ -6,17 +6,83 @@ module RuboCop
|
|
6
6
|
# This cop checks for deprecated global expectations
|
7
7
|
# and autocorrects them to use expect format.
|
8
8
|
#
|
9
|
-
# @example
|
9
|
+
# @example EnforcedStyle: _
|
10
10
|
# # bad
|
11
11
|
# musts.must_equal expected_musts
|
12
12
|
# wonts.wont_match expected_wonts
|
13
13
|
# musts.must_raise TypeError
|
14
14
|
#
|
15
|
+
# expect(musts).must_equal expected_musts
|
16
|
+
# expect(wonts).wont_match expected_wonts
|
17
|
+
# expect { musts }.must_raise TypeError
|
18
|
+
#
|
19
|
+
# value(musts).must_equal expected_musts
|
20
|
+
# value(wonts).wont_match expected_wonts
|
21
|
+
# value { musts }.must_raise TypeError
|
22
|
+
#
|
15
23
|
# # good
|
16
24
|
# _(musts).must_equal expected_musts
|
17
25
|
# _(wonts).wont_match expected_wonts
|
18
26
|
# _ { musts }.must_raise TypeError
|
27
|
+
#
|
28
|
+
# @example EnforcedStyle: any (default)
|
29
|
+
# # bad
|
30
|
+
# musts.must_equal expected_musts
|
31
|
+
# wonts.wont_match expected_wonts
|
32
|
+
# musts.must_raise TypeError
|
33
|
+
#
|
34
|
+
# # good
|
35
|
+
# _(musts).must_equal expected_musts
|
36
|
+
# _(wonts).wont_match expected_wonts
|
37
|
+
# _ { musts }.must_raise TypeError
|
38
|
+
#
|
39
|
+
# expect(musts).must_equal expected_musts
|
40
|
+
# expect(wonts).wont_match expected_wonts
|
41
|
+
# expect { musts }.must_raise TypeError
|
42
|
+
#
|
43
|
+
# value(musts).must_equal expected_musts
|
44
|
+
# value(wonts).wont_match expected_wonts
|
45
|
+
# value { musts }.must_raise TypeError
|
46
|
+
#
|
47
|
+
# @example EnforcedStyle: expect
|
48
|
+
# # bad
|
49
|
+
# musts.must_equal expected_musts
|
50
|
+
# wonts.wont_match expected_wonts
|
51
|
+
# musts.must_raise TypeError
|
52
|
+
#
|
53
|
+
# _(musts).must_equal expected_musts
|
54
|
+
# _(wonts).wont_match expected_wonts
|
55
|
+
# _ { musts }.must_raise TypeError
|
56
|
+
#
|
57
|
+
# value(musts).must_equal expected_musts
|
58
|
+
# value(wonts).wont_match expected_wonts
|
59
|
+
# value { musts }.must_raise TypeError
|
60
|
+
#
|
61
|
+
# # good
|
62
|
+
# expect(musts).must_equal expected_musts
|
63
|
+
# expect(wonts).wont_match expected_wonts
|
64
|
+
# expect { musts }.must_raise TypeError
|
65
|
+
#
|
66
|
+
# @example EnforcedStyle: value
|
67
|
+
# # bad
|
68
|
+
# musts.must_equal expected_musts
|
69
|
+
# wonts.wont_match expected_wonts
|
70
|
+
# musts.must_raise TypeError
|
71
|
+
#
|
72
|
+
# _(musts).must_equal expected_musts
|
73
|
+
# _(wonts).wont_match expected_wonts
|
74
|
+
# _ { musts }.must_raise TypeError
|
75
|
+
#
|
76
|
+
# expect(musts).must_equal expected_musts
|
77
|
+
# expect(wonts).wont_match expected_wonts
|
78
|
+
# expect { musts }.must_raise TypeError
|
79
|
+
#
|
80
|
+
# # good
|
81
|
+
# value(musts).must_equal expected_musts
|
82
|
+
# value(wonts).wont_match expected_wonts
|
83
|
+
# value { musts }.must_raise TypeError
|
19
84
|
class GlobalExpectations < Base
|
85
|
+
include ConfigurableEnforcedStyle
|
20
86
|
extend AutoCorrector
|
21
87
|
|
22
88
|
MSG = 'Use `%<preferred>s` instead.'
|
@@ -34,58 +100,63 @@ module RuboCop
|
|
34
100
|
|
35
101
|
RESTRICT_ON_SEND = VALUE_MATCHERS + BLOCK_MATCHERS
|
36
102
|
|
37
|
-
|
38
|
-
|
39
|
-
end.join(' ').freeze
|
103
|
+
# There are aliases for the `_` method - `expect` and `value`
|
104
|
+
DSL_METHODS = %i[_ expect value].freeze
|
40
105
|
|
41
|
-
|
42
|
-
|
43
|
-
|
106
|
+
def on_send(node)
|
107
|
+
receiver = node.receiver
|
108
|
+
return unless receiver
|
44
109
|
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
110
|
+
method = block_receiver?(receiver) || value_receiver?(receiver)
|
111
|
+
return if method == preferred_method || (method && style == :any)
|
112
|
+
|
113
|
+
register_offense(node, method)
|
114
|
+
end
|
49
115
|
|
50
|
-
|
51
|
-
|
116
|
+
private
|
117
|
+
|
118
|
+
def_node_matcher :block_receiver?, <<~PATTERN
|
119
|
+
(block (send nil? $#method_allowed?) _ _)
|
52
120
|
PATTERN
|
53
121
|
|
54
|
-
def_node_matcher :
|
55
|
-
(send
|
56
|
-
[
|
57
|
-
!(send nil? {#{DSL_METHODS_LIST}} _)
|
58
|
-
!(block (send nil? {#{DSL_METHODS_LIST}}) _ _)
|
59
|
-
]
|
60
|
-
{#{BLOCK_MATCHERS_STR}}
|
61
|
-
_
|
62
|
-
)
|
122
|
+
def_node_matcher :value_receiver?, <<~PATTERN
|
123
|
+
(send nil? $#method_allowed? _)
|
63
124
|
PATTERN
|
64
125
|
|
65
|
-
def
|
66
|
-
|
126
|
+
def method_allowed?(method)
|
127
|
+
DSL_METHODS.include?(method)
|
128
|
+
end
|
67
129
|
|
68
|
-
|
130
|
+
def preferred_method
|
131
|
+
style == :any ? :_ : style
|
132
|
+
end
|
69
133
|
|
70
|
-
|
71
|
-
|
134
|
+
def preferred_receiver(node)
|
135
|
+
receiver = node.receiver
|
72
136
|
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
137
|
+
if BLOCK_MATCHERS.include?(node.method_name)
|
138
|
+
body = receiver.lambda? ? receiver.body : receiver
|
139
|
+
"#{preferred_method} { #{body.source} }"
|
140
|
+
else
|
141
|
+
"#{preferred_method}(#{receiver.source})"
|
78
142
|
end
|
79
143
|
end
|
80
144
|
|
81
|
-
|
145
|
+
def register_offense(node, method)
|
146
|
+
receiver = node.receiver
|
82
147
|
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
"_ { #{source} }"
|
148
|
+
if method
|
149
|
+
preferred = preferred_method
|
150
|
+
replacement = receiver.source.sub(method.to_s, preferred_method.to_s)
|
87
151
|
else
|
88
|
-
|
152
|
+
preferred = preferred_receiver(node)
|
153
|
+
replacement = preferred
|
154
|
+
end
|
155
|
+
|
156
|
+
message = format(MSG, preferred: preferred)
|
157
|
+
|
158
|
+
add_offense(receiver, message: message) do |corrector|
|
159
|
+
corrector.replace(receiver, replacement)
|
89
160
|
end
|
90
161
|
end
|
91
162
|
end
|
@@ -27,17 +27,16 @@ module RuboCop
|
|
27
27
|
def on_send(node)
|
28
28
|
return unless node.method?(:assert_equal)
|
29
29
|
|
30
|
-
actual = node.arguments
|
30
|
+
expected, actual, message = *node.arguments
|
31
31
|
return unless actual&.recursive_basic_literal?
|
32
|
+
return if expected.recursive_basic_literal?
|
32
33
|
|
33
34
|
add_offense(all_arguments_range(node)) do |corrector|
|
34
|
-
autocorrect(corrector, node)
|
35
|
+
autocorrect(corrector, node, expected, actual, message)
|
35
36
|
end
|
36
37
|
end
|
37
38
|
|
38
|
-
def autocorrect(corrector, node)
|
39
|
-
expected, actual, message = *node.arguments
|
40
|
-
|
39
|
+
def autocorrect(corrector, node, expected, actual, message)
|
41
40
|
new_actual_source = if actual.hash_type? && !actual.braces?
|
42
41
|
"{#{actual.source}}"
|
43
42
|
else
|