From c5141f1f21e66c6026d4577110164c4c674a98a6 Mon Sep 17 00:00:00 2001 From: Santiago Bartesaghi Date: Wed, 24 Jul 2019 18:51:52 -0300 Subject: [PATCH] [Fix #78] Autocorrect EnumHash Cop --- lib/rubocop/cop/rails/enum_hash.rb | 29 ++++++++++++++++++++++++ manual/cops_rails.md | 2 +- spec/rubocop/cop/rails/enum_hash_spec.rb | 10 ++++++++ 3 files changed, 40 insertions(+), 1 deletion(-) diff --git a/lib/rubocop/cop/rails/enum_hash.rb b/lib/rubocop/cop/rails/enum_hash.rb index cff550baf6..9036b842e9 100644 --- a/lib/rubocop/cop/rails/enum_hash.rb +++ b/lib/rubocop/cop/rails/enum_hash.rb @@ -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 diff --git a/manual/cops_rails.md b/manual/cops_rails.md index 2b12dae89e..017184d3c2 100644 --- a/manual/cops_rails.md +++ b/manual/cops_rails.md @@ -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. diff --git a/spec/rubocop/cop/rails/enum_hash_spec.rb b/spec/rubocop/cop/rails/enum_hash_spec.rb index a803c85a85..48f75963cf 100644 --- a/spec/rubocop/cop/rails/enum_hash_spec.rb +++ b/spec/rubocop/cop/rails/enum_hash_spec.rb @@ -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