rdf-n3 0.3.1.1 → 0.3.1.2

Sign up to get free protection for your applications and to get access to all the features.
data/.yardopts CHANGED
@@ -9,3 +9,4 @@
9
9
  History.md
10
10
  AUTHORS
11
11
  VERSION
12
+ UNLICENSE
data/History.md CHANGED
@@ -1,3 +1,7 @@
1
+ 0.3.1.2
2
+ -----
3
+ * Normalize language tags to lower case.
4
+
1
5
  0.3.1.1
2
6
  -----
3
7
  * Assert formats for :ttl, :turtle, and :notation3 in addition to :n3
data/README.md CHANGED
@@ -1,134 +1,130 @@
1
1
  RDF::N3 reader/writer
2
2
  =====================
3
- Notation-3 and Turtle reader/writer for RDF.rb.
3
+ Notation-3 and Turtle reader/writer for [RDF.rb][RDF.rb] .
4
4
 
5
5
  Description
6
6
  -----------
7
- RDF::N3 is an Notation-3 parser for Ruby using the RDF.rb library suite.
7
+ RDF::N3 is an Notation-3 parser for Ruby using the [RDF.rb][RDF.rb] library suite.
8
8
 
9
9
  Reader inspired from TimBL predictiveParser and Python librdf implementation.
10
10
 
11
11
  Features
12
12
  --------
13
- RDF::N3 parses Notation-3, Turtle and N-Triples into statements or triples. It also serializes to Turtle.
13
+ RDF::N3 parses [Notation-3][N3], [Turtle][Turtle] and [N-Triples][N-Triples] into statements or triples. It also serializes to Turtle.
14
14
 
15
- * Fully compliant N3-rdf parser
16
- * Also parses Turtle and N-Triples
17
- * Turtle serializer
15
+ Install with `gem install rdf-n3`
18
16
 
19
- Install with 'gem install rdf-n3'
20
-
21
- Limitations
22
- -----------
17
+ ## Limitations
23
18
  * Full support of Unicode input requires Ruby version 1.9 or greater.
24
19
  * Support for Variables in Formulae dependent on underlying repository. Existential variables are quantified to RDF::Node instances, Universals to RDF::Query::Variable, with the URI of the variable target used as the variable name.
25
20
  * No support for N3 Reification. If there were, it would be through a :reify option to the reader.
26
21
 
27
- Usage
28
- -----
22
+ ## Usage
29
23
  Instantiate a reader from a local file:
30
24
 
31
- RDF::N3::Reader.open("etc/foaf.n3") do |reader|
32
- reader.each_statement do |statement|
33
- puts statement.inspect
25
+ RDF::N3::Reader.open("etc/foaf.n3") do |reader|
26
+ reader.each_statement do |statement|
27
+ puts statement.inspect
28
+ end
34
29
  end
35
- end
36
30
 
37
- Define @base and @prefix definitions, and use for serialization using :base_uri an :prefixes options
31
+ Define `@base` and `@prefix` definitions, and use for serialization using `:base_uri` an `:prefixes` options
38
32
 
39
33
  Write a graph to a file:
40
34
 
41
- RDF::N3::Writer.open("etc/test.n3") do |writer|
42
- writer << graph
43
- end
35
+ RDF::N3::Writer.open("etc/test.n3") do |writer|
36
+ writer << graph
37
+ end
44
38
 
45
- Formulae
46
- --------
47
- N3 Formulae are introduced with the { statmenent-list } syntax. A given formula is assigned an RDF::Node instance, which is also used as the context for RDF::Statement instances provided to RDF::N3::Reader#each_statement. For example, the following N3 generates the associated statements:
39
+ ### Formulae
40
+ N3 Formulae are introduced with the { statement-list } syntax. A given formula is assigned an RDF::Node instance, which is also used as the context for RDF::Statement instances provided to RDF::N3::Reader#each_statement. For example, the following N3 generates the associated statements:
48
41
 
49
- { [ x:firstname "Ora" ] dc:wrote [ dc:title "Moby Dick" ] } a n3:falsehood .
42
+ { [ x:firstname "Ora" ] dc:wrote [ dc:title "Moby Dick" ] } a n3:falsehood .
50
43
 
51
44
  results in
52
45
 
53
- f = RDF::Node.new
54
- s = RDF::Node.new
55
- o = RDF::Node.new
56
- RDF::Statement(f, rdf:type n3:falsehood)
57
- RDF::Statement(s, x:firstname, "Ora", :context => f)
58
- RDF::Statement(s, dc:wrote, o, :context => f)
59
- RDF::Statement(o, dc:title, "Moby Dick", :context => f)
46
+ f = RDF::Node.new
47
+ s = RDF::Node.new
48
+ o = RDF::Node.new
49
+ RDF::Statement(f, rdf:type n3:falsehood)
50
+ RDF::Statement(s, x:firstname, "Ora", :context => f)
51
+ RDF::Statement(s, dc:wrote, o, :context => f)
52
+ RDF::Statement(o, dc:title, "Moby Dick", :context => f)
60
53
 
61
- Variables
62
- ---------
54
+ ### Variables
63
55
  N3 Variables are introduced with @forAll, @forEach, or ?x. Variables reference URIs described in formulae, typically defined in the default vocabulary (e.g., ":x"). Existential variables are replaced with an allocated RDF::Node instance. Universal variables are replaced with a RDF::Query::Variable instance. For example, the following N3 generates the associated statements:
64
56
 
65
- @forAll <#h>. @forSome <#g>. <#g> <#loves> <#h> .
57
+ @forAll <#h>. @forSome <#g>. <#g> <#loves> <#h> .
66
58
 
67
59
  results in:
68
60
 
69
- h = RDF::Query::Variable.new(<#h>)
70
- g = RDF::Node.new()
71
- RDF::Statement.new(f, <#loves>, h)
61
+ h = RDF::Query::Variable.new(<#h>)
62
+ g = RDF::Node.new()
63
+ RDF::Statement.new(f, <#loves>, h)
72
64
 
73
- Implementation Notes
74
- --------------------
65
+ ## Implementation Notes
75
66
  The parser is driven through a rules table contained in lib/rdf/n3/reader/meta.rb. This includes
76
67
  branch rules to indicate productions to be taken based on a current production. Terminals are denoted
77
68
  through a set of regular expressions used to match each type of terminal.
78
69
 
79
- The meta.rb file is generated from lib/rdf/n3/reader/n3-selectors.n3
70
+ The [meta.rb][file:lib/rdf/n3/reader/meta.rb] file is generated from lib/rdf/n3/reader/n3-selectors.n3
80
71
  (taken from http://www.w3.org/2000/10/swap/grammar/n3-selectors.n3) which is the result of parsing
81
72
  http://www.w3.org/2000/10/swap/grammar/n3.n3 (along with bnf-rules.n3) using cwm using the following command sequence:
82
73
 
83
74
  cwm n3.n3 bnf-rules.n3 --think --purge --data > n3-selectors.n3
84
75
 
85
- n3-selectors.n3 is itself used to generate meta.rb using script/build_meta.
86
-
87
- Dependencies
88
- ------------
89
- * [RDF.rb](http://rubygems.org/gems/rdf) (>= 0.3.0)
90
-
91
- Resources
92
- ---------
93
- * Distiller[http://kellogg-assoc/distiller]
94
- * RDoc[http://rdoc.info/projects/gkellogg/rdf-n3]
95
- * History[http://github.com/gkellogg/rdf-n3/blob/master/History.txt]
96
- * "N3 Specification"[http://www.w3.org/DesignIssues/Notation3.html]
97
- * "N3 Primer"[http://www.w3.org/2000/10/swap/Primer.html]
98
- * "N3 Reification"[http://www.w3.org/DesignIssues/Reify.html]
99
- * Turtle[http://www.w3.org/TeamSubmission/turtle/]
100
- * "RDF Tests"[http://www.w3.org/2000/10/rdf-tests/rdfcore/allTestCases.html]
101
- * "W3C Turtle Test suite"[http://www.w3.org/2000/10/swap/test/regression.n3]
102
-
103
- License
104
- -------
105
- (The MIT License)
106
-
107
- Copyright (c) 2009-2010 Gregg Kellogg
108
-
109
- Permission is hereby granted, free of charge, to any person obtaining
110
- a copy of this software and associated documentation files (the
111
- 'Software'), to deal in the Software without restriction, including
112
- without limitation the rights to use, copy, modify, merge, publish,
113
- distribute, sublicense, and/or sell copies of the Software, and to
114
- permit persons to whom the Software is furnished to do so, subject to
115
- the following conditions:
116
-
117
- The above copyright notice and this permission notice shall be
118
- included in all copies or substantial portions of the Software.
119
-
120
- THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
121
- EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
122
- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
123
- IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
124
- CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
125
- TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
126
- SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
76
+ [n3-selectors.n3][file:lib/rdf/n3/reader/n3-selectors.rb] is itself used to generate meta.rb using script/build_meta.
77
+
78
+ ## TODO
79
+ * Generate Formulae and solutions using BGP and SPARQL CONSTRUCT mechanisms
80
+ * Create equivalent to `--think` to iterate on solutions.
81
+
82
+ ## Dependencies
83
+ * [RDF.rb](http://rubygems.org/gems/rdf) (>= 0.3.1)
84
+
85
+ ## Documentation
86
+ Full documentation available on [RubyForge](http://rdf.rubyforge.org/n3)
87
+
88
+ ### Principle Classes
89
+ * {RDF::N3}
90
+ * {RDF::N3::Format}
91
+ * {RDF::N3::Reader}
92
+ * {RDF::N3::Writer}
93
+
94
+ ### Additional vocabularies
95
+ * {RDF::LOG}
96
+ * {RDF::REI}
97
+
98
+ ### Patches
99
+ * {Array}
100
+ * {RDF::Graph}
101
+
102
+ ## Resources
103
+ * [RDF.rb][RDF.rb]
104
+ * [Distiller](http://distiller.kellogg-assoc)
105
+ * [Documentation](http://rdf.rubyforge.org/n3)
106
+ * [History](file:file.History.html)
107
+ * [Notation-3][N3]
108
+ * [N3 Primer](http://www.w3.org/2000/10/swap/Primer.html)
109
+ * [N3 Reification](http://www.w3.org/DesignIssues/Reify.html)
110
+ * [Turtle][Turtle]
111
+ * [W3C SWAP Test suite](http://www.w3.org/2000/10/swap/test/README.html)
112
+ * [W3C Turtle Test suite](http://www.w3.org/2001/sw/DataAccess/df1/tests/README.txt)
113
+ * [N-Triples][N-Triples]
114
+
115
+ ## License
116
+
117
+ This is free and unencumbered public domain software. For more information,
118
+ see <http://unlicense.org/> or the accompanying {file:UNLICENSE} file.
127
119
 
128
120
  Feedback
129
121
  --------
130
- * gregg@kellogg-assoc.com
131
- * rubygems.org/rdf-n3
132
- * github.com/gkellogg/rdf-n3
133
- * gkellogg.lighthouseapp.com for bug reports
134
- * public-rdf-ruby mailing list on w3.org
122
+ * <gregg@kellogg-assoc.com>
123
+ * <http://rubygems.org/gem/rdf-n3>
124
+ * <http://github.com/gkellogg/rdf-n3>
125
+ * <http://lists.w3.org/Archives/Public/public-rdf-ruby/>
126
+
127
+ [RDF.rb]: http://rdf.rubyforge.org/
128
+ [N3]: http://www.w3.org/DesignIssues/Notation3.html "Notation-3"
129
+ [Turtle]: http://www.w3.org/TeamSubmission/turtle/
130
+ [N-Triples]: http://www.w3.org/2001/sw/RDFCore/ntriples/
data/Rakefile CHANGED
@@ -19,7 +19,7 @@ begin
19
19
  gemspec.add_development_dependency('rdf-rdfxml', '>= 0.3.1')
20
20
  gemspec.add_development_dependency('rdf-isomorphic', '>= 0.3.4')
21
21
  gemspec.add_development_dependency('yard')
22
- gemspec.extra_rdoc_files = %w(README.md History.md AUTHORS VERSION)
22
+ gemspec.extra_rdoc_files = %w(README.md History.md AUTHORS VERSION UNLICENSE)
23
23
  end
24
24
  Jeweler::GemcutterTasks.new
25
25
  rescue LoadError
@@ -0,0 +1,24 @@
1
+ This is free and unencumbered software released into the public domain.
2
+
3
+ Anyone is free to copy, modify, publish, use, compile, sell, or
4
+ distribute this software, either in source code form or as a compiled
5
+ binary, for any purpose, commercial or non-commercial, and by any
6
+ means.
7
+
8
+ In jurisdictions that recognize copyright laws, the author or authors
9
+ of this software dedicate any and all copyright interest in the
10
+ software to the public domain. We make this dedication for the benefit
11
+ of the public at large and to the detriment of our heirs and
12
+ successors. We intend this dedication to be an overt act of
13
+ relinquishment in perpetuity of all present and future rights to this
14
+ software under copyright law.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
19
+ IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR
20
+ OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
21
+ ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
22
+ OTHER DEALINGS IN THE SOFTWARE.
23
+
24
+ For more information, please refer to <http://unlicense.org/>
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.3.1.1
1
+ 0.3.1.2
@@ -0,0 +1,21 @@
1
+ #!/usr/bin/env ruby
2
+ require 'rubygems'
3
+ require 'rdf/rdfxml'
4
+ require 'rdf/n3'
5
+
6
+ data = %q(
7
+ <?xml version="1.0" encoding="utf-8"?>
8
+ <rdf:RDF
9
+ xmlns:owl="http://www.w3.org/2002/07/owl#"
10
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
11
+ xmlns:vx="http://bcn.cat/data/v8y/xvcard#">
12
+
13
+ <owl:Ontology rdf:about="http://bcn.cat/data/v8y/xvcard#">
14
+ </owl:Ontology>
15
+
16
+ </rdf:RDF>)
17
+
18
+ reader = RDF::RDFXML::Reader.new(data)
19
+ graph = RDF::Graph.new << reader
20
+
21
+ puts graph.dump(:n3, :prefixes => reader.prefixes)
@@ -2,24 +2,24 @@ module RDF::N3
2
2
  ##
3
3
  # RDFa format specification.
4
4
  #
5
- # @example Obtaining an RDFa format class
6
- # RDF::Format.for(:n3) #=> RDF::N3::Format
7
- # RDF::Format.for("etc/foaf.ttl")
8
- # RDF::Format.for("etc/foaf.n3")
9
- # RDF::Format.for(:file_name => "etc/foaf.ttl")
10
- # RDF::Format.for(:file_name => "etc/foaf.n3")
11
- # RDF::Format.for(:file_extension => "ttl")
12
- # RDF::Format.for(:file_extension => "n3")
13
- # RDF::Format.for(:content_type => "text/turtle")
14
- # RDF::Format.for(:content_type => "text/n3")
5
+ # @example Obtaining an Notation3 format class
6
+ # RDF::Format.for(:n3) #=> RDF::N3::Format
7
+ # RDF::Format.for("etc/foaf.ttl")
8
+ # RDF::Format.for("etc/foaf.n3")
9
+ # RDF::Format.for(:file_name => "etc/foaf.ttl")
10
+ # RDF::Format.for(:file_name => "etc/foaf.n3")
11
+ # RDF::Format.for(:file_extension => "ttl")
12
+ # RDF::Format.for(:file_extension => "n3")
13
+ # RDF::Format.for(:content_type => "text/turtle")
14
+ # RDF::Format.for(:content_type => "text/n3")
15
15
  #
16
16
  # @example Obtaining serialization format MIME types
17
- # RDF::Format.content_types #=> {"text/turtle" => [RDF::N3::Format]}
18
- # RDF::Format.content_types #=> {"text/n3")" => [RDF::N3::Format]}
17
+ # RDF::Format.content_types #=> {"text/turtle" => [RDF::N3::Format]}
18
+ # RDF::Format.content_types #=> {"text/n3")" => [RDF::N3::Format]}
19
19
  #
20
20
  # @example Obtaining serialization format file extension mappings
21
- # RDF::Format.file_extensions #=> {:ttl => "text/turtle"}
22
- # RDF::Format.file_extensions #=> {:n3 => "text/n3"}
21
+ # RDF::Format.file_extensions #=> {:ttl => "text/turtle"}
22
+ # RDF::Format.file_extensions #=> {:n3 => "text/n3"}
23
23
  #
24
24
  # @see http://www.w3.org/TR/rdf-testcases/#ntriples
25
25
  class Format < RDF::Format
@@ -39,10 +39,10 @@ module RDF::N3
39
39
  #
40
40
  # This allows the following:
41
41
  #
42
- # @example Obtaining an RDFXML format class
43
- # RDF::Format.for(:ttl) # RDF::N3::Notation3
44
- # RDF::Format.for(:ttl).reader # RDF::N3::Reader
45
- # RDF::Format.for(:ttl).writer # RDF::N3::Writer
42
+ # @example Obtaining an Notation3 format class
43
+ # RDF::Format.for(:ttl) #=> RDF::N3::Notation3
44
+ # RDF::Format.for(:ttl).reader #=> RDF::N3::Reader
45
+ # RDF::Format.for(:ttl).writer #=> RDF::N3::Writer
46
46
  class Notation3 < RDF::Format
47
47
  reader { RDF::N3::Reader }
48
48
  writer { RDF::N3::Writer }
@@ -52,10 +52,10 @@ module RDF::N3
52
52
  #
53
53
  # This allows the following:
54
54
  #
55
- # @example Obtaining an RDFXML format class
56
- # RDF::Format.for(:ttl) # RDF::N3::TTL
57
- # RDF::Format.for(:ttl).reader # RDF::N3::Reader
58
- # RDF::Format.for(:ttl).writer # RDF::N3::Writer
55
+ # @example Obtaining an TTL format class
56
+ # RDF::Format.for(:ttl) # RDF::N3::TTL
57
+ # RDF::Format.for(:ttl).reader # RDF::N3::Reader
58
+ # RDF::Format.for(:ttl).writer # RDF::N3::Writer
59
59
  class TTL < RDF::Format
60
60
  reader { RDF::N3::Reader }
61
61
  writer { RDF::N3::Writer }
@@ -65,10 +65,10 @@ module RDF::N3
65
65
  #
66
66
  # This allows the following:
67
67
  #
68
- # @example Obtaining an RDFXML format class
69
- # RDF::Format.for(:turtle) # RDF::N3::Turtle
70
- # RDF::Format.for(:turtle).reader # RDF::N3::Reader
71
- # RDF::Format.for(:turtle).writer # RDF::N3::Writer
68
+ # @example Obtaining an Turtle format class
69
+ # RDF::Format.for(:turtle) # RDF::N3::Turtle
70
+ # RDF::Format.for(:turtle).reader # RDF::N3::Reader
71
+ # RDF::Format.for(:turtle).writer # RDF::N3::Writer
72
72
  class Turtle < RDF::Format
73
73
  reader { RDF::N3::Reader }
74
74
  writer { RDF::N3::Writer }
@@ -62,9 +62,8 @@ module RDF::N3
62
62
  @variables = {} # variable definitions along with defining formula
63
63
 
64
64
  if options[:base_uri]
65
- @uri = uri(options[:base_uri])
66
- add_debug("@uri", "#{@uri.inspect}")
67
- namespace(nil, uri("#{options[:base_uri]}#"))
65
+ add_debug("@uri", "#{base_uri.inspect}")
66
+ namespace(nil, uri("#{base_uri}#"))
68
67
  end
69
68
  add_debug("validate", "#{validate?.inspect}")
70
69
  add_debug("canonicalize", "#{canonicalize?.inspect}")
@@ -83,6 +82,19 @@ module RDF::N3
83
82
  end
84
83
  end
85
84
 
85
+ ##
86
+ # XXX Remove when added to RDF::Reader
87
+ # Returns the base URI determined by this reader.
88
+ #
89
+ # @example
90
+ # reader.prefixes[:dc] #=> RDF::URI('http://purl.org/dc/terms/')
91
+ #
92
+ # @return [Hash{Symbol => RDF::URI}]
93
+ # @since 0.3.0
94
+ def base_uri
95
+ @options[:base_uri]
96
+ end
97
+
86
98
  ##
87
99
  # Iterates the given block for each RDF statement in the input.
88
100
  #
@@ -169,7 +181,7 @@ module RDF::N3
169
181
  when "@base"
170
182
  # Base, set or update document URI
171
183
  uri = decl[:explicituri]
172
- @uri = process_uri(uri)
184
+ options[:base_uri] = process_uri(uri)
173
185
 
174
186
  # The empty prefix "" is by default , bound to "#" -- the local namespace of the file.
175
187
  # The parser behaves as though there were a
@@ -177,8 +189,8 @@ module RDF::N3
177
189
  # just before the file.
178
190
  # This means that <#foo> can be written :foo and using @keywords one can reduce that to foo.
179
191
 
180
- namespace(nil, uri.match(/[\/\#]$/) ? @uri : process_uri("#{uri}#"))
181
- add_debug("declarationFinish[@base]", "@base=#{@uri}")
192
+ namespace(nil, uri.match(/[\/\#]$/) ? base_uri : process_uri("#{uri}#"))
193
+ add_debug("declarationFinish[@base]", "@base=#{base_uri}")
182
194
  when "@keywords"
183
195
  add_debug("declarationFinish[@keywords]", @keywords.inspect)
184
196
  # Keywords are handled in tokenizer and maintained in @keywords array
@@ -257,7 +269,7 @@ module RDF::N3
257
269
  def literalFinish
258
270
  lit = @prod_data.pop
259
271
  content = RDF::NTriples.unescape(lit[:string])
260
- language = lit[:langcode]
272
+ language = lit[:langcode].downcase if lit[:langcode]
261
273
  datatype = lit[:symbol]
262
274
 
263
275
  lit = RDF::Literal.new(content, :language => language, :datatype => datatype, :validate => validate?, :canonicalize => canonicalize?)
@@ -554,7 +566,7 @@ module RDF::N3
554
566
  end
555
567
 
556
568
  def process_uri(uri)
557
- uri(@uri, RDF::NTriples.unescape(uri))
569
+ uri(base_uri, RDF::NTriples.unescape(uri))
558
570
  end
559
571
 
560
572
  def process_qname(tok)
@@ -584,7 +596,7 @@ module RDF::N3
584
596
  bnode(name)
585
597
  else
586
598
  add_debug('process_qname(default_ns)', name)
587
- namespace(nil, uri("#{@uri}#")) unless prefix(nil)
599
+ namespace(nil, uri("#{base_uri}#")) unless prefix(nil)
588
600
  ns(nil, name)
589
601
  end
590
602
  add_debug('process_qname', uri.inspect)
@@ -165,7 +165,7 @@ module RDF::N3
165
165
  if uri.to_s.index(vocab.to_s) == 0
166
166
  local_name = uri.to_s[(vocab.to_s.length)..-1]
167
167
  add_debug "get_qname(ns): #{prefix}:#{local_name}"
168
- return @uri_to_qname[uri] = [prefix, local_name.to_sym]
168
+ return @uri_to_qname[uri] = "#{prefix}:#{local_name}"
169
169
  end
170
170
  end
171
171
 
@@ -174,7 +174,7 @@ module RDF::N3
174
174
  prefix = vocab.__name__.to_s.split('::').last.downcase
175
175
  prefixes[prefix.to_sym] = vocab.to_uri
176
176
  suffix = uri.to_s[vocab.to_uri.to_s.size..-1]
177
- return @uri_to_qname[uri] = [prefix.to_sym, suffix.empty? ? nil : suffix.to_sym] if prefix && suffix
177
+ return @uri_to_qname[uri] = "#{prefix}:#{suffix}"
178
178
  end
179
179
 
180
180
  @uri_to_qname[uri] = nil
@@ -192,8 +192,8 @@ module RDF::N3
192
192
  def sort_properties(properties)
193
193
  properties.keys.each do |k|
194
194
  properties[k] = properties[k].sort do |a, b|
195
- a_li = a.is_a?(RDF::URI) && get_qname(a) && get_qname(a).last.to_s =~ /^_\d+$/ ? a.to_i : a.to_s
196
- b_li = b.is_a?(RDF::URI) && get_qname(b) && get_qname(b).last.to_s =~ /^_\d+$/ ? b.to_i : b.to_s
195
+ a_li = a.to_s.index(RDF._.to_s) == 0 ? a.to_s.match(/\d+$/).to_s.to_i : a.to_s
196
+ b_li = b.to_s.index(RDF._.to_s) == 0 ? b.to_s.match(/\d+$/).to_s.to_i : b.to_s
197
197
 
198
198
  a_li <=> b_li
199
199
  end
@@ -242,13 +242,7 @@ module RDF::N3
242
242
  # @return [String]
243
243
  def format_uri(uri, options = {})
244
244
  md = relativize(uri)
245
- if md && md != uri.to_s
246
- "<%s>" % md
247
- elsif qname = get_qname(uri)
248
- qname.map(&:to_s).join(":")
249
- else
250
- "<%s>" % uri_for(uri)
251
- end
245
+ md && md != uri.to_s ? "<#{md}>" : (get_qname(uri) || "<#{uri_for(uri)}>")
252
246
  end
253
247
 
254
248
  ##
@@ -5,17 +5,18 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{rdf-n3}
8
- s.version = "0.3.1.1"
8
+ s.version = "0.3.1.2"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Gregg Kellogg"]
12
- s.date = %q{2011-02-18}
12
+ s.date = %q{2011-03-30}
13
13
  s.description = %q{RDF::N3 is an Notation-3 (n3-rdf) parser for Ruby using the RDF.rb library suite.}
14
14
  s.email = %q{gregg@kellogg-assoc.com}
15
15
  s.extra_rdoc_files = [
16
16
  "AUTHORS",
17
17
  "History.md",
18
18
  "README.md",
19
+ "UNLICENSE",
19
20
  "VERSION"
20
21
  ]
21
22
  s.files = [
@@ -24,7 +25,9 @@ Gem::Specification.new do |s|
24
25
  "History.md",
25
26
  "README.md",
26
27
  "Rakefile",
28
+ "UNLICENSE",
27
29
  "VERSION",
30
+ "example-files/arnau-registered-vocab.rb",
28
31
  "example-files/sp2b.n3",
29
32
  "example.rb",
30
33
  "lib/rdf/n3.rb",
@@ -414,7 +417,7 @@ Gem::Specification.new do |s|
414
417
  ]
415
418
  s.homepage = %q{http://github.com/gkellogg/rdf-n3}
416
419
  s.require_paths = ["lib"]
417
- s.rubygems_version = %q{1.5.0}
420
+ s.rubygems_version = %q{1.6.2}
418
421
  s.summary = %q{Notation-3 (n3-rdf) and Turtle reader/writer for RDF.rb.}
419
422
  s.test_files = [
420
423
  "spec/cwm_spec.rb",
@@ -6,48 +6,44 @@ require 'rdf/ntriples'
6
6
  require 'getoptlong'
7
7
  require 'open-uri'
8
8
 
9
- def run(input, base)
10
- reader_class = RDF::Reader.for($input_format.to_sym)
11
- writer_class = RDF::Writer.for($output_format.to_sym)
12
- raise "Reader not found for #{$input_format}" unless reader_class
13
- raise "Writer not found for #{$output_format}" unless writer_class
9
+ def run(input, options)
10
+ reader_class = RDF::Reader.for(options[:input_format].to_sym)
11
+ raise "Reader not found for #{options[:input_format]}" unless reader_class
14
12
 
15
13
  start = Time.new
16
14
  num = 0
17
- if $parse_only
15
+ if options[:parse_only]
18
16
  include RDF::N3::Meta
19
17
  include RDF::N3::Parser
20
- puts "\nparse #{input.read}---\n\n" unless $quiet
18
+ puts "\nparse #{input.read}---\n\n" unless options[:quiet]
21
19
  input.rewind
22
- if $quiet
20
+ if options[:quiet]
23
21
  $stdout = StringIO.new
24
22
  end
25
23
  test(input, BRANCHES, REGEXPS)
26
- if $quiet
24
+ if options[:quiet]
27
25
  $stdout = STDOUT
28
26
  print "."
29
27
  end
30
- elsif $output_format == :ntriples || $quiet
31
- reader_class.new(input, :base_uri => base, :strict => true).each do |statement|
28
+ elsif options[:output_format] == :ntriples || options[:quiet]
29
+ reader_class.new(input, :base_uri => options[:base_uri], :strict => true).each do |statement|
32
30
  num += 1
33
- if $quiet
31
+ if options[:quiet]
34
32
  #print "."
35
33
  else
36
34
  puts statement.to_ntriples
37
35
  end
38
36
  end
39
- elsif $output_format == :inspect
40
- reader_class.new(input, :base_uri => base, :strict => true).each do |statement|
37
+ elsif options[:output_format] == :inspect
38
+ reader_class.new(input, :base_uri => options[:base_uri], :strict => true).each do |statement|
41
39
  num += 1
42
40
  puts statement.inspect
43
41
  end
44
42
  else
45
- puts writer_class.buffer(:base_uri => base, :standard_prefixes => true) { |writer|
46
- reader_class.new(input, :base_uri => base, :strict => true).each do |statement|
47
- num += 1
48
- writer << statement
49
- end
50
- }
43
+ r = reader_class.new(input, :base_uri => options[:base_uri], :strict => true)
44
+ g = RDF::Graph.new << r
45
+ num = g.count
46
+ puts g.dump(options[:output_format], :base_uri => r.base_uri, :prefixes => r.prefixes)
51
47
  end
52
48
  puts
53
49
  secs = Time.new - start
@@ -58,10 +54,12 @@ rescue
58
54
  raise
59
55
  end
60
56
 
61
- $verbose = false
62
- $output_format = :ntriples
63
- $input_format = :n3
64
- base_uri = "http://example.com"
57
+ options = {
58
+ :verbose => false,
59
+ :output_format => :ntriples,
60
+ :input_format => :n3,
61
+ :base_uri => "http://example.com",
62
+ }
65
63
  input = nil
66
64
 
67
65
  opts = GetoptLong.new(
@@ -76,23 +74,24 @@ opts = GetoptLong.new(
76
74
  )
77
75
  opts.each do |opt, arg|
78
76
  case opt
79
- when '--verbose' then $verbose = true
80
- when '--quiet' then $quiet = true
81
- when '--debug' then ::RDF::N3::debug = true
82
- when '--execute' then input = arg
83
- when '--format' then $output_format = arg.to_sym
84
- when '--input-format' then $input_format = arg.to_sym
85
- when '--uri' then base_uri = arg
86
- when '--parse-only' then $parse_only = true
77
+ when '--base-uri' then options[:verbose] = true
78
+ when '--debug' then ::RDF::N3::debug = true
79
+ when '--execute' then input = arg
80
+ when '--format' then options[:output_format] = arg.to_sym
81
+ when '--input-format' then options[:input_format] = arg.to_sym
82
+ when '--parse-only' then options[:parse_only] = true
83
+ when '--quiet' then options[:quiet] = true
84
+ when '--uri' then options[:base_uri] = arg
85
+ when '--verbose' then options[:verbose] = true
87
86
  end
88
87
  end
89
88
 
90
89
  if ARGV.empty?
91
90
  s = input ? input : $stdin.read
92
- run(StringIO.new(s), base_uri)
91
+ run(StringIO.new(s), options)
93
92
  else
94
93
  ARGV.each do |test_file|
95
- run(Kernel.open(test_file), base_uri)
94
+ run(Kernel.open(test_file), options)
96
95
  end
97
96
  end
98
97
  puts
@@ -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"@EN)
267
+ statement.object.to_ntriples.should == %("xyz"@en)
268
268
  end
269
269
 
270
270
  it "should create typed literals" do
@@ -34,6 +34,16 @@ describe RDF::N3::Writer do
34
34
  )
35
35
  end
36
36
 
37
+ # see example-files/arnau-registered-vocab.rb
38
+ it "should use qname URIs with empty suffix" do
39
+ input = %(<http://xmlns.com/foaf/0.1/> <http://xmlns.com/foaf/0.1/> <http://xmlns.com/foaf/0.1/> .)
40
+ serialize(input, nil,
41
+ [%r(^@prefix foaf: <http://xmlns.com/foaf/0.1/> \.$),
42
+ %r(^foaf: foaf: foaf: \.$)],
43
+ :prefixes => { "foaf" => RDF::FOAF}
44
+ )
45
+ end
46
+
37
47
  it "should order properties" do
38
48
  input = %(
39
49
  @prefix : <http://xmlns.com/foaf/0.1/> .
metadata CHANGED
@@ -2,7 +2,7 @@
2
2
  name: rdf-n3
3
3
  version: !ruby/object:Gem::Version
4
4
  prerelease:
5
- version: 0.3.1.1
5
+ version: 0.3.1.2
6
6
  platform: ruby
7
7
  authors:
8
8
  - Gregg Kellogg
@@ -10,7 +10,7 @@ autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
12
 
13
- date: 2011-02-18 00:00:00 -08:00
13
+ date: 2011-03-30 00:00:00 -07:00
14
14
  default_executable:
15
15
  dependencies:
16
16
  - !ruby/object:Gem::Dependency
@@ -111,6 +111,7 @@ extra_rdoc_files:
111
111
  - AUTHORS
112
112
  - History.md
113
113
  - README.md
114
+ - UNLICENSE
114
115
  - VERSION
115
116
  files:
116
117
  - .yardopts
@@ -118,7 +119,9 @@ files:
118
119
  - History.md
119
120
  - README.md
120
121
  - Rakefile
122
+ - UNLICENSE
121
123
  - VERSION
124
+ - example-files/arnau-registered-vocab.rb
122
125
  - example-files/sp2b.n3
123
126
  - example.rb
124
127
  - lib/rdf/n3.rb
@@ -529,7 +532,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
529
532
  requirements: []
530
533
 
531
534
  rubyforge_project:
532
- rubygems_version: 1.5.0
535
+ rubygems_version: 1.6.2
533
536
  signing_key:
534
537
  specification_version: 3
535
538
  summary: Notation-3 (n3-rdf) and Turtle reader/writer for RDF.rb.