Class: RDF::Literal::Time

Inherits:
RDF::Literal show all
Defined in:
vendor/bundler/ruby/2.5.0/bundler/gems/rdf-491e9bb5b443/lib/rdf/model/literal/time.rb

Overview

A time literal.

The lexical representation for time is the left truncated lexical representation for xsd:dateTime: "hh:mm:ss.sss" with an optional following time zone indicator.

Constant Summary collapse

DATATYPE =

Since:

  • 0.2.1

RDF::URI("http://www.w3.org/2001/XMLSchema#time")
GRAMMAR =

Since:

  • 0.2.1

%r(\A(\d{2}:\d{2}:\d{2}(?:\.\d+)?)((?:[\+\-]\d{2}:\d{2})|UTC|GMT|Z)?\Z).freeze
FORMAT =

Since:

  • 0.2.1

'%H:%M:%S%:z'.freeze

Constants inherited from RDF::Literal

FALSE, TRUE, ZERO

Instance Attribute Summary

Attributes inherited from RDF::Literal

#datatype, #language

Instance Method Summary collapse

Methods inherited from RDF::Literal

#compatible?, #comperable_datatype?, #eql?, #escape, #has_datatype?, #has_language?, #hash, #inspect, #literal?, #method_missing, #object, #plain?, #respond_to_missing?, #simple?, #squish, #squish!, #valid_extended?, #validate!, #value, #value_hash

Methods included from Term

#<=>, #aggregate?, #compatible?, #eql?, #escape, #evaluate, #ndvars, #term?, #to_base, #to_term, #vars

Methods included from SPARQL::Algebra::Expression

cast, #constant?, #evaluate, extension, extensions, for, #invalid?, new, #node?, open, #optimize, parse, register_extension, #to_sxp_bin, #validate!, #variable?

Methods included from Value

#anonymous?, #canonicalize, #constant?, #graph?, #inspect, #inspect!, #invalid?, #iri?, #list?, #literal?, #node?, #resource?, #start_with?, #statement?, #term?, #to_nquads, #to_ntriples, #to_rdf, #to_term, #type_error, #uri?, #validate!, #variable?

Constructor Details

#initialize(value, datatype: nil, lexical: nil, **options) ⇒ Time

Returns a new instance of Time

Parameters:

  • value (String, DateTime, #to_datetime)
  • value (Object)
  • language (Symbol)

    (nil) Language is downcased to ensure proper matching

  • lexical (String)

    (nil) Supplied lexical representation of this literal, otherwise it comes from transforming value to a string form..

  • datatype (URI)

    (nil)

  • validate (Boolean)

    (false)

  • canonicalize (Boolean)

    (false)

Since:

  • 0.2.1



20
21
22
23
24
25
26
27
28
# File 'vendor/bundler/ruby/2.5.0/bundler/gems/rdf-491e9bb5b443/lib/rdf/model/literal/time.rb', line 20

def initialize(value, datatype: nil, lexical: nil, **options)
  @datatype = RDF::URI(datatype || self.class.const_get(:DATATYPE))
  @string   = lexical || (value if value.is_a?(String))
  @object   = case
    when value.is_a?(::DateTime)         then value
    when value.respond_to?(:to_datetime) then value.to_datetime rescue ::DateTime.parse(value.to_s)
    else ::DateTime.parse(value.to_s)
  end rescue ::DateTime.new
end

Dynamic Method Handling

This class handles dynamic methods through the method_missing method in the class RDF::Literal

Instance Method Details

#==(other) ⇒ Object

Equal compares as Time objects

Since:

  • 0.2.1



116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
# File 'vendor/bundler/ruby/2.5.0/bundler/gems/rdf-491e9bb5b443/lib/rdf/model/literal/time.rb', line 116

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

  case other
  when Literal::Time
    return super unless other.valid?
    # Compare as strings, as time includes a date portion, and adjusting for UTC
    # can create a mismatch in the date portion.
    self.object.new_offset.strftime('%H%M%S') == other.object.new_offset.strftime('%H%M%S')
  when Literal::DateTime, Literal::Date
    false
  else
    super
  end
end

#canonicalize!RDF::Literal

Converts this literal into its canonical lexical representation.

§3.2.8.2 Canonical representation

The canonical representation for time is defined by prohibiting certain options from the Lexical representation (§3.2.8.1). Specifically, either the time zone must be omitted or, if present, the time zone must be Coordinated Universal Time (UTC) indicated by a "Z". Additionally, the canonical representation for midnight is 00:00:00.

Returns:

See Also:

Since:

  • 0.2.1



43
44
45
46
47
48
49
50
51
52
# File 'vendor/bundler/ruby/2.5.0/bundler/gems/rdf-491e9bb5b443/lib/rdf/model/literal/time.rb', line 43

def canonicalize!
  if self.valid?
    @string = if has_timezone?
      @object.new_offset.new_offset.strftime(FORMAT[0..-4] + 'Z')
    else
      @object.strftime(FORMAT[0..-4])
    end
  end
  self
end

#has_timezone?Boolean Also known as: has_tz?

Does the literal representation include a timezone? Note that this is only possible if initialized using a string, or :lexical option.

Returns:

Since:

  • 1.1.6



82
83
84
85
# File 'vendor/bundler/ruby/2.5.0/bundler/gems/rdf-491e9bb5b443/lib/rdf/model/literal/time.rb', line 82

def has_timezone?
  md = self.to_s.match(GRAMMAR)
  md && !!md[2]
end

#humanize(lang = :en) ⇒ String

Returns a human-readable value for the literal

Returns:

Since:

  • 1.1.6



102
103
104
105
106
107
108
109
110
111
112
# File 'vendor/bundler/ruby/2.5.0/bundler/gems/rdf-491e9bb5b443/lib/rdf/model/literal/time.rb', line 102

def humanize(lang = :en)
  t = object.strftime("%r")
  if has_timezone?
    t += if self.tz == 'Z'
      " UTC"
    else
      " #{self.tz}"
    end
  end
  t
end

#to_sString

Returns the value as a string. Does not normalize timezone

Returns:

Since:

  • 0.2.1



93
94
95
# File 'vendor/bundler/ruby/2.5.0/bundler/gems/rdf-491e9bb5b443/lib/rdf/model/literal/time.rb', line 93

def to_s
  @string || @object.strftime(FORMAT).sub("+00:00", 'Z')
end

#tzRDF::Literal

Returns the timezone part of arg as a simple literal. Returns the empty string if there is no timezone.



59
60
61
62
63
# File 'vendor/bundler/ruby/2.5.0/bundler/gems/rdf-491e9bb5b443/lib/rdf/model/literal/time.rb', line 59

def tz
  zone =  has_timezone? ? object.zone : ""
  zone = "Z" if zone == "+00:00"
  RDF::Literal(zone)
end

#valid?Boolean

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

Returns:

Since:

  • 0.2.1



73
74
75
# File 'vendor/bundler/ruby/2.5.0/bundler/gems/rdf-491e9bb5b443/lib/rdf/model/literal/time.rb', line 73

def valid?
  super && !object.nil?
end