lib/simple_enum.rb in simple_enum-1.5.1 vs lib/simple_enum.rb in simple_enum-1.6.1
- old
+ new
@@ -43,12 +43,11 @@
:upcase => false
}
end
def included(base) #:nodoc:
- base.send :class_attribute, :enum_definitions, :instance_write => false, :instance_reader => false
- base.enum_definitions = {}
+ base.send :class_attribute, :simple_enum_definitions, :instance_writer => false, :instance_reader => false
base.send :extend, ClassMethods
end
end
module ClassMethods
@@ -164,27 +163,27 @@
# convert array to hash...
values = SimpleEnum::EnumHash.new(values)
values_inverted = values.invert
# store info away
- self.enum_definitions = {} if self.enum_definitions.nil?
self.enum_definitions[enum_cd] = self.enum_definitions[options[:column]] = { :name => enum_cd, :column => options[:column], :options => options }
- # display deprecation warning if enum_cd == column
- ActiveSupport::Deprecation.warn "[simple_enum] use different names for #{enum_cd}'s name and column name (support for this will be dropped in 1.5)" if enum_cd.to_s == options[:column].to_s
+ # raise error if enum_cd == column
+ raise ArgumentError, "[simple_enum] use different names for #{enum_cd}'s name and column name." if enum_cd.to_s == options[:column].to_s
# generate getter
define_method("#{enum_cd}") do
id = respond_to?(:read_attribute) ? read_attribute(options[:column]) : send(options[:column])
values_inverted[id]
end
# generate setter
define_method("#{enum_cd}=") do |new_value|
- v = new_value.blank? ? nil : values[new_value.to_sym]
- raise(ArgumentError, "Invalid enumeration value: #{new_value}") if (options[:whiny] and v.nil? and !new_value.blank?)
- respond_to?(:write_attribute) ? write_attribute(options[:column], v) : send("#{options[:column]}=", v)
+ real = new_value.blank? ? nil : values[EnumHash.symbolize(new_value)]
+ real = new_value if real.nil? && values_inverted[new_value].present?
+ raise(ArgumentError, "Invalid enumeration value: #{new_value}") if (options[:whiny] and real.nil? and !new_value.blank?)
+ respond_to?(:write_attribute) ? write_attribute(options[:column], real) : send("#{options[:column]}=", real)
end
# generate checker
define_method("#{enum_cd}?") do |*args|
current = send(enum_cd)
@@ -211,11 +210,11 @@
define_method("human_#{enum_cd}") do
self.class.human_enum_name(attr_name, self.send(enum_cd)) unless self.send(enum_cd).nil?
end
class_eval(<<-RUBY, __FILE__, __LINE__ + 1)
- class_attribute #{enum_attr.inspect}, :instance_write => false, :instance_reader => false
+ class_attribute #{enum_attr.inspect}, :instance_writer => false, :instance_reader => false
def self.#{attr_name}(*args)
return #{enum_attr} if args.first.nil?
return #{enum_attr}[args.first] if args.size == 1
args.inject([]) { |ary, sym| ary << #{enum_attr}[sym]; ary }
@@ -269,9 +268,13 @@
defaults << options.delete(:default) if options[:default]
defaults << key.to_s.humanize
options.reverse_merge! :count => 1, :default => defaults
I18n.translate(defaults.shift, options)
+ end
+
+ def enum_definitions
+ self.simple_enum_definitions ||= {}
end
end
end
# include in AR