Sha256: 30588650c857fb60c45265130a33149903254f9649b73fec3f1a9a9cbf896dc8

Contents?: true

Size: 1.92 KB

Versions: 2

Compression:

Stored size: 1.92 KB

Contents

module RDF; class Literal
  ##
  # A date literal.
  #
  # @see   http://www.w3.org/TR/xmlschema-2/#date
  # @since 0.2.1
  class Date < Literal
    DATATYPE = XSD.date
    GRAMMAR  = %r(\A-?\d{4}-\d{2}-\d{2}(([\+\-]\d{2}:\d{2})|UTC|Z)?\Z).freeze
    FORMAT   = '%Y-%m-%d%Z'.freeze

    ##
    # @param  [Date] value
    # @option options [String] :lexical (nil)
    def initialize(value, options = {})
      @datatype = RDF::URI(options[:datatype] || self.class.const_get(:DATATYPE))
      @string   = options[:lexical] if options.has_key?(:lexical)
      @string   ||= value if value.is_a?(String)
      @object   = case
        when value.is_a?(::Date)         then value
        when value.respond_to?(:to_date) then value.to_date # Ruby 1.9+
        else ::Date.parse(value.to_s)
      end rescue nil
    end

    ##
    # Converts this literal into its canonical lexical representation.
    #
    # @return [RDF::Literal] `self`
    # @see    http://www.w3.org/TR/xmlschema-2/#date
    def canonicalize!
      @string = @object.strftime(FORMAT).sub(/\+00:00|UTC/, 'Z')
      self
    end

    ##
    # Returns `true` if the value adheres to the defined grammar of the
    # datatype.
    #
    # Special case for date and dateTime, for which '0000' is not a valid year
    #
    # @return [Boolean]
    # @since  0.2.1
    def valid?
      super && value !~ %r(\A0000)
    end

    ##
    # Returns the value as a string.
    #
    # @return [String]
    def to_s
      @string || @object.strftime(FORMAT).sub(/\+00:00|UTC/, 'Z')
    end

    ##
    # Equal compares as Date objects
    def ==(other)
      # If lexically invalid, use regular literal testing
      return super unless self.valid?

      case other
      when Literal::Date
        return super unless other.valid?
        self.object == other.object
      when Literal::Time, Literal::DateTime
        false
      else
        super
      end
    end
  end # Date
end; end # RDF::Literal

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
rdf-0.3.4.1 lib/rdf/model/literal/date.rb
rdf-0.3.4 lib/rdf/model/literal/date.rb