rdf-turtle 1.1.0p2 → 1.1.0p3

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.
checksums.yaml CHANGED
@@ -1,15 +1,15 @@
1
1
  ---
2
2
  !binary "U0hBMQ==":
3
3
  metadata.gz: !binary |-
4
- YjQ4ODA0OWM2ZDg4NjVhZGE1OTIwYmIwMzkxMzNmNWJjMDU5MDZhNQ==
4
+ MmNhNDYwMWEyY2VhYTY4MzE1OTk2Mjk3ODA0YjFhNjgwZDhmN2U0NA==
5
5
  data.tar.gz: !binary |-
6
- NGE1ZDQ2MTgzOGY1NzNhYzcyNTBmNzczNjg2NDQ1ZDVkNDA3NDgxZQ==
6
+ MmEzYTM0MGUzMjVmNzg2NWI2NDljNzNiZjU2ZWJjN2JkYmY2NmVhZA==
7
7
  !binary "U0hBNTEy":
8
8
  metadata.gz: !binary |-
9
- NzhhMTA3NTFjMTY2ZjUxYzU3ZDJiNjg3NTMzMmU2ZTljZDIzNDVlZDA0ZTAx
10
- NDUwZGYwNDAwNjdmZDhhOWNlNGY0MmNiNTNhOTNhMzI1ZTVmZmFlOWI3MGU1
11
- MGE4OWI5ZGI4MjVlNzNhZWNhMGFiYWMxODM2N2NmMzA2MDJjNmE=
9
+ Y2UxYTFhODg2YWFhMDlmYjU3ZDJlOThjOGU0NGI0Yzc0Mzc1ZTJmZDliMGVl
10
+ MjAzMWZhZGQwNWRhNTI2YTRhYTY2ZGNmOTk3YzM0YWIyZjIwZjM4ZjYzZGRm
11
+ OTRkZjdhNmUzMWYwOGI5YzM1NDhjNDEwYzIwZDUwNzE4N2Y0OWQ=
12
12
  data.tar.gz: !binary |-
13
- YjY2ZDMzYjRkNjg5ODk2YmRjMTQwMjIwMTcyYWIyZmEzOTZjOWJhYjEzMTBm
14
- Y2YwMGM4ZjhjYjJlZWVlOWFlM2RjYTIzNDI4NjliM2JjNmRjOGJiMTJlOGIw
15
- MWRkYmUzOGM0NzQ3ZjZhZDFmNjljMjJhMWFhNDAyYmEzN2YxNTM=
13
+ NTliNWU3ZjJmNTk2YmYzOTQ2NzJkZWYyYTllODJmNmY1MTAxNzI3YjI3OTA5
14
+ NDMxNTc1ZDE4ZmZmMzg1MTM5YWIyZjI3ODYxYTNjMDQwNzJkYmFkNzUxYTY3
15
+ YTVlODYwZmZjMWNhNWU5NjJlNGViNjc3MzFkYWRkZWE2NWZkZjE=
data/README.md CHANGED
@@ -16,6 +16,7 @@ Install with `gem install rdf-turtle`
16
16
  * 100% free and unencumbered [public domain](http://unlicense.org/) software.
17
17
  * Implements a complete parser for [Turtle][].
18
18
  * Compatible with Ruby >= 1.9.2.
19
+ * Optional streaming writer, to serialize large graphs
19
20
 
20
21
  ## Usage
21
22
  Instantiate a reader from a local file:
data/VERSION CHANGED
@@ -1 +1 @@
1
- 1.1.0p2
1
+ 1.1.0p3
@@ -1,4 +1,4 @@
1
- # This file is automatically generated by /Users/gregg/.rvm/gems/ruby-1.9.3-p392/bundler/gems/ebnf-af9a669d518f/bin/ebnf
1
+ # This file is automatically generated by /Users/gregg/.rvm/gems/ruby-1.9.3-p429/bundler/gems/ebnf-3f823030418a/bin/ebnf
2
2
  # BRANCH derived from etc/turtle.bnf
3
3
  module RDF::Turtle::Meta
4
4
  START = :turtleDoc
@@ -197,7 +197,6 @@ module RDF::Turtle::Meta
197
197
  :PNAME_NS => [:iri],
198
198
  },
199
199
  :predicateObjectList => {
200
- "A" => [:verb, :objectList, :_predicateObjectList_1],
201
200
  :IRIREF => [:verb, :objectList, :_predicateObjectList_1],
202
201
  :PNAME_LN => [:verb, :objectList, :_predicateObjectList_1],
203
202
  :PNAME_NS => [:verb, :objectList, :_predicateObjectList_1],
@@ -217,7 +216,6 @@ module RDF::Turtle::Meta
217
216
  :_predicateObjectList_4 => {
218
217
  "." => [],
219
218
  ";" => [],
220
- "A" => [:_predicateObjectList_5],
221
219
  :IRIREF => [:_predicateObjectList_5],
222
220
  :PNAME_LN => [:_predicateObjectList_5],
223
221
  :PNAME_NS => [:_predicateObjectList_5],
@@ -225,7 +223,6 @@ module RDF::Turtle::Meta
225
223
  "a" => [:_predicateObjectList_5],
226
224
  },
227
225
  :_predicateObjectList_5 => {
228
- "A" => [:verb, :objectList],
229
226
  :IRIREF => [:verb, :objectList],
230
227
  :PNAME_LN => [:verb, :objectList],
231
228
  :PNAME_NS => [:verb, :objectList],
@@ -296,7 +293,6 @@ module RDF::Turtle::Meta
296
293
  },
297
294
  :_triples_3 => {
298
295
  "." => [],
299
- "A" => [:predicateObjectList],
300
296
  :IRIREF => [:predicateObjectList],
301
297
  :PNAME_LN => [:predicateObjectList],
302
298
  :PNAME_NS => [:predicateObjectList],
@@ -325,7 +321,6 @@ module RDF::Turtle::Meta
325
321
  "[" => [:statement, :turtleDoc],
326
322
  },
327
323
  :verb => {
328
- "A" => ["A"],
329
324
  :IRIREF => [:predicate],
330
325
  :PNAME_LN => [:predicate],
331
326
  :PNAME_NS => [:predicate],
@@ -338,7 +333,6 @@ module RDF::Turtle::Meta
338
333
  ",",
339
334
  ".",
340
335
  ";",
341
- "A",
342
336
  :ANON,
343
337
  :BASE,
344
338
  :BLANK_NODE_LABEL,
@@ -411,7 +405,6 @@ module RDF::Turtle::Meta
411
405
  :blankNodePropertyList => [
412
406
  "["],
413
407
  :_blankNodePropertyList_1 => [
414
- "A",
415
408
  "a",
416
409
  :IRIREF,
417
410
  :PNAME_LN,
@@ -581,7 +574,6 @@ module RDF::Turtle::Meta
581
574
  :PNAME_LN,
582
575
  :PNAME_NS],
583
576
  :predicateObjectList => [
584
- "A",
585
577
  "a",
586
578
  :IRIREF,
587
579
  :PNAME_LN,
@@ -595,13 +587,11 @@ module RDF::Turtle::Meta
595
587
  ";"],
596
588
  :_predicateObjectList_4 => [
597
589
  :_eps,
598
- "A",
599
590
  "a",
600
591
  :IRIREF,
601
592
  :PNAME_LN,
602
593
  :PNAME_NS],
603
594
  :_predicateObjectList_5 => [
604
- "A",
605
595
  "a",
606
596
  :IRIREF,
607
597
  :PNAME_LN,
@@ -628,7 +618,6 @@ module RDF::Turtle::Meta
628
618
  ";"],
629
619
  :_predicateObjectList_8 => [
630
620
  :_eps,
631
- "A",
632
621
  "a",
633
622
  :IRIREF,
634
623
  :PNAME_LN,
@@ -708,20 +697,17 @@ module RDF::Turtle::Meta
708
697
  "["],
709
698
  :_triples_3 => [
710
699
  :_eps,
711
- "A",
712
700
  "a",
713
701
  :IRIREF,
714
702
  :PNAME_LN,
715
703
  :PNAME_NS],
716
704
  :_triples_4 => [
717
- "A",
718
705
  "a",
719
706
  :IRIREF,
720
707
  :PNAME_LN,
721
708
  :PNAME_NS],
722
709
  :_triples_5 => [
723
710
  :_eps,
724
- "A",
725
711
  "a",
726
712
  :IRIREF,
727
713
  :PNAME_LN,
@@ -759,7 +745,6 @@ module RDF::Turtle::Meta
759
745
  :PNAME_LN,
760
746
  :PNAME_NS],
761
747
  :verb => [
762
- "A",
763
748
  "a",
764
749
  :IRIREF,
765
750
  :PNAME_LN,
@@ -767,7 +752,6 @@ module RDF::Turtle::Meta
767
752
  }.freeze
768
753
  FOLLOW = {
769
754
  :BlankNode => [
770
- "A",
771
755
  "a",
772
756
  ")",
773
757
  ",",
@@ -835,7 +819,6 @@ module RDF::Turtle::Meta
835
819
  :STRING_LITERAL_LONG_SINGLE_QUOTE,
836
820
  :STRING_LITERAL_LONG_QUOTE],
837
821
  :PrefixedName => [
838
- "A",
839
822
  "a",
840
823
  :IRIREF,
841
824
  :BLANK_NODE_LABEL,
@@ -1038,7 +1021,6 @@ module RDF::Turtle::Meta
1038
1021
  :PNAME_NS],
1039
1022
  :blankNodePropertyList => [
1040
1023
  ".",
1041
- "A",
1042
1024
  "a",
1043
1025
  ")",
1044
1026
  ",",
@@ -1062,7 +1044,6 @@ module RDF::Turtle::Meta
1062
1044
  :STRING_LITERAL_LONG_QUOTE],
1063
1045
  :_blankNodePropertyList_1 => [
1064
1046
  ".",
1065
- "A",
1066
1047
  "a",
1067
1048
  ")",
1068
1049
  ",",
@@ -1086,7 +1067,6 @@ module RDF::Turtle::Meta
1086
1067
  :STRING_LITERAL_LONG_QUOTE],
1087
1068
  :_blankNodePropertyList_2 => [
1088
1069
  ".",
1089
- "A",
1090
1070
  "a",
1091
1071
  ")",
1092
1072
  ",",
@@ -1109,7 +1089,6 @@ module RDF::Turtle::Meta
1109
1089
  :STRING_LITERAL_LONG_SINGLE_QUOTE,
1110
1090
  :STRING_LITERAL_LONG_QUOTE],
1111
1091
  :collection => [
1112
- "A",
1113
1092
  "a",
1114
1093
  ")",
1115
1094
  ",",
@@ -1137,7 +1116,6 @@ module RDF::Turtle::Meta
1137
1116
  :_collection_2 => [
1138
1117
  ")"],
1139
1118
  :_collection_3 => [
1140
- "A",
1141
1119
  "a",
1142
1120
  ")",
1143
1121
  ",",
@@ -1163,7 +1141,6 @@ module RDF::Turtle::Meta
1163
1141
  :_collection_4 => [
1164
1142
  ")"],
1165
1143
  :_collection_5 => [
1166
- "A",
1167
1144
  "a",
1168
1145
  ")",
1169
1146
  ",",
@@ -1198,7 +1175,6 @@ module RDF::Turtle::Meta
1198
1175
  :PNAME_LN,
1199
1176
  :PNAME_NS],
1200
1177
  :iri => [
1201
- "A",
1202
1178
  "a",
1203
1179
  :IRIREF,
1204
1180
  :BLANK_NODE_LABEL,
@@ -1441,7 +1417,6 @@ module RDF::Turtle::Meta
1441
1417
  :PNAME_LN,
1442
1418
  :PNAME_NS],
1443
1419
  :subject => [
1444
- "A",
1445
1420
  "a",
1446
1421
  :IRIREF,
1447
1422
  :PNAME_LN,
@@ -72,15 +72,16 @@ module RDF::Turtle
72
72
  when 'A', 'a' then input[:resource] = RDF.type
73
73
  when 'true', 'false' then input[:resource] = RDF::Literal::Boolean.new(token.value)
74
74
  when '@base', '@prefix' then input[:lang] = token.value[1..-1]
75
+ when '.' then input[:terminated] = true
75
76
  else input[:string] = token.value
76
77
  end
77
78
  end
78
79
 
79
80
  terminal(:PREFIX, PREFIX) do |prod, token, input|
80
- input[:string_value] = token.value.downcase
81
+ input[:string_value] = token.value
81
82
  end
82
83
  terminal(:BASE, BASE) do |prod, token, input|
83
- input[:string_value] = token.value.downcase
84
+ input[:string_value] = token.value
84
85
  end
85
86
 
86
87
  terminal(:LANGTAG, LANGTAG) do |prod, token, input|
@@ -92,14 +93,32 @@ module RDF::Turtle
92
93
  production(:prefixID) do |input, current, callback|
93
94
  prefix = current[:prefix]
94
95
  iri = current[:resource]
96
+ lexical = current[:string_value]
97
+ terminated = current[:terminated]
95
98
  debug("prefixID") {"Defined prefix #{prefix.inspect} mapping to #{iri.inspect}"}
99
+ if lexical.start_with?('@') && lexical != '@prefix'
100
+ error(:prefixID, "should be downcased")
101
+ elsif lexical == '@prefix'
102
+ error(:prefixID, "directive not terminated") unless terminated
103
+ else
104
+ error(:prefixID, "directive should not be terminated") if terminated
105
+ end
96
106
  prefix(prefix, iri)
97
107
  end
98
108
 
99
109
  # [5] base set base_uri
100
110
  production(:base) do |input, current, callback|
101
111
  iri = current[:resource]
112
+ lexical = current[:string_value]
113
+ terminated = current[:terminated]
102
114
  debug("base") {"Defined base as #{iri}"}
115
+ if lexical.start_with?('@') && lexical != '@base'
116
+ error(:base, "should be downcased")
117
+ elsif lexical == '@base'
118
+ error(:base, "directive not terminated") unless terminated
119
+ else
120
+ error(:base, "directive should not be terminated") if terminated
121
+ end
103
122
  options[:base_uri] = iri
104
123
  end
105
124
 
@@ -0,0 +1,52 @@
1
+ require 'rdf/turtle/terminals'
2
+
3
+ module RDF::Turtle
4
+ ##
5
+ # Streaming writer interface
6
+ # @author [Gregg Kellogg](http://greggkellogg.net/)
7
+ module StreamingWriter
8
+ ##
9
+ # Write out declarations
10
+ # @return [void] `self`
11
+ def stream_prologue
12
+ if @options[:standard_prefixes]
13
+ RDF::Vocabulary.each do |vocab|
14
+ pfx = vocab.__name__.to_s.split('::').last.downcase
15
+ prefix(pfx, vocab.to_uri)
16
+ end
17
+ end
18
+ preprocess
19
+ start_document
20
+ @output.puts ""
21
+ self
22
+ end
23
+
24
+ ##
25
+ # Write out a statement, retaining current
26
+ # `subject` and `predicate` to create more compact output
27
+ # @return [void] `self`
28
+ def stream_statement(statement)
29
+ if statement.subject != @streaming_subject
30
+ @output.puts ' .' if @streaming_subject
31
+ @streaming_subject, @streaming_predicate = statement.subject, statement.predicate
32
+ @output.write "#{format_term(statement.subject)} "
33
+ @output.write "#{format_term(statement.predicate)} "
34
+ elsif statement.predicate != @streaming_predicate
35
+ @streaming_predicate = statement.predicate
36
+ @output.write ";\n#{indent(1)}#{format_term(statement.predicate)} "
37
+ else
38
+ @output.write ",\n#{indent(2)}"
39
+ end
40
+ @output.write("#{format_term(statement.object)}")
41
+ end
42
+
43
+ ##
44
+ # Complete open statements
45
+ # @return [void] `self`
46
+ def stream_epilogue
47
+ @output.puts ' .' if @streaming_subject
48
+ end
49
+
50
+ private
51
+ end
52
+ end
@@ -1,4 +1,5 @@
1
1
  require 'rdf/turtle/terminals'
2
+ require 'rdf/turtle/streaming_writer'
2
3
 
3
4
  module RDF::Turtle
4
5
  ##
@@ -34,6 +35,13 @@ module RDF::Turtle
34
35
  # end
35
36
  # end
36
37
  #
38
+ # @example Serializing RDF statements to a string in streaming mode
39
+ # RDF::Turtle::Writer.buffer(:stream => true) do |writer|
40
+ # graph.each_statement do |statement|
41
+ # writer << statement
42
+ # end
43
+ # end
44
+ #
37
45
  # The writer will add prefix definitions, and use them for creating @prefix definitions, and minting QNames
38
46
  #
39
47
  # @example Creating @base and @prefix definitions in output
@@ -48,12 +56,11 @@ module RDF::Turtle
48
56
  #
49
57
  # @author [Gregg Kellogg](http://greggkellogg.net/)
50
58
  class Writer < RDF::Writer
59
+ include StreamingWriter
51
60
  format RDF::Turtle::Format
52
61
 
53
62
  # @return [Graph] Graph of statements serialized
54
63
  attr_accessor :graph
55
- # @return [URI] Base URI used for relativizing URIs
56
- attr_accessor :base_uri
57
64
 
58
65
  ##
59
66
  # Initializes the Turtle writer instance.
@@ -74,6 +81,8 @@ module RDF::Turtle
74
81
  # Maximum depth for recursively defining resources, defaults to 3
75
82
  # @option options [Boolean] :standard_prefixes (false)
76
83
  # Add standard prefixes to @prefixes, if necessary.
84
+ # @option options [Boolean] :stream (false)
85
+ # Do not attempt to optimize graph presentation, suitable for streaming large graphs.
77
86
  # @option options [String] :default_namespace (nil)
78
87
  # URI to use as default namespace, same as `prefixes[nil]`
79
88
  # @yield [writer] `self`
@@ -82,10 +91,11 @@ module RDF::Turtle
82
91
  # @yield [writer]
83
92
  # @yieldparam [RDF::Writer] writer
84
93
  def initialize(output = $stdout, options = {}, &block)
94
+ reset
95
+ @graph = RDF::Graph.new
96
+ @uri_to_pname = {}
97
+ @uri_to_prefix = {}
85
98
  super do
86
- @graph = RDF::Graph.new
87
- @uri_to_pname = {}
88
- @uri_to_prefix = {}
89
99
  if block_given?
90
100
  case block.arity
91
101
  when 0 then instance_eval(&block)
@@ -95,21 +105,18 @@ module RDF::Turtle
95
105
  end
96
106
  end
97
107
 
98
- ##
99
- # Write whole graph
100
- #
101
- # @param [Graph] graph
102
- # @return [void]
103
- def write_graph(graph)
104
- @graph = graph
105
- end
106
-
107
108
  ##
108
109
  # Adds a statement to be serialized
109
110
  # @param [RDF::Statement] statement
110
111
  # @return [void]
111
112
  def write_statement(statement)
112
- @graph.insert(statement)
113
+ case
114
+ when @options[:stream]
115
+ stream_statement(statement)
116
+ else
117
+ # Add to local graph and output in epilogue
118
+ @graph.insert(statement)
119
+ end
113
120
  end
114
121
 
115
122
  ##
@@ -118,10 +125,19 @@ module RDF::Turtle
118
125
  # @param [RDF::URI] predicate
119
126
  # @param [RDF::Value] object
120
127
  # @return [void]
121
- # @raise [NotImplementedError] unless implemented in subclass
122
- # @abstract
123
128
  def write_triple(subject, predicate, object)
124
- @graph.insert(Statement.new(subject, predicate, object))
129
+ write_statement(Statement.new(subject, predicate, object))
130
+ end
131
+
132
+ ##
133
+ # Write out declarations
134
+ # @return [void] `self`
135
+ def write_prologue
136
+ case
137
+ when @options[:stream]
138
+ stream_prologue
139
+ else
140
+ end
125
141
  end
126
142
 
127
143
  ##
@@ -130,19 +146,23 @@ module RDF::Turtle
130
146
  # @return [void]
131
147
  # @see #write_triple
132
148
  def write_epilogue
133
- @max_depth = @options[:max_depth] || 3
134
- @base_uri = RDF::URI(@options[:base_uri])
149
+ case
150
+ when @options[:stream]
151
+ stream_epilogue
152
+ else
153
+ @max_depth = @options[:max_depth] || 3
135
154
 
136
- self.reset
155
+ self.reset
137
156
 
138
- debug("\nserialize") {"graph: #{@graph.size}"}
157
+ debug("\nserialize") {"graph: #{@graph.size}"}
139
158
 
140
- preprocess
141
- start_document
159
+ preprocess
160
+ start_document
142
161
 
143
- order_subjects.each do |subject|
144
- unless is_done?(subject)
145
- statement(subject)
162
+ order_subjects.each do |subject|
163
+ unless is_done?(subject)
164
+ statement(subject)
165
+ end
146
166
  end
147
167
  end
148
168
  end
@@ -300,8 +320,8 @@ module RDF::Turtle
300
320
 
301
321
  # Start with base_uri
302
322
  if base_uri && @subjects.keys.include?(base_uri)
303
- subjects << base_uri
304
- seen[base_uri] = true
323
+ subjects << RDF::URI(base_uri)
324
+ seen[RDF::URI(base_uri)] = true
305
325
  end
306
326
 
307
327
  # Add distinguished classes
@@ -328,11 +348,16 @@ module RDF::Turtle
328
348
  (@options[:prefixes] || {}).each_pair do |k, v|
329
349
  @uri_to_prefix[v.to_s] = k
330
350
  end
331
- @options[:prefixes] = {} # Will define actual used when matched
332
351
 
333
352
  prefix(nil, @options[:default_namespace]) if @options[:default_namespace]
334
353
 
335
- @graph.each {|statement| preprocess_statement(statement)}
354
+ case
355
+ when @options[:stream]
356
+ else
357
+ @options[:prefixes] = {} # Will define actual used when matched
358
+
359
+ @graph.each {|statement| preprocess_statement(statement)}
360
+ end
336
361
  end
337
362
 
338
363
  # Perform any statement preprocessing required. This is used to perform reference counts and determine required
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rdf-turtle
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.0p2
4
+ version: 1.1.0p3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Gregg Kellogg
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-06-16 00:00:00.000000000 Z
11
+ date: 2013-07-30 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rdf
@@ -151,6 +151,7 @@ files:
151
151
  - lib/rdf/turtle/freebase_reader.rb
152
152
  - lib/rdf/turtle/meta.rb
153
153
  - lib/rdf/turtle/reader.rb
154
+ - lib/rdf/turtle/streaming_writer.rb
154
155
  - lib/rdf/turtle/terminals.rb
155
156
  - lib/rdf/turtle/version.rb
156
157
  - lib/rdf/turtle/writer.rb
@@ -175,7 +176,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
175
176
  version: 1.3.1
176
177
  requirements: []
177
178
  rubyforge_project: rdf-turtle
178
- rubygems_version: 2.0.3
179
+ rubygems_version: 2.0.5
179
180
  signing_key:
180
181
  specification_version: 4
181
182
  summary: Turtle reader/writer for Ruby.