@@ -6,7 +6,7 @@ module Rails
66 #
77 # Use `assert_not` methods instead of `refute` methods.
88 #
9- # @example
9+ # @example EnforcedStyle: assert_not (default)
1010 # # bad
1111 # refute false
1212 # refute_empty [1, 2, 3]
@@ -17,29 +17,43 @@ module Rails
1717 # assert_not_empty [1, 2, 3]
1818 # assert_not_equal true, false
1919 #
20+ # @example EnforcedStyle: refute
21+ # # bad
22+ # assert_not false
23+ # assert_not_empty [1, 2, 3]
24+ # assert_not_equal true, false
25+ #
26+ # # good
27+ # refute false
28+ # refute_empty [1, 2, 3]
29+ # refute_equal true, false
30+ #
2031 class RefuteMethods < Cop
21- MSG = 'Prefer `%<assert_method>s` over `%<refute_method>s`.'
32+ include ConfigurableEnforcedStyle
33+
34+ MSG = 'Prefer `%<good_method>s` over `%<bad_method>s`.'
2235
2336 CORRECTIONS = {
24- refute : ' assert_not' ,
25- refute_empty : ' assert_not_empty' ,
26- refute_equal : ' assert_not_equal' ,
27- refute_in_delta : ' assert_not_in_delta' ,
28- refute_in_epsilon : ' assert_not_in_epsilon' ,
29- refute_includes : ' assert_not_includes' ,
30- refute_instance_of : ' assert_not_instance_of' ,
31- refute_kind_of : ' assert_not_kind_of' ,
32- refute_nil : ' assert_not_nil' ,
33- refute_operator : ' assert_not_operator' ,
34- refute_predicate : ' assert_not_predicate' ,
35- refute_respond_to : ' assert_not_respond_to' ,
36- refute_same : ' assert_not_same' ,
37- refute_match : ' assert_no_match'
37+ refute : : assert_not,
38+ refute_empty : : assert_not_empty,
39+ refute_equal : : assert_not_equal,
40+ refute_in_delta : : assert_not_in_delta,
41+ refute_in_epsilon : : assert_not_in_epsilon,
42+ refute_includes : : assert_not_includes,
43+ refute_instance_of : : assert_not_instance_of,
44+ refute_kind_of : : assert_not_kind_of,
45+ refute_nil : : assert_not_nil,
46+ refute_operator : : assert_not_operator,
47+ refute_predicate : : assert_not_predicate,
48+ refute_respond_to : : assert_not_respond_to,
49+ refute_same : : assert_not_same,
50+ refute_match : : assert_no_match
3851 } . freeze
3952
40- OFFENSIVE_METHODS = CORRECTIONS . keys . freeze
53+ REFUTE_METHODS = CORRECTIONS . keys . freeze
54+ ASSERT_NOT_METHODS = CORRECTIONS . values . freeze
4155
42- def_node_matcher :offensive? , '(send nil? #refute_method ? ...)'
56+ def_node_matcher :offensive? , '(send nil? #bad_method ? ...)'
4357
4458 def on_send ( node )
4559 return unless offensive? ( node )
@@ -49,27 +63,39 @@ def on_send(node)
4963 end
5064
5165 def autocorrect ( node )
66+ bad_method = node . method_name
67+ good_method = convert_good_method ( bad_method )
68+
5269 lambda do |corrector |
53- corrector . replace (
54- node . loc . selector ,
55- CORRECTIONS [ node . method_name ]
56- )
70+ corrector . replace ( node . loc . selector , good_method . to_s )
5771 end
5872 end
5973
6074 private
6175
62- def refute_method? ( method_name )
63- OFFENSIVE_METHODS . include? ( method_name )
76+ def bad_method? ( method_name )
77+ if style == :assert_not
78+ REFUTE_METHODS . include? ( method_name )
79+ else
80+ ASSERT_NOT_METHODS . include? ( method_name )
81+ end
6482 end
6583
6684 def offense_message ( method_name )
6785 format (
6886 MSG ,
69- refute_method : method_name ,
70- assert_method : CORRECTIONS [ method_name ]
87+ bad_method : method_name ,
88+ good_method : convert_good_method ( method_name )
7189 )
7290 end
91+
92+ def convert_good_method ( bad_method )
93+ if style == :assert_not
94+ CORRECTIONS . fetch ( bad_method )
95+ else
96+ CORRECTIONS . invert . fetch ( bad_method )
97+ end
98+ end
7399 end
74100 end
75101 end
0 commit comments