Skip to content

Commit 51c57d8

Browse files
authored
Merge pull request #96 from pocke/enumhash
Fix false negatives for Rails/EnumHash cop
2 parents 7b55e00 + 2c0b6af commit 51c57d8

File tree

2 files changed

+58
-9
lines changed

2 files changed

+58
-9
lines changed

lib/rubocop/cop/rails/enum_hash.rb

Lines changed: 24 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,13 +21,33 @@ class EnumHash < Cop
2121
MSG = 'Enum defined as an array found in `%<enum>s` enum declaration. '\
2222
'Use hash syntax instead.'
2323

24-
def_node_matcher :enum_with_array?, <<~PATTERN
25-
(send nil? :enum (hash (pair (_ $_) array)))
24+
def_node_matcher :enum?, <<~PATTERN
25+
(send nil? :enum (hash $...))
26+
PATTERN
27+
28+
def_node_matcher :array_pair?, <<~PATTERN
29+
(pair $_ $array)
2630
PATTERN
2731

2832
def on_send(node)
29-
enum_with_array?(node) do |name|
30-
add_offense(node, message: format(MSG, enum: name))
33+
enum?(node) do |pairs|
34+
pairs.each do |pair|
35+
key, array = array_pair?(pair)
36+
next unless key
37+
38+
add_offense(array, message: format(MSG, enum: enum_name(key)))
39+
end
40+
end
41+
end
42+
43+
private
44+
45+
def enum_name(key)
46+
case key.type
47+
when :sym, :str
48+
key.value
49+
else
50+
key.source
3151
end
3252
end
3353
end

spec/rubocop/cop/rails/enum_hash_spec.rb

Lines changed: 34 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
it 'registers an offense' do
1111
expect_offense(<<~RUBY)
1212
enum status: %i[active archived]
13-
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Enum defined as an array found in `status` enum declaration. Use hash syntax instead.
13+
^^^^^^^^^^^^^^^^^^^ Enum defined as an array found in `status` enum declaration. Use hash syntax instead.
1414
RUBY
1515
end
1616
end
@@ -19,7 +19,7 @@
1919
it 'registers an offense' do
2020
expect_offense(<<~RUBY)
2121
enum status: %w[active archived]
22-
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Enum defined as an array found in `status` enum declaration. Use hash syntax instead.
22+
^^^^^^^^^^^^^^^^^^^ Enum defined as an array found in `status` enum declaration. Use hash syntax instead.
2323
RUBY
2424
end
2525
end
@@ -28,7 +28,7 @@
2828
it 'registers an offense' do
2929
expect_offense(<<~RUBY)
3030
enum status: %i(active archived)
31-
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Enum defined as an array found in `status` enum declaration. Use hash syntax instead.
31+
^^^^^^^^^^^^^^^^^^^ Enum defined as an array found in `status` enum declaration. Use hash syntax instead.
3232
RUBY
3333
end
3434
end
@@ -37,7 +37,7 @@
3737
it 'registers an offense' do
3838
expect_offense(<<~RUBY)
3939
enum status: %w(active archived)
40-
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Enum defined as an array found in `status` enum declaration. Use hash syntax instead.
40+
^^^^^^^^^^^^^^^^^^^ Enum defined as an array found in `status` enum declaration. Use hash syntax instead.
4141
RUBY
4242
end
4343
end
@@ -46,7 +46,36 @@
4646
it 'registers an offense' do
4747
expect_offense(<<~RUBY)
4848
enum status: [:active, :archived]
49-
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Enum defined as an array found in `status` enum declaration. Use hash syntax instead.
49+
^^^^^^^^^^^^^^^^^^^^ Enum defined as an array found in `status` enum declaration. Use hash syntax instead.
50+
RUBY
51+
end
52+
end
53+
54+
context 'when the enum name is a string' do
55+
it 'registers an offense' do
56+
expect_offense(<<~RUBY)
57+
enum "status" => %i[active archived]
58+
^^^^^^^^^^^^^^^^^^^ Enum defined as an array found in `status` enum declaration. Use hash syntax instead.
59+
RUBY
60+
end
61+
end
62+
63+
context 'when the enum name is not a literal' do
64+
it 'registers an offense' do
65+
expect_offense(<<~RUBY)
66+
enum KEY => %i[active archived]
67+
^^^^^^^^^^^^^^^^^^^ Enum defined as an array found in `KEY` enum declaration. Use hash syntax instead.
68+
RUBY
69+
end
70+
end
71+
72+
context 'with multiple enum definition for a `enum` method call' do
73+
it 'registers an offense' do
74+
expect_offense(<<~RUBY)
75+
enum status: %i[active archived],
76+
^^^^^^^^^^^^^^^^^^^ Enum defined as an array found in `status` enum declaration. Use hash syntax instead.
77+
role: %i[owner member guest]
78+
^^^^^^^^^^^^^^^^^^^^^^ Enum defined as an array found in `role` enum declaration. Use hash syntax instead.
5079
RUBY
5180
end
5281
end

0 commit comments

Comments
 (0)