Sha256: fb0396168a9d46a9cc2997f093da07982f5ced64479cacef7d7313dbf19c6cbb

Contents?: true

Size: 1.9 KB

Versions: 18

Compression:

Stored size: 1.9 KB

Contents

module Frodo
  module Properties
    # Defines the DateTime Frodo type.
    class DateTime < Frodo::Property
      # Returns the property value, properly typecast
      # @return [DateTime, nil]
      def value
        if (@value.nil? || @value.empty?) && allows_nil?
          nil
        else
          begin
            date_class.strptime(@value, strptime_format)
          rescue ArgumentError
            date_class.parse(@value)
          end
        end
      end

      # Sets the property value
      # @params new_value [DateTime]
      def value=(new_value)
        validate(new_value)
        @value = parse_value(new_value)
      end

      # The Frodo type name
      def type
        'Edm.DateTime'
      end

      # Value to be used in JSON.
      # @return [String]
      def xml_value
        @value.andand.sub(/[\+\-]00:00$/, 'Z')
      end

      # Value to be used in JSON.
      # @return [String]
      def json_value
        xml_value
      end

      # Value to be used in URLs.
      # @return [String]
      def url_value
        xml_value
      end

      protected

      # Specifies date/time implementation to use
      def date_class
        ::DateTime
      end

      # Specifies the date/time format string used for `strptime`
      def strptime_format
        #'%Y-%m-%dT%H:%M:%S.%L'
        "%Y-%m-%dT%H:%M:%SZ"
      end

      def validate(value)
        begin
          return if value.nil? && allows_nil?
          return if value.is_a?(date_class)
          date_class.parse(value)
        rescue
          validation_error "Value '#{value}' is not a date time format that can be parsed"
        end
      end

      def parse_value(value)
        return value if value.nil? && allows_nil?
        if value.is_a?(date_class)
          parsed_value = value
        else
          parsed_value = date_class.parse(value)
        end
        parsed_value.strftime(strptime_format)
      end
    end
  end
end

Version data entries

18 entries across 18 versions & 1 rubygems

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