@@ -7,6 +7,18 @@ module Rails
7
7
#
8
8
# @example
9
9
# # bad
10
+ # enum :status, { active: 0, archived: 0 }
11
+ #
12
+ # # good
13
+ # enum :status, { active: 0, archived: 1 }
14
+ #
15
+ # # bad
16
+ # enum :status, [:active, :archived, :active]
17
+ #
18
+ # # good
19
+ # enum :status, [:active, :archived]
20
+ #
21
+ # # bad
10
22
# enum status: { active: 0, archived: 0 }
11
23
#
12
24
# # good
@@ -24,6 +36,10 @@ class EnumUniqueness < Base
24
36
RESTRICT_ON_SEND = %i[ enum ] . freeze
25
37
26
38
def_node_matcher :enum? , <<~PATTERN
39
+ (send nil? :enum $_ ${array hash} ...)
40
+ PATTERN
41
+
42
+ def_node_matcher :enum_with_old_syntax? , <<~PATTERN
27
43
(send nil? :enum (hash $...))
28
44
PATTERN
29
45
@@ -32,15 +48,17 @@ class EnumUniqueness < Base
32
48
PATTERN
33
49
34
50
def on_send ( node )
35
- enum? ( node ) do |pairs |
51
+ enum? ( node ) do |key , args |
52
+ consecutive_duplicates ( args . values ) . each do |item |
53
+ add_offense ( item , message : message ( key , item ) )
54
+ end
55
+ end
56
+
57
+ enum_with_old_syntax? ( node ) do |pairs |
36
58
pairs . each do |pair |
37
59
enum_values ( pair ) do |key , args |
38
- items = args . values
39
-
40
- next unless duplicates? ( items )
41
-
42
- consecutive_duplicates ( items ) . each do |item |
43
- add_offense ( item , message : format ( MSG , value : item . source , enum : enum_name ( key ) ) )
60
+ consecutive_duplicates ( args . values ) . each do |item |
61
+ add_offense ( item , message : message ( key , item ) )
44
62
end
45
63
end
46
64
end
@@ -57,6 +75,10 @@ def enum_name(key)
57
75
key . source
58
76
end
59
77
end
78
+
79
+ def message ( key , item )
80
+ format ( MSG , value : item . source , enum : enum_name ( key ) )
81
+ end
60
82
end
61
83
end
62
84
end
0 commit comments