rdf-rdfa 0.0.2 → 0.0.3
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +2 -0
- data/.yardopts +11 -0
- data/CONTRIBUTORS +1 -0
- data/History.txt +3 -0
- data/README.rdoc +21 -3
- data/Rakefile +4 -4
- data/VERSION +1 -1
- data/etc/basic.html +15 -0
- data/example.rb +13 -17
- data/lib/rdf/rdfa.rb +4 -11
- data/lib/rdf/rdfa/reader.rb +79 -128
- data/lib/rdf/rdfa/version.rb +16 -18
- data/lib/rdf/rdfa/vocab.rb +0 -1
- data/rdf-rdfa.gemspec +13 -11
- data/spec/matchers.rb +205 -0
- data/spec/rdfa_reader_spec.rb +449 -140
- metadata +18 -30
- data/lib/rdf/rdfa/reader/exceptions.rb +0 -14
data/lib/rdf/rdfa/version.rb
CHANGED
@@ -1,23 +1,21 @@
|
|
1
|
-
module RDFa
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
EXTRA = nil
|
1
|
+
module RDF::RDFa::VERSION
|
2
|
+
MAJOR = 0
|
3
|
+
MINOR = 0
|
4
|
+
TINY = 3
|
5
|
+
EXTRA = nil
|
7
6
|
|
8
|
-
|
9
|
-
|
7
|
+
STRING = [MAJOR, MINOR, TINY].join('.')
|
8
|
+
STRING << "-#{EXTRA}" if EXTRA
|
10
9
|
|
11
|
-
|
12
|
-
|
13
|
-
|
10
|
+
##
|
11
|
+
# @return [String]
|
12
|
+
def self.to_s() STRING end
|
14
13
|
|
15
|
-
|
16
|
-
|
17
|
-
|
14
|
+
##
|
15
|
+
# @return [String]
|
16
|
+
def self.to_str() STRING end
|
18
17
|
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
end
|
18
|
+
##
|
19
|
+
# @return [Array(Integer, Integer, Integer)]
|
20
|
+
def self.to_a() [MAJOR, MINOR, TINY] end
|
23
21
|
end
|
data/lib/rdf/rdfa/vocab.rb
CHANGED
@@ -3,5 +3,4 @@ module RDF
|
|
3
3
|
class XHV < Vocabulary("http://www.w3.org/1999/xhtml/vocab#"); end
|
4
4
|
class XML < Vocabulary("http://www.w3.org/XML/1998/namespace"); end
|
5
5
|
class XSI < Vocabulary("http://www.w3.org/2001/XMLSchema-instance"); end
|
6
|
-
class OWL < Vocabulary("http://www.w3.org/2002/07/owl#"); end
|
7
6
|
end
|
data/rdf-rdfa.gemspec
CHANGED
@@ -5,12 +5,12 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{rdf-rdfa}
|
8
|
-
s.version = "0.0.
|
8
|
+
s.version = "0.0.3"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
|
-
s.authors = ["Gregg Kellogg"
|
12
|
-
s.date = %q{2010-06-
|
13
|
-
s.description = %q{ RDF::RDFa is an RDFa
|
11
|
+
s.authors = ["Gregg Kellogg"]
|
12
|
+
s.date = %q{2010-06-10}
|
13
|
+
s.description = %q{ RDF::RDFa is an RDFa reader for Ruby using the RDF.rb library suite.
|
14
14
|
}
|
15
15
|
s.email = %q{gregg@kellogg-assoc.com}
|
16
16
|
s.extra_rdoc_files = [
|
@@ -19,23 +19,27 @@ Gem::Specification.new do |s|
|
|
19
19
|
"README.rdoc"
|
20
20
|
]
|
21
21
|
s.files = [
|
22
|
-
"
|
22
|
+
".gitignore",
|
23
|
+
".yardopts",
|
24
|
+
"AUTHORS",
|
25
|
+
"CONTRIBUTORS",
|
23
26
|
"History.txt",
|
24
27
|
"README.rdoc",
|
25
28
|
"Rakefile",
|
26
29
|
"VERSION",
|
30
|
+
"etc/basic.html",
|
27
31
|
"etc/foaf.html",
|
28
32
|
"etc/xhv.html",
|
29
33
|
"example.rb",
|
30
34
|
"lib/rdf/rdfa.rb",
|
31
35
|
"lib/rdf/rdfa/format.rb",
|
32
36
|
"lib/rdf/rdfa/reader.rb",
|
33
|
-
"lib/rdf/rdfa/reader/exceptions.rb",
|
34
37
|
"lib/rdf/rdfa/version.rb",
|
35
38
|
"lib/rdf/rdfa/vocab.rb",
|
36
39
|
"pkg/.gitignore",
|
37
40
|
"rdf-rdfa.gemspec",
|
38
41
|
"script/console",
|
42
|
+
"spec/matchers.rb",
|
39
43
|
"spec/rdfa-triples/0001.nt",
|
40
44
|
"spec/rdfa-triples/0006.nt",
|
41
45
|
"spec/rdfa-triples/0007.nt",
|
@@ -157,9 +161,10 @@ Gem::Specification.new do |s|
|
|
157
161
|
s.rdoc_options = ["--charset=UTF-8"]
|
158
162
|
s.require_paths = ["lib"]
|
159
163
|
s.rubygems_version = %q{1.3.7}
|
160
|
-
s.summary = %q{RDFa
|
164
|
+
s.summary = %q{RDFa reader for RDF.rb.}
|
161
165
|
s.test_files = [
|
162
|
-
"spec/
|
166
|
+
"spec/matchers.rb",
|
167
|
+
"spec/rdfa_helper.rb",
|
163
168
|
"spec/rdfa_reader_spec.rb",
|
164
169
|
"spec/spec_helper.rb"
|
165
170
|
]
|
@@ -171,14 +176,12 @@ Gem::Specification.new do |s|
|
|
171
176
|
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
172
177
|
s.add_runtime_dependency(%q<rdf>, [">= 0.1.6"])
|
173
178
|
s.add_runtime_dependency(%q<nokogiri>, [">= 1.3.3"])
|
174
|
-
s.add_runtime_dependency(%q<patron>, [">= 0.4.6"])
|
175
179
|
s.add_development_dependency(%q<rspec>, [">= 0"])
|
176
180
|
s.add_development_dependency(%q<rdf-spec>, [">= 0"])
|
177
181
|
s.add_development_dependency(%q<activesupport>, [">= 2.3.0"])
|
178
182
|
else
|
179
183
|
s.add_dependency(%q<rdf>, [">= 0.1.6"])
|
180
184
|
s.add_dependency(%q<nokogiri>, [">= 1.3.3"])
|
181
|
-
s.add_dependency(%q<patron>, [">= 0.4.6"])
|
182
185
|
s.add_dependency(%q<rspec>, [">= 0"])
|
183
186
|
s.add_dependency(%q<rdf-spec>, [">= 0"])
|
184
187
|
s.add_dependency(%q<activesupport>, [">= 2.3.0"])
|
@@ -186,7 +189,6 @@ Gem::Specification.new do |s|
|
|
186
189
|
else
|
187
190
|
s.add_dependency(%q<rdf>, [">= 0.1.6"])
|
188
191
|
s.add_dependency(%q<nokogiri>, [">= 1.3.3"])
|
189
|
-
s.add_dependency(%q<patron>, [">= 0.4.6"])
|
190
192
|
s.add_dependency(%q<rspec>, [">= 0"])
|
191
193
|
s.add_dependency(%q<rdf-spec>, [">= 0"])
|
192
194
|
s.add_dependency(%q<activesupport>, [">= 2.3.0"])
|
data/spec/matchers.rb
ADDED
@@ -0,0 +1,205 @@
|
|
1
|
+
module Matchers
|
2
|
+
class BeEquivalentGraph
|
3
|
+
Info = Struct.new(:about, :information, :trace, :compare, :inputDocument, :outputDocument)
|
4
|
+
def normalize(graph)
|
5
|
+
case @info.compare
|
6
|
+
when :array
|
7
|
+
array = case graph
|
8
|
+
when Graph, Parser
|
9
|
+
graph = graph.graph if graph.respond_to?(:graph)
|
10
|
+
anon = "a"
|
11
|
+
anon_ctx = {}
|
12
|
+
graph.triples.collect {|triple| triple.to_ntriples }.each do |t|
|
13
|
+
t.gsub(/_:nbn\d+[a-z]+N/, "_:").
|
14
|
+
gsub!(/_:bn\d+[a-z]+/) do |bn|
|
15
|
+
# Normalize anon BNodes
|
16
|
+
if anon_ctx[bn]
|
17
|
+
anon_ctx[bn]
|
18
|
+
else
|
19
|
+
anon_ctx[bn] = anon
|
20
|
+
anon = anon.succ
|
21
|
+
end
|
22
|
+
"_:#{anon_ctx[bn]}"
|
23
|
+
end
|
24
|
+
end.sort
|
25
|
+
when Array
|
26
|
+
graph.sort
|
27
|
+
else
|
28
|
+
graph.to_s.split("\n").
|
29
|
+
map {|t| t.gsub(/^\s*(.*)\s*$/, '\1')}.
|
30
|
+
reject {|t2| t2.match(/^\s*$/)}.
|
31
|
+
compact.
|
32
|
+
sort.
|
33
|
+
uniq
|
34
|
+
end
|
35
|
+
|
36
|
+
# Implement to_ntriples on array, to simplify logic later
|
37
|
+
def array.to_ntriples; self.join("\n") + "\n"; end
|
38
|
+
array
|
39
|
+
else
|
40
|
+
case graph
|
41
|
+
when Graph then graph
|
42
|
+
when Parser then graph.graph
|
43
|
+
when IO, StringIO
|
44
|
+
Parser.parse(graph, @info.about)
|
45
|
+
else
|
46
|
+
parser = Parser.new(:struct => true)
|
47
|
+
fmt = parser.detect_format(graph.to_s)
|
48
|
+
parser.parse(graph.to_s, @info.about, :type => fmt)
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
def initialize(expected, info)
|
54
|
+
@info = if info.respond_to?(:about)
|
55
|
+
info
|
56
|
+
elsif info.is_a?(Hash)
|
57
|
+
identifier = info[:identifier] || expected.is_a?(Graph) ? expected.identifier : info[:about]
|
58
|
+
Info.new(identifier, info[:information] || "", info[:trace], info[:compare])
|
59
|
+
else
|
60
|
+
Info.new(expected.is_a?(Graph) ? expected.identifier : info, info.to_s)
|
61
|
+
end
|
62
|
+
@expected = normalize(expected)
|
63
|
+
end
|
64
|
+
|
65
|
+
def matches?(actual)
|
66
|
+
@actual = normalize(actual)
|
67
|
+
@actual == @expected
|
68
|
+
end
|
69
|
+
|
70
|
+
def failure_message_for_should
|
71
|
+
info = @info.respond_to?(:information) ? @info.information : ""
|
72
|
+
if @expected.is_a?(Graph) && @actual.size != @expected.size
|
73
|
+
"Graph entry count differs:\nexpected: #{@expected.size}\nactual: #{@actual.size}"
|
74
|
+
elsif @expected.is_a?(Array) && @actual.size != @expected.length
|
75
|
+
"Graph entry count differs:\nexpected: #{@expected.length}\nactual: #{@actual.size}"
|
76
|
+
elsif @expected.is_a?(Graph) && @actual.identifier != @expected.identifier
|
77
|
+
"Graph identifiers differ:\nexpected: #{@expected.identifier}\nactual: #{@actual.identifier}"
|
78
|
+
else
|
79
|
+
"Graph differs#{@info.compare == :array ? '(array)' : ''}\n"
|
80
|
+
end +
|
81
|
+
"\n#{info + "\n" unless info.empty?}" +
|
82
|
+
(@info.inputDocument ? "Input file: #{@info.inputDocument}\n" : "") +
|
83
|
+
(@info.outputDocument ? "Output file: #{@info.outputDocument}\n" : "") +
|
84
|
+
"Unsorted Expected:\n#{@expected.to_ntriples}" +
|
85
|
+
"Unsorted Results:\n#{@actual.to_ntriples}" +
|
86
|
+
(@info.trace ? "\nDebug:\n#{@info.trace}" : "")
|
87
|
+
end
|
88
|
+
def negative_failure_message
|
89
|
+
"Graphs do not differ\n"
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
93
|
+
def be_equivalent_graph(expected, info = nil)
|
94
|
+
BeEquivalentGraph.new(expected, info)
|
95
|
+
end
|
96
|
+
|
97
|
+
# Run expected SPARQL query against actual
|
98
|
+
if $redland_enabled
|
99
|
+
class PassQuery
|
100
|
+
def initialize(expected, info)
|
101
|
+
@expected = expected
|
102
|
+
@query = Redland::Query.new(expected)
|
103
|
+
@info = info
|
104
|
+
end
|
105
|
+
def matches?(actual)
|
106
|
+
@actual = actual
|
107
|
+
@expected_results = @info.respond_to?(:expectedResults) ? @info.expectedResults : true
|
108
|
+
model = Redland::Model.new
|
109
|
+
ntriples_parser = Redland::Parser.ntriples
|
110
|
+
ntriples_parser.parse_string_into_model(model, actual.to_ntriples, "http://www.w3.org/2006/07/SWD/RDFa/testsuite/xhtml1-testcases/")
|
111
|
+
|
112
|
+
@results = @query.execute(model)
|
113
|
+
#puts "Redland query results: #{@results.inspect}"
|
114
|
+
if @expected_results
|
115
|
+
@results.is_boolean? && @results.get_boolean?
|
116
|
+
else
|
117
|
+
@results.nil? || @results.is_boolean? && !@results.get_boolean?
|
118
|
+
end
|
119
|
+
end
|
120
|
+
def failure_message_for_should
|
121
|
+
info = @info.respond_to?(:information) ? @info.information : ""
|
122
|
+
"#{info + "\n" unless info.empty?}" +
|
123
|
+
if @results.nil?
|
124
|
+
"Query failed to return results"
|
125
|
+
elsif !@results.is_boolean?
|
126
|
+
"Query returned non-boolean results"
|
127
|
+
elsif @expected_results
|
128
|
+
"Query returned false"
|
129
|
+
else
|
130
|
+
"Query returned true (expected false)"
|
131
|
+
end +
|
132
|
+
"\n#{@expected}" +
|
133
|
+
"\n#{@info.input}" +
|
134
|
+
"\nResults:\n#{@actual.to_ntriples}" +
|
135
|
+
"\nDebug:\n#{@info.trace}"
|
136
|
+
end
|
137
|
+
end
|
138
|
+
|
139
|
+
def pass_query(expected, info = "")
|
140
|
+
PassQuery.new(expected, info)
|
141
|
+
end
|
142
|
+
else
|
143
|
+
def pass_query(expect, info = ""); false; end
|
144
|
+
end
|
145
|
+
|
146
|
+
class BeValidXML
|
147
|
+
def initialize(info)
|
148
|
+
@info = info
|
149
|
+
end
|
150
|
+
def matches?(actual)
|
151
|
+
@actual = actual
|
152
|
+
@doc = Nokogiri::XML.parse(actual)
|
153
|
+
@results = @doc.validate
|
154
|
+
@results.nil?
|
155
|
+
rescue
|
156
|
+
false
|
157
|
+
end
|
158
|
+
def failure_message_for_should
|
159
|
+
"#{@info + "\n" unless @info.empty?}" +
|
160
|
+
if @doc.nil?
|
161
|
+
"did not parse"
|
162
|
+
else
|
163
|
+
"\n#{@results}" +
|
164
|
+
"\nParsed:\n#{@doc}"
|
165
|
+
end +
|
166
|
+
"\nActual:\n#{@actual}"
|
167
|
+
end
|
168
|
+
end
|
169
|
+
|
170
|
+
def be_valid_xml(info = "")
|
171
|
+
BeValidXML.new(info)
|
172
|
+
end
|
173
|
+
|
174
|
+
class BeEquivalentXML
|
175
|
+
def initialize(expected, info)
|
176
|
+
@expected = expected
|
177
|
+
@info = info
|
178
|
+
end
|
179
|
+
|
180
|
+
def matches?(actual)
|
181
|
+
@actual = actual
|
182
|
+
|
183
|
+
a = @actual.index("<") == 0 ? @actual : "<foo>#{@actual}</foo>"
|
184
|
+
e = @expected.index("<") == 0 ? @expected : "<foo>#{@expected}</foo>"
|
185
|
+
a_hash = ActiveSupport::XmlMini.parse(a)
|
186
|
+
e_hash = ActiveSupport::XmlMini.parse(e)
|
187
|
+
a_hash == e_hash
|
188
|
+
rescue
|
189
|
+
puts $!
|
190
|
+
@fault = $!.message
|
191
|
+
false
|
192
|
+
end
|
193
|
+
|
194
|
+
def failure_message_for_should
|
195
|
+
"#{@info + "\n" unless @info.empty?}" +
|
196
|
+
"Fault: #{@fault + "\n" if @fault}" +
|
197
|
+
"Expected:#{@expected}\n" +
|
198
|
+
"Actual:#{@actual}"
|
199
|
+
end
|
200
|
+
end
|
201
|
+
|
202
|
+
def be_equivalent_xml(expected, info = "")
|
203
|
+
BeEquivalentXML.new(expected, info)
|
204
|
+
end
|
205
|
+
end
|
data/spec/rdfa_reader_spec.rb
CHANGED
@@ -16,158 +16,467 @@ describe RDF::RDFa::Format do
|
|
16
16
|
end
|
17
17
|
|
18
18
|
describe "RDF::RDFa::Reader" do
|
19
|
-
|
20
|
-
|
21
|
-
RDF::Reader.for(:rdfa),
|
22
|
-
RDF::Reader.for("etc/foaf.html"),
|
23
|
-
RDF::Reader.for(:file_name => "
|
24
|
-
RDF::Reader.for(:file_extension => "html"),
|
25
|
-
RDF::Reader.for(:
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
19
|
+
context "discovery" do
|
20
|
+
{
|
21
|
+
"html" => RDF::Reader.for(:rdfa),
|
22
|
+
"etc/foaf.html" => RDF::Reader.for("etc/foaf.html"),
|
23
|
+
"foaf.html" => RDF::Reader.for(:file_name => "foaf.html"),
|
24
|
+
".html" => RDF::Reader.for(:file_extension => "html"),
|
25
|
+
"application/xhtml+xml" => RDF::Reader.for(:content_type => "application/xhtml+xml"),
|
26
|
+
}.each_pair do |label, format|
|
27
|
+
it "should discover '#{label}'" do
|
28
|
+
format.should == RDF::RDFa::Reader
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
context :interface do
|
34
|
+
before(:each) do
|
35
|
+
@sampledoc = <<-EOF;
|
36
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
37
|
+
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML+RDFa 1.0//EN" "http://www.w3.org/MarkUp/DTD/xhtml-rdfa-1.dtd">
|
38
|
+
<html xmlns="http://www.w3.org/1999/xhtml"
|
39
|
+
xmlns:dc="http://purl.org/dc/elements/1.1/">
|
40
|
+
<head>
|
41
|
+
<title>Test 0001</title>
|
42
|
+
</head>
|
43
|
+
<body>
|
44
|
+
<p>This photo was taken by <span class="author" about="photo1.jpg" property="dc:creator">Mark Birbeck</span>.</p>
|
45
|
+
</body>
|
46
|
+
</html>
|
47
|
+
EOF
|
48
|
+
end
|
49
|
+
|
50
|
+
it "should yield reader" do
|
51
|
+
inner = mock("inner")
|
52
|
+
inner.should_receive(:called).with(RDF::RDFa::Reader)
|
53
|
+
RDF::RDFa::Reader.new(@sampledoc) do |reader|
|
54
|
+
inner.called(reader.class)
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
it "should return reader" do
|
59
|
+
RDF::RDFa::Reader.new(@sampledoc).should be_a(RDF::RDFa::Reader)
|
60
|
+
end
|
61
|
+
|
62
|
+
it "should yield statements" do
|
63
|
+
inner = mock("inner")
|
64
|
+
inner.should_receive(:called).with(RDF::Statement)
|
65
|
+
RDF::RDFa::Reader.new(@sampledoc).each_statement do |statement|
|
66
|
+
inner.called(statement.class)
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
it "should yield triples" do
|
71
|
+
inner = mock("inner")
|
72
|
+
inner.should_receive(:called).with(RDF::URI, RDF::URI, RDF::Literal)
|
73
|
+
RDF::RDFa::Reader.new(@sampledoc).each_triple do |subject, predicate, object|
|
74
|
+
inner.called(subject.class, predicate.class, object.class)
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
context "paring a simple doc" do
|
80
|
+
before :each do
|
81
|
+
sampledoc = <<-EOF;
|
82
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
83
|
+
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML+RDFa 1.0//EN" "http://www.w3.org/MarkUp/DTD/xhtml-rdfa-1.dtd">
|
84
|
+
<html xmlns="http://www.w3.org/1999/xhtml"
|
85
|
+
xmlns:dc="http://purl.org/dc/elements/1.1/">
|
86
|
+
<head>
|
87
|
+
<title>Test 0001</title>
|
88
|
+
</head>
|
89
|
+
<body>
|
90
|
+
<p>This photo was taken by <span class="author" about="photo1.jpg" property="dc:creator">Mark Birbeck</span>.</p>
|
91
|
+
</body>
|
92
|
+
</html>
|
93
|
+
EOF
|
94
|
+
|
95
|
+
@graph = parse(sampledoc, :base_uri => "http://rdfa.digitalbazaar.com/test-suite/test-cases/xhtml1/0001.xhtml", :strict => true)
|
96
|
+
@statement = @graph.statements.first
|
97
|
+
end
|
98
|
+
|
99
|
+
it "should return 1 triple" do
|
100
|
+
@graph.size.should == 1
|
101
|
+
end
|
102
|
+
|
103
|
+
it "should have a subject with an expanded URI" do
|
104
|
+
@statement.subject.should == RDF::URI('http://rdfa.digitalbazaar.com/test-suite/test-cases/xhtml1/photo1.jpg')
|
105
|
+
end
|
106
|
+
|
107
|
+
it "should have a predicate of dc:creator" do
|
108
|
+
@statement.predicate.should == RDF::DC11.creator
|
109
|
+
end
|
110
|
+
|
111
|
+
it "should have an object of type literal and value 'Mark Birkbeck'" do
|
112
|
+
@statement.object.should == RDF::Literal("Mark Birbeck")
|
113
|
+
end
|
114
|
+
end
|
115
|
+
|
116
|
+
context "parsing a simple doc without a base URI" do
|
117
|
+
before :each do
|
118
|
+
sampledoc = <<-EOF;
|
119
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
120
|
+
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML+RDFa 1.0//EN" "http://www.w3.org/MarkUp/DTD/xhtml-rdfa-1.dtd">
|
121
|
+
<html xmlns="http://www.w3.org/1999/xhtml"
|
122
|
+
xmlns:dc="http://purl.org/dc/elements/1.1/">
|
123
|
+
<body>
|
124
|
+
<p>This photo was taken by <span class="author" about="_:photo" property="dc:creator">Mark Birbeck</span>.</p>
|
125
|
+
</body>
|
126
|
+
</html>
|
127
|
+
EOF
|
128
|
+
|
129
|
+
@graph = parse(sampledoc, :strict => true)
|
130
|
+
@statement = @graph.statements.first
|
131
|
+
end
|
132
|
+
|
133
|
+
it "should return 1 triple" do
|
134
|
+
@graph.size.should == 1
|
135
|
+
end
|
136
|
+
|
137
|
+
it "should have a Blank Node named 'photo' as the subject of the triple" do
|
138
|
+
@statement.subject.should == RDF::Node('photo')
|
139
|
+
end
|
140
|
+
|
141
|
+
it "should have a predicate of dc:creator" do
|
142
|
+
@statement.predicate.should == RDF::DC11.creator
|
143
|
+
end
|
144
|
+
|
145
|
+
it "should have an object of type literal and value 'Mark Birkbeck'" do
|
146
|
+
@statement.object.should == RDF::Literal("Mark Birbeck")
|
147
|
+
end
|
148
|
+
end
|
149
|
+
|
150
|
+
context "parsing a document containing an XML Literal" do
|
151
|
+
before :each do
|
152
|
+
sampledoc = <<-EOF
|
153
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
154
|
+
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML+RDFa 1.0//EN" "http://www.w3.org/MarkUp/DTD/xhtml-rdfa-1.dtd">
|
155
|
+
<html xmlns="http://www.w3.org/1999/xhtml"
|
156
|
+
xmlns:dc="http://purl.org/dc/elements/1.1/">
|
157
|
+
<head>
|
158
|
+
<title>Test 0011</title>
|
159
|
+
</head>
|
160
|
+
<body>
|
161
|
+
<div about="">
|
162
|
+
Author: <span property="dc:creator">Albert Einstein</span>
|
163
|
+
<h2 property="dc:title">E = mc<sup>2</sup>: The Most Urgent Problem of Our Time</h2>
|
164
|
+
</div>
|
165
|
+
</body>
|
166
|
+
</html>
|
167
|
+
EOF
|
168
|
+
|
169
|
+
@graph = parse(sampledoc, :base_uri => "http://rdfa.digitalbazaar.com/test-suite/test-cases/xhtml1/0011.xhtml", :strict => true)
|
170
|
+
end
|
171
|
+
|
172
|
+
it "should return 2 triples" do
|
173
|
+
@graph.size.should == 2
|
174
|
+
end
|
175
|
+
|
176
|
+
it "should have a triple for the dc:creator of the document" do
|
177
|
+
@graph.should have_triple([
|
178
|
+
RDF::URI('http://rdfa.digitalbazaar.com/test-suite/test-cases/xhtml1/0011.xhtml'),
|
179
|
+
RDF::DC11.creator,
|
180
|
+
"Albert Einstein"
|
181
|
+
])
|
182
|
+
end
|
183
|
+
|
184
|
+
it "should have an XML Literal for the dc:title of the document" do
|
185
|
+
@graph.should have_triple([
|
186
|
+
RDF::URI('http://rdfa.digitalbazaar.com/test-suite/test-cases/xhtml1/0011.xhtml'),
|
187
|
+
RDF::DC11.title,
|
188
|
+
RDF::Literal("E = mc<sup>2</sup>: The Most Urgent Problem of Our Time", :datatype => RDF.XMLLiteral)
|
189
|
+
])
|
190
|
+
end
|
191
|
+
end
|
192
|
+
|
193
|
+
context "parsing a document containing sereral bnodes" do
|
194
|
+
before :each do
|
195
|
+
sampledoc = <<-EOF
|
196
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
197
|
+
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML+RDFa 1.0//EN" "http://www.w3.org/MarkUp/DTD/xhtml-rdfa-1.dtd">
|
198
|
+
<html xmlns="http://www.w3.org/1999/xhtml" version="XHTML+RDFa 1.0"
|
199
|
+
xmlns:foaf="http://xmlns.com/foaf/0.1/">
|
200
|
+
<head>
|
201
|
+
<title>Test 0017</title>
|
202
|
+
</head>
|
203
|
+
<body>
|
204
|
+
<p>
|
205
|
+
<span about="[_:a]" property="foaf:name">Manu Sporny</span>
|
206
|
+
<span about="[_:a]" rel="foaf:knows" resource="[_:b]">knows</span>
|
207
|
+
<span about="[_:b]" property="foaf:name">Ralph Swick</span>.
|
208
|
+
</p>
|
209
|
+
</body>
|
210
|
+
</html>
|
211
|
+
EOF
|
212
|
+
|
213
|
+
@graph = parse(sampledoc, :base_uri => "http://rdfa.digitalbazaar.com/test-suite/test-cases/xhtml1/0017.xhtml", :strict => true)
|
214
|
+
end
|
215
|
+
|
216
|
+
it "should return 3 triples" do
|
217
|
+
@graph.size.should == 3
|
218
|
+
end
|
219
|
+
|
220
|
+
it "should have a triple for the foaf:name of BNode A" do
|
221
|
+
@graph.should have_triple([
|
222
|
+
RDF::Node('a'),
|
223
|
+
RDF::FOAF.name,
|
224
|
+
"Manu Sporny"
|
225
|
+
])
|
226
|
+
end
|
227
|
+
|
228
|
+
it "should have a triple for the foaf:name of BNode B" do
|
229
|
+
@graph.should have_triple([
|
230
|
+
RDF::Node('b'),
|
231
|
+
RDF::FOAF.name,
|
232
|
+
"Ralph Swick"
|
233
|
+
])
|
234
|
+
end
|
235
|
+
|
236
|
+
it "should have a triple for BNode A knows BNode B" do
|
237
|
+
@graph.should have_triple([
|
238
|
+
RDF::Node('a'),
|
239
|
+
RDF::FOAF.knows,
|
240
|
+
RDF::Node('b'),
|
241
|
+
])
|
242
|
+
end
|
30
243
|
end
|
31
244
|
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
</
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
245
|
+
context "parsing a document that uses the typeof attribute" do
|
246
|
+
before :each do
|
247
|
+
sampledoc = <<-EOF
|
248
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
249
|
+
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML+RDFa 1.0//EN" "http://www.w3.org/MarkUp/DTD/xhtml-rdfa-1.dtd">
|
250
|
+
<html xmlns="http://www.w3.org/1999/xhtml" version="XHTML+RDFa 1.0"
|
251
|
+
xmlns:foaf="http://xmlns.com/foaf/0.1/">
|
252
|
+
<head>
|
253
|
+
<title>Test 0049</title>
|
254
|
+
</head>
|
255
|
+
<body>
|
256
|
+
<div about="http://www.example.org/#me" typeof="foaf:Person">
|
257
|
+
<p property="foaf:name">John Doe</p>
|
258
|
+
</div>
|
259
|
+
</body>
|
260
|
+
</html>
|
261
|
+
EOF
|
262
|
+
|
263
|
+
@graph = parse(sampledoc, :base_uri => "http://rdfa.digitalbazaar.com/test-suite/test-cases/xhtml1/0049.xhtml", :strict => true)
|
264
|
+
end
|
265
|
+
|
266
|
+
it "should return 2 triples" do
|
267
|
+
@graph.size.should == 2
|
268
|
+
end
|
269
|
+
|
270
|
+
it "should have a triple stating that #me is of type foaf:Person" do
|
271
|
+
@graph.should have_triple([
|
272
|
+
RDF::URI('http://www.example.org/#me'),
|
273
|
+
RDF.type,
|
274
|
+
RDF::FOAF.Person
|
275
|
+
])
|
276
|
+
end
|
277
|
+
|
278
|
+
it "should have a triple stating that #me has name 'John Doe'" do
|
279
|
+
@graph.should have_triple([
|
280
|
+
RDF::URI('http://www.example.org/#me'),
|
281
|
+
RDF::FOAF.name,
|
282
|
+
RDF::Literal("John Doe")
|
283
|
+
])
|
284
|
+
end
|
50
285
|
end
|
51
286
|
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
</
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
287
|
+
context "parsing a document with a <base> tag in the <head>" do
|
288
|
+
before :each do
|
289
|
+
sampledoc = <<-EOF
|
290
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
291
|
+
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML+RDFa 1.0//EN" "http://www.w3.org/MarkUp/DTD/xhtml-rdfa-1.dtd">
|
292
|
+
<html xmlns="http://www.w3.org/1999/xhtml" version="XHTML+RDFa 1.0"
|
293
|
+
xmlns:dc="http://purl.org/dc/elements/1.1/">
|
294
|
+
<head>
|
295
|
+
<base href="http://www.example.org/"></base>
|
296
|
+
<title>Test 0072</title>
|
297
|
+
</head>
|
298
|
+
<body>
|
299
|
+
<p about="faq">
|
300
|
+
Learn more by reading the example.org
|
301
|
+
<span property="dc:title">Example FAQ</span>.
|
302
|
+
</p>
|
303
|
+
</body>
|
304
|
+
</html>
|
305
|
+
EOF
|
306
|
+
|
307
|
+
@graph = parse(sampledoc, :base_uri => "http://rdfa.digitalbazaar.com/test-suite/test-cases/xhtml1/0072.xhtml", :strict => true)
|
308
|
+
end
|
309
|
+
|
310
|
+
it "should return 1 triple" do
|
311
|
+
@graph.size.should == 1
|
312
|
+
end
|
313
|
+
|
314
|
+
it "should have the subject of the triple relative to the URI in base" do
|
315
|
+
@graph.should have_subject RDF::URI('http://www.example.org/faq')
|
316
|
+
end
|
67
317
|
end
|
68
318
|
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
319
|
+
context "parsing a document with a profile containing a prefix mapping" do
|
320
|
+
before :each do
|
321
|
+
sampledoc = <<-EOF
|
322
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
323
|
+
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML+RDFa 1.0//EN" "http://www.w3.org/MarkUp/DTD/xhtml-rdfa-1.dtd">
|
324
|
+
<html xmlns="http://www.w3.org/1999/xhtml" version="XHTML+RDFa 1.0">
|
325
|
+
<head>
|
326
|
+
<title>Test</title>
|
327
|
+
<base href="http://example.org/"/>
|
328
|
+
</head>
|
329
|
+
<body profile="http://www.w3.org/2007/08/pyRdfa/profiles/basic">
|
330
|
+
<div about="#me">
|
331
|
+
<p>
|
332
|
+
<span property="foaf:name">Ivan Herman</span>
|
333
|
+
</p>
|
334
|
+
</div>
|
335
|
+
</body>
|
336
|
+
</html>
|
337
|
+
EOF
|
338
|
+
|
339
|
+
basic = File.open(File.join(File.dirname(__FILE__), "..", "etc", "basic.html"))
|
340
|
+
basic_graph = RDF::Graph.new
|
341
|
+
RDF::RDFa::Reader.new(basic,
|
342
|
+
:base_uri => "http://www.w3.org/2007/08/pyRdfa/profiles/basic").each do |statement|
|
343
|
+
basic_graph << statement
|
344
|
+
end
|
345
|
+
|
346
|
+
RDF::Graph.stub!(:load).with("http://www.w3.org/2007/08/pyRdfa/profiles/basic",
|
347
|
+
:base_uri => "http://www.w3.org/2007/08/pyRdfa/profiles/basic",
|
348
|
+
:format => :rdfa).and_return(basic_graph)
|
349
|
+
|
350
|
+
@graph = parse(sampledoc, :strict => true)
|
351
|
+
@statement = @graph.statements.first
|
352
|
+
end
|
353
|
+
|
354
|
+
it "should return 1 triple" do
|
355
|
+
@graph.size.should == 1
|
356
|
+
end
|
357
|
+
|
358
|
+
it "should have a subject of http://example.org/#me" do
|
359
|
+
@statement.subject.should == RDF::URI('http://example.org/#me')
|
360
|
+
end
|
361
|
+
|
362
|
+
it "should have a predicate of foaf:name" do
|
363
|
+
@statement.predicate.should == RDF::FOAF.name
|
364
|
+
end
|
365
|
+
|
366
|
+
it "should have an object with the literal 'Ivan Herman'" do
|
367
|
+
@statement.object.should == RDF::Literal('Ivan Herman')
|
368
|
+
end
|
95
369
|
end
|
96
370
|
|
371
|
+
context "parsing a document with a profile containing a term mapping" do
|
372
|
+
before :each do
|
373
|
+
sampledoc = <<-EOF
|
374
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
375
|
+
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML+RDFa 1.0//EN" "http://www.w3.org/MarkUp/DTD/xhtml-rdfa-1.dtd">
|
376
|
+
<html xmlns="http://www.w3.org/1999/xhtml" version="XHTML+RDFa 1.0">
|
377
|
+
<head>
|
378
|
+
<title>Test</title>
|
379
|
+
<base href="http://example.org/"/>
|
380
|
+
</head>
|
381
|
+
<body profile="http://www.w3.org/2007/08/pyRdfa/profiles/foaf">
|
382
|
+
<div about="#me">
|
383
|
+
<p>
|
384
|
+
<span property="name">Ivan Herman</span>
|
385
|
+
</p>
|
386
|
+
</div>
|
387
|
+
</body>
|
388
|
+
</html>
|
389
|
+
EOF
|
390
|
+
|
391
|
+
foaf = File.open(File.join(File.dirname(__FILE__), "..", "etc", "foaf.html"))
|
392
|
+
foaf_graph = RDF::Graph.new
|
393
|
+
RDF::RDFa::Reader.new(foaf,
|
394
|
+
:base_uri => "http://www.w3.org/2007/08/pyRdfa/profiles/foaf").each do |statement|
|
395
|
+
foaf_graph << statement
|
396
|
+
end
|
397
|
+
|
398
|
+
RDF::Graph.stub!(:load).with("http://www.w3.org/2007/08/pyRdfa/profiles/foaf",
|
399
|
+
:base_uri => "http://www.w3.org/2007/08/pyRdfa/profiles/foaf",
|
400
|
+
:format => :rdfa).and_return(foaf_graph)
|
401
|
+
|
402
|
+
@graph = parse(sampledoc, :strict => true)
|
403
|
+
@statement = @graph.statements.first
|
404
|
+
end
|
405
|
+
|
406
|
+
it "should return 1 triple" do
|
407
|
+
@graph.size.should == 1
|
408
|
+
end
|
409
|
+
|
410
|
+
it "should have a subject of http://example.org/#me" do
|
411
|
+
@statement.subject.should == RDF::URI('http://example.org/#me')
|
412
|
+
end
|
413
|
+
|
414
|
+
it "should have a predicate of foaf:name" do
|
415
|
+
@statement.predicate.should == RDF::FOAF.name
|
416
|
+
end
|
97
417
|
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML+RDFa 1.0//EN" "http://www.w3.org/MarkUp/DTD/xhtml-rdfa-1.dtd">
|
102
|
-
<html xmlns="http://www.w3.org/1999/xhtml"
|
103
|
-
xmlns:foaf="http://xmlns.com/foaf/0.1/">
|
104
|
-
<head>
|
105
|
-
<title>Test 0017</title>
|
106
|
-
</head>
|
107
|
-
<body>
|
108
|
-
<p>
|
109
|
-
<span about="[_:a]" property="foaf:name">Manu Sporny</span>
|
110
|
-
<span about="[_:a]" rel="foaf:knows" resource="[_:b]">knows</span>
|
111
|
-
<span about="[_:b]" property="foaf:name">Ralph Swick</span>.
|
112
|
-
</p>
|
113
|
-
</body>
|
114
|
-
</html>
|
115
|
-
EOF
|
116
|
-
|
117
|
-
reader = RDF::RDFa::Reader.new(sampledoc, :base_uri => "http://rdfa.digitalbazaar.com/test-suite/test-cases/xhtml1/0011.xhtml", :strict => true)
|
118
|
-
|
119
|
-
reader.graph.size.should == 3
|
120
|
-
reader.graph.should have_object("Ralph Swick")
|
121
|
-
reader.graph.should have_object("Manu Sporny")
|
418
|
+
it "should have an object with the literal 'Ivan Herman'" do
|
419
|
+
@statement.object.should == RDF::Literal('Ivan Herman')
|
420
|
+
end
|
122
421
|
end
|
123
|
-
|
124
|
-
|
422
|
+
|
423
|
+
def self.test_cases(suite)
|
125
424
|
[] #RdfaHelper::TestCase.test_cases(suite)
|
425
|
+
end
|
426
|
+
|
427
|
+
# W3C Test suite from http://www.w3.org/2006/07/SWD/RDFa/testsuite/
|
428
|
+
%w(xhtml html4 html5).each do |suite|
|
429
|
+
describe "w3c #{suite} testcases" do
|
430
|
+
describe "that are approved" do
|
431
|
+
test_cases(suite).each do |t|
|
432
|
+
puts t.inspect
|
433
|
+
next unless t.status == "approved"
|
434
|
+
#next unless t.name =~ /0140/
|
435
|
+
specify "test #{t.name}: #{t.title}#{", (negative test)" unless t.expectedResults}" do
|
436
|
+
#puts t.input
|
437
|
+
#puts t.results
|
438
|
+
begin
|
439
|
+
t.run_test do |rdfa_string, rdfa_parser|
|
440
|
+
rdfa_parser.parse(rdfa_string, t.informationResourceInput, :debug => [])
|
441
|
+
end
|
442
|
+
rescue SparqlException => e
|
443
|
+
pending(e.message) { raise }
|
444
|
+
end
|
445
|
+
end
|
446
|
+
end
|
447
|
+
end
|
448
|
+
describe "that are unreviewed" do
|
449
|
+
test_cases(suite).each do |t|
|
450
|
+
next unless t.status == "unreviewed"
|
451
|
+
#next unless t.name =~ /0185/
|
452
|
+
#puts t.inspect
|
453
|
+
specify "test #{t.name}: #{t.title}#{", (negative test)" unless t.expectedResults}" do
|
454
|
+
begin
|
455
|
+
t.run_test do |rdfa_string, rdfa_parser|
|
456
|
+
rdfa_parser.parse(rdfa_string, t.informationResourceInput, :debug => [])
|
457
|
+
end
|
458
|
+
rescue SparqlException => e
|
459
|
+
pending(e.message) { raise }
|
460
|
+
rescue Spec::Expectations::ExpectationNotMetError => e
|
461
|
+
if t.name =~ /01[789]\d/
|
462
|
+
raise
|
463
|
+
else
|
464
|
+
pending() { raise }
|
465
|
+
end
|
466
|
+
end
|
467
|
+
end
|
468
|
+
end
|
469
|
+
end
|
126
470
|
end
|
471
|
+
end
|
127
472
|
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
puts t.inspect
|
134
|
-
next unless t.status == "approved"
|
135
|
-
#next unless t.name =~ /0140/
|
136
|
-
specify "test #{t.name}: #{t.title}#{", (negative test)" unless t.expectedResults}" do
|
137
|
-
#puts t.input
|
138
|
-
#puts t.results
|
139
|
-
begin
|
140
|
-
t.run_test do |rdfa_string, rdfa_parser|
|
141
|
-
rdfa_parser.parse(rdfa_string, t.informationResourceInput, :debug => [])
|
142
|
-
end
|
143
|
-
rescue SparqlException => e
|
144
|
-
pending(e.message) { raise }
|
145
|
-
end
|
146
|
-
end
|
147
|
-
end
|
148
|
-
end
|
149
|
-
describe "that are unreviewed" do
|
150
|
-
test_cases(suite).each do |t|
|
151
|
-
next unless t.status == "unreviewed"
|
152
|
-
#next unless t.name =~ /0185/
|
153
|
-
#puts t.inspect
|
154
|
-
specify "test #{t.name}: #{t.title}#{", (negative test)" unless t.expectedResults}" do
|
155
|
-
begin
|
156
|
-
t.run_test do |rdfa_string, rdfa_parser|
|
157
|
-
rdfa_parser.parse(rdfa_string, t.informationResourceInput, :debug => [])
|
158
|
-
end
|
159
|
-
rescue SparqlException => e
|
160
|
-
pending(e.message) { raise }
|
161
|
-
rescue Spec::Expectations::ExpectationNotMetError => e
|
162
|
-
if t.name =~ /01[789]\d/
|
163
|
-
raise
|
164
|
-
else
|
165
|
-
pending() { raise }
|
166
|
-
end
|
167
|
-
end
|
168
|
-
end
|
169
|
-
end
|
170
|
-
end
|
473
|
+
def parse(input, options)
|
474
|
+
@debug = []
|
475
|
+
graph = RDF::Graph.new
|
476
|
+
RDF::RDFa::Reader.new(input, options.merge(:debug => @debug)).each do |statement|
|
477
|
+
graph << statement
|
171
478
|
end
|
479
|
+
graph
|
172
480
|
end
|
173
|
-
|
481
|
+
|
482
|
+
end
|