diff --git a/lib/magic_enum.rb b/lib/magic_enum.rb index 20fe6ec..7ec3ac3 100644 --- a/lib/magic_enum.rb +++ b/lib/magic_enum.rb @@ -2,3 +2,4 @@ require 'magic_enum/class_methods' ActiveRecord::Base.extend(MagicEnum::ClassMethods) +ActiveResource::Base.extend(MagicEnum::ClassMethods) if defined?(::ActiveResource) diff --git a/lib/magic_enum/class_methods.rb b/lib/magic_enum/class_methods.rb index 23ba677..e2765f8 100644 --- a/lib/magic_enum/class_methods.rb +++ b/lib/magic_enum/class_methods.rb @@ -50,12 +50,12 @@ module ClassMethods # StatusesInverted = Statuses.invert # # def status - # return StatusesInverted[self[:status].to_i] || StatusesInverted[1] + # return StatusesInverted[self.attributes[:status].to_i] || StatusesInverted[1] # end # # def status=(value) # raise ArgumentError, "Invalid value \"#{value}\" for :status attribute of the #{self.class} model" if Statuses[value].nil? - # self[:status] = Statuses[value] + # self.attributes[:status] = Statuses[value] # end # # def unknown? @@ -98,12 +98,12 @@ def define_enum(name, opts = {}) else a <=> b end - end.first unless opts[:default] + end.first unless opts.has_key?(:default) const_set(enum_inverted, const_get(enum).invert) define_method name do - self.class.const_get(enum_inverted)[self[name]] || self.class.const_get(enum_inverted)[opts[:default]] + self.class.const_get(enum_inverted)[self.attributes[name]] || self.class.const_get(enum_inverted)[opts[:default]] end define_method "#{name}_name" do @@ -111,12 +111,12 @@ def define_enum(name, opts = {}) end define_method "#{name}=" do |value| - value = value.to_sym if value.is_a?(String) + value = value.to_sym if value.is_a?(String) && value.length > 0 raise ArgumentError, "Invalid value \"#{value}\" for :#{name} attribute of the #{self.class} model" if opts[:raise_on_invalid] and self.class.const_get(enum)[value].nil? if value.is_a?(Integer) - self[name] = value + self.attributes[name] = value else - self[name] = self.class.const_get(enum)[value] || opts[:default] + self.attributes[name] = self.class.const_get(enum)[value] || opts[:default] end end diff --git a/spec/magic_enum_spec.rb b/spec/magic_enum_spec.rb index 65343d1..b3362b7 100644 --- a/spec/magic_enum_spec.rb +++ b/spec/magic_enum_spec.rb @@ -2,10 +2,11 @@ require 'active_record' require File.dirname(__FILE__) + '/../init' +require File.dirname(__FILE__) + '/../lib/magic_enum' module MagicEnumHelper class TestModelBase - include MagicEnum + extend MagicEnum::ClassMethods Statuses = { :unknown => 0, :draft => 1, :published => 2 } def [](attr_name) @@ -15,6 +16,12 @@ def [](attr_name) def []=(attr_name, value) @status = value end + attr_accessor :attributes + + def initialize(*args) + super + @attributes = {} + end end end @@ -52,6 +59,11 @@ class TestModel1 < MagicEnumHelper::TestModelBase @model.status.should == :unknown end + specify 'use a default value if the string is empty' do + @model.status = '' + @model[:status].should == 0 + end + specify 'should store enum value if key is given as integer equivalent' do @model.status = 1 @model[:status].should == 1 @@ -125,6 +137,25 @@ class TestModel2 < MagicEnumHelper::TestModelBase end end +context 'Model with magic enum and default value of nil' do + include MagicEnumHelper + + class TestModelNil < MagicEnumHelper::TestModelBase + define_enum :status, :default => nil + end + + setup do + @model = TestModelNil.new + end + + specify 'should use default value when current state is invalid' do + @model.status = :draft + @model.status.should == :draft + @model.status = nil + @model.status.should == nil + end +end + describe 'Model with magic enum and raise_on_invalid option specified' do include MagicEnumHelper