Sha256: fe8b9faa9cf6928dd9201df7d3a88128498993edcc5a9e9e32a247cb201b6f70

Contents?: true

Size: 1.52 KB

Versions: 18

Compression:

Stored size: 1.52 KB

Contents

module Frodo
  module Properties
    # Abstract base class for Frodo EnumTypes
    # @see [Frodo::Schema::EnumType]
    class Enum < Frodo::Property
      # Returns the property value, properly typecast
      # @return [String, nil]
      def value
        if @value.nil? && allows_nil?
          nil
        else
          @value
        end
      end

      # Sets the property value
      # @params new_value [String]
      def value=(new_value)
        parsed_value = validate(new_value)
        @value = is_flags? ? parsed_value : parsed_value.first
      end

      # Value to be used in URLs.
      # @return [String]
      def url_value
        "#{type}'#{@value}'"
      end

      private

      def members
        raise NotImplementedError, 'Subclass must override'
      end

      def validate(value)
        return [] if value.nil? && allows_nil?
        values = parse_value(value)

        if values.length > 1 && !is_flags?
          raise ArgumentError, 'Multiple values are not allowed for this property'
        end

        values.map do |value|
          if members.keys.include?(value)
            members[value]
          elsif members.values.include?(value)
            value
          else
            validation_error "Value must be one of #{members.to_a}, but was: '#{value}'"
          end
        end.compact
      end

      def parse_value(value)
        return nil if value.nil?
        value.to_s.split(',').map(&:strip).map do |val|
          val =~ /^[0-9]+$/ ? val.to_i : val
        end
      end
    end
  end
end

Version data entries

18 entries across 18 versions & 1 rubygems

Version Path
frodo-0.12.8 lib/frodo/properties/enum.rb
frodo-0.12.7 lib/frodo/properties/enum.rb
frodo-0.12.6 lib/frodo/properties/enum.rb
frodo-0.12.5 lib/frodo/properties/enum.rb
frodo-0.12.4 lib/frodo/properties/enum.rb
frodo-0.12.2 lib/frodo/properties/enum.rb
frodo-0.12.1 lib/frodo/properties/enum.rb
frodo-0.12.0 lib/frodo/properties/enum.rb
frodo-0.11.0 lib/frodo/properties/enum.rb
frodo-0.10.8 lib/frodo/properties/enum.rb
frodo-0.10.7 lib/frodo/properties/enum.rb
frodo-0.10.6 lib/frodo/properties/enum.rb
frodo-0.10.5 lib/frodo/properties/enum.rb
frodo-0.10.4 lib/frodo/properties/enum.rb
frodo-0.10.3 lib/frodo/properties/enum.rb
frodo-0.10.2 lib/frodo/properties/enum.rb
frodo-0.10.1 lib/frodo/properties/enum.rb
frodo-0.10.0 lib/frodo/properties/enum.rb