diff --git a/lib/ruby-enum/enum.rb b/lib/ruby-enum/enum.rb index 0930e86..6693b66 100644 --- a/lib/ruby-enum/enum.rb +++ b/lib/ruby-enum/enum.rb @@ -19,6 +19,9 @@ def self.included(base) base.extend ClassMethods base.private_class_method(:new) + + base.instance_variable_set(:@_enum_hash, {}) + base.instance_variable_set(:@_enums_by_value, {}) end module ClassMethods diff --git a/spec/ruby-enum/enum_spec.rb b/spec/ruby-enum/enum_spec.rb index a3d811e..8c32b6a 100644 --- a/spec/ruby-enum/enum_spec.rb +++ b/spec/ruby-enum/enum_spec.rb @@ -17,6 +17,13 @@ class FirstSubclass < Colors class SecondSubclass < FirstSubclass define :PINK, 'pink' end + + class OtherSecondSubclass < FirstSubclass + include Ruby::Enum + + define :MAGENTA, 'magenta' + end + it 'returns an enum value' do expect(Colors::RED).to eq 'red' expect(Colors::GREEN).to eq 'green' @@ -169,6 +176,12 @@ class SecondSubclass < FirstSubclass expect(SecondSubclass.values).to eq(%w[red green orange pink]) end end + + context 'when a subclass of a subclass is defined with redundant module inclusion' do + it 'returns all values' do + expect(OtherSecondSubclass.values).to eq(%w[red green orange magenta]) + end + end end describe '#to_h' do @@ -229,6 +242,22 @@ class SecondSubclass < FirstSubclass end end + # rubocop:disable Rspec/DescribedClass + describe 'Reloading enum definition' do + it 'plays nice with lazy loading in Ruby on Rails' do + class_body = proc do + include Ruby::Enum + + define :BALD, 'bald' + end + + HairStyles = Class.new(&class_body) + + expect { HairStyles.class_eval(&class_body) }.not_to raise_error + end + end + # rubocop:enable Rspec/DescribedClass + describe 'Given a class that has not defined any enums' do class EmptyEnums include Ruby::Enum