rdf-rdfxml 0.3.2.1 → 0.3.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/.yardopts +2 -1
- data/History.rdoc +5 -0
- data/README +95 -0
- data/README.md +31 -11
- data/Rakefile +5 -7
- data/VERSION +1 -1
- data/lib/rdf/rdfxml/format.rb +1 -1
- data/lib/rdf/rdfxml/reader.rb +0 -13
- data/lib/rdf/rdfxml/writer.rb +67 -56
- data/lib/rdf/rdfxml.rb +15 -1
- data/rdf-rdfxml.gemspec +13 -11
- data/script/tc +1 -1
- data/spec/format_spec.rb +9 -9
- data/spec/matchers.rb +72 -54
- data/spec/rdf_test.rb +1 -22
- data/spec/reader_spec.rb +17 -23
- data/spec/spec_helper.rb +6 -18
- data/spec/writer_spec.rb +448 -238
- metadata +8 -6
data/spec/matchers.rb
CHANGED
@@ -1,61 +1,79 @@
|
|
1
|
-
|
2
|
-
class BeEquivalentGraph
|
3
|
-
Info = Struct.new(:about, :information, :trace, :compare, :inputDocument, :outputDocument)
|
4
|
-
def normalize(graph)
|
5
|
-
case graph
|
6
|
-
when RDF::Graph then graph
|
7
|
-
when IO, StringIO
|
8
|
-
RDF::Graph.new.load(graph, :base_uri => @info.about)
|
9
|
-
else
|
10
|
-
# Figure out which parser to use
|
11
|
-
g = RDF::Graph.new
|
12
|
-
reader_class = detect_format(graph)
|
13
|
-
reader_class.new(graph, :base_uri => @info.about).each {|s| g << s}
|
14
|
-
g
|
15
|
-
end
|
16
|
-
end
|
17
|
-
|
18
|
-
def initialize(expected, info)
|
19
|
-
@info = if info.respond_to?(:about)
|
20
|
-
info
|
21
|
-
elsif info.is_a?(Hash)
|
22
|
-
identifier = info[:identifier] || expected.is_a?(RDF::Graph) ? expected.context : info[:about]
|
23
|
-
trace = info[:trace]
|
24
|
-
trace = trace.join("\n") if trace.is_a?(Array)
|
25
|
-
Info.new(identifier, info[:information] || "", trace, info[:compare])
|
26
|
-
else
|
27
|
-
Info.new(expected.is_a?(RDF::Graph) ? expected.context : info, info.to_s)
|
28
|
-
end
|
29
|
-
@expected = normalize(expected)
|
30
|
-
end
|
1
|
+
require 'rspec/matchers'
|
31
2
|
|
32
|
-
|
33
|
-
|
34
|
-
|
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
|
35
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
|
36
29
|
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
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)
|
55
57
|
end
|
58
|
+
@expected = normalize(expected)
|
59
|
+
@actual = normalize(actual)
|
60
|
+
@actual.isomorphic_with?(@expected)
|
56
61
|
end
|
57
62
|
|
58
|
-
|
59
|
-
|
60
|
-
|
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
|
61
79
|
end
|
data/spec/rdf_test.rb
CHANGED
@@ -46,29 +46,8 @@ module Fixtures
|
|
46
46
|
).map {|a| v = self.send(a); "#{a}='#{v}'" if v}.compact.join(", ") +
|
47
47
|
"]"
|
48
48
|
end
|
49
|
-
|
50
|
-
# Run test case, yields input for parser to create triples
|
51
|
-
def run_test(options = {})
|
52
|
-
# Run
|
53
|
-
graph = yield
|
54
|
-
|
55
|
-
return unless self.outputDocument
|
56
|
-
|
57
|
-
case self.compare
|
58
|
-
when :none
|
59
|
-
# Don't check output, just parse to graph
|
60
|
-
when :array
|
61
|
-
@parser.graph.should be_equivalent_graph(self.output, self)
|
62
|
-
else
|
63
|
-
#puts "parse #{self.outputDocument} as #{RDF::Reader.for(self.outputDocument)}"
|
64
|
-
format = detect_format(self.output)
|
65
|
-
output_graph = RDF::Graph.load(self.outputDocument, :format => format, :base_uri => self.inputDocument)
|
66
|
-
puts "result: #{CGI.escapeHTML(graph.to_ntriples)}" if ::RDF::N3::debug?
|
67
|
-
graph.should Matchers::be_equivalent_graph(output_graph, self)
|
68
|
-
end
|
69
|
-
end
|
70
49
|
end
|
71
|
-
|
50
|
+
|
72
51
|
class PositiveParserTest < Entry
|
73
52
|
default_source :entries
|
74
53
|
type Test.PositiveParserTest
|
data/spec/reader_spec.rb
CHANGED
@@ -144,7 +144,7 @@ EOF
|
|
144
144
|
graph = parse(sampledoc, :base_uri => "http://example.com", :validate => true)
|
145
145
|
#puts @debug
|
146
146
|
graph.size.should == 10
|
147
|
-
# print graph.
|
147
|
+
# print graph.dump(:ntriples
|
148
148
|
# TODO: add datatype parsing
|
149
149
|
# TODO: make sure the BNode forging is done correctly - an internal element->nodeID mapping
|
150
150
|
# TODO: proper test
|
@@ -309,17 +309,17 @@ EOF
|
|
309
309
|
#puts t.inspect
|
310
310
|
specify "#{t.name}: " + (t.description || "#{t.inputDocument} against #{t.outputDocument}") do
|
311
311
|
begin
|
312
|
-
t.
|
313
|
-
t.
|
314
|
-
|
315
|
-
|
316
|
-
|
317
|
-
|
318
|
-
|
319
|
-
|
320
|
-
|
321
|
-
|
322
|
-
|
312
|
+
graph = RDF::Graph.new << @reader.new(t.input,
|
313
|
+
:base_uri => t.inputDocument,
|
314
|
+
:validate => false,
|
315
|
+
:debug => t.debug)
|
316
|
+
|
317
|
+
# Parse result graph
|
318
|
+
#puts "parse #{self.outputDocument} as #{RDF::Reader.for(self.outputDocument)}"
|
319
|
+
format = detect_format(t.output)
|
320
|
+
output_graph = RDF::Graph.load(t.outputDocument, :format => format, :base_uri => t.inputDocument)
|
321
|
+
puts "result: #{CGI.escapeHTML(graph.dump(:ntriples))}" if ::RDF::N3::debug?
|
322
|
+
graph.should be_equivalent_graph(output_graph, t)
|
323
323
|
rescue RSpec::Expectations::ExpectationNotMetError => e
|
324
324
|
if t.inputDocument =~ %r(xml-literal|xml-canon)
|
325
325
|
pending("XMLLiteral canonicalization not implemented yet")
|
@@ -339,17 +339,11 @@ EOF
|
|
339
339
|
#next unless t.name =~ /1/
|
340
340
|
#puts t.inspect
|
341
341
|
specify "test #{t.name}: " + (t.description || t.inputDocument) do
|
342
|
-
|
343
|
-
|
344
|
-
|
345
|
-
|
346
|
-
|
347
|
-
:validate => true).each do |statement|
|
348
|
-
g << statement
|
349
|
-
end
|
350
|
-
g.should be_empty
|
351
|
-
end.should raise_error(RDF::ReaderError)
|
352
|
-
end
|
342
|
+
lambda do
|
343
|
+
RDF::Graph.new << @reader.new(t.input,
|
344
|
+
:base_uri => t.inputDocument,
|
345
|
+
:validate => true)
|
346
|
+
end.should raise_error(RDF::ReaderError)
|
353
347
|
end
|
354
348
|
end
|
355
349
|
end
|
data/spec/spec_helper.rb
CHANGED
@@ -5,16 +5,14 @@ $:.unshift File.dirname(__FILE__)
|
|
5
5
|
require 'rubygems'
|
6
6
|
require 'rspec'
|
7
7
|
require 'matchers'
|
8
|
-
require 'bigdecimal' # XXX Remove Me
|
9
8
|
require 'rdf/rdfxml'
|
10
9
|
require 'rdf/ntriples'
|
11
10
|
require 'rdf/spec'
|
12
11
|
require 'rdf/spec/matchers'
|
13
12
|
require 'rdf/isomorphic'
|
13
|
+
require 'yaml' # XXX should be in open-uri/cached
|
14
14
|
require 'open-uri/cached'
|
15
15
|
|
16
|
-
include Matchers
|
17
|
-
|
18
16
|
# Create and maintain a cache of downloaded URIs
|
19
17
|
URI_CACHE = File.expand_path(File.join(File.dirname(__FILE__), "uri-cache"))
|
20
18
|
Dir.mkdir(URI_CACHE) unless File.directory?(URI_CACHE)
|
@@ -24,15 +22,6 @@ module RDF
|
|
24
22
|
module Isomorphic
|
25
23
|
alias_method :==, :isomorphic_with?
|
26
24
|
end
|
27
|
-
class Graph
|
28
|
-
def to_ntriples
|
29
|
-
RDF::Writer.for(:ntriples).buffer do |writer|
|
30
|
-
self.each_statement do |statement|
|
31
|
-
writer << statement
|
32
|
-
end
|
33
|
-
end
|
34
|
-
end
|
35
|
-
end
|
36
25
|
end
|
37
26
|
|
38
27
|
::RSpec.configure do |c|
|
@@ -41,7 +30,6 @@ end
|
|
41
30
|
c.exclusion_filter = {
|
42
31
|
:ruby => lambda { |version| !(RUBY_VERSION.to_s =~ /^#{version.to_s}/) },
|
43
32
|
}
|
44
|
-
c.include(Matchers)
|
45
33
|
c.include(RDF::Spec::Matchers)
|
46
34
|
end
|
47
35
|
|
@@ -56,10 +44,10 @@ def detect_format(stream)
|
|
56
44
|
string = stream.to_s
|
57
45
|
end
|
58
46
|
case string
|
59
|
-
when /<\w+:RDF/ then
|
60
|
-
when /<RDF/ then
|
61
|
-
#when /<html/i then
|
62
|
-
when /@prefix/i then
|
63
|
-
else
|
47
|
+
when /<\w+:RDF/ then :rdf
|
48
|
+
when /<RDF/ then :rdf
|
49
|
+
#when /<html/i then :rdfa
|
50
|
+
when /@prefix/i then :n3
|
51
|
+
else :ntriples
|
64
52
|
end
|
65
53
|
end
|