From 9c535dacaaed8847206823bfe0ceb7d26982d2a6 Mon Sep 17 00:00:00 2001 From: Santiago Bartesaghi Date: Fri, 26 Jul 2019 20:40:36 -0300 Subject: [PATCH] [Fix #78] Improvements --- lib/rubocop/cop/rails/enum_hash.rb | 39 ++++++------------------ spec/rubocop/cop/rails/enum_hash_spec.rb | 15 ++++----- 2 files changed, 18 insertions(+), 36 deletions(-) diff --git a/lib/rubocop/cop/rails/enum_hash.rb b/lib/rubocop/cop/rails/enum_hash.rb index 560ceddd02..0ce73e8040 100644 --- a/lib/rubocop/cop/rails/enum_hash.rb +++ b/lib/rubocop/cop/rails/enum_hash.rb @@ -40,6 +40,16 @@ def on_send(node) end end + def autocorrect(node) + range = node.loc.expression + hash = node + .children + .each_with_index + .map { |elem, index| [elem.children.first, index] }.to_h + + ->(corrector) { corrector.replace(range, hash.to_s) } + end + private def enum_name(key) @@ -50,35 +60,6 @@ def enum_name(key) key.source 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/spec/rubocop/cop/rails/enum_hash_spec.rb b/spec/rubocop/cop/rails/enum_hash_spec.rb index a371941d5c..43016f853c 100644 --- a/spec/rubocop/cop/rails/enum_hash_spec.rb +++ b/spec/rubocop/cop/rails/enum_hash_spec.rb @@ -81,13 +81,14 @@ 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 }" - ) + expect_offense(<<~RUBY) + enum status: [:old, :"very active", "is archived", 42] + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Enum defined as an array found in `status` enum declaration. Use hash syntax instead. + RUBY + + expect_correction(<<~RUBY) + enum status: {:old=>0, :"very active"=>1, "is archived"=>2, 42=>3} + RUBY end end