rubocop-minitest 0.17.2 → 0.18.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.github/workflows/linting.yml +15 -0
- data/.rubocop.yml +7 -7
- data/.yamllint.yml +9 -0
- data/CHANGELOG.md +10 -0
- data/config/default.yml +12 -0
- data/docs/antora.yml +2 -2
- data/docs/modules/ROOT/pages/cops.adoc +2 -0
- data/docs/modules/ROOT/pages/cops_minitest.adoc +70 -2
- data/lib/rubocop/cop/minitest/assert_empty_literal.rb +1 -2
- data/lib/rubocop/cop/minitest/assert_nil.rb +5 -2
- data/lib/rubocop/cop/minitest/assert_path_exists.rb +2 -2
- data/lib/rubocop/cop/minitest/assert_predicate.rb +34 -0
- data/lib/rubocop/cop/minitest/assert_silent.rb +1 -1
- data/lib/rubocop/cop/minitest/assert_truthy.rb +1 -2
- data/lib/rubocop/cop/minitest/refute_equal.rb +9 -11
- data/lib/rubocop/cop/minitest/refute_false.rb +2 -2
- data/lib/rubocop/cop/minitest/refute_nil.rb +5 -2
- data/lib/rubocop/cop/minitest/refute_path_exists.rb +2 -2
- data/lib/rubocop/cop/minitest/refute_predicate.rb +34 -0
- data/lib/rubocop/cop/minitest_cops.rb +3 -0
- data/lib/rubocop/cop/mixin/in_delta_mixin.rb +2 -2
- data/lib/rubocop/cop/mixin/minitest_cop_rule.rb +2 -6
- data/lib/rubocop/cop/mixin/nil_assertion_handleable.rb +5 -10
- data/lib/rubocop/cop/mixin/predicate_assertion_handleable.rb +61 -0
- data/lib/rubocop/minitest/assert_offense.rb +3 -3
- data/lib/rubocop/minitest/version.rb +1 -1
- data/mkdocs.yml +6 -6
- data/relnotes/v0.18.0.md +9 -0
- metadata +9 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: add241b07281db4494e25119722057177e5eb15056360b0907d4b58819b6f371
|
4
|
+
data.tar.gz: 0dbe3916ea796caa3c59e04df1b13ade8a11c25b7613187308b3ea90348380fa
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4ab3dd3b82e55154731f600b942f2ef3dd48e85bf55d8d5d09c94bcb5227e409ea201c45be221cfde00cdb434d4877508bfad26cc7d3d3427c531c0babf146c1
|
7
|
+
data.tar.gz: 261d27488e8ee453f9307bb4367a7072dddb544c0dd73c5ac4e70e033875be7916519cf346ede3c5956023d81e5cf0f22b6ab284c85650a8987b0fa95c77f18d
|
@@ -0,0 +1,15 @@
|
|
1
|
+
name: Linting
|
2
|
+
on:
|
3
|
+
- pull_request
|
4
|
+
jobs:
|
5
|
+
yamllint:
|
6
|
+
name: Yamllint
|
7
|
+
runs-on: ubuntu-latest
|
8
|
+
steps:
|
9
|
+
- uses: actions/checkout@v2
|
10
|
+
- name: Yamllint
|
11
|
+
uses: karancode/yamllint-github-action@master
|
12
|
+
with:
|
13
|
+
yamllint_comment: true
|
14
|
+
env:
|
15
|
+
GITHUB_ACCESS_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
data/.rubocop.yml
CHANGED
@@ -55,13 +55,13 @@ Layout/ClassStructure:
|
|
55
55
|
- prepend
|
56
56
|
- extend
|
57
57
|
ExpectedOrder:
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
58
|
+
- module_inclusion
|
59
|
+
- constants
|
60
|
+
- public_class_methods
|
61
|
+
- initializer
|
62
|
+
- instance_methods
|
63
|
+
- protected_methods
|
64
|
+
- private_methods
|
65
65
|
|
66
66
|
# Trailing white space is meaningful in code examples
|
67
67
|
Layout/TrailingWhitespace:
|
data/.yamllint.yml
ADDED
data/CHANGELOG.md
CHANGED
@@ -2,6 +2,16 @@
|
|
2
2
|
|
3
3
|
## master (unreleased)
|
4
4
|
|
5
|
+
## 0.18.0 (2022-03-13)
|
6
|
+
|
7
|
+
### New features
|
8
|
+
|
9
|
+
* [#161](https://github.com/rubocop/rubocop-minitest/pull/161): Add new `Minitest/AssertPredicate` and `Minitest/RefutePredicate` cops. ([@koic][])
|
10
|
+
|
11
|
+
### Changes
|
12
|
+
|
13
|
+
* [#162](https://github.com/rubocop/rubocop-minitest/pull/162): Make `Minitest/AssertNil` (`Minitest/RefuteNil`) aware of `assert_predicate(obj, :nil?)` (`refute_predicate(obj, :nil?)`). ([@koic][])
|
14
|
+
|
5
15
|
## 0.17.2 (2022-02-12)
|
6
16
|
|
7
17
|
### Bug fixes
|
data/config/default.yml
CHANGED
@@ -81,6 +81,12 @@ Minitest/AssertRespondTo:
|
|
81
81
|
Enabled: true
|
82
82
|
VersionAdded: '0.3'
|
83
83
|
|
84
|
+
Minitest/AssertPredicate:
|
85
|
+
Description: 'This cop enforces the test to use `assert_predicate` instead of using `assert(obj.a_predicate_method?)`.'
|
86
|
+
StyleGuide: 'https://minitest.rubystyle.guide/#assert-predicate'
|
87
|
+
Enabled: pending
|
88
|
+
VersionAdded: '0.18'
|
89
|
+
|
84
90
|
Minitest/AssertSilent:
|
85
91
|
Description: "This cop enforces the test to use `assert_silent { ... }` instead of using `assert_output('', '') { ... }`."
|
86
92
|
StyleGuide: 'https://github.com/rubocop/minitest-style-guide#assert-silent'
|
@@ -194,6 +200,12 @@ Minitest/RefutePathExists:
|
|
194
200
|
Enabled: 'pending'
|
195
201
|
VersionAdded: '0.10'
|
196
202
|
|
203
|
+
Minitest/RefutePredicate:
|
204
|
+
Description: 'This cop enforces the test to use `refute_predicate` instead of using `refute(obj.a_predicate_method?)`.'
|
205
|
+
StyleGuide: 'https://minitest.rubystyle.guide/#refute-predicate'
|
206
|
+
Enabled: pending
|
207
|
+
VersionAdded: '0.18'
|
208
|
+
|
197
209
|
Minitest/RefuteRespondTo:
|
198
210
|
Description: 'This cop enforces the test to use `refute_respond_to(object, :do_something)` over `refute(object.respond_to?(:do_something))`.'
|
199
211
|
StyleGuide: 'https://minitest.rubystyle.guide#refute-respond-to'
|
data/docs/antora.yml
CHANGED
@@ -24,6 +24,7 @@ based on the https://minitest.rubystyle.guide/[Minitest Style Guide].
|
|
24
24
|
* xref:cops_minitest.adoc#minitestassertnil[Minitest/AssertNil]
|
25
25
|
* xref:cops_minitest.adoc#minitestassertoutput[Minitest/AssertOutput]
|
26
26
|
* xref:cops_minitest.adoc#minitestassertpathexists[Minitest/AssertPathExists]
|
27
|
+
* xref:cops_minitest.adoc#minitestassertpredicate[Minitest/AssertPredicate]
|
27
28
|
* xref:cops_minitest.adoc#minitestassertrespondto[Minitest/AssertRespondTo]
|
28
29
|
* xref:cops_minitest.adoc#minitestassertsilent[Minitest/AssertSilent]
|
29
30
|
* xref:cops_minitest.adoc#minitestasserttruthy[Minitest/AssertTruthy]
|
@@ -43,6 +44,7 @@ based on the https://minitest.rubystyle.guide/[Minitest Style Guide].
|
|
43
44
|
* xref:cops_minitest.adoc#minitestrefutematch[Minitest/RefuteMatch]
|
44
45
|
* xref:cops_minitest.adoc#minitestrefutenil[Minitest/RefuteNil]
|
45
46
|
* xref:cops_minitest.adoc#minitestrefutepathexists[Minitest/RefutePathExists]
|
47
|
+
* xref:cops_minitest.adoc#minitestrefutepredicate[Minitest/RefutePredicate]
|
46
48
|
* xref:cops_minitest.adoc#minitestrefuterespondto[Minitest/RefuteRespondTo]
|
47
49
|
* xref:cops_minitest.adoc#minitesttestmethodname[Minitest/TestMethodName]
|
48
50
|
* xref:cops_minitest.adoc#minitestunreachableassertion[Minitest/UnreachableAssertion]
|
@@ -262,7 +262,7 @@ assert_match(matcher, string, 'message')
|
|
262
262
|
|===
|
263
263
|
|
264
264
|
This cop enforces the test to use `assert_nil` instead of using
|
265
|
-
`assert_equal(nil, something)` or `
|
265
|
+
`assert_equal(nil, something)`, `assert(something.nil?)`, or `assert_predicate(something, :nil?)`.
|
266
266
|
|
267
267
|
=== Examples
|
268
268
|
|
@@ -273,6 +273,8 @@ assert_equal(nil, actual)
|
|
273
273
|
assert_equal(nil, actual, 'message')
|
274
274
|
assert(object.nil?)
|
275
275
|
assert(object.nil?, 'message')
|
276
|
+
assert_predicate(object, :nil?)
|
277
|
+
assert_predicate(object, :nil?, 'message')
|
276
278
|
|
277
279
|
# good
|
278
280
|
assert_nil(actual)
|
@@ -347,6 +349,38 @@ assert_path_exists(path, 'message')
|
|
347
349
|
|
348
350
|
* https://minitest.rubystyle.guide/#assert-path-exists
|
349
351
|
|
352
|
+
== Minitest/AssertPredicate
|
353
|
+
|
354
|
+
|===
|
355
|
+
| Enabled by default | Safe | Supports autocorrection | Version Added | Version Changed
|
356
|
+
|
357
|
+
| Pending
|
358
|
+
| Yes
|
359
|
+
| Yes
|
360
|
+
| 0.18
|
361
|
+
| -
|
362
|
+
|===
|
363
|
+
|
364
|
+
This cop enforces the test to use `assert_predicate`
|
365
|
+
instead of using `assert(obj.a_predicate_method?)`.
|
366
|
+
|
367
|
+
=== Examples
|
368
|
+
|
369
|
+
[source,ruby]
|
370
|
+
----
|
371
|
+
# bad
|
372
|
+
assert(obj.one?)
|
373
|
+
assert(obj.one?, 'message')
|
374
|
+
|
375
|
+
# good
|
376
|
+
assert_predicate(obj, :one?)
|
377
|
+
assert_predicate(obj, :one?, 'message')
|
378
|
+
----
|
379
|
+
|
380
|
+
=== References
|
381
|
+
|
382
|
+
* https://minitest.rubystyle.guide/#assert-predicate
|
383
|
+
|
350
384
|
== Minitest/AssertRespondTo
|
351
385
|
|
352
386
|
|===
|
@@ -1025,7 +1059,7 @@ refute_match(matcher, string, 'message')
|
|
1025
1059
|
|===
|
1026
1060
|
|
1027
1061
|
This cop enforces the test to use `refute_nil` instead of using
|
1028
|
-
`refute_equal(nil, something)` or `
|
1062
|
+
`refute_equal(nil, something)`, `refute(something.nil?)`, or `refute_predicate(something, :nil?)`.
|
1029
1063
|
|
1030
1064
|
=== Examples
|
1031
1065
|
|
@@ -1036,6 +1070,8 @@ refute_equal(nil, actual)
|
|
1036
1070
|
refute_equal(nil, actual, 'message')
|
1037
1071
|
refute(actual.nil?)
|
1038
1072
|
refute(actual.nil?, 'message')
|
1073
|
+
refute_predicate(object, :nil?)
|
1074
|
+
refute_predicate(object, :nil?, 'message')
|
1039
1075
|
|
1040
1076
|
# good
|
1041
1077
|
refute_nil(actual)
|
@@ -1078,6 +1114,38 @@ refute_path_exists(path, 'message')
|
|
1078
1114
|
|
1079
1115
|
* https://minitest.rubystyle.guide/#refute-path-exists
|
1080
1116
|
|
1117
|
+
== Minitest/RefutePredicate
|
1118
|
+
|
1119
|
+
|===
|
1120
|
+
| Enabled by default | Safe | Supports autocorrection | Version Added | Version Changed
|
1121
|
+
|
1122
|
+
| Pending
|
1123
|
+
| Yes
|
1124
|
+
| Yes
|
1125
|
+
| 0.18
|
1126
|
+
| -
|
1127
|
+
|===
|
1128
|
+
|
1129
|
+
This cop enforces the test to use `refute_predicate`
|
1130
|
+
instead of using `refute(obj.a_predicate_method?)`.
|
1131
|
+
|
1132
|
+
=== Examples
|
1133
|
+
|
1134
|
+
[source,ruby]
|
1135
|
+
----
|
1136
|
+
# bad
|
1137
|
+
refute(obj.one?)
|
1138
|
+
refute(obj.one?, 'message')
|
1139
|
+
|
1140
|
+
# good
|
1141
|
+
refute_predicate(obj, :one?)
|
1142
|
+
refute_predicate(obj, :one?, 'message')
|
1143
|
+
----
|
1144
|
+
|
1145
|
+
=== References
|
1146
|
+
|
1147
|
+
* https://minitest.rubystyle.guide/#refute-predicate
|
1148
|
+
|
1081
1149
|
== Minitest/RefuteRespondTo
|
1082
1150
|
|
1083
1151
|
|===
|
@@ -18,8 +18,7 @@ module RuboCop
|
|
18
18
|
include ArgumentRangeHelper
|
19
19
|
extend AutoCorrector
|
20
20
|
|
21
|
-
MSG = 'Prefer using `assert_empty(%<arguments>s)
|
22
|
-
'`assert_equal(%<literal>s, %<arguments>s)`.'
|
21
|
+
MSG = 'Prefer using `assert_empty(%<arguments>s)`.'
|
23
22
|
RESTRICT_ON_SEND = %i[assert_equal].freeze
|
24
23
|
|
25
24
|
def_node_matcher :assert_equal_with_empty_literal, <<~PATTERN
|
@@ -4,7 +4,7 @@ module RuboCop
|
|
4
4
|
module Cop
|
5
5
|
module Minitest
|
6
6
|
# This cop enforces the test to use `assert_nil` instead of using
|
7
|
-
# `assert_equal(nil, something)` or `
|
7
|
+
# `assert_equal(nil, something)`, `assert(something.nil?)`, or `assert_predicate(something, :nil?)`.
|
8
8
|
#
|
9
9
|
# @example
|
10
10
|
# # bad
|
@@ -12,6 +12,8 @@ module RuboCop
|
|
12
12
|
# assert_equal(nil, actual, 'message')
|
13
13
|
# assert(object.nil?)
|
14
14
|
# assert(object.nil?, 'message')
|
15
|
+
# assert_predicate(object, :nil?)
|
16
|
+
# assert_predicate(object, :nil?, 'message')
|
15
17
|
#
|
16
18
|
# # good
|
17
19
|
# assert_nil(actual)
|
@@ -23,12 +25,13 @@ module RuboCop
|
|
23
25
|
extend AutoCorrector
|
24
26
|
|
25
27
|
ASSERTION_TYPE = 'assert'
|
26
|
-
RESTRICT_ON_SEND = %i[assert_equal
|
28
|
+
RESTRICT_ON_SEND = %i[assert assert_equal assert_predicate].freeze
|
27
29
|
|
28
30
|
def_node_matcher :nil_assertion, <<~PATTERN
|
29
31
|
{
|
30
32
|
(send nil? :assert_equal nil $_ $...)
|
31
33
|
(send nil? :assert (send $_ :nil?) $...)
|
34
|
+
(send nil? :assert_predicate $_ (sym :nil?) $...)
|
32
35
|
}
|
33
36
|
PATTERN
|
34
37
|
|
@@ -18,7 +18,7 @@ module RuboCop
|
|
18
18
|
class AssertPathExists < Base
|
19
19
|
extend AutoCorrector
|
20
20
|
|
21
|
-
MSG = 'Prefer using `%<good_method>s
|
21
|
+
MSG = 'Prefer using `%<good_method>s`.'
|
22
22
|
RESTRICT_ON_SEND = %i[assert].freeze
|
23
23
|
|
24
24
|
def_node_matcher :assert_file_exists, <<~PATTERN
|
@@ -32,7 +32,7 @@ module RuboCop
|
|
32
32
|
assert_file_exists(node) do |path, failure_message|
|
33
33
|
failure_message = failure_message.first
|
34
34
|
good_method = build_good_method(path, failure_message)
|
35
|
-
message = format(MSG, good_method: good_method
|
35
|
+
message = format(MSG, good_method: good_method)
|
36
36
|
|
37
37
|
add_offense(node, message: message) do |corrector|
|
38
38
|
corrector.replace(node, good_method)
|
@@ -0,0 +1,34 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RuboCop
|
4
|
+
module Cop
|
5
|
+
module Minitest
|
6
|
+
# This cop enforces the test to use `assert_predicate`
|
7
|
+
# instead of using `assert(obj.a_predicate_method?)`.
|
8
|
+
#
|
9
|
+
# @example
|
10
|
+
# # bad
|
11
|
+
# assert(obj.one?)
|
12
|
+
# assert(obj.one?, 'message')
|
13
|
+
#
|
14
|
+
# # good
|
15
|
+
# assert_predicate(obj, :one?)
|
16
|
+
# assert_predicate(obj, :one?, 'message')
|
17
|
+
#
|
18
|
+
class AssertPredicate < Base
|
19
|
+
include ArgumentRangeHelper
|
20
|
+
include PredicateAssertionHandleable
|
21
|
+
extend AutoCorrector
|
22
|
+
|
23
|
+
MSG = 'Prefer using `assert_predicate(%<new_arguments>s)`.'
|
24
|
+
RESTRICT_ON_SEND = %i[assert].freeze
|
25
|
+
|
26
|
+
private
|
27
|
+
|
28
|
+
def assertion_type
|
29
|
+
'assert'
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
@@ -19,8 +19,7 @@ module RuboCop
|
|
19
19
|
include ArgumentRangeHelper
|
20
20
|
extend AutoCorrector
|
21
21
|
|
22
|
-
MSG = 'Prefer using `assert(%<arguments>s)
|
23
|
-
'`assert_equal(true, %<arguments>s)`.'
|
22
|
+
MSG = 'Prefer using `assert(%<arguments>s)`.'
|
24
23
|
RESTRICT_ON_SEND = %i[assert_equal].freeze
|
25
24
|
|
26
25
|
def_node_matcher :assert_equal_with_truthy, <<~PATTERN
|
@@ -18,20 +18,19 @@ module RuboCop
|
|
18
18
|
include ArgumentRangeHelper
|
19
19
|
extend AutoCorrector
|
20
20
|
|
21
|
-
MSG = 'Prefer using `refute_equal(%<preferred>s)
|
22
|
-
'`assert(%<over>s)`.'
|
21
|
+
MSG = 'Prefer using `refute_equal(%<preferred>s)`.'
|
23
22
|
RESTRICT_ON_SEND = %i[assert].freeze
|
24
23
|
|
25
24
|
def_node_matcher :assert_not_equal, <<~PATTERN
|
26
|
-
(send nil? :assert
|
25
|
+
(send nil? :assert {(send $_ :!= $_) (send (send $_ :! ) :== $_) } $... )
|
27
26
|
PATTERN
|
28
27
|
|
29
28
|
def on_send(node)
|
30
|
-
preferred
|
31
|
-
return unless preferred
|
29
|
+
preferred = process_not_equal(node)
|
30
|
+
return unless preferred
|
32
31
|
|
33
|
-
assert_not_equal(node) do |
|
34
|
-
message = format(MSG, preferred: preferred
|
32
|
+
assert_not_equal(node) do |expected, actual|
|
33
|
+
message = format(MSG, preferred: preferred)
|
35
34
|
|
36
35
|
add_offense(node, message: message) do |corrector|
|
37
36
|
corrector.replace(node.loc.selector, 'refute_equal')
|
@@ -54,11 +53,10 @@ module RuboCop
|
|
54
53
|
end
|
55
54
|
|
56
55
|
def process_not_equal(node)
|
57
|
-
assert_not_equal(node) do |
|
56
|
+
assert_not_equal(node) do |first_arg, second_arg, rest_args|
|
58
57
|
custom_message = rest_args.first
|
59
|
-
|
60
|
-
|
61
|
-
return [preferred, over]
|
58
|
+
|
59
|
+
preferred_usage(first_arg, second_arg, custom_message)
|
62
60
|
end
|
63
61
|
end
|
64
62
|
end
|
@@ -22,8 +22,8 @@ module RuboCop
|
|
22
22
|
include ArgumentRangeHelper
|
23
23
|
extend AutoCorrector
|
24
24
|
|
25
|
-
MSG_FOR_ASSERT_EQUAL = 'Prefer using `refute(%<arguments>s)
|
26
|
-
MSG_FOR_ASSERT = 'Prefer using `refute(%<arguments>s)
|
25
|
+
MSG_FOR_ASSERT_EQUAL = 'Prefer using `refute(%<arguments>s)`.'
|
26
|
+
MSG_FOR_ASSERT = 'Prefer using `refute(%<arguments>s)`.'
|
27
27
|
RESTRICT_ON_SEND = %i[assert_equal assert].freeze
|
28
28
|
|
29
29
|
def_node_matcher :assert_equal_with_false, <<~PATTERN
|
@@ -4,7 +4,7 @@ module RuboCop
|
|
4
4
|
module Cop
|
5
5
|
module Minitest
|
6
6
|
# This cop enforces the test to use `refute_nil` instead of using
|
7
|
-
# `refute_equal(nil, something)` or `
|
7
|
+
# `refute_equal(nil, something)`, `refute(something.nil?)`, or `refute_predicate(something, :nil?)`.
|
8
8
|
#
|
9
9
|
# @example
|
10
10
|
# # bad
|
@@ -12,6 +12,8 @@ module RuboCop
|
|
12
12
|
# refute_equal(nil, actual, 'message')
|
13
13
|
# refute(actual.nil?)
|
14
14
|
# refute(actual.nil?, 'message')
|
15
|
+
# refute_predicate(object, :nil?)
|
16
|
+
# refute_predicate(object, :nil?, 'message')
|
15
17
|
#
|
16
18
|
# # good
|
17
19
|
# refute_nil(actual)
|
@@ -23,12 +25,13 @@ module RuboCop
|
|
23
25
|
extend AutoCorrector
|
24
26
|
|
25
27
|
ASSERTION_TYPE = 'refute'
|
26
|
-
RESTRICT_ON_SEND = %i[refute_equal
|
28
|
+
RESTRICT_ON_SEND = %i[refute refute_equal refute_predicate].freeze
|
27
29
|
|
28
30
|
def_node_matcher :nil_refutation, <<~PATTERN
|
29
31
|
{
|
30
32
|
(send nil? :refute_equal nil $_ $...)
|
31
33
|
(send nil? :refute (send $_ :nil?) $...)
|
34
|
+
(send nil? :refute_predicate $_ (sym :nil?) $...)
|
32
35
|
}
|
33
36
|
PATTERN
|
34
37
|
|
@@ -18,7 +18,7 @@ module RuboCop
|
|
18
18
|
class RefutePathExists < Base
|
19
19
|
extend AutoCorrector
|
20
20
|
|
21
|
-
MSG = 'Prefer using `%<good_method>s
|
21
|
+
MSG = 'Prefer using `%<good_method>s`.'
|
22
22
|
RESTRICT_ON_SEND = %i[refute].freeze
|
23
23
|
|
24
24
|
def_node_matcher :refute_file_exists, <<~PATTERN
|
@@ -32,7 +32,7 @@ module RuboCop
|
|
32
32
|
refute_file_exists(node) do |path, failure_message|
|
33
33
|
failure_message = failure_message.first
|
34
34
|
good_method = build_good_method(path, failure_message)
|
35
|
-
message = format(MSG, good_method: good_method
|
35
|
+
message = format(MSG, good_method: good_method)
|
36
36
|
|
37
37
|
add_offense(node, message: message) do |corrector|
|
38
38
|
corrector.replace(node, good_method)
|
@@ -0,0 +1,34 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RuboCop
|
4
|
+
module Cop
|
5
|
+
module Minitest
|
6
|
+
# This cop enforces the test to use `refute_predicate`
|
7
|
+
# instead of using `refute(obj.a_predicate_method?)`.
|
8
|
+
#
|
9
|
+
# @example
|
10
|
+
# # bad
|
11
|
+
# refute(obj.one?)
|
12
|
+
# refute(obj.one?, 'message')
|
13
|
+
#
|
14
|
+
# # good
|
15
|
+
# refute_predicate(obj, :one?)
|
16
|
+
# refute_predicate(obj, :one?, 'message')
|
17
|
+
#
|
18
|
+
class RefutePredicate < Base
|
19
|
+
include ArgumentRangeHelper
|
20
|
+
include PredicateAssertionHandleable
|
21
|
+
extend AutoCorrector
|
22
|
+
|
23
|
+
MSG = 'Prefer using `refute_predicate(%<new_arguments>s)`.'
|
24
|
+
RESTRICT_ON_SEND = %i[refute].freeze
|
25
|
+
|
26
|
+
private
|
27
|
+
|
28
|
+
def assertion_type
|
29
|
+
'refute'
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
@@ -5,10 +5,12 @@ require_relative 'mixin/in_delta_mixin'
|
|
5
5
|
require_relative 'mixin/minitest_cop_rule'
|
6
6
|
require_relative 'mixin/minitest_exploration_helpers'
|
7
7
|
require_relative 'mixin/nil_assertion_handleable'
|
8
|
+
require_relative 'mixin/predicate_assertion_handleable'
|
8
9
|
require_relative 'minitest/assert_empty'
|
9
10
|
require_relative 'minitest/assert_empty_literal'
|
10
11
|
require_relative 'minitest/assert_equal'
|
11
12
|
require_relative 'minitest/assert_in_delta'
|
13
|
+
require_relative 'minitest/assert_predicate'
|
12
14
|
require_relative 'minitest/assert_with_expected_argument'
|
13
15
|
require_relative 'minitest/assertion_in_lifecycle_hook'
|
14
16
|
require_relative 'minitest/assert_kind_of'
|
@@ -35,6 +37,7 @@ require_relative 'minitest/refute_includes'
|
|
35
37
|
require_relative 'minitest/refute_match'
|
36
38
|
require_relative 'minitest/refute_instance_of'
|
37
39
|
require_relative 'minitest/refute_path_exists'
|
40
|
+
require_relative 'minitest/refute_predicate'
|
38
41
|
require_relative 'minitest/refute_respond_to'
|
39
42
|
require_relative 'minitest/test_method_name'
|
40
43
|
require_relative 'minitest/unreachable_assertion'
|
@@ -4,7 +4,7 @@ module RuboCop
|
|
4
4
|
module Cop
|
5
5
|
# Common functionality for `AssertInDelta` and `RefuteInDelta` cops.
|
6
6
|
module InDeltaMixin
|
7
|
-
MSG = 'Prefer using `%<good_method>s
|
7
|
+
MSG = 'Prefer using `%<good_method>s`.'
|
8
8
|
|
9
9
|
def on_send(node)
|
10
10
|
equal_floats_call(node) do |expected, actual, message|
|
@@ -12,7 +12,7 @@ module RuboCop
|
|
12
12
|
good_method = build_good_method(expected, actual, message)
|
13
13
|
|
14
14
|
if expected.float_type? || actual.float_type?
|
15
|
-
message = format(MSG, good_method: good_method
|
15
|
+
message = format(MSG, good_method: good_method)
|
16
16
|
|
17
17
|
add_offense(node, message: message) do |corrector|
|
18
18
|
corrector.replace(node, good_method)
|
@@ -28,8 +28,7 @@ module RuboCop
|
|
28
28
|
include ArgumentRangeHelper
|
29
29
|
extend AutoCorrector
|
30
30
|
|
31
|
-
MSG = 'Prefer using `#{preferred_method}(%<new_arguments>s)
|
32
|
-
'`#{assertion_method}(%<original_arguments>s)`.'
|
31
|
+
MSG = 'Prefer using `#{preferred_method}(%<new_arguments>s)`.'
|
33
32
|
RESTRICT_ON_SEND = %i[#{assertion_method}].freeze
|
34
33
|
|
35
34
|
def on_send(node)
|
@@ -70,12 +69,9 @@ module RuboCop
|
|
70
69
|
message_argument&.source
|
71
70
|
].flatten.compact.join(', ')
|
72
71
|
|
73
|
-
original_arguments = arguments.map(&:source).join(', ')
|
74
|
-
|
75
72
|
format(
|
76
73
|
MSG,
|
77
|
-
new_arguments: new_arguments
|
78
|
-
original_arguments: original_arguments
|
74
|
+
new_arguments: new_arguments
|
79
75
|
)
|
80
76
|
end
|
81
77
|
|
@@ -5,7 +5,7 @@ module RuboCop
|
|
5
5
|
module Minitest
|
6
6
|
# Common functionality for `AssertNil` and `RefuteNil` cops.
|
7
7
|
module NilAssertionHandleable
|
8
|
-
MSG = 'Prefer using `%<assertion_type>s_nil(%<preferred_args>s)
|
8
|
+
MSG = 'Prefer using `%<assertion_type>s_nil(%<preferred_args>s)`.'
|
9
9
|
|
10
10
|
private
|
11
11
|
|
@@ -22,23 +22,18 @@ module RuboCop
|
|
22
22
|
message_source = message&.source
|
23
23
|
|
24
24
|
preferred_args = [actual.source, message_source].compact
|
25
|
-
current_args = if comparison_assertion_method?(node)
|
26
|
-
['nil', preferred_args].join(', ')
|
27
|
-
else
|
28
|
-
["#{actual.source}.nil?", message_source].compact.join(', ')
|
29
|
-
end
|
30
25
|
|
31
26
|
format(
|
32
27
|
MSG,
|
33
28
|
assertion_type: assertion_type,
|
34
29
|
preferred_args: preferred_args.join(', '),
|
35
|
-
method: node.method_name
|
30
|
+
method: node.method_name
|
36
31
|
)
|
37
32
|
end
|
38
33
|
|
39
34
|
def autocorrect(corrector, node, actual)
|
40
35
|
corrector.replace(node.loc.selector, :"#{assertion_type}_nil")
|
41
|
-
if
|
36
|
+
if comparison_or_predicate_assertion_method?(node)
|
42
37
|
corrector.replace(first_and_second_arguments_range(node), actual.source)
|
43
38
|
else
|
44
39
|
corrector.remove(node.first_argument.loc.dot)
|
@@ -46,8 +41,8 @@ module RuboCop
|
|
46
41
|
end
|
47
42
|
end
|
48
43
|
|
49
|
-
def
|
50
|
-
node.method?(:"#{assertion_type}_equal")
|
44
|
+
def comparison_or_predicate_assertion_method?(node)
|
45
|
+
node.method?(:"#{assertion_type}_equal") || node.method?(:"#{assertion_type}_predicate")
|
51
46
|
end
|
52
47
|
end
|
53
48
|
end
|
@@ -0,0 +1,61 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RuboCop
|
4
|
+
module Cop
|
5
|
+
module Minitest
|
6
|
+
# Common functionality for `Minitest/AssertPredicate` and `Minitest/RefutePredicate` cops.
|
7
|
+
module PredicateAssertionHandleable
|
8
|
+
MSG = 'Prefer using `%<assertion_type>s_predicate(%<new_arguments>s)`.'
|
9
|
+
RESTRICT_ON_SEND = %i[assert].freeze
|
10
|
+
|
11
|
+
def on_send(node)
|
12
|
+
return unless (arguments = peel_redundant_parentheses_from(node.arguments))
|
13
|
+
return unless arguments.first.respond_to?(:predicate_method?) && arguments.first.predicate_method?
|
14
|
+
return unless arguments.first.arguments.count.zero?
|
15
|
+
|
16
|
+
add_offense(node, message: offense_message(arguments)) do |corrector|
|
17
|
+
autocorrect(corrector, node, arguments)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
def autocorrect(corrector, node, arguments)
|
22
|
+
corrector.replace(node.loc.selector, "#{assertion_type}_predicate")
|
23
|
+
|
24
|
+
new_arguments = new_arguments(arguments).join(', ')
|
25
|
+
|
26
|
+
corrector.replace(first_argument_range(node), new_arguments)
|
27
|
+
end
|
28
|
+
|
29
|
+
private
|
30
|
+
|
31
|
+
def peel_redundant_parentheses_from(arguments)
|
32
|
+
return arguments unless arguments.first&.begin_type?
|
33
|
+
|
34
|
+
peel_redundant_parentheses_from(arguments.first.children)
|
35
|
+
end
|
36
|
+
|
37
|
+
def offense_message(arguments)
|
38
|
+
message_argument = arguments.last if arguments.first != arguments.last
|
39
|
+
|
40
|
+
new_arguments = [
|
41
|
+
new_arguments(arguments),
|
42
|
+
message_argument&.source
|
43
|
+
].flatten.compact.join(', ')
|
44
|
+
|
45
|
+
format(MSG, assertion_type: assertion_type, new_arguments: new_arguments)
|
46
|
+
end
|
47
|
+
|
48
|
+
def new_arguments(arguments)
|
49
|
+
receiver = correct_receiver(arguments.first.receiver)
|
50
|
+
method_name = arguments.first.method_name
|
51
|
+
|
52
|
+
[receiver, ":#{method_name}"]
|
53
|
+
end
|
54
|
+
|
55
|
+
def correct_receiver(receiver)
|
56
|
+
receiver ? receiver.source : 'self'
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
@@ -22,7 +22,7 @@ module RuboCop
|
|
22
22
|
# class FooTest < Minitest::Test
|
23
23
|
# def test_do_something
|
24
24
|
# assert_equal(nil, somestuff)
|
25
|
-
# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Prefer using `assert_nil(somestuff)
|
25
|
+
# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Prefer using `assert_nil(somestuff)`.
|
26
26
|
# end
|
27
27
|
# end
|
28
28
|
# RUBY
|
@@ -36,7 +36,7 @@ module RuboCop
|
|
36
36
|
# class FooTest < Minitest::Test
|
37
37
|
# def test_do_something
|
38
38
|
# assert_equal(nil, somestuff)
|
39
|
-
# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Prefer using `assert_nil(somestuff)
|
39
|
+
# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Prefer using `assert_nil(somestuff)`.
|
40
40
|
# end
|
41
41
|
# end
|
42
42
|
# RUBY
|
@@ -64,7 +64,7 @@ module RuboCop
|
|
64
64
|
# class FooTest < Minitest::Test
|
65
65
|
# def test_do_something
|
66
66
|
# assert_equal(nil, somestuff)
|
67
|
-
# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Prefer using `assert_nil(somestuff)
|
67
|
+
# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Prefer using `assert_nil(somestuff)`.
|
68
68
|
# end
|
69
69
|
# end
|
70
70
|
# RUBY
|
data/mkdocs.yml
CHANGED
@@ -4,10 +4,10 @@ edit_uri: edit/master/legacy-docs/
|
|
4
4
|
copyright: "Copyright © 2022 Bozhidar Batsov, Jonas Arvidsson, Koichi ITO, and RuboCop contributors"
|
5
5
|
docs_dir: legacy-docs
|
6
6
|
pages:
|
7
|
-
- Home: index.md
|
8
|
-
- Installation: installation.md
|
9
|
-
- Usage: usage.md
|
10
|
-
- Cops: cops.md
|
11
|
-
- Cops Documentation:
|
12
|
-
|
7
|
+
- Home: index.md
|
8
|
+
- Installation: installation.md
|
9
|
+
- Usage: usage.md
|
10
|
+
- Cops: cops.md
|
11
|
+
- Cops Documentation:
|
12
|
+
- Minitest Cops: cops_minitest.md
|
13
13
|
theme: readthedocs
|
data/relnotes/v0.18.0.md
ADDED
@@ -0,0 +1,9 @@
|
|
1
|
+
### New features
|
2
|
+
|
3
|
+
* [#161](https://github.com/rubocop/rubocop-minitest/pull/161): Add new `Minitest/AssertPredicate` and `Minitest/RefutePredicate` cops. ([@koic][])
|
4
|
+
|
5
|
+
### Changes
|
6
|
+
|
7
|
+
* [#162](https://github.com/rubocop/rubocop-minitest/pull/162): Make `Minitest/AssertNil` (`Minitest/RefuteNil`) aware of `assert_predicate(obj, :nil?)` (`refute_predicate(obj, :nil?)`). ([@koic][])
|
8
|
+
|
9
|
+
[@koic]: https://github.com/koic
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rubocop-minitest
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.18.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Bozhidar Batsov
|
@@ -10,7 +10,7 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: exe
|
12
12
|
cert_chain: []
|
13
|
-
date: 2022-
|
13
|
+
date: 2022-03-13 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: rubocop
|
@@ -60,10 +60,12 @@ files:
|
|
60
60
|
- ".github/ISSUE_TEMPLATE/bug_report.md"
|
61
61
|
- ".github/ISSUE_TEMPLATE/feature_request.md"
|
62
62
|
- ".github/PULL_REQUEST_TEMPLATE.md"
|
63
|
+
- ".github/workflows/linting.yml"
|
63
64
|
- ".github/workflows/spell_checking.yml"
|
64
65
|
- ".gitignore"
|
65
66
|
- ".rubocop.yml"
|
66
67
|
- ".rubocop_todo.yml"
|
68
|
+
- ".yamllint.yml"
|
67
69
|
- ".yardopts"
|
68
70
|
- CHANGELOG.md
|
69
71
|
- CONTRIBUTING.md
|
@@ -100,6 +102,7 @@ files:
|
|
100
102
|
- lib/rubocop/cop/minitest/assert_nil.rb
|
101
103
|
- lib/rubocop/cop/minitest/assert_output.rb
|
102
104
|
- lib/rubocop/cop/minitest/assert_path_exists.rb
|
105
|
+
- lib/rubocop/cop/minitest/assert_predicate.rb
|
103
106
|
- lib/rubocop/cop/minitest/assert_respond_to.rb
|
104
107
|
- lib/rubocop/cop/minitest/assert_silent.rb
|
105
108
|
- lib/rubocop/cop/minitest/assert_truthy.rb
|
@@ -119,6 +122,7 @@ files:
|
|
119
122
|
- lib/rubocop/cop/minitest/refute_match.rb
|
120
123
|
- lib/rubocop/cop/minitest/refute_nil.rb
|
121
124
|
- lib/rubocop/cop/minitest/refute_path_exists.rb
|
125
|
+
- lib/rubocop/cop/minitest/refute_predicate.rb
|
122
126
|
- lib/rubocop/cop/minitest/refute_respond_to.rb
|
123
127
|
- lib/rubocop/cop/minitest/test_method_name.rb
|
124
128
|
- lib/rubocop/cop/minitest/unreachable_assertion.rb
|
@@ -129,6 +133,7 @@ files:
|
|
129
133
|
- lib/rubocop/cop/mixin/minitest_cop_rule.rb
|
130
134
|
- lib/rubocop/cop/mixin/minitest_exploration_helpers.rb
|
131
135
|
- lib/rubocop/cop/mixin/nil_assertion_handleable.rb
|
136
|
+
- lib/rubocop/cop/mixin/predicate_assertion_handleable.rb
|
132
137
|
- lib/rubocop/minitest.rb
|
133
138
|
- lib/rubocop/minitest/assert_offense.rb
|
134
139
|
- lib/rubocop/minitest/inject.rb
|
@@ -154,6 +159,7 @@ files:
|
|
154
159
|
- relnotes/v0.17.0.md
|
155
160
|
- relnotes/v0.17.1.md
|
156
161
|
- relnotes/v0.17.2.md
|
162
|
+
- relnotes/v0.18.0.md
|
157
163
|
- relnotes/v0.2.0.md
|
158
164
|
- relnotes/v0.2.1.md
|
159
165
|
- relnotes/v0.3.0.md
|
@@ -180,7 +186,7 @@ metadata:
|
|
180
186
|
homepage_uri: https://docs.rubocop.org/rubocop-minitest/
|
181
187
|
changelog_uri: https://github.com/rubocop/rubocop-minitest/blob/master/CHANGELOG.md
|
182
188
|
source_code_uri: https://github.com/rubocop/rubocop-minitest
|
183
|
-
documentation_uri: https://docs.rubocop.org/rubocop-minitest/0.
|
189
|
+
documentation_uri: https://docs.rubocop.org/rubocop-minitest/0.18
|
184
190
|
bug_tracker_uri: https://github.com/rubocop/rubocop-minitest/issues
|
185
191
|
rubygems_mfa_required: 'true'
|
186
192
|
post_install_message:
|