rdf-rdfxml 0.3.4 → 0.3.5
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.rdoc → History.markdown} +19 -15
- data/{README → README.markdown} +2 -2
- data/VERSION +1 -1
- data/lib/rdf/rdfxml/format.rb +13 -0
- data/lib/rdf/rdfxml/reader.rb +26 -24
- data/lib/rdf/rdfxml/writer.rb +41 -32
- metadata +31 -66
- data/.yardopts +0 -13
- data/README.md +0 -95
- data/Rakefile +0 -59
- data/etc/doap.nt +0 -47
- data/etc/doap.xml +0 -73
- data/example.rb +0 -37
- data/rdf-rdfxml.gemspec +0 -99
- data/script/console +0 -10
- data/script/parse +0 -55
- data/script/tc +0 -50
- data/script/yard-to-rubyforge +0 -2
- data/spec/.gitignore +0 -1
- data/spec/format_spec.rb +0 -28
- data/spec/graph_spec.rb +0 -59
- data/spec/literal_spec.rb +0 -244
- data/spec/matchers.rb +0 -79
- data/spec/rdf_test.rb +0 -69
- data/spec/reader_spec.rb +0 -394
- data/spec/spec.opts +0 -1
- data/spec/spec_helper.rb +0 -53
- data/spec/writer_spec.rb +0 -714
data/spec/matchers.rb
DELETED
@@ -1,79 +0,0 @@
|
|
1
|
-
require 'rspec/matchers'
|
2
|
-
|
3
|
-
RSpec::Matchers.define :have_xpath do |xpath, value, namespaces = {}|
|
4
|
-
match do |actual|
|
5
|
-
@doc = Nokogiri::XML.parse(actual)
|
6
|
-
@doc.should be_a(Nokogiri::XML::Document)
|
7
|
-
@doc.root.should be_a(Nokogiri::XML::Element)
|
8
|
-
@namespaces = @doc.namespaces.
|
9
|
-
merge(namespaces).
|
10
|
-
merge("xhtml" => "http://www.w3.org/1999/xhtml", "xml" => "http://www.w3.org/XML/1998/namespace")
|
11
|
-
@result = @doc.root.at_xpath(xpath, @namespaces) rescue false
|
12
|
-
case value
|
13
|
-
when false
|
14
|
-
@result.should be_nil
|
15
|
-
when Array
|
16
|
-
@result.to_s.split(" ").should include(*value)
|
17
|
-
when Regexp
|
18
|
-
@result.to_s.should =~ value
|
19
|
-
else
|
20
|
-
@result.to_s.should == value
|
21
|
-
end
|
22
|
-
end
|
23
|
-
|
24
|
-
failure_message_for_should do |actual|
|
25
|
-
msg = "expected to that #{xpath.inspect} would be #{value.inspect} in:\n" + actual.to_s
|
26
|
-
msg += "was: #{@result}"
|
27
|
-
end
|
28
|
-
end
|
29
|
-
|
30
|
-
def normalize(graph)
|
31
|
-
case graph
|
32
|
-
when RDF::Graph then graph
|
33
|
-
when IO, StringIO
|
34
|
-
RDF::Graph.new.load(graph, :base_uri => @info.about)
|
35
|
-
else
|
36
|
-
# Figure out which parser to use
|
37
|
-
g = RDF::Graph.new
|
38
|
-
reader_class = RDF::Reader.for(detect_format(graph))
|
39
|
-
reader_class.new(graph, :base_uri => @info.about).each {|s| g << s}
|
40
|
-
g
|
41
|
-
end
|
42
|
-
end
|
43
|
-
|
44
|
-
Info = Struct.new(:about, :information, :trace, :compare, :inputDocument, :outputDocument)
|
45
|
-
|
46
|
-
RSpec::Matchers.define :be_equivalent_graph do |expected, info|
|
47
|
-
match do |actual|
|
48
|
-
@info = if info.respond_to?(:about)
|
49
|
-
info
|
50
|
-
elsif info.is_a?(Hash)
|
51
|
-
identifier = info[:identifier] || expected.is_a?(RDF::Graph) ? expected.context : info[:about]
|
52
|
-
trace = info[:trace]
|
53
|
-
trace = trace.join("\n") if trace.is_a?(Array)
|
54
|
-
Info.new(identifier, info[:information] || "", trace, info[:compare])
|
55
|
-
else
|
56
|
-
Info.new(expected.is_a?(RDF::Graph) ? expected.context : info, info.to_s)
|
57
|
-
end
|
58
|
-
@expected = normalize(expected)
|
59
|
-
@actual = normalize(actual)
|
60
|
-
@actual.isomorphic_with?(@expected)
|
61
|
-
end
|
62
|
-
|
63
|
-
failure_message_for_should do |actual|
|
64
|
-
info = @info.respond_to?(:information) ? @info.information : @info.inspect
|
65
|
-
if @expected.is_a?(RDF::Graph) && @actual.size != @expected.size
|
66
|
-
"Graph entry count differs:\nexpected: #{@expected.size}\nactual: #{@actual.size}"
|
67
|
-
elsif @expected.is_a?(Array) && @actual.size != @expected.length
|
68
|
-
"Graph entry count differs:\nexpected: #{@expected.length}\nactual: #{@actual.size}"
|
69
|
-
else
|
70
|
-
"Graph differs"
|
71
|
-
end +
|
72
|
-
"\n#{info + "\n" unless info.empty?}" +
|
73
|
-
(@info.inputDocument ? "Input file: #{@info.inputDocument}\n" : "") +
|
74
|
-
(@info.outputDocument ? "Output file: #{@info.outputDocument}\n" : "") +
|
75
|
-
"Unsorted Expected:\n#{@expected.dump(:ntriples)}" +
|
76
|
-
"Unsorted Results:\n#{@actual.dump(:ntriples)}" +
|
77
|
-
(@info.trace ? "\nDebug:\n#{@info.trace}" : "")
|
78
|
-
end
|
79
|
-
end
|
data/spec/rdf_test.rb
DELETED
@@ -1,69 +0,0 @@
|
|
1
|
-
# Spira class for manipulating test-manifest style test suites.
|
2
|
-
# Used for SWAP tests
|
3
|
-
require 'spira'
|
4
|
-
require 'rdf/n3'
|
5
|
-
require 'open-uri'
|
6
|
-
|
7
|
-
module Fixtures
|
8
|
-
module TestCase
|
9
|
-
class Test < RDF::Vocabulary("http://www.w3.org/2000/10/rdf-tests/rdfcore/testSchema#"); end
|
10
|
-
|
11
|
-
class Entry
|
12
|
-
attr_accessor :debug
|
13
|
-
attr_accessor :compare
|
14
|
-
include Spira::Resource
|
15
|
-
|
16
|
-
property :description, :predicate => Test.description, :type => XSD.string
|
17
|
-
property :status, :predicate => Test.status, :type => XSD.string
|
18
|
-
property :warning, :predicate => Test.warning, :type => XSD.string
|
19
|
-
property :approval, :predicate => Test.approval
|
20
|
-
property :issue, :predicate => Test.issue
|
21
|
-
property :document, :predicate => Test.document
|
22
|
-
property :discussion, :predicate => Test.discussion
|
23
|
-
property :inputDocument, :predicate => Test.inputDocument
|
24
|
-
property :outputDocument, :predicate => Test.outputDocument
|
25
|
-
|
26
|
-
def name
|
27
|
-
subject.to_s.split("#").last
|
28
|
-
end
|
29
|
-
|
30
|
-
def input
|
31
|
-
Kernel.open(self.inputDocument)
|
32
|
-
end
|
33
|
-
|
34
|
-
def output
|
35
|
-
self.outputDocument ? Kernel.open(self.outputDocument) : ""
|
36
|
-
end
|
37
|
-
|
38
|
-
def information; self.description; end
|
39
|
-
|
40
|
-
def inspect
|
41
|
-
"[#{self.class.to_s} " + %w(
|
42
|
-
subject
|
43
|
-
description
|
44
|
-
inputDocument
|
45
|
-
outputDocument
|
46
|
-
).map {|a| v = self.send(a); "#{a}='#{v}'" if v}.compact.join(", ") +
|
47
|
-
"]"
|
48
|
-
end
|
49
|
-
end
|
50
|
-
|
51
|
-
class PositiveParserTest < Entry
|
52
|
-
default_source :entries
|
53
|
-
type Test.PositiveParserTest
|
54
|
-
end
|
55
|
-
|
56
|
-
class NegativeParserTest < Entry
|
57
|
-
default_source :entries
|
58
|
-
type Test.NegativeParserTest
|
59
|
-
end
|
60
|
-
|
61
|
-
class MiscellaneousTest < Entry
|
62
|
-
default_source :entries
|
63
|
-
type Test.MiscellaneousTest
|
64
|
-
end
|
65
|
-
|
66
|
-
repo = RDF::Repository.load("http://www.w3.org/2000/10/rdf-tests/rdfcore/Manifest.rdf")
|
67
|
-
Spira.add_repository! :entries, repo
|
68
|
-
end
|
69
|
-
end
|
data/spec/reader_spec.rb
DELETED
@@ -1,394 +0,0 @@
|
|
1
|
-
# coding: utf-8
|
2
|
-
$:.unshift "."
|
3
|
-
require File.join(File.dirname(__FILE__), 'spec_helper')
|
4
|
-
require 'rdf/spec/reader'
|
5
|
-
|
6
|
-
# w3c test suite: http://www.w3.org/TR/rdf-testcases/
|
7
|
-
|
8
|
-
describe "RDF::RDFXML::Reader" do
|
9
|
-
before :each do
|
10
|
-
@reader = RDF::RDFXML::Reader
|
11
|
-
end
|
12
|
-
|
13
|
-
it_should_behave_like RDF_Reader
|
14
|
-
|
15
|
-
context "discovery" do
|
16
|
-
{
|
17
|
-
"rdf" => RDF::Reader.for(:rdf),
|
18
|
-
"rdfxml" => RDF::Reader.for(:rdfxml),
|
19
|
-
"etc/foaf.xml" => RDF::Reader.for("etc/foaf.xml"),
|
20
|
-
"etc/foaf.rdf" => RDF::Reader.for("etc/foaf.rdf"),
|
21
|
-
"foaf.xml" => RDF::Reader.for(:file_name => "foaf.xml"),
|
22
|
-
"foaf.rdf" => RDF::Reader.for(:file_name => "foaf.rdf"),
|
23
|
-
".xml" => RDF::Reader.for(:file_extension => "xml"),
|
24
|
-
".rdf" => RDF::Reader.for(:file_extension => "rdf"),
|
25
|
-
"application/xml" => RDF::Reader.for(:content_type => "application/xml"),
|
26
|
-
"application/rdf+xml" => RDF::Reader.for(:content_type => "application/rdf+xml"),
|
27
|
-
}.each_pair do |label, format|
|
28
|
-
it "should discover '#{label}'" do
|
29
|
-
format.should == @reader
|
30
|
-
end
|
31
|
-
end
|
32
|
-
end
|
33
|
-
|
34
|
-
context :interface do
|
35
|
-
before(:each) do
|
36
|
-
@sampledoc = <<-EOF;
|
37
|
-
<?xml version="1.0" ?>
|
38
|
-
<GenericXML xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:ex="http://example.org/">
|
39
|
-
<rdf:RDF>
|
40
|
-
<rdf:Description rdf:about="http://example.org/one">
|
41
|
-
<ex:name>Foo</ex:name>
|
42
|
-
</rdf:Description>
|
43
|
-
</rdf:RDF>
|
44
|
-
<blablabla />
|
45
|
-
<rdf:RDF>
|
46
|
-
<rdf:Description rdf:about="http://example.org/two">
|
47
|
-
<ex:name>Bar</ex:name>
|
48
|
-
</rdf:Description>
|
49
|
-
</rdf:RDF>
|
50
|
-
</GenericXML>
|
51
|
-
EOF
|
52
|
-
end
|
53
|
-
|
54
|
-
it "should yield reader" do
|
55
|
-
inner = mock("inner")
|
56
|
-
inner.should_receive(:called).with(@reader)
|
57
|
-
@reader.new(@sampledoc) do |reader|
|
58
|
-
inner.called(reader.class)
|
59
|
-
end
|
60
|
-
end
|
61
|
-
|
62
|
-
it "should return reader" do
|
63
|
-
@reader.new(@sampledoc).should be_a(@reader)
|
64
|
-
end
|
65
|
-
|
66
|
-
it "should yield statements" do
|
67
|
-
inner = mock("inner")
|
68
|
-
inner.should_receive(:called).with(RDF::Statement).twice
|
69
|
-
@reader.new(@sampledoc).each_statement do |statement|
|
70
|
-
inner.called(statement.class)
|
71
|
-
end
|
72
|
-
end
|
73
|
-
|
74
|
-
it "should yield triples" do
|
75
|
-
inner = mock("inner")
|
76
|
-
inner.should_receive(:called).with(RDF::URI, RDF::URI, RDF::Literal).twice
|
77
|
-
@reader.new(@sampledoc).each_triple do |subject, predicate, object|
|
78
|
-
inner.called(subject.class, predicate.class, object.class)
|
79
|
-
end
|
80
|
-
end
|
81
|
-
end
|
82
|
-
|
83
|
-
context "simple parsing" do
|
84
|
-
it "should recognise and create single triple for empty non-RDF root" do
|
85
|
-
sampledoc = %(<?xml version="1.0" ?>
|
86
|
-
<NotRDF />)
|
87
|
-
graph = parse(sampledoc, :base_uri => "http://example.com", :validate => true)
|
88
|
-
graph.size.should == 1
|
89
|
-
statement = graph.statements.first
|
90
|
-
statement.subject.class.should == RDF::Node
|
91
|
-
statement.predicate.should == RDF.type
|
92
|
-
statement.object.should == RDF::XML.NotRDF
|
93
|
-
end
|
94
|
-
|
95
|
-
it "should parse on XML documents with multiple RDF nodes" do
|
96
|
-
sampledoc = <<-EOF;
|
97
|
-
<?xml version="1.0" ?>
|
98
|
-
<GenericXML xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:ex="http://example.org/">
|
99
|
-
<rdf:RDF>
|
100
|
-
<rdf:Description rdf:about="http://example.org/one">
|
101
|
-
<ex:name>Foo</ex:name>
|
102
|
-
</rdf:Description>
|
103
|
-
</rdf:RDF>
|
104
|
-
<blablabla />
|
105
|
-
<rdf:RDF>
|
106
|
-
<rdf:Description rdf:about="http://example.org/two">
|
107
|
-
<ex:name>Bar</ex:name>
|
108
|
-
</rdf:Description>
|
109
|
-
</rdf:RDF>
|
110
|
-
</GenericXML>
|
111
|
-
EOF
|
112
|
-
graph = parse(sampledoc, :base_uri => "http://example.com", :validate => true)
|
113
|
-
objects = graph.statements.map {|s| s.object.value}.sort
|
114
|
-
objects.should == ["Bar", "Foo"]
|
115
|
-
end
|
116
|
-
|
117
|
-
it "should be able to parse a simple single-triple document" do
|
118
|
-
sampledoc = <<-EOF;
|
119
|
-
<?xml version="1.0" ?>
|
120
|
-
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
121
|
-
xmlns:ex="http://www.example.org/" xml:lang="en" xml:base="http://www.example.org/foo">
|
122
|
-
<ex:Thing rdf:about="http://example.org/joe" ex:name="bar">
|
123
|
-
<ex:belongsTo rdf:resource="http://tommorris.org/" />
|
124
|
-
<ex:sampleText rdf:datatype="http://www.w3.org/2001/XMLSchema#string">foo</ex:sampleText>
|
125
|
-
<ex:hadADodgyRelationshipWith>
|
126
|
-
<rdf:Description>
|
127
|
-
<ex:name>Tom</ex:name>
|
128
|
-
<ex:hadADodgyRelationshipWith>
|
129
|
-
<rdf:Description>
|
130
|
-
<ex:name>Rob</ex:name>
|
131
|
-
<ex:hadADodgyRelationshipWith>
|
132
|
-
<rdf:Description>
|
133
|
-
<ex:name>Mary</ex:name>
|
134
|
-
</rdf:Description>
|
135
|
-
</ex:hadADodgyRelationshipWith>
|
136
|
-
</rdf:Description>
|
137
|
-
</ex:hadADodgyRelationshipWith>
|
138
|
-
</rdf:Description>
|
139
|
-
</ex:hadADodgyRelationshipWith>
|
140
|
-
</ex:Thing>
|
141
|
-
</rdf:RDF>
|
142
|
-
EOF
|
143
|
-
|
144
|
-
graph = parse(sampledoc, :base_uri => "http://example.com", :validate => true)
|
145
|
-
#puts @debug
|
146
|
-
graph.size.should == 10
|
147
|
-
# print graph.dump(:ntriples
|
148
|
-
# TODO: add datatype parsing
|
149
|
-
# TODO: make sure the BNode forging is done correctly - an internal element->nodeID mapping
|
150
|
-
# TODO: proper test
|
151
|
-
end
|
152
|
-
|
153
|
-
it "should be able to handle Bags/Alts etc." do
|
154
|
-
sampledoc = <<-EOF;
|
155
|
-
<?xml version="1.0" ?>
|
156
|
-
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:eg="http://example.org/">
|
157
|
-
<rdf:Bag>
|
158
|
-
<rdf:li rdf:resource="http://tommorris.org/" />
|
159
|
-
<rdf:li rdf:resource="http://twitter.com/tommorris" />
|
160
|
-
</rdf:Bag>
|
161
|
-
</rdf:RDF>
|
162
|
-
EOF
|
163
|
-
graph = parse(sampledoc, :base_uri => "http://example.com", :validate => true)
|
164
|
-
graph.predicates.map(&:to_s).should include("http://www.w3.org/1999/02/22-rdf-syntax-ns#_1", "http://www.w3.org/1999/02/22-rdf-syntax-ns#_2")
|
165
|
-
end
|
166
|
-
end
|
167
|
-
|
168
|
-
context :exceptions do
|
169
|
-
it "should raise an error if rdf:aboutEach is used, as per the negative parser test rdfms-abouteach-error001 (rdf:aboutEach attribute)" do
|
170
|
-
sampledoc = <<-EOF;
|
171
|
-
<?xml version="1.0" ?>
|
172
|
-
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
173
|
-
xmlns:eg="http://example.org/">
|
174
|
-
|
175
|
-
<rdf:Bag rdf:ID="node">
|
176
|
-
<rdf:li rdf:resource="http://example.org/node2"/>
|
177
|
-
</rdf:Bag>
|
178
|
-
|
179
|
-
<rdf:Description rdf:aboutEach="#node">
|
180
|
-
<dc:rights xmlns:dc="http://purl.org/dc/elements/1.1/">me</dc:rights>
|
181
|
-
|
182
|
-
</rdf:Description>
|
183
|
-
|
184
|
-
</rdf:RDF>
|
185
|
-
EOF
|
186
|
-
|
187
|
-
lambda do
|
188
|
-
graph = parse(sampledoc, :base_uri => "http://example.com", :validate => true)
|
189
|
-
end.should raise_error(RDF::ReaderError, /Obsolete attribute .*aboutEach/)
|
190
|
-
end
|
191
|
-
|
192
|
-
it "should raise an error if rdf:aboutEachPrefix is used, as per the negative parser test rdfms-abouteach-error002 (rdf:aboutEachPrefix attribute)" do
|
193
|
-
sampledoc = <<-EOF;
|
194
|
-
<?xml version="1.0" ?>
|
195
|
-
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
196
|
-
xmlns:eg="http://example.org/">
|
197
|
-
|
198
|
-
<rdf:Description rdf:about="http://example.org/node">
|
199
|
-
<eg:property>foo</eg:property>
|
200
|
-
</rdf:Description>
|
201
|
-
|
202
|
-
<rdf:Description rdf:aboutEachPrefix="http://example.org/">
|
203
|
-
<dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">me</dc:creator>
|
204
|
-
|
205
|
-
</rdf:Description>
|
206
|
-
|
207
|
-
</rdf:RDF>
|
208
|
-
EOF
|
209
|
-
|
210
|
-
lambda do
|
211
|
-
graph = parse(sampledoc, :base_uri => "http://example.com", :validate => true)
|
212
|
-
end.should raise_error(RDF::ReaderError, /Obsolete attribute .*aboutEachPrefix/)
|
213
|
-
end
|
214
|
-
|
215
|
-
it "should fail if given a non-ID as an ID (as per rdfcore-rdfms-rdf-id-error001)" do
|
216
|
-
sampledoc = <<-EOF;
|
217
|
-
<?xml version="1.0"?>
|
218
|
-
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
|
219
|
-
<rdf:Description rdf:ID='333-555-666' />
|
220
|
-
</rdf:RDF>
|
221
|
-
EOF
|
222
|
-
|
223
|
-
lambda do
|
224
|
-
graph = parse(sampledoc, :base_uri => "http://example.com", :validate => true)
|
225
|
-
end.should raise_error(RDF::ReaderError, /ID addtribute '.*' must be a NCName/)
|
226
|
-
end
|
227
|
-
|
228
|
-
it "should make sure that the value of rdf:ID attributes match the XML Name production (child-element version)" do
|
229
|
-
sampledoc = <<-EOF;
|
230
|
-
<?xml version="1.0" ?>
|
231
|
-
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
232
|
-
xmlns:eg="http://example.org/">
|
233
|
-
<rdf:Description>
|
234
|
-
<eg:prop rdf:ID="q:name" />
|
235
|
-
</rdf:Description>
|
236
|
-
</rdf:RDF>
|
237
|
-
EOF
|
238
|
-
|
239
|
-
lambda do
|
240
|
-
graph = parse(sampledoc, :base_uri => "http://example.com", :validate => true)
|
241
|
-
end.should raise_error(RDF::ReaderError, /ID addtribute '.*' must be a NCName/)
|
242
|
-
end
|
243
|
-
|
244
|
-
it "should make sure that the value of rdf:ID attributes match the XML Name production (data attribute version)" do
|
245
|
-
sampledoc = <<-EOF;
|
246
|
-
<?xml version="1.0" ?>
|
247
|
-
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
248
|
-
xmlns:eg="http://example.org/">
|
249
|
-
<rdf:Description rdf:ID="a/b" eg:prop="val" />
|
250
|
-
</rdf:RDF>
|
251
|
-
EOF
|
252
|
-
|
253
|
-
lambda do
|
254
|
-
graph = parse(sampledoc, :base_uri => "http://example.com", :validate => true)
|
255
|
-
end.should raise_error(RDF::ReaderError, "ID addtribute 'a/b' must be a NCName")
|
256
|
-
end
|
257
|
-
|
258
|
-
it "should detect bad bagIDs" do
|
259
|
-
sampledoc = <<-EOF;
|
260
|
-
<?xml version="1.0" ?>
|
261
|
-
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
|
262
|
-
<rdf:Description rdf:bagID='333-555-666' />
|
263
|
-
</rdf:RDF>
|
264
|
-
EOF
|
265
|
-
|
266
|
-
lambda do
|
267
|
-
graph = parse(sampledoc, :base_uri => "http://example.com", :validate => true)
|
268
|
-
puts @debug
|
269
|
-
end.should raise_error(RDF::ReaderError, /Obsolete attribute .*bagID/)
|
270
|
-
end
|
271
|
-
end
|
272
|
-
|
273
|
-
context :reification do
|
274
|
-
it "should be able to reify according to §2.17 of RDF/XML Syntax Specification" do
|
275
|
-
sampledoc = <<-EOF;
|
276
|
-
<?xml version="1.0"?>
|
277
|
-
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
278
|
-
xmlns:ex="http://example.org/stuff/1.0/"
|
279
|
-
xml:base="http://example.org/triples/">
|
280
|
-
<rdf:Description rdf:about="http://example.org/">
|
281
|
-
<ex:prop rdf:ID="triple1">blah</ex:prop>
|
282
|
-
</rdf:Description>
|
283
|
-
</rdf:RDF>
|
284
|
-
EOF
|
285
|
-
|
286
|
-
triples = <<-EOF
|
287
|
-
<http://example.org/> <http://example.org/stuff/1.0/prop> \"blah\" .
|
288
|
-
<http://example.org/triples/#triple1> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/1999/02/22-rdf-syntax-ns#Statement> .
|
289
|
-
<http://example.org/triples/#triple1> <http://www.w3.org/1999/02/22-rdf-syntax-ns#subject> <http://example.org/> .
|
290
|
-
<http://example.org/triples/#triple1> <http://www.w3.org/1999/02/22-rdf-syntax-ns#predicate> <http://example.org/stuff/1.0/prop> .
|
291
|
-
<http://example.org/triples/#triple1> <http://www.w3.org/1999/02/22-rdf-syntax-ns#object> \"blah\" .
|
292
|
-
EOF
|
293
|
-
|
294
|
-
graph = parse(sampledoc, :base_uri => "http://example.com", :validate => true)
|
295
|
-
graph.should be_equivalent_graph(triples, :about => "http://example.com/", :trace => @debug)
|
296
|
-
end
|
297
|
-
end
|
298
|
-
|
299
|
-
context :entities do
|
300
|
-
it "decodes" do
|
301
|
-
sampledoc = <<-EOF;
|
302
|
-
<?xml version="1.0"?>
|
303
|
-
<!DOCTYPE rdf:RDF [<!ENTITY rdf "http://www.w3.org/1999/02/22-rdf-syntax-ns#" >]>
|
304
|
-
<rdf:RDF xmlns:rdf="&rdf;"
|
305
|
-
xmlns:ex="http://example.org/stuff/1.0/"
|
306
|
-
xml:base="http://example.org/triples/">
|
307
|
-
<rdf:Description rdf:about="http://example.org/">
|
308
|
-
<ex:prop rdf:ID="triple1">blah</ex:prop>
|
309
|
-
</rdf:Description>
|
310
|
-
</rdf:RDF>
|
311
|
-
EOF
|
312
|
-
|
313
|
-
triples = <<-EOF
|
314
|
-
<http://example.org/> <http://example.org/stuff/1.0/prop> \"blah\" .
|
315
|
-
<http://example.org/triples/#triple1> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/1999/02/22-rdf-syntax-ns#Statement> .
|
316
|
-
<http://example.org/triples/#triple1> <http://www.w3.org/1999/02/22-rdf-syntax-ns#subject> <http://example.org/> .
|
317
|
-
<http://example.org/triples/#triple1> <http://www.w3.org/1999/02/22-rdf-syntax-ns#predicate> <http://example.org/stuff/1.0/prop> .
|
318
|
-
<http://example.org/triples/#triple1> <http://www.w3.org/1999/02/22-rdf-syntax-ns#object> \"blah\" .
|
319
|
-
EOF
|
320
|
-
|
321
|
-
graph = parse(sampledoc, :base_uri => "http://example.com", :validate => true)
|
322
|
-
graph.should be_equivalent_graph(triples, :about => "http://example.com/", :trace => @debug)
|
323
|
-
end
|
324
|
-
|
325
|
-
it "processes OWL definition" do
|
326
|
-
@debug = []
|
327
|
-
graph = RDF::Graph.load("http://www.w3.org/2002/07/owl", :format => :rdfxml, :debug => @debug)
|
328
|
-
graph.count.should > 10
|
329
|
-
end
|
330
|
-
end
|
331
|
-
|
332
|
-
# W3C Test suite from http://www.w3.org/2000/10/rdf-tests/rdfcore/
|
333
|
-
describe "w3c rdfcore tests" do
|
334
|
-
require 'rdf_test'
|
335
|
-
|
336
|
-
# Positive parser tests should raise errors.
|
337
|
-
describe "positive parser tests" do
|
338
|
-
Fixtures::TestCase::PositiveParserTest.each do |t|
|
339
|
-
next unless t.status == "APPROVED"
|
340
|
-
#next unless t.about =~ /rdfms-rdf-names-use/
|
341
|
-
#next unless t.name =~ /11/
|
342
|
-
#puts t.inspect
|
343
|
-
specify "#{t.name}: " + (t.description || "#{t.inputDocument} against #{t.outputDocument}") do
|
344
|
-
begin
|
345
|
-
graph = RDF::Graph.new << @reader.new(t.input,
|
346
|
-
:base_uri => t.inputDocument,
|
347
|
-
:validate => false,
|
348
|
-
:debug => t.debug)
|
349
|
-
|
350
|
-
# Parse result graph
|
351
|
-
#puts "parse #{self.outputDocument} as #{RDF::Reader.for(self.outputDocument)}"
|
352
|
-
format = detect_format(t.output)
|
353
|
-
output_graph = RDF::Graph.load(t.outputDocument, :format => format, :base_uri => t.inputDocument)
|
354
|
-
puts "result: #{CGI.escapeHTML(graph.dump(:ntriples))}" if ::RDF::N3::debug?
|
355
|
-
graph.should be_equivalent_graph(output_graph, t)
|
356
|
-
rescue RSpec::Expectations::ExpectationNotMetError => e
|
357
|
-
if t.inputDocument =~ %r(xml-literal|xml-canon)
|
358
|
-
pending("XMLLiteral canonicalization not implemented yet")
|
359
|
-
else
|
360
|
-
raise
|
361
|
-
end
|
362
|
-
end
|
363
|
-
end
|
364
|
-
end
|
365
|
-
end
|
366
|
-
|
367
|
-
# Negative parser tests should raise errors.
|
368
|
-
describe "negative parser tests" do
|
369
|
-
Fixtures::TestCase::NegativeParserTest.each do |t|
|
370
|
-
next unless t.status == "APPROVED"
|
371
|
-
#next unless t.about =~ /rdfms-empty-property-elements/
|
372
|
-
#next unless t.name =~ /1/
|
373
|
-
#puts t.inspect
|
374
|
-
specify "test #{t.name}: " + (t.description || t.inputDocument) do
|
375
|
-
lambda do
|
376
|
-
RDF::Graph.new << @reader.new(t.input,
|
377
|
-
:base_uri => t.inputDocument,
|
378
|
-
:validate => true)
|
379
|
-
end.should raise_error(RDF::ReaderError)
|
380
|
-
end
|
381
|
-
end
|
382
|
-
end
|
383
|
-
end
|
384
|
-
|
385
|
-
def parse(input, options)
|
386
|
-
@debug = []
|
387
|
-
graph = RDF::Graph.new
|
388
|
-
@reader.new(input, options.merge(:debug => @debug)).each do |statement|
|
389
|
-
graph << statement
|
390
|
-
end
|
391
|
-
graph
|
392
|
-
end
|
393
|
-
end
|
394
|
-
|