rdfobjects 0.9.1 → 0.10.0
Sign up to get free protection for your applications and to get access to all the features.
- data/lib/rdf_objects/collection.rb +7 -1
- data/lib/rdf_objects/data_types.rb +5 -1
- data/lib/rdf_objects/parsers.rb +37 -34
- data/lib/rdf_objects/rdf_resource.rb +86 -23
- metadata +2 -2
@@ -40,7 +40,13 @@ module RDFObject
|
|
40
40
|
if uri.could_be_a_safe_curie?
|
41
41
|
uri = Curie.parse uri
|
42
42
|
end
|
43
|
-
|
43
|
+
if BlankNode.is_bnode_id?(uri)
|
44
|
+
bnode = BlankNode.new(uri)
|
45
|
+
self[bnode.uri] = bnode unless self[bnode.uri]
|
46
|
+
return self[bnode.uri]
|
47
|
+
else
|
48
|
+
self[uri] = Resource.new(uri) unless self[uri]
|
49
|
+
end
|
44
50
|
self[uri]
|
45
51
|
end
|
46
52
|
|
@@ -55,7 +55,11 @@ class RDFObject::Literal
|
|
55
55
|
value
|
56
56
|
end
|
57
57
|
if obj.is_a?(Float)
|
58
|
-
|
58
|
+
if obj.to_s == value
|
59
|
+
elsif obj.to_s.sub(/\.0*/,'') == value
|
60
|
+
else
|
61
|
+
raise ArgumentError
|
62
|
+
end
|
59
63
|
elsif obj.is_a?(DateTime)
|
60
64
|
raise ArgumentError if obj.to_s !~ /^#{Regexp.escape(value)}/
|
61
65
|
else
|
data/lib/rdf_objects/parsers.rb
CHANGED
@@ -64,7 +64,7 @@ module RDFObject
|
|
64
64
|
# Choose the best format parser from an admittedly small group of choices.
|
65
65
|
def self.parse(rdf, options={})
|
66
66
|
parser = init_parser(rdf, options)
|
67
|
-
parser.parse
|
67
|
+
parser.parse if parser
|
68
68
|
end
|
69
69
|
|
70
70
|
def self.init_parser(rdf, options={})
|
@@ -76,7 +76,16 @@ module RDFObject
|
|
76
76
|
when 'json' then JSONParser.new(rdf)
|
77
77
|
end
|
78
78
|
else
|
79
|
-
|
79
|
+
# Check to see if it is a URI being passed
|
80
|
+
begin
|
81
|
+
uri = URI.parse(rdf)
|
82
|
+
if uri.is_a?(URI::HTTP)
|
83
|
+
response = HTTPClient.fetch(rdf)
|
84
|
+
rdf = response[:content]
|
85
|
+
options[:base_uri] = response[:uri]
|
86
|
+
end
|
87
|
+
rescue URI::InvalidURIError
|
88
|
+
end
|
80
89
|
# Check if the format is XML or RDFa
|
81
90
|
doc = XMLTestDocument.new
|
82
91
|
p = Nokogiri::XML::SAX::Parser.new(doc)
|
@@ -90,8 +99,9 @@ module RDFObject
|
|
90
99
|
rdf.rewind
|
91
100
|
end
|
92
101
|
if doc.is_html?
|
102
|
+
|
93
103
|
parser = RDFAParser.new(rdf)
|
94
|
-
|
104
|
+
elsif doc.is_rdf?
|
95
105
|
parser = XMLParser.new(rdf)
|
96
106
|
end
|
97
107
|
else
|
@@ -111,7 +121,7 @@ module RDFObject
|
|
111
121
|
end
|
112
122
|
end
|
113
123
|
end
|
114
|
-
if options[:base_uri]
|
124
|
+
if options[:base_uri] && parser
|
115
125
|
parser.base_uri = options[:base_uri]
|
116
126
|
end
|
117
127
|
parser
|
@@ -155,9 +165,14 @@ module RDFObject
|
|
155
165
|
ntriple.force_encoding("ASCII-8BIT")
|
156
166
|
end
|
157
167
|
scanner = StringScanner.new(ntriple)
|
158
|
-
|
159
|
-
|
160
|
-
|
168
|
+
if ntriple[0,1] == "<"
|
169
|
+
subject = scanner.scan_until(/> /)
|
170
|
+
subject.sub!(/^</,'')
|
171
|
+
subject.sub!(/> $/,'')
|
172
|
+
else
|
173
|
+
subject = scanner.scan_until(/\w /)
|
174
|
+
subject.strip!
|
175
|
+
end
|
161
176
|
predicate = scanner.scan_until(/> /)
|
162
177
|
predicate.sub!(/^</,'')
|
163
178
|
predicate.sub!(/> $/,'')
|
@@ -167,6 +182,10 @@ module RDFObject
|
|
167
182
|
tmp_object.sub!(/>\s?\.\s*\n?$/,'')
|
168
183
|
object = self.sanitize_uri(tmp_object)
|
169
184
|
type = "uri"
|
185
|
+
elsif scanner.match?(/_:/)
|
186
|
+
object = scanner.scan_until(/\w\s?\.\s*\n?$/)
|
187
|
+
object.sub!(/\s?\.\s*\n?$/,'')
|
188
|
+
type = "bnode"
|
170
189
|
else
|
171
190
|
language = nil
|
172
191
|
data_type = nil
|
@@ -213,6 +232,7 @@ module RDFObject
|
|
213
232
|
object = case triple[:type]
|
214
233
|
when "literal" then triple[:object]
|
215
234
|
when "uri" then @collection.find_or_create(triple[:object])
|
235
|
+
when "bnode" then @collection.find_or_create(triple[:object])
|
216
236
|
end
|
217
237
|
resource.assert(triple[:predicate],object)
|
218
238
|
end
|
@@ -248,8 +268,14 @@ module RDFObject
|
|
248
268
|
return false
|
249
269
|
end
|
250
270
|
|
271
|
+
def is_rdf?
|
272
|
+
return true if @namespaces.index("http://www.w3.org/1999/02/22-rdf-syntax-ns#")
|
273
|
+
return false
|
274
|
+
end
|
275
|
+
|
251
276
|
def is_html?
|
252
277
|
return true if @namespaces.index("http://www.w3.org/1999/xhtml")
|
278
|
+
return true if @xml_start =~ /html/i
|
253
279
|
return false
|
254
280
|
end
|
255
281
|
end
|
@@ -294,35 +320,12 @@ module RDFObject
|
|
294
320
|
hash
|
295
321
|
end
|
296
322
|
|
297
|
-
#def add_layer(element_uri, resource_uri)
|
298
|
-
# if @uris.length > 0 && @current_predicate
|
299
|
-
# @collection[@uris.last].relate(@current_predicate, @collection.find_or_create(resource_uri))
|
300
|
-
# @current_predicate = nil
|
301
|
-
# end
|
302
|
-
# @uris << resource_uri
|
303
|
-
# @tags[resource_uri] = element_uri
|
304
|
-
#end
|
305
|
-
|
306
|
-
#def remove_layer(element_uri)
|
307
|
-
# uris = []
|
308
|
-
# @tags.each do |uri, el|
|
309
|
-
# uris << uri if el == element_uri
|
310
|
-
# end
|
311
|
-
# uris.each do | uri |
|
312
|
-
# if @uris.last == uri
|
313
|
-
# @uris.pop
|
314
|
-
# @tags.delete(uri)
|
315
|
-
# break
|
316
|
-
# end
|
317
|
-
# end
|
318
|
-
# @current_resource = @collection[@uris.last]
|
319
|
-
#end
|
320
|
-
|
321
|
-
|
322
323
|
def add_layer name, attributes, prefix, uri, ns
|
323
324
|
layer = {:name=>"#{uri}#{name}"}
|
324
|
-
if attributes['about']
|
325
|
-
|
325
|
+
if attributes['about'] or attributes['nodeID']
|
326
|
+
id = attributes['about'] || attributes['nodeID']
|
327
|
+
id = sanitize_uri(id) if attributes['about']
|
328
|
+
layer[:resource] = @collection.find_or_create(id)
|
326
329
|
unless "#{uri}#{name}" == "http://www.w3.org/1999/02/22-rdf-syntax-ns#Description"
|
327
330
|
layer[:resource].relate("http://www.w3.org/1999/02/22-rdf-syntax-ns#type", @collection.find_or_create("#{uri}#{name}"))
|
328
331
|
end
|
@@ -3,15 +3,7 @@ require 'date'
|
|
3
3
|
require 'curies'
|
4
4
|
|
5
5
|
module RDFObject
|
6
|
-
|
7
|
-
attr_reader :table
|
8
|
-
def initialize(uri)
|
9
|
-
if uri.could_be_a_safe_curie?
|
10
|
-
uri = Curie.parse uri
|
11
|
-
end
|
12
|
-
super(:uri=>uri)
|
13
|
-
end
|
14
|
-
|
6
|
+
module Node
|
15
7
|
def assert(predicate, object)
|
16
8
|
curied_predicate = case
|
17
9
|
when predicate.could_be_a_safe_curie? then Curie.new_from_curie(predicate)
|
@@ -68,8 +60,12 @@ module RDFObject
|
|
68
60
|
end
|
69
61
|
|
70
62
|
def relate(predicate, resource)
|
71
|
-
unless resource.is_a?(
|
72
|
-
|
63
|
+
unless resource.is_a?(Resource) or resource.is_a?(BlankNode) or resource.is_a?(ResourceReference)
|
64
|
+
if BlankNode.is_bnode_id?(resource)
|
65
|
+
resource = BlankNode.new(resource)
|
66
|
+
else
|
67
|
+
resource = Resource.new(resource)
|
68
|
+
end
|
73
69
|
end
|
74
70
|
self.assert(predicate, resource)
|
75
71
|
end
|
@@ -77,7 +73,7 @@ module RDFObject
|
|
77
73
|
def describe
|
78
74
|
response = HTTPClient.fetch(self.uri)
|
79
75
|
local_collection = Parser.parse(response[:content], {:base_uri=>response[:uri]})
|
80
|
-
return unless local_collection[self.uri]
|
76
|
+
return unless local_collection && local_collection[self.uri]
|
81
77
|
local_collection[self.uri].assertions.each do | predicate, object |
|
82
78
|
[*object].each do | obj |
|
83
79
|
self.assert(predicate, obj) unless self.assertion_exists?(predicate, obj)
|
@@ -115,9 +111,9 @@ module RDFObject
|
|
115
111
|
objects = [self[uri][pred]]
|
116
112
|
end
|
117
113
|
objects.each do | object |
|
118
|
-
line = "
|
119
|
-
if
|
120
|
-
line <<
|
114
|
+
line = "#{ntriples_format} <#{uri}#{pred}> "
|
115
|
+
if object.is_a?(ResourceReference)
|
116
|
+
line << object.ntriples_format
|
121
117
|
else
|
122
118
|
line << "#{object.to_json}"
|
123
119
|
if (object.respond_to?(:data_type) || object.respond_to?(:language))
|
@@ -155,8 +151,8 @@ module RDFObject
|
|
155
151
|
rdf
|
156
152
|
end
|
157
153
|
|
158
|
-
def rdf_description_block(depth)
|
159
|
-
rdf = "<rdf:Description
|
154
|
+
def rdf_description_block(depth=0)
|
155
|
+
rdf = "<rdf:Description #{xml_subject_attribute}>"
|
160
156
|
namespaces = {}
|
161
157
|
Curie.get_mappings.each_pair do |key, value|
|
162
158
|
if self.respond_to?(key.to_sym)
|
@@ -165,11 +161,11 @@ module RDFObject
|
|
165
161
|
rdf << "<#{key}:#{predicate}"
|
166
162
|
namespaces["xmlns:#{key}"] = "#{Curie.parse("[#{key}:]")}"
|
167
163
|
if object.is_a?(RDFObject::ResourceReference)
|
168
|
-
if depth
|
169
|
-
rdf << "
|
164
|
+
if depth == 0
|
165
|
+
rdf << " #{object.xml_object_attribute} />"
|
170
166
|
else
|
171
167
|
rdf << ">"
|
172
|
-
ns, rdf_data = object.resource.rdf_description_block(depth
|
168
|
+
ns, rdf_data = object.resource.rdf_description_block(depth-1)
|
173
169
|
namespaces.merge!(ns)
|
174
170
|
rdf << rdf_data
|
175
171
|
rdf << "</#{key}:#{predicate}>"
|
@@ -192,7 +188,7 @@ module RDFObject
|
|
192
188
|
end
|
193
189
|
|
194
190
|
def ==(other)
|
195
|
-
return false unless other.is_a?(
|
191
|
+
return false unless other.is_a?(self.class) or other.is_a?(ResourceReference)
|
196
192
|
return false unless self.uri == other.uri
|
197
193
|
Curie.get_mappings.each do | prefix, uri |
|
198
194
|
next unless self[uri] or other[uri]
|
@@ -212,8 +208,8 @@ module RDFObject
|
|
212
208
|
return false unless self[uri][pred].index(idx)
|
213
209
|
end
|
214
210
|
else
|
215
|
-
if self[uri][pred].is_a?(Resource) or self[uri][pred].is_a?(ResourceReference)
|
216
|
-
return false unless other[uri][pred].is_a?(Resource) or other[uri][pred].is_a?(ResourceReference)
|
211
|
+
if self[uri][pred].is_a?(Resource) or self[uri][pred].is_a?(BlankNode) or self[uri][pred].is_a?(ResourceReference)
|
212
|
+
return false unless other[uri][pred].is_a?(Resource) or self[uri][pred].is_a?(BlankNode) or other[uri][pred].is_a?(ResourceReference)
|
217
213
|
return false unless self[uri][pred].uri == other[uri][pred].uri
|
218
214
|
else
|
219
215
|
return false unless self[uri][pred] == other[uri][pred]
|
@@ -227,6 +223,73 @@ module RDFObject
|
|
227
223
|
end
|
228
224
|
true
|
229
225
|
end
|
226
|
+
end
|
227
|
+
|
228
|
+
class Resource < OpenStruct
|
229
|
+
include RDFObject::Node
|
230
|
+
attr_reader :table
|
231
|
+
def initialize(uri)
|
232
|
+
if uri.could_be_a_safe_curie?
|
233
|
+
uri = Curie.parse uri
|
234
|
+
end
|
235
|
+
super(:uri=>uri)
|
236
|
+
end
|
237
|
+
|
238
|
+
def xml_subject_attribute
|
239
|
+
"rdf:about=\"#{CGI.escapeHTML(self.uri)}\""
|
240
|
+
end
|
241
|
+
|
242
|
+
def xml_object_attribute
|
243
|
+
"rdf:resource=\"#{CGI.escapeHTML(self.uri)}\""
|
244
|
+
end
|
245
|
+
|
246
|
+
def ntriples_format
|
247
|
+
"<#{uri}>"
|
248
|
+
end
|
249
|
+
end
|
250
|
+
|
251
|
+
class BlankNode < OpenStruct
|
252
|
+
include RDFObject::Node
|
253
|
+
require 'md5'
|
254
|
+
def initialize(node_id = nil)
|
255
|
+
super(:node_id=>sanitize_bnode_id(node_id||MD5.md5(self.object_id.to_s + "/" + DateTime.now.to_s).to_s))
|
256
|
+
end
|
257
|
+
|
258
|
+
def describe; end
|
259
|
+
|
260
|
+
def uri
|
261
|
+
"_:#{self.node_id}"
|
262
|
+
end
|
263
|
+
|
264
|
+
def xml_subject_attribute
|
265
|
+
"rdf:nodeID=\"#{self.node_id}\""
|
266
|
+
end
|
267
|
+
|
268
|
+
def xml_object_attribute
|
269
|
+
xml_subject_attribute
|
270
|
+
end
|
271
|
+
|
272
|
+
def ntriples_format
|
273
|
+
uri
|
274
|
+
end
|
275
|
+
|
276
|
+
def self.is_bnode_id?(str)
|
277
|
+
return true if str =~ /^_\:/
|
278
|
+
if str.could_be_a_safe_curie?
|
279
|
+
str = Curie.parse str
|
280
|
+
end
|
281
|
+
begin
|
282
|
+
uri = URI.parse(str)
|
283
|
+
return true unless uri.scheme
|
284
|
+
rescue URI::InvalidURIError
|
285
|
+
return true
|
286
|
+
end
|
287
|
+
return false
|
288
|
+
end
|
289
|
+
|
290
|
+
def sanitize_bnode_id(str)
|
291
|
+
str.sub(/^_\:/,"")
|
292
|
+
end
|
230
293
|
end
|
231
294
|
|
232
295
|
class ResourceReference
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rdfobjects
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.10.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ross Singer
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2010-02-
|
12
|
+
date: 2010-02-10 00:00:00 -05:00
|
13
13
|
default_executable:
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|