rdf_context 0.4.7 → 0.4.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/History.txt +6 -0
- data/Rakefile +2 -2
- data/VERSION +1 -1
- data/lib/rdf_context.rb +2 -0
- data/lib/rdf_context/duration.rb +113 -0
- data/lib/rdf_context/graph.rb +1 -1
- data/lib/rdf_context/literal.rb +65 -17
- data/lib/rdf_context/store/list_store.rb +1 -1
- data/lib/rdf_context/uriref.rb +9 -3
- data/spec/duration_spec.rb +46 -0
- data/spec/literal_spec.rb +85 -13
- metadata +5 -2
data/History.txt
CHANGED
@@ -1,3 +1,9 @@
|
|
1
|
+
=== 0.4.8
|
2
|
+
* Add Duration and support in Literal
|
3
|
+
* Add datatype support for xs:boolean, xs:double, xs:duration and xs:time.
|
4
|
+
* Literal::Encoding#encode_contents properly encodes different datatypes to string.
|
5
|
+
* Literal#to_native converts literal value to appropriate native object based on datatype.
|
6
|
+
|
1
7
|
=== 0.4.7
|
2
8
|
* Graph identifiers only URIRef or BNode; Literal not supported by SQL Store.
|
3
9
|
* Namespace#+ updated to not use URIRef logic for creating URIs, as this removes part of the URI in the case that the URI does not end with / or #.
|
data/Rakefile
CHANGED
@@ -46,13 +46,13 @@ end
|
|
46
46
|
require 'spec/rake/spectask'
|
47
47
|
Spec::Rake::SpecTask.new(:spec) do |spec|
|
48
48
|
spec.libs << 'lib' << 'spec'
|
49
|
-
spec.spec_files = FileList['spec
|
49
|
+
spec.spec_files = FileList['spec/*_spec.rb']
|
50
50
|
end
|
51
51
|
|
52
52
|
desc "Run specs through RCov"
|
53
53
|
Spec::Rake::SpecTask.new(:rcov) do |spec|
|
54
54
|
spec.libs << 'lib' << 'spec'
|
55
|
-
spec.pattern = 'spec
|
55
|
+
spec.pattern = 'spec/*_spec.rb'
|
56
56
|
spec.rcov = true
|
57
57
|
end
|
58
58
|
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.4.
|
1
|
+
0.4.8
|
data/lib/rdf_context.rb
CHANGED
@@ -55,6 +55,8 @@ module RdfContext
|
|
55
55
|
RDFS_NS = Namespace.new("http://www.w3.org/2000/01/rdf-schema#", "rdfs")
|
56
56
|
XHV_NS = Namespace.new("http://www.w3.org/1999/xhtml/vocab#", "xhv")
|
57
57
|
XML_NS = Namespace.new("http://www.w3.org/XML/1998/namespace", "xml")
|
58
|
+
XSD_NS = Namespace.new("http://www.w3.org/2001/XMLSchema#", "xsd")
|
59
|
+
XSI_NS = Namespace.new("http://www.w3.org/2001/XMLSchema-instance", "xsi")
|
58
60
|
|
59
61
|
XH_MAPPING = {"" => Namespace.new("http://www.w3.org/1999/xhtml/vocab\#", nil)}
|
60
62
|
end
|
@@ -0,0 +1,113 @@
|
|
1
|
+
# An XSD duration
|
2
|
+
module RdfContext
|
3
|
+
class Duration
|
4
|
+
attr_accessor :ne, :yr, :mo, :da, :hr, :mi, :se
|
5
|
+
|
6
|
+
# * Given an integer, assumes that it is milliseconds
|
7
|
+
# * Given a time, extract second
|
8
|
+
# * Given a Flaat, use value direcly
|
9
|
+
# * Given a String, parse as xsd:duration
|
10
|
+
def initialize(value)
|
11
|
+
case value
|
12
|
+
when Hash
|
13
|
+
@ne = value[:ne] || 1
|
14
|
+
@yr = value[:yr] || value[:years] || 0
|
15
|
+
@mo = value[:mo] || value[:months] || 0
|
16
|
+
@da = value[:da] || value[:days] || 0
|
17
|
+
@hr = value[:hr] || value[:hours] || 0
|
18
|
+
@mi = value[:mi] || value[:minutes] || 0
|
19
|
+
@se = value[:se] || value[:seconds] || 0
|
20
|
+
when Duration
|
21
|
+
@se = value.to_f
|
22
|
+
when Numeric
|
23
|
+
@se = value
|
24
|
+
else
|
25
|
+
@se = value.to_i
|
26
|
+
end
|
27
|
+
|
28
|
+
self.normalize
|
29
|
+
end
|
30
|
+
|
31
|
+
def self.parse(value)
|
32
|
+
# Reverse convert from XSD version of duration
|
33
|
+
# XSD allows -P1111Y22M33DT44H55M66.666S with any combination in regular order
|
34
|
+
# We assume 1M == 30D, but are out of spec in this regard
|
35
|
+
# We only output up to hours
|
36
|
+
if value.to_s.match(/^(-?)P(\d+Y)?(\d+M)?(\d+D)?T?(\d+H)?(\d+M)?([\d\.]+S)?$/)
|
37
|
+
hash = {}
|
38
|
+
hash[:ne] = $1 == "-" ? -1 : 1
|
39
|
+
hash[:yr] = $2.to_i
|
40
|
+
hash[:mo] = $3.to_i
|
41
|
+
hash[:da] = $4.to_i
|
42
|
+
hash[:hr] = $5.to_i
|
43
|
+
hash[:mi] = $6.to_i
|
44
|
+
hash[:se] = $7.to_f
|
45
|
+
value = hash
|
46
|
+
end
|
47
|
+
|
48
|
+
self.new(value)
|
49
|
+
end
|
50
|
+
|
51
|
+
def to_f
|
52
|
+
(((((@yr.to_i * 12 + @mo.to_i) * 30 + @da.to_i) * 24 + @hr.to_i) * 60 + @mi.to_i) * 60 + @se.to_f) * (@ne || 1)
|
53
|
+
end
|
54
|
+
|
55
|
+
def to_i; Integer(self.to_f); end
|
56
|
+
def eql?(something)
|
57
|
+
case something
|
58
|
+
when Duration
|
59
|
+
self.to_f == something.to_f
|
60
|
+
when String
|
61
|
+
self.to_s(:xml) == something
|
62
|
+
when Numeric
|
63
|
+
self.to_f == something
|
64
|
+
else
|
65
|
+
false
|
66
|
+
end
|
67
|
+
end
|
68
|
+
alias_method :==, :eql?
|
69
|
+
|
70
|
+
def to_s(format = nil)
|
71
|
+
usec = (@se * 1000).to_i % 1000
|
72
|
+
sec_str = usec > 0 ? "%2.3f" % @se : @se.to_i.to_s
|
73
|
+
|
74
|
+
if format == :xml
|
75
|
+
str = @ne < 0 ? "-P" : "P"
|
76
|
+
str << "%dY" % @yr if @yr > 0
|
77
|
+
str << "%dM" % @mo if @mo > 0
|
78
|
+
str << "%dD" % @da if @da > 0
|
79
|
+
str << "T" if @hr + @mi + @se > 0
|
80
|
+
str << "%dH" % @hr if @hr > 0
|
81
|
+
str << "%dM" % @mi if @mi > 0
|
82
|
+
str << "#{sec_str}S" if @se > 0
|
83
|
+
else
|
84
|
+
ar = []
|
85
|
+
ar << "%d years" % @yr if @yr > 0
|
86
|
+
ar << "%d months" % @mo if @mo > 0
|
87
|
+
ar << "%d days" % @da if @da > 0
|
88
|
+
ar << "%d hours" % @hr if @hr > 0
|
89
|
+
ar << "%d minutes" % @mi if @mi > 0
|
90
|
+
ar << "%s seconds" % sec_str if @se > 0
|
91
|
+
last = ar.pop
|
92
|
+
first = ar.join(", ")
|
93
|
+
res = first.empty? ? last : "#{first} and #{last}"
|
94
|
+
ne < 0 ? "#{res} ago" : res
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
98
|
+
protected
|
99
|
+
|
100
|
+
# Normalize representation by adding everything up and then breaking it back down again
|
101
|
+
def normalize
|
102
|
+
s = self.to_f
|
103
|
+
|
104
|
+
@ne = s < 0 ? -1 : 1
|
105
|
+
s = s * @ne
|
106
|
+
_mi, @se = s.divmod(60)
|
107
|
+
_hr, @mi = _mi.to_i.divmod(60)
|
108
|
+
_da, @hr = _hr.divmod(24)
|
109
|
+
_mo, @da = _da.divmod(30)
|
110
|
+
@yr, @mo = _mo.divmod(12)
|
111
|
+
end
|
112
|
+
end
|
113
|
+
end
|
data/lib/rdf_context/graph.rb
CHANGED
@@ -325,7 +325,7 @@ module RdfContext
|
|
325
325
|
# after sorting each graph.
|
326
326
|
#
|
327
327
|
# We just follow Python RDFlib's lead and do a simple comparison
|
328
|
-
def eql?
|
328
|
+
def eql?(other)
|
329
329
|
#puts "eql? size #{self.size} vs #{other.size}"
|
330
330
|
return false if !other.is_a?(Graph) || self.size != other.size
|
331
331
|
return false unless other.identifier.to_s == identifier.to_s
|
data/lib/rdf_context/literal.rb
CHANGED
@@ -4,6 +4,9 @@ begin
|
|
4
4
|
rescue LoadError
|
5
5
|
end
|
6
6
|
|
7
|
+
require 'parsedate'
|
8
|
+
require File.join(File.dirname(__FILE__), 'duration')
|
9
|
+
|
7
10
|
module RdfContext
|
8
11
|
# An RDF Literal, with value, encoding and language elements.
|
9
12
|
class Literal
|
@@ -15,29 +18,49 @@ module RdfContext
|
|
15
18
|
@value = URIRef.new(value.to_s) if value
|
16
19
|
end
|
17
20
|
|
18
|
-
# Shortcut for <tt>Literal::Encoding.new("http://www.w3.org/2001/XMLSchema#
|
19
|
-
def self.
|
20
|
-
@
|
21
|
+
# Shortcut for <tt>Literal::Encoding.new("http://www.w3.org/2001/XMLSchema#boolean")</tt>
|
22
|
+
def self.boolean
|
23
|
+
@boolean ||= coerce XSD_NS.boolean
|
24
|
+
end
|
25
|
+
|
26
|
+
# Shortcut for <tt>Literal::Encoding.new("http://www.w3.org/2001/XMLSchema#double")</tt>
|
27
|
+
def self.double
|
28
|
+
@double ||= coerce XSD_NS.double
|
21
29
|
end
|
22
30
|
|
23
31
|
# Shortcut for <tt>Literal::Encoding.new("http://www.w3.org/2001/XMLSchema#float")</tt>
|
24
32
|
def self.float
|
25
|
-
@float ||= coerce
|
33
|
+
@float ||= coerce XSD_NS.float
|
26
34
|
end
|
27
35
|
|
28
|
-
# Shortcut for <tt>Literal::Encoding.new("http://www.w3.org/2001/XMLSchema#
|
29
|
-
def self.
|
30
|
-
@
|
36
|
+
# Shortcut for <tt>Literal::Encoding.new("http://www.w3.org/2001/XMLSchema#int")</tt>
|
37
|
+
def self.integer
|
38
|
+
@integer ||= coerce XSD_NS.int
|
31
39
|
end
|
32
|
-
|
40
|
+
|
33
41
|
# Shortcut for <tt>Literal::Encoding.new("http://www.w3.org/2001/XMLSchema#date")</tt>
|
34
42
|
def self.date
|
35
|
-
@date ||= coerce
|
43
|
+
@date ||= coerce XSD_NS.date
|
36
44
|
end
|
37
45
|
|
38
46
|
# Shortcut for <tt>Literal::Encoding.new("http://www.w3.org/2001/XMLSchema#dateTime")</tt>
|
39
47
|
def self.datetime
|
40
|
-
@datetime ||= coerce
|
48
|
+
@datetime ||= coerce XSD_NS.dateTime
|
49
|
+
end
|
50
|
+
|
51
|
+
# Shortcut for <tt>Literal::Encoding.new("http://www.w3.org/2001/XMLSchema#duration")</tt>
|
52
|
+
def self.duration
|
53
|
+
@duration ||= coerce XSD_NS.duration
|
54
|
+
end
|
55
|
+
|
56
|
+
# Shortcut for <tt>Literal::Encoding.new("http://www.w3.org/2001/XMLSchema#string")</tt>
|
57
|
+
def self.string
|
58
|
+
@string ||= coerce XSD_NS.string
|
59
|
+
end
|
60
|
+
|
61
|
+
# Shortcut for <tt>Literal::Encoding.new("http://www.w3.org/2001/XMLSchema#time")</tt>
|
62
|
+
def self.time
|
63
|
+
@time ||= coerce XSD_NS.time
|
41
64
|
end
|
42
65
|
|
43
66
|
# Create from URI, empty or nil string
|
@@ -108,7 +131,14 @@ module RdfContext
|
|
108
131
|
|
109
132
|
# Encode literal contents
|
110
133
|
def encode_contents(contents, options)
|
111
|
-
|
134
|
+
case @value
|
135
|
+
when XSD_NS.boolean then %w(1 true).include?(contents.to_s) ? "true" : "false"
|
136
|
+
when XSD_NS.time then contents.is_a?(Time) ? contents.strftime("%H:%M:%S%Z").sub(/\+00:00|UTC/, "Z") : contents.to_s
|
137
|
+
when XSD_NS.dateTime then contents.is_a?(DateTime) ? contents.strftime("%Y-%m-%dT%H:%M:%S%Z").sub(/\+00:00|UTC/, "Z") : contents.to_s
|
138
|
+
when XSD_NS.date then contents.is_a?(Date) ? contents.strftime("%Y-%m-%d%Z").sub(/\+00:00|UTC/, "Z") : contents.to_s
|
139
|
+
when XSD_NS.duration then contents.is_a?(Duration) ? contents.to_s(:xml) : contents.to_s
|
140
|
+
else contents.to_s
|
141
|
+
end
|
112
142
|
end
|
113
143
|
end
|
114
144
|
|
@@ -292,12 +322,15 @@ module RdfContext
|
|
292
322
|
# Infer the proper XML datatype for the given object
|
293
323
|
def self.infer_encoding_for(object)
|
294
324
|
case object
|
295
|
-
when
|
296
|
-
when
|
297
|
-
when
|
298
|
-
when
|
299
|
-
when
|
300
|
-
|
325
|
+
when TrueClass then Encoding.boolean
|
326
|
+
when FalseClass then Encoding.boolean
|
327
|
+
when Integer then Encoding.integer
|
328
|
+
when Float then Encoding.float
|
329
|
+
when Time then Encoding.time
|
330
|
+
when DateTime then Encoding.datetime
|
331
|
+
when Date then Encoding.date
|
332
|
+
when Duration then Encoding.duration
|
333
|
+
else Encoding.string
|
301
334
|
end
|
302
335
|
end
|
303
336
|
|
@@ -337,6 +370,21 @@ module RdfContext
|
|
337
370
|
encoding.format_as_trix(@contents, @lang)
|
338
371
|
end
|
339
372
|
|
373
|
+
# Create native representation for value
|
374
|
+
def to_native
|
375
|
+
case encoding
|
376
|
+
when Encoding.boolean then @contents.to_s == "true"
|
377
|
+
when Encoding.double then @contents.to_s.to_f
|
378
|
+
when Encoding.integer then @contents.to_s.to_i
|
379
|
+
when Encoding.float then @contents.to_s.to_f
|
380
|
+
when Encoding.time then Time.parse(@contents.to_s)
|
381
|
+
when Encoding.datetime then DateTime.parse(@contents.to_s)
|
382
|
+
when Encoding.date then Date.parse(@contents.to_s)
|
383
|
+
when Encoding.duration then Duration.parse(@contents.to_s)
|
384
|
+
else @contents.to_s
|
385
|
+
end
|
386
|
+
end
|
387
|
+
|
340
388
|
# Return content and hash appropriate for encoding in XML
|
341
389
|
#
|
342
390
|
# ==== Example
|
@@ -30,7 +30,7 @@ module RdfContext
|
|
30
30
|
|
31
31
|
# Check to see if this graph contains the specified triple
|
32
32
|
def contains?(triple, context = nil)
|
33
|
-
|
33
|
+
@triples.any? {|t| t == triple}
|
34
34
|
end
|
35
35
|
|
36
36
|
# Triples from graph, optionally matching subject, predicate, or object.
|
data/lib/rdf_context/uriref.rb
CHANGED
@@ -78,9 +78,15 @@ module RdfContext
|
|
78
78
|
|
79
79
|
# Output URI as QName using URI binding
|
80
80
|
def to_qname(uri_binding = {})
|
81
|
-
|
82
|
-
|
83
|
-
|
81
|
+
"#{namespace(uri_binding).prefix}:#{self.short_name}"
|
82
|
+
end
|
83
|
+
|
84
|
+
def namespace(uri_binding = {})
|
85
|
+
@namespace ||= begin
|
86
|
+
ns = uri_binding[self.base]
|
87
|
+
raise RdfException, "Couldn't find namespace for #{@uri}" unless ns
|
88
|
+
ns
|
89
|
+
end
|
84
90
|
end
|
85
91
|
|
86
92
|
def inspect
|
@@ -0,0 +1,46 @@
|
|
1
|
+
require File.join(File.dirname(__FILE__), 'spec_helper')
|
2
|
+
describe "Duration" do
|
3
|
+
it "should create from Hash" do
|
4
|
+
Duration.new(:seconds => 10, :minutes => 1).to_i.should == 70
|
5
|
+
end
|
6
|
+
|
7
|
+
it "should create from Duration" do
|
8
|
+
d = Duration.new(:seconds => 10, :minutes => 1)
|
9
|
+
Duration.new(d).to_i.should == 70
|
10
|
+
end
|
11
|
+
it "should create from Numeric" do
|
12
|
+
Duration.new(70.2).to_i.should == 70
|
13
|
+
Duration.new(70.2).to_f.should == 70.2
|
14
|
+
end
|
15
|
+
|
16
|
+
it "should create from Integer string" do
|
17
|
+
Duration.new("70").to_f.should == 70
|
18
|
+
end
|
19
|
+
|
20
|
+
it "should parse formatted string" do
|
21
|
+
Duration.parse('-P1111Y11M23DT4H55M16.666S').to_i.should == -34587060916
|
22
|
+
end
|
23
|
+
|
24
|
+
describe "normalization" do
|
25
|
+
end
|
26
|
+
|
27
|
+
describe "output format" do
|
28
|
+
subject { Duration.parse('P1111Y11M23DT4H55M16.666S') }
|
29
|
+
|
30
|
+
it "should output xml" do
|
31
|
+
subject.to_s(:xml).should == "P1111Y11M23DT4H55M16.666S"
|
32
|
+
end
|
33
|
+
|
34
|
+
it "should output human readable" do
|
35
|
+
subject.to_s.should == "1111 years, 11 months, 23 days, 4 hours, 55 minutes and 16.666 seconds"
|
36
|
+
end
|
37
|
+
|
38
|
+
it "should output integer" do
|
39
|
+
subject.to_i.should == 34587060916
|
40
|
+
end
|
41
|
+
|
42
|
+
it "should output float" do
|
43
|
+
subject.to_f.should == 34587060916.666
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
data/spec/literal_spec.rb
CHANGED
@@ -103,9 +103,29 @@ describe "Literals: " do
|
|
103
103
|
end
|
104
104
|
end
|
105
105
|
|
106
|
+
describe "a boolean" do
|
107
|
+
subject { Literal.typed(true, "http://www.w3.org/2001/XMLSchema#boolean") }
|
108
|
+
describe "encodings" do
|
109
|
+
it "should return n3" do subject.to_n3.should == "\"true\"^^<http://www.w3.org/2001/XMLSchema#boolean>" end
|
110
|
+
it "should return ntriples" do subject.to_ntriples.should == subject.to_n3 end
|
111
|
+
it "should return xml_args" do subject.xml_args.should == ["true", {"rdf:datatype" => "http://www.w3.org/2001/XMLSchema#boolean"}] end
|
112
|
+
it "should return TriX" do subject.to_trix.should == "<typedLiteral datatype=\"http://www.w3.org/2001/XMLSchema#boolean\">true</typedLiteral>" end
|
113
|
+
end
|
114
|
+
|
115
|
+
it "should infer type" do
|
116
|
+
int = Literal.build_from(true)
|
117
|
+
int.encoding.should == "http://www.w3.org/2001/XMLSchema#boolean"
|
118
|
+
end
|
119
|
+
|
120
|
+
it "should have string contents" do subject.contents.should == "true" end
|
121
|
+
it "should have native contents" do subject.to_native.should == true end
|
122
|
+
it "should coerce 1" do Literal.typed("1", XSD_NS.boolean).contents.should == "true" end
|
123
|
+
it "should coerce 1" do Literal.typed("0", XSD_NS.boolean).contents.should == "false" end
|
124
|
+
end
|
125
|
+
|
106
126
|
describe "an integer" do
|
127
|
+
subject { Literal.typed(5, "http://www.w3.org/2001/XMLSchema#int") }
|
107
128
|
describe "encodings" do
|
108
|
-
subject { Literal.typed(5, "http://www.w3.org/2001/XMLSchema#int") }
|
109
129
|
it "should return n3" do subject.to_n3.should == "\"5\"^^<http://www.w3.org/2001/XMLSchema#int>" end
|
110
130
|
it "should return ntriples" do subject.to_ntriples.should == subject.to_n3 end
|
111
131
|
it "should return xml_args" do subject.xml_args.should == ["5", {"rdf:datatype" => "http://www.w3.org/2001/XMLSchema#int"}] end
|
@@ -116,11 +136,14 @@ describe "Literals: " do
|
|
116
136
|
int = Literal.build_from(15)
|
117
137
|
int.encoding.should == "http://www.w3.org/2001/XMLSchema#int"
|
118
138
|
end
|
139
|
+
|
140
|
+
it "should have string contents" do subject.contents.should == "5" end
|
141
|
+
it "should have native contents" do subject.to_native.should == 5 end
|
119
142
|
end
|
120
143
|
|
121
144
|
describe "a float" do
|
145
|
+
subject { Literal.typed(15.4, "http://www.w3.org/2001/XMLSchema#float") }
|
122
146
|
describe "encodings" do
|
123
|
-
subject { Literal.typed(15.4, "http://www.w3.org/2001/XMLSchema#float") }
|
124
147
|
it "should return n3" do subject.to_n3.should == "\"15.4\"^^<http://www.w3.org/2001/XMLSchema#float>" end
|
125
148
|
it "should return ntriples" do subject.to_ntriples.should == subject.to_n3 end
|
126
149
|
it "should return xml_args" do subject.xml_args.should == ["15.4", {"rdf:datatype" => "http://www.w3.org/2001/XMLSchema#float"}] end
|
@@ -131,36 +154,85 @@ describe "Literals: " do
|
|
131
154
|
float = Literal.build_from(15.4)
|
132
155
|
float.encoding.should == "http://www.w3.org/2001/XMLSchema#float"
|
133
156
|
end
|
157
|
+
|
158
|
+
it "should have string contents" do subject.contents.should == "15.4" end
|
159
|
+
it "should have native contents" do subject.to_native.should == 15.4 end
|
134
160
|
end
|
135
161
|
|
136
162
|
describe "a date" do
|
163
|
+
before(:each) { @value = Date.parse("2010-01-02Z") }
|
164
|
+
subject { Literal.typed(@value, "http://www.w3.org/2001/XMLSchema#date") }
|
137
165
|
describe "encodings" do
|
138
|
-
subject
|
139
|
-
it "should return n3" do subject.to_n3.should == "\"2010-01-02\"^^<http://www.w3.org/2001/XMLSchema#date>" end
|
166
|
+
it "should return n3" do subject.to_n3.should == "\"2010-01-02Z\"^^<http://www.w3.org/2001/XMLSchema#date>" end
|
140
167
|
it "should return ntriples" do subject.to_ntriples.should == subject.to_n3 end
|
141
|
-
it "should return xml_args" do subject.xml_args.should == ["2010-01-
|
142
|
-
it "should return TriX" do subject.to_trix.should == "<typedLiteral datatype=\"http://www.w3.org/2001/XMLSchema#date\">2010-01-
|
168
|
+
it "should return xml_args" do subject.xml_args.should == ["2010-01-02Z", {"rdf:datatype" => "http://www.w3.org/2001/XMLSchema#date"}] end
|
169
|
+
it "should return TriX" do subject.to_trix.should == "<typedLiteral datatype=\"http://www.w3.org/2001/XMLSchema#date\">2010-01-02Z</typedLiteral>" end
|
143
170
|
end
|
144
171
|
|
145
172
|
it "should infer type" do
|
146
|
-
int = Literal.build_from(
|
173
|
+
int = Literal.build_from(@value)
|
147
174
|
int.encoding.should == "http://www.w3.org/2001/XMLSchema#date"
|
148
175
|
end
|
176
|
+
|
177
|
+
it "should have string contents" do subject.contents.should == "2010-01-02Z" end
|
178
|
+
it "should have native contents" do subject.to_native.should == @value end
|
149
179
|
end
|
150
180
|
|
151
|
-
describe "a
|
181
|
+
describe "a dateTime" do
|
182
|
+
before(:each) { @value = DateTime.parse('2010-01-03T01:02:03Z') }
|
183
|
+
subject { Literal.typed(@value, "http://www.w3.org/2001/XMLSchema#dateTime") }
|
152
184
|
describe "encodings" do
|
153
|
-
subject
|
154
|
-
it "should return n3" do subject.to_n3.should == "\"2010-01-03T01:02:03\"^^<http://www.w3.org/2001/XMLSchema#dateTime>" end
|
185
|
+
it "should return n3" do subject.to_n3.should == "\"2010-01-03T01:02:03Z\"^^<http://www.w3.org/2001/XMLSchema#dateTime>" end
|
155
186
|
it "should return ntriples" do subject.to_ntriples.should == subject.to_n3 end
|
156
|
-
it "should return xml_args" do subject.xml_args.should == ["2010-01-03T01:02:
|
157
|
-
it "should return TriX" do subject.to_trix.should == "<typedLiteral datatype=\"http://www.w3.org/2001/XMLSchema#dateTime\">2010-01-03T01:02:
|
187
|
+
it "should return xml_args" do subject.xml_args.should == ["2010-01-03T01:02:03Z", {"rdf:datatype" => "http://www.w3.org/2001/XMLSchema#dateTime"}] end
|
188
|
+
it "should return TriX" do subject.to_trix.should == "<typedLiteral datatype=\"http://www.w3.org/2001/XMLSchema#dateTime\">2010-01-03T01:02:03Z</typedLiteral>" end
|
158
189
|
end
|
159
190
|
|
160
191
|
it "should infer type" do
|
161
|
-
int = Literal.build_from(
|
192
|
+
int = Literal.build_from(@value)
|
162
193
|
int.encoding.should == "http://www.w3.org/2001/XMLSchema#dateTime"
|
163
194
|
end
|
195
|
+
|
196
|
+
it "should have string contents" do subject.contents.should == "2010-01-03T01:02:03Z" end
|
197
|
+
it "should have native contents" do subject.to_native.should == @value end
|
198
|
+
end
|
199
|
+
|
200
|
+
describe "a time" do
|
201
|
+
before(:each) { @value = Time.parse('01:02:03Z') }
|
202
|
+
subject { Literal.typed(@value, "http://www.w3.org/2001/XMLSchema#time") }
|
203
|
+
describe "encodings" do
|
204
|
+
it "should return n3" do subject.to_n3.should == "\"01:02:03Z\"^^<http://www.w3.org/2001/XMLSchema#time>" end
|
205
|
+
it "should return ntriples" do subject.to_ntriples.should == subject.to_n3 end
|
206
|
+
it "should return xml_args" do subject.xml_args.should == ["01:02:03Z", {"rdf:datatype" => "http://www.w3.org/2001/XMLSchema#time"}] end
|
207
|
+
it "should return TriX" do subject.to_trix.should == "<typedLiteral datatype=\"http://www.w3.org/2001/XMLSchema#time\">01:02:03Z</typedLiteral>" end
|
208
|
+
end
|
209
|
+
|
210
|
+
it "should infer type" do
|
211
|
+
int = Literal.build_from(@value)
|
212
|
+
int.encoding.should == "http://www.w3.org/2001/XMLSchema#time"
|
213
|
+
end
|
214
|
+
|
215
|
+
it "should have string contents" do subject.contents.should == "01:02:03Z" end
|
216
|
+
it "should have native contents" do subject.to_native.should == @value end
|
217
|
+
end
|
218
|
+
|
219
|
+
describe "a duration" do
|
220
|
+
before(:each) { @value = Duration.parse('-P1111Y11M23DT4H55M16.666S') }
|
221
|
+
subject { Literal.typed(@value, "http://www.w3.org/2001/XMLSchema#duration") }
|
222
|
+
describe "encodings" do
|
223
|
+
it "should return n3" do subject.to_n3.should == "\"-P1111Y11M23DT4H55M16.666S\"^^<http://www.w3.org/2001/XMLSchema#duration>" end
|
224
|
+
it "should return ntriples" do subject.to_ntriples.should == subject.to_n3 end
|
225
|
+
it "should return xml_args" do subject.xml_args.should == ["-P1111Y11M23DT4H55M16.666S", {"rdf:datatype" => "http://www.w3.org/2001/XMLSchema#duration"}] end
|
226
|
+
it "should return TriX" do subject.to_trix.should == "<typedLiteral datatype=\"http://www.w3.org/2001/XMLSchema#duration\">-P1111Y11M23DT4H55M16.666S</typedLiteral>" end
|
227
|
+
end
|
228
|
+
|
229
|
+
it "should infer type" do
|
230
|
+
int = Literal.build_from(@value)
|
231
|
+
int.encoding.should == "http://www.w3.org/2001/XMLSchema#duration"
|
232
|
+
end
|
233
|
+
|
234
|
+
it "should have string contents" do subject.contents.should == "-P1111Y11M23DT4H55M16.666S" end
|
235
|
+
it "should have native contents" do subject.to_native.should == @value end
|
164
236
|
end
|
165
237
|
|
166
238
|
describe "XML Literal" do
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rdf_context
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.4.
|
4
|
+
version: 0.4.8
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Gregg Kellogg
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2010-01-
|
12
|
+
date: 2010-01-20 00:00:00 -08:00
|
13
13
|
default_executable: rdf_context
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
@@ -106,6 +106,7 @@ files:
|
|
106
106
|
- lib/rdf_context.rb
|
107
107
|
- lib/rdf_context/bnode.rb
|
108
108
|
- lib/rdf_context/conjunctive_graph.rb
|
109
|
+
- lib/rdf_context/duration.rb
|
109
110
|
- lib/rdf_context/exceptions.rb
|
110
111
|
- lib/rdf_context/graph.rb
|
111
112
|
- lib/rdf_context/literal.rb
|
@@ -129,6 +130,7 @@ files:
|
|
129
130
|
- script/console
|
130
131
|
- spec/bnode_spec.rb
|
131
132
|
- spec/conjunctive_graph_spec.rb
|
133
|
+
- spec/duration_spec.rb
|
132
134
|
- spec/graph_spec.rb
|
133
135
|
- spec/list_store_spec.rb
|
134
136
|
- spec/literal_spec.rb
|
@@ -676,6 +678,7 @@ summary: RdfContext is an RDF library for Ruby supporting contextual graphs, mul
|
|
676
678
|
test_files:
|
677
679
|
- spec/bnode_spec.rb
|
678
680
|
- spec/conjunctive_graph_spec.rb
|
681
|
+
- spec/duration_spec.rb
|
679
682
|
- spec/graph_spec.rb
|
680
683
|
- spec/list_store_spec.rb
|
681
684
|
- spec/literal_spec.rb
|