rdf-n3 0.2.3.2 → 0.3.0
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 +1 -0
- data/.yardopts +4 -3
- data/{History.txt → History.md} +30 -6
- data/{README.rdoc → README.md} +56 -19
- data/Rakefile +15 -29
- data/VERSION +1 -1
- data/example-files/sp2b.n3 +50177 -0
- data/lib/rdf/n3.rb +2 -2
- data/lib/rdf/n3/reader.rb +560 -367
- data/lib/rdf/n3/reader/meta.rb +640 -0
- data/lib/rdf/n3/reader/n3-selectors.n3 +0 -0
- data/lib/rdf/n3/reader/parser.rb +229 -0
- data/lib/rdf/n3/vocab.rb +1 -0
- data/lib/rdf/n3/writer.rb +324 -265
- data/rdf-n3.gemspec +24 -26
- data/script/build_meta +242 -0
- data/script/parse +62 -13
- data/script/tc +4 -4
- data/spec/cwm_spec.rb +11 -3
- data/spec/n3reader_spec.rb +233 -63
- data/spec/rdf_helper.rb +15 -15
- data/spec/spec_helper.rb +10 -4
- data/spec/swap_spec.rb +11 -35
- data/spec/swap_test/n3parser.tests +14 -14
- data/spec/swap_test/n3parser.yml +0 -19
- data/spec/swap_test/nodeID/classes.ref.rdf +1 -1
- data/spec/swap_test/ref/contexts-1.n3 +12 -0
- data/spec/swap_test/ref/prefix2.rdf +33 -0
- data/spec/swap_test/ref/strquot.n3 +0 -1
- data/spec/swap_test/ref/xml-syntax-basic-serialization.rdf +1 -1
- data/spec/swap_test/regression.n3 +5 -5
- data/spec/swap_test/regression.yml +53 -23
- data/spec/turtle/manifest-bad.yml +91 -0
- data/spec/turtle/manifest.yml +187 -0
- data/spec/turtle_spec.rb +12 -20
- data/spec/writer_spec.rb +39 -37
- metadata +43 -48
- data/lib/rdf/n3/patches/qname_hacks.rb +0 -57
- data/lib/rdf/n3/patches/seq.rb +0 -34
- data/lib/rdf/n3/reader/n3_grammar.rb +0 -3764
- data/lib/rdf/n3/reader/n3_grammar.treetop +0 -227
- data/lib/rdf/n3/reader/n3_grammar_18.rb +0 -3764
- data/lib/rdf/n3/reader/n3_grammar_18.treetop +0 -227
- data/spec/literal_spec.rb +0 -245
data/script/tc
CHANGED
@@ -2,12 +2,12 @@
|
|
2
2
|
require 'rubygems'
|
3
3
|
$:.unshift(File.expand_path(File.join(File.dirname(__FILE__), "..", 'lib')))
|
4
4
|
require 'rdf/n3'
|
5
|
-
require 'spec
|
5
|
+
require File.expand_path(File.join(File.dirname(__FILE__), "..", 'spec', 'rdfa_helper'))
|
6
6
|
require 'getoptlong'
|
7
7
|
|
8
8
|
def run_tc(tc)
|
9
9
|
puts "run #{tc.name}"
|
10
|
-
puts RDF::Writer.for($
|
10
|
+
puts RDF::Writer.for($output_format.to_sym).buffer { |writer|
|
11
11
|
RDF::N3::Reader.new(tc.input, :base_uri => tc.about, :strict => $strict).each do |statement|
|
12
12
|
writer << statement
|
13
13
|
end
|
@@ -15,7 +15,7 @@ def run_tc(tc)
|
|
15
15
|
end
|
16
16
|
|
17
17
|
$verbose = false
|
18
|
-
$
|
18
|
+
$output_format = :ntriples
|
19
19
|
$strict = false
|
20
20
|
suite = "turtle"
|
21
21
|
opts = GetoptLong.new(
|
@@ -31,7 +31,7 @@ opts.each do |opt, arg|
|
|
31
31
|
when '--verbose' then $verbose = true
|
32
32
|
when '--quiet' then $quiet = true
|
33
33
|
when '--debug' then ::RDF::N3::debug = true
|
34
|
-
when '--format' then $
|
34
|
+
when '--format' then $output_format = arg
|
35
35
|
when '--suite' then suite = arg
|
36
36
|
when '--strict' then $strict = true
|
37
37
|
end
|
data/spec/cwm_spec.rb
CHANGED
@@ -12,11 +12,19 @@ describe RDF::N3::Reader do
|
|
12
12
|
|
13
13
|
# Negative parser tests should raise errors.
|
14
14
|
test_cases.each do |t|
|
15
|
+
next unless t.about.to_s =~ /n3$/
|
15
16
|
#next unless t.about.uri.to_s =~ /rdfms-rdf-names-use/
|
16
|
-
#next unless t.name =~ /
|
17
|
+
#next unless t.name =~ /1018/
|
17
18
|
#puts t.inspect
|
18
|
-
specify "test #{t.name}:
|
19
|
+
specify "test #{t.name}: #{t.description}: #{t.inputDocument} against #{t.outputDocument}" do
|
19
20
|
begin
|
21
|
+
if t.name =~ /1018/
|
22
|
+
pending("matcher does not stop")
|
23
|
+
next
|
24
|
+
elsif t.rdf_type == "CwmProofTest"
|
25
|
+
pending("proofs not supported")
|
26
|
+
next
|
27
|
+
end
|
20
28
|
t.run_test do |rdf_string|
|
21
29
|
t.debug = []
|
22
30
|
g = RDF::Graph.new
|
@@ -28,7 +36,7 @@ describe RDF::N3::Reader do
|
|
28
36
|
end
|
29
37
|
g
|
30
38
|
end
|
31
|
-
rescue
|
39
|
+
rescue RSpec::Expectations::ExpectationNotMetError => e
|
32
40
|
if t.status == "pending"
|
33
41
|
pending("Formulae not supported") { raise }
|
34
42
|
else
|
data/spec/n3reader_spec.rb
CHANGED
@@ -264,7 +264,7 @@ describe "RDF::N3::Reader" do
|
|
264
264
|
it "should allow mixed-case language" do
|
265
265
|
n3doc = %(:x2 :p "xyz"@EN .)
|
266
266
|
statement = parse(n3doc).statements.first
|
267
|
-
statement.object.to_ntriples.should == %("xyz"@
|
267
|
+
statement.object.to_ntriples.should == %("xyz"@EN)
|
268
268
|
end
|
269
269
|
|
270
270
|
it "should create typed literals" do
|
@@ -343,32 +343,13 @@ describe "RDF::N3::Reader" do
|
|
343
343
|
end
|
344
344
|
end
|
345
345
|
|
346
|
-
|
347
|
-
# {
|
348
|
-
# %(:y :p1 "xyz"^^xsd:integer .) => %r(Typed literal has an invalid lexical value: .* "xyz"),
|
349
|
-
# %(:y :p1 "12xyz"^^xsd:integer .) => %r(Typed literal has an invalid lexical value: .* "12xyz"),
|
350
|
-
# %(:y :p1 "xy.z"^^xsd:double .) => %r(Typed literal has an invalid lexical value: .* "xy\.z"),
|
351
|
-
# %(:y :p1 "+1.0z"^^xsd:double .) => %r(Typed literal has an invalid lexical value: .* "\+1.0z"),
|
352
|
-
# %(:a :b .) => %r(Illegal statment: ".*" missing object),
|
353
|
-
# %(:a :b 'single quote' .) => RDF::ReaderError,
|
354
|
-
# %(:a "literal value" :b .) => RDF::ReaderError,
|
355
|
-
# %(@keywords prefix. :e prefix :f .) => %r(Keyword ".*" used as expression)
|
356
|
-
# }.each_pair do |n3, error|
|
357
|
-
# it "should raise error for '#{n3}'" do
|
358
|
-
# lambda {
|
359
|
-
# parse("@prefix xsd: <http://www.w3.org/2001/XMLSchema#> . #{n3}", :base_uri => "http://a/b")
|
360
|
-
# }.should raise_error(error)
|
361
|
-
# end
|
362
|
-
# end
|
363
|
-
# end
|
364
|
-
|
365
|
-
describe "with n3 grammer" do
|
346
|
+
describe "with n3 grammar" do
|
366
347
|
describe "syntactic expressions" do
|
367
348
|
it "should create typed literals with qname" do
|
368
349
|
n3doc = %(
|
369
|
-
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
|
370
|
-
@prefix foaf: <http://xmlns.com/foaf/0.1/>
|
371
|
-
@prefix xsd: <http://www.w3.org/2001/XMLSchema#>
|
350
|
+
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
|
351
|
+
@prefix foaf: <http://xmlns.com/foaf/0.1/> .
|
352
|
+
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .
|
372
353
|
<http://example.org/joe> foaf:name \"Joe\"^^xsd:string .
|
373
354
|
)
|
374
355
|
statement = parse(n3doc).statements.first
|
@@ -482,16 +463,50 @@ describe "RDF::N3::Reader" do
|
|
482
463
|
parse(n3, :base_uri => "http://a/b").should be_equivalent_graph(nt, :about => "http://a/b", :trace => @debug)
|
483
464
|
end
|
484
465
|
|
485
|
-
it "
|
486
|
-
|
466
|
+
it "substitutes variable for URI with @forAll" do
|
467
|
+
n3 = %(@forAll :x . :x :y :z .)
|
468
|
+
g = parse(n3, :base_uri => "http://a/b")
|
469
|
+
statement = g.statements.first
|
470
|
+
statement.subject.should be_a(RDF::Query::Variable)
|
471
|
+
statement.predicate.to_s.should == "http://a/b#y"
|
472
|
+
statement.object.to_s.should == "http://a/b#z"
|
473
|
+
end
|
474
|
+
|
475
|
+
it "substitutes variable for URIs with @forAll" do
|
476
|
+
n3 = %(@forAll :x, :y, :z . :x :y :z .)
|
477
|
+
g = parse(n3, :base_uri => "http://a/b")
|
478
|
+
statement = g.statements.first
|
479
|
+
statement.subject.should be_a(RDF::Query::Variable)
|
480
|
+
statement.predicate.should be_a(RDF::Query::Variable)
|
481
|
+
statement.object.should be_a(RDF::Query::Variable)
|
482
|
+
statement.subject.should_not == statement.predicate
|
483
|
+
statement.object.should_not == statement.predicate
|
484
|
+
statement.predicate.should_not == statement.object
|
487
485
|
end
|
488
486
|
|
489
|
-
it "
|
490
|
-
|
487
|
+
it "substitutes node for URI with @forEach" do
|
488
|
+
n3 = %(@forSome :x . :x :y :z .)
|
489
|
+
g = parse(n3, :base_uri => "http://a/b")
|
490
|
+
statement = g.statements.first
|
491
|
+
statement.subject.should be_a(RDF::Node)
|
492
|
+
statement.predicate.to_s.should == "http://a/b#y"
|
493
|
+
statement.object.to_s.should == "http://a/b#z"
|
494
|
+
end
|
495
|
+
|
496
|
+
it "substitutes node for URIs with @forEach" do
|
497
|
+
n3 = %(@forSome :x, :y, :z . :x :y :z .)
|
498
|
+
g = parse(n3, :base_uri => "http://a/b")
|
499
|
+
statement = g.statements.first
|
500
|
+
statement.subject.should be_a(RDF::Node)
|
501
|
+
statement.predicate.should be_a(RDF::Node)
|
502
|
+
statement.object.should be_a(RDF::Node)
|
503
|
+
statement.subject.should_not == statement.predicate
|
504
|
+
statement.object.should_not == statement.predicate
|
505
|
+
statement.predicate.should_not == statement.object
|
491
506
|
end
|
492
507
|
end
|
493
508
|
|
494
|
-
describe "
|
509
|
+
describe "prefixes" do
|
495
510
|
it "should not append # for http://foo/bar" do
|
496
511
|
n3 = %(@prefix : <http://foo/bar> . :a : :b .)
|
497
512
|
nt = %(
|
@@ -562,11 +577,27 @@ describe "RDF::N3::Reader" do
|
|
562
577
|
)
|
563
578
|
parse(n3, :base_uri => "http://a/b").should be_equivalent_graph(nt, :about => "http://a/b", :trace => @debug)
|
564
579
|
end
|
580
|
+
|
581
|
+
it "returns defined prefixes" do
|
582
|
+
n3 = %(
|
583
|
+
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
|
584
|
+
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
|
585
|
+
@prefix : <http://test/> .
|
586
|
+
:foo a rdfs:Class.
|
587
|
+
:bar :d :c.
|
588
|
+
:a :d :c.
|
589
|
+
)
|
590
|
+
reader = RDF::N3::Reader.new(n3)
|
591
|
+
reader.each {|statement|}
|
592
|
+
reader.prefixes.should == {
|
593
|
+
:rdf => "http://www.w3.org/1999/02/22-rdf-syntax-ns#",
|
594
|
+
:rdfs => "http://www.w3.org/2000/01/rdf-schema#",
|
595
|
+
nil => "http://test/"}
|
596
|
+
end
|
565
597
|
end
|
566
598
|
|
567
599
|
describe "keywords" do
|
568
600
|
[
|
569
|
-
%(prefix :<>.),
|
570
601
|
%(base <>.),
|
571
602
|
%(keywords a.),
|
572
603
|
%(:a is :b of :c.),
|
@@ -577,10 +608,19 @@ describe "RDF::N3::Reader" do
|
|
577
608
|
it "should require @ if keywords set to empty for '#{n3}'" do
|
578
609
|
lambda do
|
579
610
|
parse("@keywords . #{n3}", :base_uri => "http://a/b")
|
580
|
-
end.should raise_error(
|
611
|
+
end.should raise_error(RDF::ReaderError)
|
581
612
|
end
|
582
613
|
end
|
583
614
|
|
615
|
+
[
|
616
|
+
%(prefix :<>.),
|
617
|
+
].each do |n3|
|
618
|
+
it "parses as local name if keywords set to empty for '#{n3}'" do
|
619
|
+
lambda do
|
620
|
+
parse("@keywords . #{n3}", :base_uri => "http://a/b")
|
621
|
+
end.should_not raise_error(RDF::ReaderError)
|
622
|
+
end
|
623
|
+
end
|
584
624
|
{
|
585
625
|
%(:a a :b) => %(<http://a/b#a> <http://a/b#a> <http://a/b#b> .),
|
586
626
|
%(:a :b true) => %(<http://a/b#a> <http://a/b#b> <http://a/b#true> .),
|
@@ -611,7 +651,7 @@ describe "RDF::N3::Reader" do
|
|
611
651
|
n3 = %(@keywords foo.)
|
612
652
|
lambda do
|
613
653
|
parse(n3, :base_uri => "http://a/b")
|
614
|
-
end.should raise_error(RDF::ReaderError,
|
654
|
+
end.should raise_error(RDF::ReaderError, /Undefined keywords used: foo/)
|
615
655
|
end
|
616
656
|
end
|
617
657
|
|
@@ -744,12 +784,6 @@ describe "RDF::N3::Reader" do
|
|
744
784
|
end
|
745
785
|
|
746
786
|
describe "from paths" do
|
747
|
-
it "should create bnode for path x.p" do
|
748
|
-
n3 = %(:x2.:y2 :p2 "3" .)
|
749
|
-
nt = %(:x2 :y2 _:bnode0 . _:bnode0 :p2 "3" .)
|
750
|
-
parse(n3, :base_uri => "http://a/b").should be_equivalent_graph(nt, :about => "http://a/b", :trace => @debug)
|
751
|
-
end
|
752
|
-
|
753
787
|
it "should create bnode for path x!p" do
|
754
788
|
n3 = %(:x2!:y2 :p2 "3" .)
|
755
789
|
nt = %(:x2 :y2 _:bnode0 . _:bnode0 :p2 "3" .)
|
@@ -794,7 +828,7 @@ describe "RDF::N3::Reader" do
|
|
794
828
|
it "should decode path with property list." do
|
795
829
|
n3 = %(
|
796
830
|
@prefix a: <http://a/ns#>.
|
797
|
-
:a2
|
831
|
+
:a2!a:b2!a:c2 :q1 "3" ; :q2 "4" , "5" .
|
798
832
|
)
|
799
833
|
nt = %(
|
800
834
|
:a2 <http://a/ns#b2> _:bnode0 .
|
@@ -816,7 +850,7 @@ describe "RDF::N3::Reader" do
|
|
816
850
|
end
|
817
851
|
|
818
852
|
it "should decode path as object(2)" do
|
819
|
-
n3 = %(@prefix a: <http://a/ns#>. :r :p :o
|
853
|
+
n3 = %(@prefix a: <http://a/ns#>. :r :p :o!a:p1!a:p2 .)
|
820
854
|
nt = %(
|
821
855
|
:o <http://a/ns#p1> _:bnode0 .
|
822
856
|
_:bnode0 <http://a/ns#p2> _:bnode1 .
|
@@ -828,12 +862,67 @@ describe "RDF::N3::Reader" do
|
|
828
862
|
end
|
829
863
|
|
830
864
|
describe "formulae" do
|
831
|
-
|
832
|
-
|
865
|
+
before(:each) { @repo = RDF::Repository.new }
|
866
|
+
|
867
|
+
it "creates an RDF::Graph instance for formula" do
|
868
|
+
n3 = %(:a :b {})
|
869
|
+
parse(n3, :graph => @repo, :base_uri => "http://a/b")
|
870
|
+
statement = @repo.statements.first
|
871
|
+
statement.object.should be_a(RDF::Node)
|
872
|
+
end
|
873
|
+
|
874
|
+
it "adds statements with context" do
|
875
|
+
|
876
|
+
end
|
877
|
+
|
878
|
+
it "creates variables with ?" do
|
879
|
+
|
833
880
|
end
|
834
881
|
|
835
|
-
|
836
|
-
|
882
|
+
context "contexts" do
|
883
|
+
before(:each) do
|
884
|
+
n3 = %(
|
885
|
+
# Test data in notation3 http://www.w3.org/DesignIssues/Notation3.html
|
886
|
+
#
|
887
|
+
@prefix u: <http://www.example.org/utilities#> .
|
888
|
+
@prefix : <#> .
|
889
|
+
|
890
|
+
:assumption = { :fred u:knows :john .
|
891
|
+
:john u:knows :mary .} .
|
892
|
+
|
893
|
+
:conclusion = { :fred u:knows :mary . } .
|
894
|
+
|
895
|
+
# The empty context is trivially true.
|
896
|
+
# Check that we can input it and output it!
|
897
|
+
|
898
|
+
:trivialTruth = { }.
|
899
|
+
|
900
|
+
# ENDS
|
901
|
+
)
|
902
|
+
@repo = RDF::Repository.new
|
903
|
+
parse(n3, :graph => @repo, :base_uri => "http://a/b")
|
904
|
+
end
|
905
|
+
|
906
|
+
it "assumption graph has 2 statements" do
|
907
|
+
tt = @repo.first(:subject => RDF::URI.new("http://a/b#assumption"), :predicate => RDF::OWL.sameAs)
|
908
|
+
tt.object.should be_a(RDF::Node)
|
909
|
+
@repo.query(:context => tt.object).to_a.length.should == 2
|
910
|
+
end
|
911
|
+
|
912
|
+
it "conclusion graph has 1 statements" do
|
913
|
+
tt = @repo.first(:subject => RDF::URI.new("http://a/b#conclusion"), :predicate => RDF::OWL.sameAs)
|
914
|
+
tt.object.should be_a(RDF::Node)
|
915
|
+
@repo.query(:context => tt.object).to_a.length.should == 1
|
916
|
+
end
|
917
|
+
|
918
|
+
it "trivialTruth equivalent to empty graph" do
|
919
|
+
tt = @repo.first(:subject => RDF::URI.new("http://a/b#trivialTruth"), :predicate => RDF::OWL.sameAs)
|
920
|
+
tt.object.should be_a(RDF::Node)
|
921
|
+
@repo.query(:context => tt.object) do |s|
|
922
|
+
puts "statement: #{s}"
|
923
|
+
end
|
924
|
+
end
|
925
|
+
|
837
926
|
end
|
838
927
|
end
|
839
928
|
|
@@ -919,34 +1008,43 @@ describe "RDF::N3::Reader" do
|
|
919
1008
|
nt = %(<http://www.w3.org/1999/02/22-rdf-syntax-ns#nil> <http://foo/a#prop> "nilProp" .)
|
920
1009
|
parse(n3, :base_uri => "http://a/b").should be_equivalent_graph(nt, :about => "http://a/b", :trace => @debug)
|
921
1010
|
end
|
1011
|
+
|
922
1012
|
it "should parse with compound items" do
|
923
1013
|
n3 = %(
|
924
|
-
|
925
|
-
|
926
|
-
|
927
|
-
|
928
|
-
|
929
|
-
|
930
|
-
|
931
|
-
|
1014
|
+
@prefix a: <http://foo/a#> .
|
1015
|
+
a:a a:p (
|
1016
|
+
[ a:p2 "v1" ]
|
1017
|
+
<http://resource1>
|
1018
|
+
<http://resource2>
|
1019
|
+
("inner list")
|
1020
|
+
) .
|
1021
|
+
<http://resource1> a:p "value" .
|
932
1022
|
)
|
933
1023
|
nt = %(
|
934
|
-
<http://foo/a#a> <http://foo/a#p> _:
|
935
|
-
_:bnode5 <http://www.w3.org/1999/02/22-rdf-syntax-ns#first> _:bnode4 .
|
936
|
-
_:bnode5 <http://www.w3.org/1999/02/22-rdf-syntax-ns#rest> _:bnode2 .
|
937
|
-
_:bnode4 <http://foo/a#p2> "v1" .
|
938
|
-
_:bnode2 <http://www.w3.org/1999/02/22-rdf-syntax-ns#first> <http://resource1> .
|
1024
|
+
<http://foo/a#a> <http://foo/a#p> _:bnode3 .
|
939
1025
|
<http://resource1> <http://foo/a#p> "value" .
|
1026
|
+
_:bnode3 <http://www.w3.org/1999/02/22-rdf-syntax-ns#first> _:bnode5 .
|
1027
|
+
_:bnode3 <http://www.w3.org/1999/02/22-rdf-syntax-ns#rest> _:bnode2 .
|
1028
|
+
_:bnode5 <http://foo/a#p2> "v1" .
|
1029
|
+
_:bnode2 <http://www.w3.org/1999/02/22-rdf-syntax-ns#first> <http://resource1> .
|
940
1030
|
_:bnode2 <http://www.w3.org/1999/02/22-rdf-syntax-ns#rest> _:bnode1 .
|
941
1031
|
_:bnode1 <http://www.w3.org/1999/02/22-rdf-syntax-ns#first> <http://resource2> .
|
942
1032
|
_:bnode1 <http://www.w3.org/1999/02/22-rdf-syntax-ns#rest> _:bnode0 .
|
943
|
-
_:bnode0 <http://www.w3.org/1999/02/22-rdf-syntax-ns#first> _:
|
1033
|
+
_:bnode0 <http://www.w3.org/1999/02/22-rdf-syntax-ns#first> _:bnode4 .
|
944
1034
|
_:bnode0 <http://www.w3.org/1999/02/22-rdf-syntax-ns#rest> <http://www.w3.org/1999/02/22-rdf-syntax-ns#nil> .
|
945
|
-
_:
|
946
|
-
_:
|
1035
|
+
_:bnode4 <http://www.w3.org/1999/02/22-rdf-syntax-ns#first> "inner list" .
|
1036
|
+
_:bnode4 <http://www.w3.org/1999/02/22-rdf-syntax-ns#rest> <http://www.w3.org/1999/02/22-rdf-syntax-ns#nil> .
|
947
1037
|
)
|
948
1038
|
g = parse(n3, :base_uri => "http://a/b")
|
949
|
-
|
1039
|
+
g.subjects.to_a.length.should == 8
|
1040
|
+
n = g.first_object(:subject => RDF::URI.new("http://foo/a#a"), :predicate => RDF::URI.new("http://foo/a#p"))
|
1041
|
+
n.should be_a(RDF::Node)
|
1042
|
+
seq = RDF::List.new(n, g)
|
1043
|
+
seq.to_a.length.should == 4
|
1044
|
+
seq.first.should be_a(RDF::Node)
|
1045
|
+
seq.second.should == RDF::URI.new("http://resource1")
|
1046
|
+
seq.third.should == RDF::URI.new("http://resource2")
|
1047
|
+
seq.fourth.should be_a(RDF::Node)
|
950
1048
|
end
|
951
1049
|
|
952
1050
|
end
|
@@ -1031,6 +1129,78 @@ describe "RDF::N3::Reader" do
|
|
1031
1129
|
end
|
1032
1130
|
end
|
1033
1131
|
|
1132
|
+
describe "canonicalization" do
|
1133
|
+
# {
|
1134
|
+
# "<http://foo>" => "<http://foo>",
|
1135
|
+
# "<http://foo/a>" => "<http://foo/a>",
|
1136
|
+
# "<http://foo#a>" => "<http://foo#a>",
|
1137
|
+
#
|
1138
|
+
# "<http://foo/>" => "<http://foo/>",
|
1139
|
+
# "<http://foo/#a>" => "<http://foo/#a>",
|
1140
|
+
#
|
1141
|
+
# "<http://foo#>" => "<http://foo#>",
|
1142
|
+
# "<http://foo#a>" => "<http://foo/a>",
|
1143
|
+
# "<http://foo#/a>" => "<http://foo/a>",
|
1144
|
+
# "<http://foo##a>" => "<http://foo#a>",
|
1145
|
+
#
|
1146
|
+
# "<http://foo/bar>" => "<http://foo/bar>",
|
1147
|
+
# "<http://foo/bar>" => "<http://foo/a>",
|
1148
|
+
# "<http://foo/bar/a>" => "<http://foo/a>",
|
1149
|
+
# "<http://foo/bar#a>" => "<http://foo/bar#a>",
|
1150
|
+
#
|
1151
|
+
# "<http://foo/bar/>" => "<http://foo/bar/>",
|
1152
|
+
# "<http://foo/bar/a>" => "<http://foo/bar/a>",
|
1153
|
+
# "<http://foo/bar//a>" => "<http://foo/a>",
|
1154
|
+
# "<http://foo/bar/#a>" => "<http://foo/bar/#a>",
|
1155
|
+
#
|
1156
|
+
# "<http://foo/bar#>" => "<http://foo/bar#>",
|
1157
|
+
# "<http://foo/bar#a>" => "<http://foo/a>",
|
1158
|
+
# "<http://foo/bar#/a>" => "<http://foo/a>",
|
1159
|
+
# "<http://foo/bar##a>" => "<http://foo/bar#a>",
|
1160
|
+
#
|
1161
|
+
# "<http://foo/bar##D%C3%BCrst>" => "<http://foo/bar#D%C3%BCrst>",
|
1162
|
+
# "<http://foo/bar##Dürst>" => "<http://foo/bar#D\\u00FCrst>",
|
1163
|
+
# }.each_pair do |input, result|
|
1164
|
+
# it "returns subject #{result} given #{input}" do
|
1165
|
+
# n3 = %(#{input} a :b)
|
1166
|
+
# nt = %(#{result} <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://a/b#b> .)
|
1167
|
+
# parse(n3, :base_uri => "http://a/b", :canonicalize => true).should be_equivalent_graph(nt, :about => "http://a/b", :trace => @debug)
|
1168
|
+
# end
|
1169
|
+
# end
|
1170
|
+
|
1171
|
+
{
|
1172
|
+
%("+1"^^xsd:integer) => %("1"^^<http://www.w3.org/2001/XMLSchema#integer>),
|
1173
|
+
%(+1) => %("1"^^<http://www.w3.org/2001/XMLSchema#integer>),
|
1174
|
+
%(true) => %("true"^^<http://www.w3.org/2001/XMLSchema#boolean>),
|
1175
|
+
%("lang"@EN) => %("lang"@en),
|
1176
|
+
}.each_pair do |input, result|
|
1177
|
+
it "returns object #{result} given #{input}" do
|
1178
|
+
n3 = %(@prefix xsd: <http://www.w3.org/2001/XMLSchema#> . :a :b #{input} .)
|
1179
|
+
nt = %(<http://a/b#a> <http://a/b#b> #{result} .)
|
1180
|
+
parse(n3, :base_uri => "http://a/b", :canonicalize => true).should be_equivalent_graph(nt, :about => "http://a/b", :trace => @debug)
|
1181
|
+
end
|
1182
|
+
end
|
1183
|
+
end
|
1184
|
+
|
1185
|
+
describe "validation" do
|
1186
|
+
{
|
1187
|
+
%(:y :p1 "xyz"^^xsd:integer .) => %r("xyz" is not a valid .*),
|
1188
|
+
%(:y :p1 "12xyz"^^xsd:integer .) => %r("12xyz" is not a valid .*),
|
1189
|
+
%(:y :p1 "xy.z"^^xsd:double .) => %r("xy\.z" is not a valid .*),
|
1190
|
+
%(:y :p1 "+1.0z"^^xsd:double .) => %r("\+1.0z" is not a valid .*),
|
1191
|
+
%(:a :b .) =>RDF::ReaderError,
|
1192
|
+
%(:a :b 'single quote' .) => RDF::ReaderError,
|
1193
|
+
%(:a "literal value" :b .) => RDF::ReaderError,
|
1194
|
+
%(@keywords prefix. :e prefix :f .) => RDF::ReaderError
|
1195
|
+
}.each_pair do |n3, error|
|
1196
|
+
it "should raise '#{error}' for '#{n3}'" do
|
1197
|
+
lambda {
|
1198
|
+
parse("@prefix xsd: <http://www.w3.org/2001/XMLSchema#> . #{n3}", :base_uri => "http://a/b", :validate => true)
|
1199
|
+
}.should raise_error(error)
|
1200
|
+
end
|
1201
|
+
end
|
1202
|
+
end
|
1203
|
+
|
1034
1204
|
it "should parse rdf_core testcase" do
|
1035
1205
|
sampledoc = <<-EOF;
|
1036
1206
|
<http://www.w3.org/2000/10/rdf-tests/rdfcore/xmlbase/Manifest.rdf#test001> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/2000/10/rdf-tests/rdfcore/testSchema#PositiveParserTest> .
|
@@ -1052,8 +1222,8 @@ EOF
|
|
1052
1222
|
|
1053
1223
|
def parse(input, options = {})
|
1054
1224
|
@debug = []
|
1055
|
-
graph = RDF::Graph.new
|
1056
|
-
RDF::N3::Reader.new(input,
|
1225
|
+
graph = options[:graph] || RDF::Graph.new
|
1226
|
+
RDF::N3::Reader.new(input, {:debug => @debug, :validate => true, :canonicalize => false}.merge(options)).each do |statement|
|
1057
1227
|
graph << statement
|
1058
1228
|
end
|
1059
1229
|
graph
|