Skip to content

Commit

Permalink
[Fix rubocop#78] Autocorrect EnumHash Cop
Browse files Browse the repository at this point in the history
  • Loading branch information
santib committed Jul 25, 2019
1 parent 7b55e00 commit c5141f1
Show file tree
Hide file tree
Showing 3 changed files with 40 additions and 1 deletion.
29 changes: 29 additions & 0 deletions lib/rubocop/cop/rails/enum_hash.rb
Expand Up @@ -30,6 +30,35 @@ def on_send(node)
add_offense(node, message: format(MSG, enum: name))
end
end

def autocorrect(node)
enum_values = node.children[2].children.first.children[1]
to_replace = enum_values.loc.expression
values_hash = "{ #{converted_values(enum_values)} }"

->(corrector) { corrector.replace(to_replace, values_hash) }
end

private

def converted_values(enum_values)
enum_values.children.each_with_index.map do |child, index|
hash_entry_as_string(child, index)
end.join(', ')
end

def hash_entry_as_string(child, index)
value = child.children.first
case value
when String
"'#{value}' => #{index}"
when Symbol
value = "'#{value}'" if value =~ /\s/
"#{value}: #{index}"
else
"#{child.source} => #{index}"
end
end
end
end
end
Expand Down
2 changes: 1 addition & 1 deletion manual/cops_rails.md
Expand Up @@ -646,7 +646,7 @@ Whitelist | `find_by_sql` | Array

Enabled by default | Safe | Supports autocorrection | VersionAdded | VersionChanged
--- | --- | --- | --- | ---
Enabled | Yes | No | 2.3 | -
Enabled | Yes | Yes | 2.3 | -

This cop looks for enums written with array syntax.

Expand Down
10 changes: 10 additions & 0 deletions spec/rubocop/cop/rails/enum_hash_spec.rb
Expand Up @@ -50,6 +50,16 @@
RUBY
end
end

it 'autocorrects' do
expect(
autocorrect_source(
'enum status: [:old, :"very active", "is archived", 42]'
)
).to eq(
"enum status: { old: 0, 'very active': 1, 'is archived' => 2, 42 => 3 }"
)
end
end

context 'when hash syntax is used' do
Expand Down

0 comments on commit c5141f1

Please sign in to comment.