rdf-n3 0.3.1.1 → 0.3.1.2

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 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.