rdf-n3 0.2.2 → 0.2.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/History.txt +7 -0
- data/README.rdoc +3 -0
- data/Rakefile +7 -1
- data/VERSION +1 -1
- data/lib/rdf/n3.rb +3 -0
- data/lib/rdf/n3/reader.rb +14 -9
- data/lib/rdf/n3/reader/n3_grammar.rb +148 -260
- data/lib/rdf/n3/reader/n3_grammar.treetop +21 -21
- data/lib/rdf/n3/reader/n3_grammar_18.rb +3764 -0
- data/lib/rdf/n3/reader/n3_grammar_18.treetop +227 -0
- data/lib/rdf/n3/version.rb +4 -7
- data/lib/rdf/n3/writer.rb +61 -25
- data/rdf-n3.gemspec +7 -7
- data/script/parse +2 -2
- data/script/tc +1 -1
- data/spec/n3reader_spec.rb +53 -5
- data/spec/rdf_helper.rb +6 -6
- metadata +11 -9
- data/lib/rdf/n3/patches/literal_normalization.rb +0 -158
- data/lib/rdf/n3/patches/uri_hacks.rb +0 -29
data/script/parse
CHANGED
@@ -5,7 +5,7 @@ require 'rdf/n3'
|
|
5
5
|
require 'getoptlong'
|
6
6
|
|
7
7
|
def parse(input, base)
|
8
|
-
puts RDF::Writer.for($format.to_sym).buffer { |writer|
|
8
|
+
puts RDF::Writer.for($format.to_sym).buffer(:base_uri => base) { |writer|
|
9
9
|
RDF::N3::Reader.new(input, :base_uri => base, :strict => true).each do |statement|
|
10
10
|
writer << statement
|
11
11
|
end
|
@@ -32,7 +32,7 @@ opts.each do |opt, arg|
|
|
32
32
|
case opt
|
33
33
|
when '--verbose' then $verbose = true
|
34
34
|
when '--quiet' then $quiet = true
|
35
|
-
when '--debug' then
|
35
|
+
when '--debug' then ::RDF::N3::debug = true
|
36
36
|
when '--execute' then input = arg
|
37
37
|
when '--format' then $format = arg
|
38
38
|
when '--uri' then base_uri = arg
|
data/script/tc
CHANGED
@@ -30,7 +30,7 @@ opts.each do |opt, arg|
|
|
30
30
|
case opt
|
31
31
|
when '--verbose' then $verbose = true
|
32
32
|
when '--quiet' then $quiet = true
|
33
|
-
when '--debug' then
|
33
|
+
when '--debug' then ::RDF::N3::debug = true
|
34
34
|
when '--format' then $format = arg
|
35
35
|
when '--suite' then suite = arg
|
36
36
|
when '--strict' then $strict = true
|
data/spec/n3reader_spec.rb
CHANGED
@@ -134,8 +134,23 @@ describe "RDF::N3::Reader" do
|
|
134
134
|
"tab:\t" => ':a :b "tab:\t" .',
|
135
135
|
"é" => ':a :b "\u00E9" .',
|
136
136
|
"€" => ':a :b "\u20AC" .',
|
137
|
+
"resumé" => ':a :resume "resum\u00E9" .',
|
137
138
|
}.each_pair do |contents, triple|
|
138
|
-
specify "test #{
|
139
|
+
specify "test #{triple}" do
|
140
|
+
graph = parse(triple, :base_uri => "http://a/b")
|
141
|
+
statement = graph.statements.first
|
142
|
+
graph.size.should == 1
|
143
|
+
statement.object.value.should == contents
|
144
|
+
end
|
145
|
+
end
|
146
|
+
|
147
|
+
{
|
148
|
+
'Dürst' => ':a :b "Dürst" .',
|
149
|
+
"é" => ':a :b "é" .',
|
150
|
+
"€" => ':a :b "€" .',
|
151
|
+
"resumé" => ':a :resume "resumé" .',
|
152
|
+
}.each_pair do |contents, triple|
|
153
|
+
specify "test #{triple}" do
|
139
154
|
graph = parse(triple, :base_uri => "http://a/b")
|
140
155
|
statement = graph.statements.first
|
141
156
|
graph.size.should == 1
|
@@ -246,6 +261,12 @@ describe "RDF::N3::Reader" do
|
|
246
261
|
end
|
247
262
|
end
|
248
263
|
|
264
|
+
it "should allow mixed-case language" do
|
265
|
+
n3doc = %(:x2 :p "xyz"@EN .)
|
266
|
+
statement = parse(n3doc).statements.first
|
267
|
+
statement.object.to_ntriples.should == %("xyz"@en)
|
268
|
+
end
|
269
|
+
|
249
270
|
it "should create typed literals" do
|
250
271
|
n3doc = "<http://example.org/joe> <http://xmlns.com/foaf/0.1/name> \"Joe\"^^<http://www.w3.org/2001/XMLSchema#string> ."
|
251
272
|
statement = parse(n3doc).statements.first
|
@@ -271,6 +292,25 @@ describe "RDF::N3::Reader" do
|
|
271
292
|
end
|
272
293
|
end
|
273
294
|
|
295
|
+
{
|
296
|
+
%(<#Dürst> :knows :jane.) => '<http://a/b#D\u00FCrst> <http://a/b#knows> <http://a/b#jane> .',
|
297
|
+
%(:Dürst :knows :jane.) => '<http://a/b#D\u00FCrst> <http://a/b#knows> <http://a/b#jane> .',
|
298
|
+
%(:bob :resumé "Bob's non-normalized resumé".) => '<http://a/b#bob> <http://a/b#resumé> "Bob\'s non-normalized resumé" .',
|
299
|
+
%(:alice :resumé "Alice's normalized resumé".) => '<http://a/b#alice> <http://a/b#resumé> "Alice\'s normalized resumé" .',
|
300
|
+
}.each_pair do |n3, nt|
|
301
|
+
it "for '#{n3}'" do
|
302
|
+
begin
|
303
|
+
parse(n3, :base_uri => "http://a/b").should be_equivalent_graph(nt, :about => "http://a/b", :trace => @debug)
|
304
|
+
rescue
|
305
|
+
if defined?(::Encoding)
|
306
|
+
raise
|
307
|
+
else
|
308
|
+
pending("Unicode URIs not supported in Ruby 1.8") { raise }
|
309
|
+
end
|
310
|
+
end
|
311
|
+
end
|
312
|
+
end
|
313
|
+
|
274
314
|
{
|
275
315
|
%(<#Dürst> a "URI straight in UTF8".) => %(<http://a/b#D\\u00FCrst> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> "URI straight in UTF8" .),
|
276
316
|
#%(:a :related :ひらがな .) => %(<http://a/b#a> <http://a/b#related> <http://a/b#\\u3072\\u3089\\u304C\\u306A> .),
|
@@ -442,9 +482,13 @@ describe "RDF::N3::Reader" do
|
|
442
482
|
parse(n3, :base_uri => "http://a/b").should be_equivalent_graph(nt, :about => "http://a/b", :trace => @debug)
|
443
483
|
end
|
444
484
|
|
445
|
-
it "should do something for @forAll"
|
485
|
+
it "should do something for @forAll" do
|
486
|
+
pending
|
487
|
+
end
|
446
488
|
|
447
|
-
it "should do something for @forSome"
|
489
|
+
it "should do something for @forSome" do
|
490
|
+
pending
|
491
|
+
end
|
448
492
|
end
|
449
493
|
|
450
494
|
describe "namespaces" do
|
@@ -784,9 +828,13 @@ describe "RDF::N3::Reader" do
|
|
784
828
|
end
|
785
829
|
|
786
830
|
describe "formulae" do
|
787
|
-
it "should require that graph be formula_aware when encountering a formlua"
|
831
|
+
it "should require that graph be formula_aware when encountering a formlua" do
|
832
|
+
pending
|
833
|
+
end
|
788
834
|
|
789
|
-
it "should separate triples between specified and quoted graphs"
|
835
|
+
it "should separate triples between specified and quoted graphs" do
|
836
|
+
pending
|
837
|
+
end
|
790
838
|
end
|
791
839
|
|
792
840
|
describe "object lists" do
|
data/spec/rdf_helper.rb
CHANGED
@@ -52,24 +52,24 @@ module RdfHelper
|
|
52
52
|
pred = statement.predicate.to_s.split(/[\#\/]/).last
|
53
53
|
obj = statement.object.is_a?(RDF::Literal) ? statement.object.value : statement.object.to_s
|
54
54
|
|
55
|
-
puts "#{pred}: #{obj}" if
|
55
|
+
puts "#{pred}: #{obj}" if ::RDF::N3::debug?
|
56
56
|
if statement.predicate == RDF.type
|
57
57
|
self.rdf_type = obj.to_s.split(/[\#\/]/).last
|
58
58
|
#puts statement.subject.to_s
|
59
59
|
elsif pred =~ /Document\Z/i
|
60
|
-
puts "sub #{uri_prefix} in #{obj} for #{test_dir}" if
|
60
|
+
puts "sub #{uri_prefix} in #{obj} for #{test_dir}" if ::RDF::N3::debug?
|
61
61
|
about = obj.dup
|
62
62
|
obj.sub!(uri_prefix, test_dir)
|
63
|
-
puts " => #{obj}" if
|
63
|
+
puts " => #{obj}" if ::RDF::N3::debug?
|
64
64
|
self.send("#{pred}=", obj)
|
65
65
|
if pred == "inputDocument"
|
66
66
|
self.about ||= about
|
67
67
|
self.name ||= statement.subject.to_s.split(/[\#\/]/).last
|
68
68
|
end
|
69
69
|
elsif pred == "referenceOutput"
|
70
|
-
puts "referenceOutput: #{obj}" if
|
70
|
+
puts "referenceOutput: #{obj}" if ::RDF::N3::debug?
|
71
71
|
outputDocument = obj.sub(uri_prefix, test_dir)
|
72
|
-
puts "referenceOutput: " + self.send(pred) if
|
72
|
+
puts "referenceOutput: " + self.send(pred) if ::RDF::N3::debug?
|
73
73
|
elsif self.respond_to?("#{pred}=")
|
74
74
|
self.send("#{pred}=", obj)
|
75
75
|
end
|
@@ -130,7 +130,7 @@ module RdfHelper
|
|
130
130
|
@parser.graph.should be_equivalent_graph(self.output, self)
|
131
131
|
else
|
132
132
|
output_graph = RDF::Graph.load(self.outputDocument, :format => detect_format(self.outputDocument))
|
133
|
-
puts "result: #{CGI.escapeHTML(graph.to_ntriples)}" if
|
133
|
+
puts "result: #{CGI.escapeHTML(graph.to_ntriples)}" if ::RDF::N3::debug?
|
134
134
|
graph.should Matchers::be_equivalent_graph(output_graph, self)
|
135
135
|
end
|
136
136
|
end
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rdf-n3
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 17
|
5
5
|
prerelease: false
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 2
|
9
|
-
-
|
10
|
-
version: 0.2.
|
9
|
+
- 3
|
10
|
+
version: 0.2.3
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Gregg Kellogg
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2010-
|
18
|
+
date: 2010-11-10 00:00:00 -08:00
|
19
19
|
default_executable:
|
20
20
|
dependencies:
|
21
21
|
- !ruby/object:Gem::Dependency
|
@@ -56,12 +56,14 @@ dependencies:
|
|
56
56
|
requirement: &id003 !ruby/object:Gem::Requirement
|
57
57
|
none: false
|
58
58
|
requirements:
|
59
|
-
- - "
|
59
|
+
- - "="
|
60
60
|
- !ruby/object:Gem::Version
|
61
|
-
hash:
|
61
|
+
hash: 27
|
62
62
|
segments:
|
63
|
+
- 1
|
64
|
+
- 3
|
63
65
|
- 0
|
64
|
-
version:
|
66
|
+
version: 1.3.0
|
65
67
|
type: :development
|
66
68
|
version_requirements: *id003
|
67
69
|
- !ruby/object:Gem::Dependency
|
@@ -147,13 +149,13 @@ files:
|
|
147
149
|
- lib/rdf/n3/format.rb
|
148
150
|
- lib/rdf/n3/patches/array_hacks.rb
|
149
151
|
- lib/rdf/n3/patches/graph_properties.rb
|
150
|
-
- lib/rdf/n3/patches/literal_normalization.rb
|
151
152
|
- lib/rdf/n3/patches/qname_hacks.rb
|
152
153
|
- lib/rdf/n3/patches/seq.rb
|
153
|
-
- lib/rdf/n3/patches/uri_hacks.rb
|
154
154
|
- lib/rdf/n3/reader.rb
|
155
155
|
- lib/rdf/n3/reader/n3_grammar.rb
|
156
156
|
- lib/rdf/n3/reader/n3_grammar.treetop
|
157
|
+
- lib/rdf/n3/reader/n3_grammar_18.rb
|
158
|
+
- lib/rdf/n3/reader/n3_grammar_18.treetop
|
157
159
|
- lib/rdf/n3/version.rb
|
158
160
|
- lib/rdf/n3/vocab.rb
|
159
161
|
- lib/rdf/n3/writer.rb
|
@@ -1,158 +0,0 @@
|
|
1
|
-
# Use Nokogiri or LibXML when available, and REXML otherwise:
|
2
|
-
begin
|
3
|
-
require 'nokogiri'
|
4
|
-
rescue LoadError => e
|
5
|
-
begin
|
6
|
-
require 'libxml'
|
7
|
-
rescue LoadError => e
|
8
|
-
:rexml
|
9
|
-
end
|
10
|
-
end
|
11
|
-
|
12
|
-
module RDF; class Literal
|
13
|
-
##
|
14
|
-
# An XML literal.
|
15
|
-
#
|
16
|
-
# @see http://www.w3.org/TR/rdf-concepts/#section-XMLLiteral
|
17
|
-
# @see http://www.w3.org/TR/rdfa-core/#s_xml_literals
|
18
|
-
# @since 0.2.1
|
19
|
-
class XML < Literal
|
20
|
-
##
|
21
|
-
# @param [Object] value
|
22
|
-
# @option options [String] :lexical (nil)
|
23
|
-
# @option options [Hash] :namespaces ({}) Use :__default__ or "" to declare default namespace
|
24
|
-
# @option options [Symbol] :language (nil)
|
25
|
-
# @option options [Symbol] :library (:nokogiri, :libxml, or :rexml)
|
26
|
-
def initialize(value, options = {})
|
27
|
-
options[:namespaces] ||= {}
|
28
|
-
|
29
|
-
@library = case options[:library]
|
30
|
-
when nil
|
31
|
-
case
|
32
|
-
when defined?(::Nokogiri) then :nokogiri
|
33
|
-
when defined?(::LibXML) then :libxml
|
34
|
-
else :rexml
|
35
|
-
end
|
36
|
-
when :nokogiri, :libxml, :rexml
|
37
|
-
options[:library]
|
38
|
-
else
|
39
|
-
raise ArgumentError.new("expected :rexml, :libxml or :nokogiri, but got #{options[:library].inspect}")
|
40
|
-
end
|
41
|
-
|
42
|
-
@datatype = options[:datatype] || DATATYPE
|
43
|
-
@string = options[:lexical] if options.has_key?(:lexical)
|
44
|
-
@object = parse_value(value, options)
|
45
|
-
@string = serialize_nodeset(@object)
|
46
|
-
end
|
47
|
-
|
48
|
-
##
|
49
|
-
# Converts the literal into its canonical lexical representation.
|
50
|
-
#
|
51
|
-
# @return [Literal]
|
52
|
-
# @see http://www.w3.org/TR/xml-exc-c14n/
|
53
|
-
def canonicalize
|
54
|
-
# This is the opportunity to use exclusive canonicalization library
|
55
|
-
self
|
56
|
-
end
|
57
|
-
|
58
|
-
##
|
59
|
-
# Returns the value as a string.
|
60
|
-
#
|
61
|
-
# @return [String]
|
62
|
-
def to_s
|
63
|
-
@string
|
64
|
-
end
|
65
|
-
|
66
|
-
private
|
67
|
-
|
68
|
-
def parse_value(value, options)
|
69
|
-
ns_hash = {}
|
70
|
-
options[:namespaces].each_pair do |prefix, uri|
|
71
|
-
prefix = prefix == :__default__ ? "" : prefix.to_s
|
72
|
-
attr = prefix.empty? ? "xmlns" : "xmlns:#{prefix}"
|
73
|
-
ns_hash[attr] = uri.to_s
|
74
|
-
end
|
75
|
-
ns_strs = []
|
76
|
-
ns_hash.each_pair {|a, u| ns_strs << "#{a}=\"#{u}\""}
|
77
|
-
|
78
|
-
case @library
|
79
|
-
when :nokogiri then parse_value_nokogiri(value, ns_strs, options[:language])
|
80
|
-
when :libxml then parse_value_libxml(value, ns_strs, options[:language])
|
81
|
-
when :rexml then parse_value_rexml(value, ns_strs, options[:language])
|
82
|
-
else value.to_s
|
83
|
-
end
|
84
|
-
end
|
85
|
-
|
86
|
-
def serialize_nodeset(object)
|
87
|
-
case @library
|
88
|
-
when :nokogiri then serialize_nodeset_nokogiri(object)
|
89
|
-
when :libxml then serialize_nodeset_libxml(object)
|
90
|
-
when :rexml then serialize_nodeset_rexml(object)
|
91
|
-
else object
|
92
|
-
end
|
93
|
-
end
|
94
|
-
|
95
|
-
# Nokogiri implementations
|
96
|
-
if defined?(::Nokogiri)
|
97
|
-
# A somewhat half-hearted attempt at C14N.
|
98
|
-
# Main problem is that it promotes all namespaces to top element, instead of demoting them
|
99
|
-
# to the required element, and does not properly order either namespaces or attributes.
|
100
|
-
#
|
101
|
-
# An open-issue in Nokogiri is to add support for C14N from the underlying libxml2 libraries.
|
102
|
-
def parse_value_nokogiri(value, ns_strs, language)
|
103
|
-
elements = if value.is_a?(Nokogiri::XML::NodeSet)
|
104
|
-
value
|
105
|
-
else
|
106
|
-
# Add inherited namespaces to created root element so that they're inherited to sub-elements
|
107
|
-
Nokogiri::XML::Document.parse("<foo #{ns_strs.join(" ")}>#{value.to_s}</foo>").root.children
|
108
|
-
end
|
109
|
-
|
110
|
-
elements.map do |c|
|
111
|
-
if c.is_a?(Nokogiri::XML::Element)
|
112
|
-
c = Nokogiri::XML.parse(c.dup.to_xml(:save_with => Nokogiri::XML::Node::SaveOptions::NO_EMPTY_TAGS)).root
|
113
|
-
# Gather namespaces from self and decendant nodes
|
114
|
-
c.traverse do |n|
|
115
|
-
ns = n.namespace
|
116
|
-
next unless ns
|
117
|
-
prefix = ns.prefix ? "xmlns:#{ns.prefix}" : "xmlns"
|
118
|
-
c[prefix] = ns.href.to_s unless c.namespaces[prefix]
|
119
|
-
end
|
120
|
-
|
121
|
-
# Add language
|
122
|
-
if language && c["lang"].to_s.empty?
|
123
|
-
c["xml:lang"] = language.to_s
|
124
|
-
end
|
125
|
-
end
|
126
|
-
c
|
127
|
-
end
|
128
|
-
end
|
129
|
-
|
130
|
-
def serialize_nodeset_nokogiri(object)
|
131
|
-
object.map {|c| c.to_xml(:save_with => Nokogiri::XML::Node::SaveOptions::NO_EMPTY_TAGS)}.join("")
|
132
|
-
end
|
133
|
-
end # Nokogiri
|
134
|
-
|
135
|
-
if defined?(::LibXML)
|
136
|
-
# This should use Document#canonicalize if as and when it is available in libxml-ruby
|
137
|
-
def parse_value_libxml(value, ns_strs, language)
|
138
|
-
# Fixme
|
139
|
-
end
|
140
|
-
|
141
|
-
def serialize_nodeset_libxml(object)
|
142
|
-
# Fixme
|
143
|
-
end
|
144
|
-
end # LibXML
|
145
|
-
|
146
|
-
# REXML
|
147
|
-
# This could make use of the XMLCanonicalizer gem (http://rubygems.org/gems/XMLCanonicalizer)
|
148
|
-
# But, it hasn't been touched since 2007 and relies on log4r.
|
149
|
-
def parse_value_rexml(value, ns_strs, language)
|
150
|
-
# Fixme
|
151
|
-
end
|
152
|
-
|
153
|
-
def serialize_nodeset_rexml(object)
|
154
|
-
# Fixme
|
155
|
-
end
|
156
|
-
|
157
|
-
end # class XML
|
158
|
-
end; end
|
@@ -1,29 +0,0 @@
|
|
1
|
-
module RDF
|
2
|
-
class URI
|
3
|
-
##
|
4
|
-
# Joins several URIs together.
|
5
|
-
#
|
6
|
-
# @param [Array<String, URI, #to_str>] uris
|
7
|
-
# @return [URI]
|
8
|
-
#
|
9
|
-
# GK -- don't add a "/" at the end of URIs, due to rdfcore/xmlbase/test002.rdf
|
10
|
-
def join(*uris)
|
11
|
-
result = @uri
|
12
|
-
uris.each do |uri|
|
13
|
-
# result.path += '/' unless result.path.match(/[\#\/]$/) || uri.to_s[0..0] == "#"
|
14
|
-
result = result.join(uri)
|
15
|
-
end
|
16
|
-
self.class.new(result)
|
17
|
-
end
|
18
|
-
|
19
|
-
# From http://www.w3.org/TR/2004/REC-rdf-concepts-20040210/#section-Graph-URIref
|
20
|
-
#
|
21
|
-
# A URI Reference within an RDF graph is a Unicode string that:
|
22
|
-
# * does not contain any control characters ( #x00 - #x1F, #x7F-#x9F)
|
23
|
-
# * and would produce a valid URI character sequence (per RFC2396 [URI], sections 2.1) representing an absolute URI with optional fragment identifier when subjected to the encoding described below.
|
24
|
-
#
|
25
|
-
# The encoding consists of:
|
26
|
-
# 1. encoding the Unicode string as UTF-8 [RFC-2279], giving a sequence of octet values.
|
27
|
-
# 2. %-escaping octets that do not correspond to permitted US-ASCII characters.
|
28
|
-
end
|
29
|
-
end
|