rdf_context 0.4.6 → 0.4.7
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 +7 -0
- data/VERSION +1 -1
- data/lib/rdf_context/graph.rb +1 -1
- data/lib/rdf_context/literal.rb +20 -2
- data/lib/rdf_context/namespace.rb +6 -1
- data/lib/rdf_context/rdfxmlparser.rb +0 -1
- data/lib/rdf_context/store/memory_store.rb +10 -7
- data/lib/rdf_context/triple.rb +5 -5
- data/spec/literal_spec.rb +36 -0
- data/spec/namespaces_spec.rb +14 -8
- data/spec/rdfxml_spec.rb +2 -4
- data/spec/triple_spec.rb +21 -1
- metadata +2 -2
data/History.txt
CHANGED
@@ -1,3 +1,10 @@
|
|
1
|
+
=== 0.4.7
|
2
|
+
* Graph identifiers only URIRef or BNode; Literal not supported by SQL Store.
|
3
|
+
* 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 #.
|
4
|
+
* Incorporated pdlug's changes:
|
5
|
+
* Support using trailing underscores to work around generating URI's with Namespace that use methods that are on core ruby classes or reserved words (like Nokogiri Builder does). For example dc.type_ to generate the dc:type URI.
|
6
|
+
* Tests for Date/DateTime literals, added support for detecting them and generating the right literals in Triple.
|
7
|
+
|
1
8
|
=== 0.4.6
|
2
9
|
* Added Graph#uri_mapping and AbstractStore#uri_mapping for uri => Namespace mappings in graph
|
3
10
|
* Fix BNode creation from existing identifier (named or un-named)
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.4.
|
1
|
+
0.4.7
|
data/lib/rdf_context/graph.rb
CHANGED
@@ -29,7 +29,7 @@ module RdfContext
|
|
29
29
|
#
|
30
30
|
# @param [Hash] options:: Options
|
31
31
|
# <em>options[:store]</em>:: storage, defaults to a new ListStore instance. May be symbol :list_store or :memory_store
|
32
|
-
# <em>options[:identifier]</em>:: Identifier for this graph,
|
32
|
+
# <em>options[:identifier]</em>:: Identifier for this graph, BNode or URIRef
|
33
33
|
def initialize(options = {})
|
34
34
|
@nsbinding = {}
|
35
35
|
|
data/lib/rdf_context/literal.rb
CHANGED
@@ -1,3 +1,9 @@
|
|
1
|
+
begin
|
2
|
+
require 'xml'
|
3
|
+
$libxml_enabled = true
|
4
|
+
rescue LoadError
|
5
|
+
end
|
6
|
+
|
1
7
|
module RdfContext
|
2
8
|
# An RDF Literal, with value, encoding and language elements.
|
3
9
|
class Literal
|
@@ -23,7 +29,17 @@ module RdfContext
|
|
23
29
|
def self.string
|
24
30
|
@string ||= coerce "http://www.w3.org/2001/XMLSchema#string"
|
25
31
|
end
|
26
|
-
|
32
|
+
|
33
|
+
# Shortcut for <tt>Literal::Encoding.new("http://www.w3.org/2001/XMLSchema#date")</tt>
|
34
|
+
def self.date
|
35
|
+
@date ||= coerce "http://www.w3.org/2001/XMLSchema#date"
|
36
|
+
end
|
37
|
+
|
38
|
+
# Shortcut for <tt>Literal::Encoding.new("http://www.w3.org/2001/XMLSchema#dateTime")</tt>
|
39
|
+
def self.datetime
|
40
|
+
@datetime ||= coerce "http://www.w3.org/2001/XMLSchema#dateTime"
|
41
|
+
end
|
42
|
+
|
27
43
|
# Create from URI, empty or nil string
|
28
44
|
def self.coerce(string_or_nil)
|
29
45
|
if string_or_nil.nil? || string_or_nil == ''
|
@@ -179,7 +195,9 @@ module RdfContext
|
|
179
195
|
|
180
196
|
# Add already mapped namespaces and language
|
181
197
|
@contents = contents.map do |c|
|
182
|
-
|
198
|
+
if $libxml_enabled
|
199
|
+
c = Nokogiri::XML.parse(c.copy(true).to_s) if c.is_a?(LibXML::XML::Node)
|
200
|
+
end
|
183
201
|
if c.is_a?(Nokogiri::XML::Element)
|
184
202
|
# Gather namespaces from self and decendant nodes
|
185
203
|
c.traverse do |n|
|
@@ -36,6 +36,8 @@ module RdfContext
|
|
36
36
|
# foaf = Namespace.new("http://xmlns.com/foaf/0.1/", "foaf"); foaf.knows # => returns a new URIRef with URI "http://xmlns.com/foaf/0.1/knows"
|
37
37
|
# foaf = Namespace.new("http://xmlns.com/foaf/0.1/", "foaf", true); foaf.knows # => returns a new URIRef with URI "http://xmlns.com/foaf/0.1/#knows"
|
38
38
|
#
|
39
|
+
# To avoid naming problems, a suffix may have an appended '_', which will be removed when the URI is generated.
|
40
|
+
#
|
39
41
|
# @return [URIRef]:: The newly created URIRegerence.
|
40
42
|
# @raise [Error]:: Checks validity of the desired prefix and raises if it is incorrect.
|
41
43
|
# @author Tom Morris, Pius Uzamere
|
@@ -45,7 +47,10 @@ module RdfContext
|
|
45
47
|
|
46
48
|
# Construct a URIRef from a namespace as in method_missing, but without method collision issues
|
47
49
|
def +(suffix)
|
48
|
-
|
50
|
+
prefix = @uri.to_s
|
51
|
+
prefix += '#' if fragment && !prefix.match(/\#$/)
|
52
|
+
suffix = suffix.to_s.sub(/_$/, '')
|
53
|
+
URIRef.new(prefix + suffix)
|
49
54
|
end
|
50
55
|
|
51
56
|
# Bind this namespace to a Graph
|
@@ -74,7 +74,7 @@ module RdfContext
|
|
74
74
|
oi = resource_to_int(triple.object) || gen_key(triple.object)
|
75
75
|
ci = resource_to_int(context) || gen_key(context)
|
76
76
|
|
77
|
-
puts "add: #{si}, #{pi}, #{oi}, #{ci}" if $DEBUG
|
77
|
+
puts "add: #{si}=#{triple.subject}, #{pi}=#{triple.predicate}, #{oi}=#{triple.object}, #{ci}=#{context ? context.identifier : 'none'}" if $DEBUG
|
78
78
|
set_nested_index(@cspo, ci, si, pi, oi)
|
79
79
|
set_nested_index(@cpos, ci, pi, oi, si)
|
80
80
|
set_nested_index(@cosp, ci, oi, si, pi)
|
@@ -132,7 +132,7 @@ module RdfContext
|
|
132
132
|
|
133
133
|
results = []
|
134
134
|
si, pi, oi = triple_to_int(triple)
|
135
|
-
puts "triples
|
135
|
+
puts "triples? #{si}=#{triple.subject}, #{pi}=#{triple.predicate}, #{oi}=#{triple.object}, #{ci}=#{context ? context.identifier : 'none'}" if $DEBUG
|
136
136
|
|
137
137
|
def result(v, si, pi, oi, ctx)
|
138
138
|
triple = int_to_triple(si, pi, oi)
|
@@ -141,12 +141,15 @@ module RdfContext
|
|
141
141
|
# keys are contexts
|
142
142
|
v.keys.each do |ci|
|
143
143
|
context = int_to_resource(ci)
|
144
|
+
puts "triples= #{si}=#{triple.subject}, #{pi}=#{triple.predicate}, #{oi}=#{triple.object}, #{ci}=#{context ? context.identifier : 'none'}" if $DEBUG
|
144
145
|
yield triple, context
|
145
146
|
end
|
146
147
|
else
|
147
|
-
|
148
|
+
puts "triples= #{si}=#{triple.subject}, #{pi}=#{triple.predicate}, #{oi}=#{triple.object}, #{ctx ? ctx.identifier : 'none'}" if $DEBUG
|
148
149
|
yield triple, ctx
|
149
150
|
end
|
151
|
+
else
|
152
|
+
puts "triples= #{si}=#{triple.subject}, #{pi}=#{triple.predicate}, #{oi}=#{triple.object}, #{ctx ? ctx.identifier : 'none'}" if $DEBUG
|
150
153
|
end
|
151
154
|
triple
|
152
155
|
end
|
@@ -214,13 +217,13 @@ module RdfContext
|
|
214
217
|
elsif !triple.object.nil?
|
215
218
|
# Subject+predicate unspecified, object specified but not found, skip
|
216
219
|
else # subject+predicate+object unbound
|
217
|
-
puts "spo = #{spo.inspect}" if $DEBUG
|
220
|
+
#puts "spo = #{spo.inspect}" if $DEBUG
|
218
221
|
spo.keys.each do |si|
|
219
|
-
puts "spo[#{si}] = #{spo[si].inspect}" if $DEBUG
|
222
|
+
#puts "spo[#{si}] = #{spo[si].inspect}" if $DEBUG
|
220
223
|
spo[si].keys.each do |pi|
|
221
|
-
puts "spo[#{si}][#{pi}] = #{spo[si][pi].inspect}" if $DEBUG
|
224
|
+
#puts "spo[#{si}][#{pi}] = #{spo[si][pi].inspect}" if $DEBUG
|
222
225
|
spo[si][pi].each_pair do |oi, value|
|
223
|
-
puts "spo[#{si}][#{pi}][#{oi}] = #{spo[si][pi][oi].inspect}" if $DEBUG
|
226
|
+
#puts "spo[#{si}][#{pi}][#{oi}] = #{spo[si][pi][oi].inspect}" if $DEBUG
|
224
227
|
results << result(value, si, pi, oi, context, &block)
|
225
228
|
end
|
226
229
|
end
|
data/lib/rdf_context/triple.rb
CHANGED
@@ -102,8 +102,8 @@ module RdfContext
|
|
102
102
|
|
103
103
|
# Coerce a predicate to the appropriate RdfContext type.
|
104
104
|
#
|
105
|
-
# @param[URI, URIRef, String]
|
106
|
-
# @raise[
|
105
|
+
# @param[URI, URIRef, String] predicate:: If a String looks like a URI, a URI is created
|
106
|
+
# @raise[InvalidPredicate]:: If predicate can't be predicate.
|
107
107
|
def self.coerce_predicate(predicate)
|
108
108
|
case predicate
|
109
109
|
when Addressable::URI
|
@@ -124,7 +124,7 @@ module RdfContext
|
|
124
124
|
# Coerce a object to the appropriate RdfContext type.
|
125
125
|
#
|
126
126
|
# @param[URI, URIRef, String, Integer, Float, BNode, Literal] object:: If a String looks like a URI, a URI is created, otherwise an untyped Literal.
|
127
|
-
# @raise[
|
127
|
+
# @raise[InvalidObject]:: If object can't be predicate.
|
128
128
|
def self.coerce_object(object)
|
129
129
|
case object
|
130
130
|
when Addressable::URI
|
@@ -135,11 +135,11 @@ module RdfContext
|
|
135
135
|
else
|
136
136
|
Literal.untyped(object)
|
137
137
|
end
|
138
|
-
when Integer, Float
|
138
|
+
when Integer, Float, Date
|
139
139
|
Literal.build_from(object)
|
140
140
|
when URIRef, BNode, Literal
|
141
141
|
object
|
142
|
-
when nil
|
142
|
+
when nil
|
143
143
|
object
|
144
144
|
else
|
145
145
|
raise InvalidObject, "#{object.class}: #{object.inspect} is not a valid object"
|
data/spec/literal_spec.rb
CHANGED
@@ -132,7 +132,37 @@ describe "Literals: " do
|
|
132
132
|
float.encoding.should == "http://www.w3.org/2001/XMLSchema#float"
|
133
133
|
end
|
134
134
|
end
|
135
|
+
|
136
|
+
describe "a date" do
|
137
|
+
describe "encodings" do
|
138
|
+
subject { Literal.typed("2010-01-02", "http://www.w3.org/2001/XMLSchema#date") }
|
139
|
+
it "should return n3" do subject.to_n3.should == "\"2010-01-02\"^^<http://www.w3.org/2001/XMLSchema#date>" end
|
140
|
+
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-02", {"rdf:datatype" => "http://www.w3.org/2001/XMLSchema#date"}] end
|
142
|
+
it "should return TriX" do subject.to_trix.should == "<typedLiteral datatype=\"http://www.w3.org/2001/XMLSchema#date\">2010-01-02</typedLiteral>" end
|
143
|
+
end
|
144
|
+
|
145
|
+
it "should infer type" do
|
146
|
+
int = Literal.build_from(Date::civil(2010, 1, 2))
|
147
|
+
int.encoding.should == "http://www.w3.org/2001/XMLSchema#date"
|
148
|
+
end
|
149
|
+
end
|
150
|
+
|
151
|
+
describe "a date time" do
|
152
|
+
describe "encodings" do
|
153
|
+
subject { Literal.typed("2010-01-03T01:02:03", "http://www.w3.org/2001/XMLSchema#dateTime") }
|
154
|
+
it "should return n3" do subject.to_n3.should == "\"2010-01-03T01:02:03\"^^<http://www.w3.org/2001/XMLSchema#dateTime>" end
|
155
|
+
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:03", {"rdf:datatype" => "http://www.w3.org/2001/XMLSchema#dateTime"}] end
|
157
|
+
it "should return TriX" do subject.to_trix.should == "<typedLiteral datatype=\"http://www.w3.org/2001/XMLSchema#dateTime\">2010-01-03T01:02:03</typedLiteral>" end
|
158
|
+
end
|
135
159
|
|
160
|
+
it "should infer type" do
|
161
|
+
int = Literal.build_from(DateTime.parse('2010-01-03T01:02:03'))
|
162
|
+
int.encoding.should == "http://www.w3.org/2001/XMLSchema#dateTime"
|
163
|
+
end
|
164
|
+
end
|
165
|
+
|
136
166
|
describe "XML Literal" do
|
137
167
|
describe "with no namespace" do
|
138
168
|
subject { Literal.typed("foo <sup>bar</sup> baz!", "http://www.w3.org/1999/02/22-rdf-syntax-ns#XMLLiteral") }
|
@@ -300,6 +330,12 @@ describe "Literals: " do
|
|
300
330
|
specify "string" do
|
301
331
|
Literal::Encoding.string.should == Literal::Encoding.new("http://www.w3.org/2001/XMLSchema#string")
|
302
332
|
end
|
333
|
+
specify "date" do
|
334
|
+
Literal::Encoding.date.should == Literal::Encoding.new("http://www.w3.org/2001/XMLSchema#date")
|
335
|
+
end
|
336
|
+
specify "date time" do
|
337
|
+
Literal::Encoding.datetime.should == Literal::Encoding.new("http://www.w3.org/2001/XMLSchema#dateTime")
|
338
|
+
end
|
303
339
|
specify "xmlliteral" do
|
304
340
|
Literal::Encoding.xmlliteral.should == Literal::XMLLiteral.new("http://www.w3.org/1999/02/22-rdf-syntax-ns#XMLLiteral")
|
305
341
|
end
|
data/spec/namespaces_spec.rb
CHANGED
@@ -50,14 +50,20 @@ describe "Namespace" do
|
|
50
50
|
subject.foo.should == "http://xmlns.com/foaf/0.1/foo"
|
51
51
|
end
|
52
52
|
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
53
|
+
describe '#+' do
|
54
|
+
it "should construct URI with +" do
|
55
|
+
(subject + "foo").class.should == URIRef
|
56
|
+
(subject + "foo").should == "http://xmlns.com/foaf/0.1/foo"
|
57
|
+
end
|
58
|
+
|
59
|
+
it "should strip trailing _ (used to work around reserved method names)" do
|
60
|
+
(subject + "type_").should == "http://xmlns.com/foaf/0.1/type"
|
61
|
+
end
|
62
|
+
|
63
|
+
it "will cause method conflict" do
|
64
|
+
(subject + "class").should == "http://xmlns.com/foaf/0.1/class"
|
65
|
+
subject.class.should == Namespace
|
66
|
+
end
|
61
67
|
end
|
62
68
|
|
63
69
|
it "should be be equivalent" do
|
data/spec/rdfxml_spec.rb
CHANGED
@@ -20,10 +20,8 @@ EOF
|
|
20
20
|
end
|
21
21
|
|
22
22
|
it "should parse simple doc without a base URI" do
|
23
|
-
sampledoc =
|
24
|
-
|
25
|
-
<NotRDF />
|
26
|
-
EOF
|
23
|
+
sampledoc = %(<?xml version="1.0" ?>
|
24
|
+
<NotRDF />)
|
27
25
|
graph = @parser.parse(sampledoc, nil, :strict => true)
|
28
26
|
graph.size.should == 1
|
29
27
|
statement = graph[0]
|
data/spec/triple_spec.rb
CHANGED
@@ -61,7 +61,7 @@ describe "Triples" do
|
|
61
61
|
it "should accept a uri string and make URIRef" do
|
62
62
|
Triple.coerce_subject('http://localhost/').should == URIRef.new('http://localhost/')
|
63
63
|
end
|
64
|
-
|
64
|
+
|
65
65
|
it "should accept an Addressable::URI object and make URIRef" do
|
66
66
|
Triple.coerce_subject(Addressable::URI.parse("http://localhost/")).should == URIRef.new("http://localhost/")
|
67
67
|
end
|
@@ -91,6 +91,26 @@ describe "Triples" do
|
|
91
91
|
end
|
92
92
|
|
93
93
|
describe "with coerced object" do
|
94
|
+
it 'should make a literal for Integer types' do
|
95
|
+
ref = 5
|
96
|
+
Triple.coerce_object(ref).should == Literal.build_from(ref)
|
97
|
+
end
|
98
|
+
|
99
|
+
it 'should make a literal for Float types' do
|
100
|
+
ref = 15.4
|
101
|
+
Triple.coerce_object(ref).should == Literal.build_from(ref)
|
102
|
+
end
|
103
|
+
|
104
|
+
it 'should make a literal for Date types' do
|
105
|
+
ref = Date::civil(2010, 1, 2)
|
106
|
+
Triple.coerce_object(ref).should == Literal.build_from(ref)
|
107
|
+
end
|
108
|
+
|
109
|
+
it 'should make a literal for DateTime types' do
|
110
|
+
ref = DateTime.parse('2010-01-03T01:02:03')
|
111
|
+
Triple.coerce_object(ref).should == Literal.build_from(ref)
|
112
|
+
end
|
113
|
+
|
94
114
|
it "should leave URIRefs alone" do
|
95
115
|
ref = URIRef.new("http://localhost/")
|
96
116
|
Triple.coerce_object(ref).should == ref
|
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.7
|
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-16 00:00:00 -08:00
|
13
13
|
default_executable: rdf_context
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|