Sha256: 4130a73de6d801cf767444bc4dd2aedd7c838e3a99dcf3fc5d60ba243482bd78

Contents?: true

Size: 1.12 KB

Versions: 4

Compression:

Stored size: 1.12 KB

Contents

require 'dm-core'
require 'dm-types/support/flags'

module DataMapper
  class Property
    class Enum < Integer

      include Flags

      def initialize(model, name, options = {})
        @flag_map = {}

        flags = options.fetch(:flags, self.class.flags)
        flags.each_with_index do |flag, i|
          @flag_map[i + 1] = flag
        end

        if self.class.accepted_options.include?(:set) && !options.include?(:set)
          options[:set] = @flag_map.values_at(*@flag_map.keys.sort)
        end

        super
      end

      def load(value)
        flag_map[value]
      end

      def dump(value)
        case value
        when ::Array then value.collect { |v| dump(v) }
        else              flag_map.invert[value]
        end
      end

      def typecast_to_primitive(value)
        # Attempt to typecast using the class of the first item in the map.
        case flag_map[1]
        when ::Symbol then value.to_sym
        when ::String then value.to_s
        when ::Fixnum then value.to_i
        else               value
        end
      end

    end # class Enum
  end # class Property
end # module DataMapper

Version data entries

4 entries across 4 versions & 1 rubygems

Version Path
dm-types-1.2.1 lib/dm-types/enum.rb
dm-types-1.2.0 lib/dm-types/enum.rb
dm-types-1.2.0.rc2 lib/dm-types/enum.rb
dm-types-1.2.0.rc1 lib/dm-types/enum.rb