lib/classy_enum.rb in classy_enum-0.7.0 vs lib/classy_enum.rb in classy_enum-0.7.1

- old
+ new

@@ -1,179 +1,9 @@ +require "classy_enum/base" +require "classy_enum/class_methods" +require "classy_enum/instance_methods" require "classy_enum/attributes" if Gem.available? 'formtastic' require 'formtastic' require 'classy_enum/semantic_form_builder' -end - -module ClassyEnum - - class Base - - # Macro for defining enum members within a ClassyEnum class. - # Accepts an array of symbols or strings which are converted to - # ClassyEnum members as descents of their parent class. - # - # ==== Example - # # Define an enum called Priority with three child classes - # class Priority < ClassyEnum::Base - # enum_classes :low, :medium, :high - # end - # - # The child classes will be defined with the following constants: - # PriorityLow, PriorityMedium, and PriorityHigh - # - # These child classes can be instantiated with either: - # Priority.build(:low) or PriorityLow.new - # - def self.enum_classes(*options) - self.send(:attr_reader, :enum_classes) - - self.const_set("OPTIONS", options) unless self.const_defined? "OPTIONS" - - self.extend ClassMethods - - options.each_with_index do |option, index| - - klass = Class.new(self) do - include InstanceMethods - - attr_reader :to_s, :to_sym, :index - - @index = index + 1 - @option = option - - def initialize - @to_s = self.class.instance_variable_get('@option').to_s - @to_sym = @to_s.to_sym - @index = self.class.instance_variable_get('@index') - end - - end - - klass_name = "#{self}#{option.to_s.camelize}" - Object.const_set(klass_name, klass) unless Object.const_defined? klass_name - end - end - end - - module ClassMethods - - # Build a new ClassyEnum child instance - # - # ==== Example - # # Create an Enum with some elements - # class Priority < ClassyEnum::Base - # enum_classes :low, :medium, :high - # end - # - # Priority.build(:low) # => PriorityLow.new - def build(option) - return option if option.blank? - return TypeError.new("Valid #{self} options are #{self.valid_options}") unless self::OPTIONS.include? option.to_sym - Object.const_get("#{self}#{option.to_s.camelize}").new - end - - alias :find :build - - # Returns an array of all instantiated enums - # - # ==== Example - # # Create an Enum with some elements - # class Priority < ClassyEnum::Base - # enum_classes :low, :medium, :high - # end - # - # Priority.all # => [PriorityLow.new, PriorityMedium.new, PriorityHigh.new] - def all - self::OPTIONS.map {|e| build(e) } - end - - # Returns a 2D array for Rails select helper options. - # Also used internally for Formtastic support - # - # ==== Example - # # Create an Enum with some elements - # class Priority < ClassyEnum::Base - # enum_classes :low, :really_high - # end - # - # Priority.select_options # => [["Low", "low"], ["Really High", "really_high"]] - def select_options - all.map {|e| [e.name, e.to_s] } - end - - # Returns a comma separated list of valid enum options. - # Also used internally for ActiveRecord model validation error messages - # - # ==== Example - # # Create an Enum with some elements - # class Priority < ClassyEnum::Base - # enum_classes :low, :medium, :high - # end - # - # Priority.valid_options # => "low, medium, high" - def valid_options - self::OPTIONS.map(&:to_s).join(', ') - end - - end - - module InstanceMethods - # Returns string representing enum in Rails titleize format - # - # ==== Example - # # Create an Enum with some elements - # class Priority < ClassyEnum::Base - # enum_classes :low, :medium, :high, :really_high - # end - # - # @priority = Priority.build(:really_high) - # @priority.name # => "Really High" - def name - @to_s.titleize - end - - # Sort an array of elements based on the order they are defined - # - # ==== Example - # # Create an Enum with some elements - # class Priority < ClassyEnum::Base - # enum_classes :low, :medium, :high - # end - # - # @low = Priority.build(:low) - # @medium = Priority.build(:medium) - # @high = Priority.build(:high) - # priorities = [@low, @high, @medium] - # priorities.sort # => [@low, @medium, @high] - # priorities.max # => @high - # priorities.min # => @low - def <=> other - @index <=> other.index - end - - # Determine if the enum attribute is a particular member. - # Accepts a symbol or string representing a member - # - # ==== Example - # # Create an Enum with some elements - # class Breed < ClassyEnum::Base - # enum_classes :golden_retriever, :snoop - # end - # - # # Create an ActiveRecord class using the Breed enum - # class Dog < ActiveRecord::Base - # classy_enum_attr :breed - # end - # - # @dog = Dog.new(:breed => :snoop) - # @dog.breed.is? :snoop # => true - # @dog.breed.is? 'snoop' # => true - # @dog.breed.is? :golden_retriever # => false - def is?(obj) - obj.to_s == to_s - end - - end - end