rubocop-minitest 0.17.2 → 0.18.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/.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:
|