rdf-rdfa 0.0.2 → 0.0.3
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/.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
|