rdf-turtle 1.99.0 → 2.0.0.beta1

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,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: e106cccdded10be877a7fc25a9f2e1f3fcebebd8
4
- data.tar.gz: 84c90e3f6dd3dba04d2e76a0d0b8a950ef150883
3
+ metadata.gz: 7e71bbbae04dd8cd11ad1a9b33b8306c93c005a0
4
+ data.tar.gz: 215ea0878f18271c5dfaebf2979f63a0f7234e86
5
5
  SHA512:
6
- metadata.gz: a31cfcbe12f72b95d4d994f3dd2c518628c4e4c4413a60c58940e1fca9922efcb6151cb2d16ecc5b8e0d9a583fac10f3b2497d7d4a8469feb277c8619226a921
7
- data.tar.gz: 80aa5ad160e0c338fb55af63c1c55480f62ee818d1de4c36c1fa85dec48d1caf6a5cdb8fce88e04089b8e2688f8d4d9f3852c447c8ffa31268b16033a646223a
6
+ metadata.gz: bc1436d3c37d6b7d8d80a50dfd8197383959558b383b59ce2603d3c3cf7703851ae2f45ce8e6a5cd17ded2bd901bab79cc3a61e8e4672e1cd1e7c13aefe96862
7
+ data.tar.gz: 8c349965005898fcc0c9b5ea6d95ef83673127667d834493077b2fdf3514ab730acc92ef0297fa984d0861b87e66d351f2534b604e76c98cc40ccf8f2ed45824
data/README.md CHANGED
@@ -17,7 +17,7 @@ Install with `gem install rdf-turtle`
17
17
 
18
18
  * 100% free and unencumbered [public domain](http://unlicense.org/) software.
19
19
  * Implements a complete parser for [Turtle][].
20
- * Compatible with Ruby >= 1.9.2.
20
+ * Compatible with Ruby >= 2.0.
21
21
  * Optional streaming writer, to serialize large graphs
22
22
 
23
23
  ## Usage
@@ -86,9 +86,9 @@ This version uses a hand-written parser using the Lexer from the [EBNF][] gem in
86
86
 
87
87
  ## Dependencies
88
88
 
89
- * [Ruby](http://ruby-lang.org/) (>= 1.9.3)
90
- * [RDF.rb](http://rubygems.org/gems/rdf) (~> 1.1)
91
- * [EBNF][] (~> 0.3)
89
+ * [Ruby](http://ruby-lang.org/) (>= 2.0)
90
+ * [RDF.rb](http://rubygems.org/gems/rdf) (~> 2.0)
91
+ * [EBNF][] (~> 1.0)
92
92
 
93
93
  ## Installation
94
94
 
data/VERSION CHANGED
@@ -1 +1 @@
1
- 1.99.0
1
+ 2.0.0.beta1
@@ -26,8 +26,5 @@ module RDF
26
26
  autoload :Terminals, 'rdf/turtle/terminals'
27
27
  autoload :VERSION, 'rdf/turtle/version'
28
28
  autoload :Writer, 'rdf/turtle/writer'
29
-
30
- def self.debug?; @debug; end
31
- def self.debug=(value); @debug = value; end
32
29
  end
33
30
  end
@@ -54,21 +54,10 @@ module RDF::Turtle
54
54
  sample.match(%r("@(context|subject|iri)")) # JSON-LD
55
55
  )
56
56
  end
57
- end
58
-
59
- # Alias for TTL format
60
- #
61
- # This allows the following:
62
- #
63
- # @example Obtaining an TTL format class
64
- # RDF::Format.for(:ttl) # RDF::Turtle::TTL
65
- # RDF::Format.for(:ttl).reader # RDF::Turtle::Reader
66
- # RDF::Format.for(:ttl).writer # RDF::Turtle::Writer
67
- class TTL < Format
68
- content_encoding 'utf-8'
69
- content_type 'text/turtle'
70
57
 
71
- reader { RDF::Turtle::Reader }
72
- writer { RDF::Turtle::Writer }
58
+ # List of symbols used to lookup this format
59
+ def self.symbols
60
+ [:turtle, :ttl]
61
+ end
73
62
  end
74
63
  end
@@ -24,7 +24,7 @@ module RDF::Turtle
24
24
  predicate = read_pname(intern: true) || fail_predicate
25
25
  object = read_pname || read_uriref || read_boolean || read_numeric || read_literal || fail_object
26
26
  if validate? && !read_eos
27
- raise RDF::ReaderError.new("ERROR [line #{lineno}] Expected end of statement (found: #{current_line.inspect})", lineno: lineno)
27
+ log_error("Expected end of statement (found: #{current_line.inspect})", lineno: lineno, exception: RDF::ReaderError)
28
28
  end
29
29
  return [subject, predicate, object]
30
30
  end
@@ -8,6 +8,7 @@ module RDF::Turtle
8
8
  format Format
9
9
  include EBNF::LL1::Parser
10
10
  include RDF::Turtle::Terminals
11
+ include RDF::Util::Logger
11
12
 
12
13
  # Terminals passed to lexer. Order matters!
13
14
  terminal(:ANON, ANON)
@@ -31,14 +32,17 @@ module RDF::Turtle
31
32
  terminal(:LANGTAG, LANGTAG)
32
33
 
33
34
  ##
34
- # Accumulated errors found during processing
35
- # @return [Array<String>]
36
- attr_reader :errors
37
-
38
- ##
39
- # Accumulated warnings found during processing
40
- # @return [Array<String>]
41
- attr_reader :warnings
35
+ # Reader options
36
+ # @see http://www.rubydoc.info/github/ruby-rdf/rdf/RDF/Reader#options-class_method
37
+ def self.options
38
+ super + [
39
+ RDF::CLI::Option.new(
40
+ symbol: :freebase,
41
+ datatype: TrueClass,
42
+ on: ["--freebase"],
43
+ description: "Use optimized Freebase reader.") {true},
44
+ ]
45
+ end
42
46
 
43
47
  ##
44
48
  # Redirect for Freebase Reader
@@ -73,18 +77,8 @@ module RDF::Turtle
73
77
  # @option options [Boolean] :validate (false)
74
78
  # whether to validate the parsed statements and values. If not validating,
75
79
  # the parser will attempt to recover from errors.
76
- # @option options [Array] :errors
77
- # array for placing errors found when parsing
78
- # @option options [Array] :warnings
79
- # array for placing warnings found when parsing
80
- # @option options [Boolean] :progress
81
- # Show progress of parser productions
82
- # @option options [Boolean, Integer, Array] :debug
83
- # Detailed debug output. If set to an Integer, output is restricted
84
- # to messages of that priority: `0` for errors, `1` for warnings,
85
- # `2` for processor tracing, and anything else for various levels
86
- # of debug. If set to an Array, information is collected in the array
87
- # instead of being output to `$stderr`.
80
+ # @option options [Logger, #write, #<<] :logger
81
+ # Record error/info/debug output
88
82
  # @option options [Boolean] :freebase (false)
89
83
  # Use optimized Freebase reader
90
84
  # @return [RDF::Turtle::Reader]
@@ -94,25 +88,17 @@ module RDF::Turtle
94
88
  anon_base: "b0",
95
89
  validate: false,
96
90
  whitespace: WS,
91
+ log_depth: 0,
97
92
  }.merge(options)
98
93
  @options = {prefixes: {nil => ""}}.merge(@options) unless @options[:validate]
99
- @errors = @options[:errors] || []
100
- @warnings = @options[:warnings] || []
101
- @depth = 0
102
94
  @prod_stack = []
103
95
 
104
- @options[:debug] ||= case
105
- when RDF::Turtle.debug? then true
106
- when @options[:progress] then 2
107
- when @options[:validate] then 1
108
- end
109
-
110
96
  @options[:base_uri] = RDF::URI(base_uri || "")
111
- debug("base IRI") {base_uri.inspect}
97
+ log_debug("base IRI") {base_uri.inspect}
112
98
 
113
- debug("validate") {validate?.inspect}
114
- debug("canonicalize") {canonicalize?.inspect}
115
- debug("intern") {intern?.inspect}
99
+ log_debug("validate") {validate?.inspect}
100
+ log_debug("canonicalize") {canonicalize?.inspect}
101
+ log_debug("intern") {intern?.inspect}
116
102
 
117
103
  @lexer = EBNF::LL1::Lexer.new(input, self.class.patterns, @options)
118
104
 
@@ -137,7 +123,7 @@ module RDF::Turtle
137
123
  # @return [void]
138
124
  def each_statement(&block)
139
125
  if block_given?
140
- @recovering = false
126
+ log_recover
141
127
  @callback = block
142
128
 
143
129
  begin
@@ -148,14 +134,8 @@ module RDF::Turtle
148
134
  # Terminate loop if EOF found while recovering
149
135
  end
150
136
 
151
- if validate?
152
- if !warnings.empty? && !@options[:warnings]
153
- $stderr.puts "Warnings: #{warnings.join("\n")}"
154
- end
155
- if !errors.empty?
156
- $stderr.puts "Errors: #{errors.join("\n")}" unless @options[:errors]
157
- raise RDF::ReaderError, "Errors found during processing"
158
- end
137
+ if validate? && log_statistics[:error]
138
+ raise RDF::ReaderError, "Errors found during processing"
159
139
  end
160
140
  end
161
141
  enum_for(:each_statement)
@@ -207,7 +187,7 @@ module RDF::Turtle
207
187
 
208
188
  # Create a literal
209
189
  def literal(value, options = {})
210
- debug("literal") do
190
+ log_debug("literal") do
211
191
  "value: #{value.inspect}, " +
212
192
  "options: #{options.inspect}, " +
213
193
  "validate: #{validate?.inspect}, " +
@@ -241,7 +221,7 @@ module RDF::Turtle
241
221
  base = ''
242
222
  end
243
223
  suffix = suffix.to_s.sub(/^\#/, "") if base.index("#")
244
- debug("pname") {"base: '#{base}', suffix: '#{suffix}'"}
224
+ log_debug("pname") {"base: '#{base}', suffix: '#{suffix}'"}
245
225
  process_iri(base + suffix.to_s)
246
226
  end
247
227
 
@@ -262,7 +242,7 @@ module RDF::Turtle
262
242
  read_directive || error("Failed to parse directive", production: :directive, token: token)
263
243
  else
264
244
  read_triples || error("Expected token", production: :statement, token: token)
265
- if !@recovering || @lexer.first === '.'
245
+ if !log_recovering? || @lexer.first === '.'
266
246
  # If recovering, we will have eaten the closing '.'
267
247
  token = @lexer.shift
268
248
  unless token && token.value == '.'
@@ -303,7 +283,7 @@ module RDF::Turtle
303
283
  terminated = token.value == '@prefix'
304
284
  error("Expected PNAME_NS", production: :prefix, token: pfx) unless pfx === :PNAME_NS
305
285
  error("Expected IRIREF", production: :prefix, token: iri) unless iri === :IRIREF
306
- debug("prefixID") {"Defined prefix #{pfx.inspect} mapping to #{iri.inspect}"}
286
+ log_debug("prefixID") {"Defined prefix #{pfx.inspect} mapping to #{iri.inspect}"}
307
287
  prefix(pfx.value[0..-2], process_iri(iri))
308
288
  error("prefixId", "#{token} should be downcased") if token.value.start_with?('@') && token.value != '@prefix'
309
289
 
@@ -451,7 +431,7 @@ module RDF::Turtle
451
431
  if token === '['
452
432
  prod(:blankNodePropertyList, %{]}) do
453
433
  @lexer.shift
454
- progress("blankNodePropertyList") {"token: #{token.inspect}"}
434
+ log_info("blankNodePropertyList") {"token: #{token.inspect}"}
455
435
  node = bnode
456
436
  read_predicateObjectList(node)
457
437
  error("blankNodePropertyList", "Expected closing ']'") unless @lexer.first === ']'
@@ -467,12 +447,12 @@ module RDF::Turtle
467
447
  prod(:collection, %{)}) do
468
448
  @lexer.shift
469
449
  token = @lexer.first
470
- progress("collection") {"token: #{token.inspect}"}
450
+ log_info("collection") {"token: #{token.inspect}"}
471
451
  objects = []
472
452
  while object = read_object
473
453
  objects << object
474
454
  end
475
- list = RDF::List.new(nil, nil, objects)
455
+ list = RDF::List.new(values: objects)
476
456
  list.each_statement do |statement|
477
457
  add_statement("collection", statement)
478
458
  end
@@ -503,9 +483,8 @@ module RDF::Turtle
503
483
 
504
484
  def prod(production, recover_to = [])
505
485
  @prod_stack << {prod: production, recover_to: recover_to}
506
- @depth += 1
507
- @recovering = false
508
- progress("#{production}(start)") {"token: #{@lexer.first.inspect}"}
486
+ @options[:log_depth] += 1
487
+ log_recover("#{production}(start)") {"token: #{@lexer.first.inspect}"}
509
488
  yield
510
489
  rescue EBNF::LL1::Lexer::Error, SyntaxError, Recovery => e
511
490
  # Lexer encountered an illegal token or the parser encountered
@@ -525,13 +504,13 @@ module RDF::Turtle
525
504
  end
526
505
  end
527
506
  raise EOFError, "End of input found when recovering" if @lexer.first.nil?
528
- debug("recovery", "current token: #{@lexer.first.inspect}", level: 4)
507
+ log_debug("recovery", "current token: #{@lexer.first.inspect}")
529
508
 
530
509
  unless e.is_a?(Recovery)
531
510
  # Get the list of follows for this sequence, this production and the stacked productions.
532
- debug("recovery", "stack follows:", level: 4)
511
+ log_debug("recovery", "stack follows:")
533
512
  @prod_stack.reverse.each do |prod|
534
- debug("recovery", level: 4) {" #{prod[:prod]}: #{prod[:recover_to].inspect}"}
513
+ log_debug("recovery", level: 4) {" #{prod[:prod]}: #{prod[:recover_to].inspect}"}
535
514
  end
536
515
  end
537
516
 
@@ -541,9 +520,9 @@ module RDF::Turtle
541
520
  # Skip tokens until one is found in follows
542
521
  while (token = (@lexer.first rescue @lexer.recover)) && follows.none? {|t| token === t}
543
522
  skipped = @lexer.shift
544
- progress("recovery") {"skip #{skipped.inspect}"}
523
+ log_debug("recovery") {"skip #{skipped.inspect}"}
545
524
  end
546
- debug("recovery") {"found #{token.inspect} in follows"}
525
+ log_debug("recovery") {"found #{token.inspect} in follows"}
547
526
 
548
527
  # Re-raise the error unless token is a follows of this production
549
528
  raise Recovery unless Array(recover_to).any? {|t| token === t}
@@ -551,34 +530,15 @@ module RDF::Turtle
551
530
  # Skip that token to get something reasonable to start the next production with
552
531
  @lexer.shift
553
532
  ensure
554
- progress("#{production}(finish)")
555
- @depth -= 1
533
+ log_info("#{production}(finish)")
534
+ @options[:log_depth] -= 1
556
535
  @prod_stack.pop
557
536
  end
558
537
 
559
- ##
560
- # Warning information, used as level `1` debug messages.
561
- #
562
- # @param [String] node Relevant location associated with message
563
- # @param [String] message Error string
564
- # @param [Hash] options
565
- # @option options [URI, #to_s] :production
566
- # @option options [Token] :token
567
- # @see {#debug}
568
- def warn(node, message, options = {})
569
- m = "WARNING "
570
- m += "[line: #{@lineno}] " if @lineno
571
- m += message
572
- m += " (found #{options[:token].inspect})" if options[:token]
573
- m += ", production = #{options[:production].inspect}" if options[:production]
574
- @warnings << m unless @recovering
575
- debug(node, m, options.merge(level: 1))
576
- end
577
-
578
538
  ##
579
539
  # Error information, used as level `0` debug messages.
580
540
  #
581
- # @overload debug(node, message, options)
541
+ # @overload error(node, message, options)
582
542
  # @param [String] node Relevant location associated with message
583
543
  # @param [String] message Error string
584
544
  # @param [Hash] options
@@ -586,70 +546,15 @@ module RDF::Turtle
586
546
  # @option options [Token] :token
587
547
  # @see {#debug}
588
548
  def error(*args)
589
- return if @recovering
590
- options = args.last.is_a?(Hash) ? args.pop : {}
549
+ ctx = ""
550
+ ctx += "(found #{options[:token].inspect})" if options[:token]
551
+ ctx += ", production = #{options[:production].inspect}" if options[:production]
591
552
  lineno = @lineno || (options[:token].lineno if options[:token].respond_to?(:lineno))
592
- message = "#{args.join(': ')}"
593
- m = "ERROR "
594
- m += "[line: #{lineno}] " if lineno
595
- m += message
596
- m += " (found #{options[:token].inspect})" if options[:token]
597
- m += ", production = #{options[:production].inspect}" if options[:production]
598
- @recovering = true
599
- @errors << m
600
- debug(m, options.merge(level: 0))
601
- raise SyntaxError.new(m, lineno: lineno, token: options[:token], production: options[:production])
602
- end
603
-
604
- ##
605
- # Progress output when debugging.
606
- #
607
- # The call is ignored, unless `@options[:debug]` is set, in which
608
- # case it records tracing information as indicated. Additionally,
609
- # if `@options[:debug]` is an Integer, the call is aborted if the
610
- # `:level` option is less than than `:level`.
611
- #
612
- # @overload debug(node, message, options)
613
- # @param [Array<String>] args Relevant location associated with message
614
- # @param [Hash] options
615
- # @option options [Integer] :depth
616
- # Recursion depth for indenting output
617
- # @option options [Integer] :level
618
- # Level assigned to message, by convention, level `0` is for
619
- # errors, level `1` is for warnings, level `2` is for parser
620
- # progress information, and anything higher is for various levels
621
- # of debug information.
622
- #
623
- # @yieldparam [:trace] trace
624
- # @yieldparam [Integer] level
625
- # @yieldparam [Integer] lineno
626
- # @yieldparam [Integer] depth Recursive depth of productions
627
- # @yieldparam [Array<String>] args
628
- # @yieldreturn [String] added to message
629
- def debug(*args)
630
- return unless @options[:debug]
631
- options = args.last.is_a?(Hash) ? args.pop : {}
632
- debug_level = options.fetch(:level, 3)
633
- return if @options[:debug].is_a?(Integer) && debug_level > @options[:debug]
634
-
635
- depth = options[:depth] || @depth
636
- args << yield if block_given?
637
-
638
- message = "#{args.join(': ')}"
639
- d_str = depth > 100 ? ' ' * 100 + '+' : ' ' * depth
640
- str = "[#{lineno}](#{debug_level})#{d_str}#{message}"
641
- case @options[:debug]
642
- when Array
643
- @options[:debug] << str
644
- when TrueClass
645
- $stderr.puts str
646
- when Integer
647
- case debug_level
648
- when 0 then return if @options[:errors]
649
- when 1 then return if @options[:warnings]
650
- end
651
- $stderr.puts(str) if debug_level <= @options[:debug]
652
- end
553
+ log_error(*args, ctx,
554
+ lineno: lineno,
555
+ token: options[:token],
556
+ production: options[:production],
557
+ exception: SyntaxError)
653
558
  end
654
559
 
655
560
  # Used for internal error recovery
@@ -57,11 +57,40 @@ module RDF::Turtle
57
57
  # @author [Gregg Kellogg](http://greggkellogg.net/)
58
58
  class Writer < RDF::Writer
59
59
  include StreamingWriter
60
+ include RDF::Util::Logger
60
61
  format RDF::Turtle::Format
61
62
 
62
63
  # @return [Graph] Graph of statements serialized
63
64
  attr_accessor :graph
64
-
65
+
66
+ ##
67
+ # Writer options
68
+ # @see http://www.rubydoc.info/github/ruby-rdf/rdf/RDF/Writer#options-class_method
69
+ def self.options
70
+ super + [
71
+ RDF::CLI::Option.new(
72
+ symbol: :max_depth,
73
+ datatype: Integer,
74
+ on: ["--max-depth DEPTH"],
75
+ description: "Maximum depth for recursively defining resources, defaults to 3.") {true},
76
+ RDF::CLI::Option.new(
77
+ symbol: :stream,
78
+ datatype: TrueClass,
79
+ on: ["--stream"],
80
+ description: "Do not attempt to optimize graph presentation, suitable for streaming large graphs.") {true},
81
+ RDF::CLI::Option.new(
82
+ symbol: :default_namespace,
83
+ datatype: RDF::URI,
84
+ on: ["--default-namespace URI", :REQUIRED],
85
+ description: "URI to use as default namespace, same as prefixes.") {|arg| RDF::URI(arg)},
86
+ RDF::CLI::Option.new(
87
+ symbol: :literal_shorthand,
88
+ datatype: FalseClass,
89
+ on: ["--no-literal-shorthand"],
90
+ description: "Do not ttempt to use Literal shorthands fo numbers and boolean values.") {false},
91
+ ]
92
+ end
93
+
65
94
  ##
66
95
  # Initializes the Turtle writer instance.
67
96
  #
@@ -88,19 +117,19 @@ module RDF::Turtle
88
117
  # @option options [Boolean] :unique_bnodes (false)
89
118
  # Use unique node identifiers, defaults to using the identifier which the node was originall initialized with (if any).
90
119
  # @option options [Boolean] :literal_shorthand (true)
91
- # Attempt to use Literal shorthands fo numbers and boolean values
120
+ # Attempt to use Literal shorthands for numbers and boolean values
92
121
  # @yield [writer] `self`
93
122
  # @yieldparam [RDF::Writer] writer
94
123
  # @yieldreturn [void]
95
124
  # @yield [writer]
96
125
  # @yieldparam [RDF::Writer] writer
97
126
  def initialize(output = $stdout, options = {}, &block)
98
- reset
99
127
  @graph = RDF::Graph.new
100
128
  @uri_to_pname = {}
101
129
  @uri_to_prefix = {}
102
130
  options = {literal_shorthand: true}.merge(options)
103
131
  super do
132
+ reset
104
133
  if block_given?
105
134
  case block.arity
106
135
  when 0 then instance_eval(&block)
@@ -110,20 +139,6 @@ module RDF::Turtle
110
139
  end
111
140
  end
112
141
 
113
- ##
114
- # Adds a statement to be serialized
115
- # @param [RDF::Statement] statement
116
- # @return [void]
117
- def write_statement(statement)
118
- case
119
- when @options[:stream]
120
- stream_statement(statement)
121
- else
122
- # Add to local graph and output in epilogue
123
- @graph.insert(statement)
124
- end
125
- end
126
-
127
142
  ##
128
143
  # Adds a triple to be serialized
129
144
  # @param [RDF::Resource] subject
@@ -131,7 +146,12 @@ module RDF::Turtle
131
146
  # @param [RDF::Value] object
132
147
  # @return [void]
133
148
  def write_triple(subject, predicate, object)
134
- write_statement(Statement.new(subject, predicate, object))
149
+ statement = RDF::Statement.new(subject, predicate, object)
150
+ if @options[:stream]
151
+ stream_statement(statement)
152
+ else
153
+ @graph.insert(statement)
154
+ end
135
155
  end
136
156
 
137
157
  ##
@@ -159,7 +179,7 @@ module RDF::Turtle
159
179
 
160
180
  self.reset
161
181
 
162
- debug("\nserialize") {"graph: #{@graph.size}"}
182
+ log_debug("\nserialize") {"graph: #{@graph.size}"}
163
183
 
164
184
  preprocess
165
185
  start_document
@@ -170,6 +190,7 @@ module RDF::Turtle
170
190
  end
171
191
  end
172
192
  end
193
+ super
173
194
  end
174
195
 
175
196
  # Return a QName for the URI, or nil. Adds namespace of QName to defined prefixes
@@ -193,14 +214,14 @@ module RDF::Turtle
193
214
  prefix = @uri_to_prefix[u]
194
215
  unless u.to_s.empty?
195
216
  prefix(prefix, u) unless u.to_s.empty?
196
- debug("get_pname") {"add prefix #{prefix.inspect} => #{u}"}
217
+ log_debug("get_pname") {"add prefix #{prefix.inspect} => #{u}"}
197
218
  uri.sub(u.to_s, "#{prefix}:")
198
219
  end
199
220
  when @options[:standard_prefixes] && vocab = RDF::Vocabulary.each.to_a.detect {|v| uri.index(v.to_uri.to_s) == 0}
200
221
  prefix = vocab.__name__.to_s.split('::').last.downcase
201
222
  @uri_to_prefix[vocab.to_uri.to_s] = prefix
202
223
  prefix(prefix, vocab.to_uri) # Define for output
203
- debug("get_pname") {"add standard prefix #{prefix.inspect} => #{vocab.to_uri}"}
224
+ log_debug("get_pname") {"add standard prefix #{prefix.inspect} => #{vocab.to_uri}"}
204
225
  uri.sub(vocab.to_uri.to_s, "#{prefix}:")
205
226
  else
206
227
  nil
@@ -233,7 +254,7 @@ module RDF::Turtle
233
254
  prop_list << prop.to_s
234
255
  end
235
256
 
236
- debug("sort_properties") {prop_list.join(', ')}
257
+ log_debug("sort_properties") {prop_list.join(', ')}
237
258
  prop_list
238
259
  end
239
260
 
@@ -244,7 +265,6 @@ module RDF::Turtle
244
265
  # @param [Hash{Symbol => Object}] options
245
266
  # @return [String]
246
267
  def format_literal(literal, options = {})
247
- literal = literal.dup.canonicalize! if @options[:canonicalize]
248
268
  case literal
249
269
  when RDF::Literal
250
270
  case @options[:literal_shorthand] && literal.valid? ? literal.datatype : false
@@ -271,7 +291,7 @@ module RDF::Turtle
271
291
  # @return [String]
272
292
  def format_uri(uri, options = {})
273
293
  md = uri.relativize(base_uri)
274
- debug("relativize") {"#{uri.to_ntriples} => #{md.inspect}"} if md != uri.to_s
294
+ log_debug("relativize") {"#{uri.to_ntriples} => #{md.inspect}"} if md != uri.to_s
275
295
  md != uri.to_s ? "<#{md}>" : (get_pname(uri) || "<#{uri}>")
276
296
  end
277
297
 
@@ -290,7 +310,7 @@ module RDF::Turtle
290
310
  def start_document
291
311
  @output.write("#{indent}@base <#{base_uri}> .\n") unless base_uri.to_s.empty?
292
312
 
293
- debug("start_document") {prefixes.inspect}
313
+ log_debug("start_document") {prefixes.inspect}
294
314
  prefixes.keys.sort_by(&:to_s).each do |prefix|
295
315
  @output.write("#{indent}@prefix #{prefix}: <#{prefixes[prefix]}> .\n")
296
316
  end
@@ -322,7 +342,7 @@ module RDF::Turtle
322
342
  # Add distinguished classes
323
343
  top_classes.each do |class_uri|
324
344
  graph.query(predicate: RDF.type, object: class_uri).map {|st| st.subject}.sort.uniq.each do |subject|
325
- debug("order_subjects") {subject.to_ntriples}
345
+ log_debug("order_subjects") {subject.to_ntriples}
326
346
  subjects << subject
327
347
  seen[subject] = true
328
348
  end
@@ -359,7 +379,7 @@ module RDF::Turtle
359
379
  # prefixes.
360
380
  # @param [Statement] statement
361
381
  def preprocess_statement(statement)
362
- #debug("preprocess") {statement.to_ntriples}
382
+ #log_debug("preprocess") {statement.to_ntriples}
363
383
  bump_reference(statement.object)
364
384
  @subjects[statement.subject] = true
365
385
 
@@ -374,12 +394,11 @@ module RDF::Turtle
374
394
  # @param [Integer] modifier Increase depth by specified amount
375
395
  # @return [String] A number of spaces, depending on current depth
376
396
  def indent(modifier = 0)
377
- " " * (@depth + modifier)
397
+ " " * (@options.fetch(:log_depth, log_depth) * 2 + modifier)
378
398
  end
379
399
 
380
400
  # Reset internal helper instance variables
381
401
  def reset
382
- @depth = 0
383
402
  @lists = {}
384
403
  @references = {}
385
404
  @serialized = {}
@@ -400,41 +419,21 @@ module RDF::Turtle
400
419
  end
401
420
  end
402
421
 
403
- ##
404
- # Add debug event to debug array, if specified
405
- #
406
- # @overload debug(message)
407
- # @param [String] message ("")
408
- # @yieldreturn [String] added to message
409
- def debug(*args)
410
- return unless @options[:debug] || RDF::Turtle.debug?
411
- options = args.last.is_a?(Hash) ? args.pop : {}
412
- depth = options[:depth] || @depth
413
- d_str = depth > 100 ? ' ' * 100 + '+' : ' ' * depth
414
- message = args.pop
415
- message = message.call if message.is_a?(Proc)
416
- args << message if message
417
- args << yield if block_given?
418
- message = "#{d_str}#{args.join(': ')}"
419
- @options[:debug] << message if @options[:debug].is_a?(Array)
420
- $stderr.puts(message) if RDF::Turtle.debug?
421
- end
422
-
423
422
  private
424
423
 
425
424
  # Checks if l is a valid RDF list, i.e. no nodes have other properties.
426
425
  def is_valid_list?(l)
427
- #debug("is_valid_list?") {l.inspect}
428
- return RDF::List.new(l, @graph).valid?
426
+ #log_debug("is_valid_list?") {l.inspect}
427
+ return RDF::List.new(subject: l, graph: @graph).valid?
429
428
  end
430
429
 
431
430
  def do_list(l)
432
- list = RDF::List.new(l, @graph)
433
- debug("do_list") {list.inspect}
431
+ list = RDF::List.new(subject: l, graph: @graph)
432
+ log_debug("do_list") {list.inspect}
434
433
  position = :subject
435
434
  list.each_statement do |st|
436
435
  next unless st.predicate == RDF.first
437
- debug {" list this: #{st.subject} first: #{st.object}[#{position}]"}
436
+ log_debug {" list this: #{st.subject} first: #{st.object}[#{position}]"}
438
437
  path(st.object, position)
439
438
  subject_done(st.subject)
440
439
  position = :object
@@ -443,12 +442,10 @@ module RDF::Turtle
443
442
 
444
443
  def collection(node, position)
445
444
  return false if !is_valid_list?(node)
446
- #debug("collection") {"#{node.to_ntriples}, #{position}"}
445
+ #log_debug("collection") {"#{node.to_ntriples}, #{position}"}
447
446
 
448
447
  @output.write(position == :subject ? "(" : " (")
449
- @depth += 2
450
- do_list(node)
451
- @depth -= 2
448
+ log_depth {do_list(node)}
452
449
  @output.write(')')
453
450
  end
454
451
 
@@ -463,20 +460,20 @@ module RDF::Turtle
463
460
  def p_squared(resource, position)
464
461
  return false unless p_squared?(resource, position)
465
462
 
466
- #debug("p_squared") {"#{resource.to_ntriples}, #{position}"}
463
+ #log_debug("p_squared") {"#{resource.to_ntriples}, #{position}"}
467
464
  subject_done(resource)
468
465
  @output.write(position == :subject ? '[' : ' [')
469
- @depth += 2
470
- num_props = predicateObjectList(resource, true)
471
- @output.write(num_props > 1 ? "\n#{indent} ]" : "]")
472
- @depth -= 2
466
+ log_depth do
467
+ num_props = predicateObjectList(resource, true)
468
+ @output.write(num_props > 1 ? "\n#{indent} ]" : "]")
469
+ end
473
470
 
474
471
  true
475
472
  end
476
473
 
477
474
  # Default singular resource representation.
478
475
  def p_default(resource, position)
479
- #debug("p_default") {"#{resource.to_ntriples}, #{position}"}
476
+ #log_debug("p_default") {"#{resource.to_ntriples}, #{position}"}
480
477
  l = (position == :subject ? "" : " ") + format_term(resource, options)
481
478
  @output.write(l)
482
479
  end
@@ -484,7 +481,7 @@ module RDF::Turtle
484
481
  # Represent a resource in subject, predicate or object position.
485
482
  # Use either collection, blankNodePropertyList or singular resource notation.
486
483
  def path(resource, position)
487
- debug("path") do
484
+ log_debug("path") do
488
485
  "#{resource.to_ntriples}, " +
489
486
  "pos: #{position}, " +
490
487
  "()?: #{is_valid_list?(resource)}, " +
@@ -495,7 +492,7 @@ module RDF::Turtle
495
492
  end
496
493
 
497
494
  def predicate(resource)
498
- debug("predicate") {resource.to_ntriples}
495
+ log_debug("predicate") {resource.to_ntriples}
499
496
  if resource == RDF.type
500
497
  @output.write(" a")
501
498
  else
@@ -505,7 +502,7 @@ module RDF::Turtle
505
502
 
506
503
  # Render an objectList having a common subject and predicate
507
504
  def objectList(objects)
508
- debug("objectList") {objects.inspect}
505
+ log_debug("objectList") {objects.inspect}
509
506
  return if objects.empty?
510
507
 
511
508
  objects.each_with_index do |obj, i|
@@ -527,7 +524,7 @@ module RDF::Turtle
527
524
  end
528
525
 
529
526
  prop_list = sort_properties(properties) - [RDF.first.to_s, RDF.rest.to_s]
530
- debug("predicateObjectList") {prop_list.inspect}
527
+ log_debug("predicateObjectList") {prop_list.inspect}
531
528
  return 0 if prop_list.empty?
532
529
 
533
530
  @output.write("\n#{indent(2)}") if properties.keys.length > 1 && from_bpl
@@ -550,11 +547,9 @@ module RDF::Turtle
550
547
  def blankNodePropertyList(subject)
551
548
  return false unless blankNodePropertyList?(subject)
552
549
 
553
- debug("blankNodePropertyList") {subject.to_ntriples}
550
+ log_debug("blankNodePropertyList") {subject.to_ntriples}
554
551
  @output.write("\n#{indent} [")
555
- @depth += 1
556
- num_props = predicateObjectList(subject, true)
557
- @depth -= 1
552
+ num_props = log_depth {predicateObjectList(subject, true)}
558
553
  @output.write(num_props > 1 ? "\n#{indent} ] ." : "] .")
559
554
  true
560
555
  end
@@ -569,7 +564,7 @@ module RDF::Turtle
569
564
  end
570
565
 
571
566
  def statement(subject)
572
- debug("statement") {"#{subject.to_ntriples}, bnodePL?: #{blankNodePropertyList?(subject)}"}
567
+ log_debug("statement") {"#{subject.to_ntriples}, bnodePL?: #{blankNodePropertyList?(subject)}"}
573
568
  subject_done(subject)
574
569
  blankNodePropertyList(subject) || triples(subject)
575
570
  @output.puts
metadata CHANGED
@@ -1,29 +1,35 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rdf-turtle
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.99.0
4
+ version: 2.0.0.beta1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Gregg Kellogg
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-10-30 00:00:00.000000000 Z
11
+ date: 2016-02-22 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rdf
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - "~>"
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: 2.0.0.beta
20
+ - - "<"
18
21
  - !ruby/object:Gem::Version
19
- version: '1.99'
22
+ version: '3'
20
23
  type: :runtime
21
24
  prerelease: false
22
25
  version_requirements: !ruby/object:Gem::Requirement
23
26
  requirements:
24
- - - "~>"
27
+ - - ">="
25
28
  - !ruby/object:Gem::Version
26
- version: '1.99'
29
+ version: 2.0.0.beta
30
+ - - "<"
31
+ - !ruby/object:Gem::Version
32
+ version: '3'
27
33
  - !ruby/object:Gem::Dependency
28
34
  name: ebnf
29
35
  requirement: !ruby/object:Gem::Requirement
@@ -31,6 +37,9 @@ dependencies:
31
37
  - - "~>"
32
38
  - !ruby/object:Gem::Version
33
39
  version: '1.0'
40
+ - - ">="
41
+ - !ruby/object:Gem::Version
42
+ version: 1.0.1.beta
34
43
  type: :runtime
35
44
  prerelease: false
36
45
  version_requirements: !ruby/object:Gem::Requirement
@@ -38,6 +47,9 @@ dependencies:
38
47
  - - "~>"
39
48
  - !ruby/object:Gem::Version
40
49
  version: '1.0'
50
+ - - ">="
51
+ - !ruby/object:Gem::Version
52
+ version: 1.0.1.beta
41
53
  - !ruby/object:Gem::Dependency
42
54
  name: rspec
43
55
  requirement: !ruby/object:Gem::Requirement
@@ -70,58 +82,82 @@ dependencies:
70
82
  name: rdf-isomorphic
71
83
  requirement: !ruby/object:Gem::Requirement
72
84
  requirements:
73
- - - "~>"
85
+ - - ">="
86
+ - !ruby/object:Gem::Version
87
+ version: 2.0.0.beta
88
+ - - "<"
74
89
  - !ruby/object:Gem::Version
75
- version: '1.99'
90
+ version: '3'
76
91
  type: :development
77
92
  prerelease: false
78
93
  version_requirements: !ruby/object:Gem::Requirement
79
94
  requirements:
80
- - - "~>"
95
+ - - ">="
81
96
  - !ruby/object:Gem::Version
82
- version: '1.99'
97
+ version: 2.0.0.beta
98
+ - - "<"
99
+ - !ruby/object:Gem::Version
100
+ version: '3'
83
101
  - !ruby/object:Gem::Dependency
84
102
  name: json-ld
85
103
  requirement: !ruby/object:Gem::Requirement
86
104
  requirements:
87
- - - "~>"
105
+ - - ">="
106
+ - !ruby/object:Gem::Version
107
+ version: 2.0.0.beta
108
+ - - "<"
88
109
  - !ruby/object:Gem::Version
89
- version: '1.99'
110
+ version: '3'
90
111
  type: :development
91
112
  prerelease: false
92
113
  version_requirements: !ruby/object:Gem::Requirement
93
114
  requirements:
94
- - - "~>"
115
+ - - ">="
116
+ - !ruby/object:Gem::Version
117
+ version: 2.0.0.beta
118
+ - - "<"
95
119
  - !ruby/object:Gem::Version
96
- version: '1.99'
120
+ version: '3'
97
121
  - !ruby/object:Gem::Dependency
98
122
  name: rdf-spec
99
123
  requirement: !ruby/object:Gem::Requirement
100
124
  requirements:
101
- - - "~>"
125
+ - - ">="
102
126
  - !ruby/object:Gem::Version
103
- version: '1.99'
127
+ version: 2.0.0.beta
128
+ - - "<"
129
+ - !ruby/object:Gem::Version
130
+ version: '3'
104
131
  type: :development
105
132
  prerelease: false
106
133
  version_requirements: !ruby/object:Gem::Requirement
107
134
  requirements:
108
- - - "~>"
135
+ - - ">="
136
+ - !ruby/object:Gem::Version
137
+ version: 2.0.0.beta
138
+ - - "<"
109
139
  - !ruby/object:Gem::Version
110
- version: '1.99'
140
+ version: '3'
111
141
  - !ruby/object:Gem::Dependency
112
142
  name: rdf-vocab
113
143
  requirement: !ruby/object:Gem::Requirement
114
144
  requirements:
115
- - - "~>"
145
+ - - ">="
146
+ - !ruby/object:Gem::Version
147
+ version: 2.0.0.beta
148
+ - - "<"
116
149
  - !ruby/object:Gem::Version
117
- version: '0.8'
150
+ version: '3'
118
151
  type: :development
119
152
  prerelease: false
120
153
  version_requirements: !ruby/object:Gem::Requirement
121
154
  requirements:
122
- - - "~>"
155
+ - - ">="
123
156
  - !ruby/object:Gem::Version
124
- version: '0.8'
157
+ version: 2.0.0.beta
158
+ - - "<"
159
+ - !ruby/object:Gem::Version
160
+ version: '3'
125
161
  - !ruby/object:Gem::Dependency
126
162
  name: rake
127
163
  requirement: !ruby/object:Gem::Requirement
@@ -157,7 +193,7 @@ files:
157
193
  - lib/rdf/turtle/writer.rb
158
194
  homepage: http://ruby-rdf.github.com/rdf-turtle
159
195
  licenses:
160
- - Public Domain
196
+ - Unlicense
161
197
  metadata: {}
162
198
  post_install_message:
163
199
  rdoc_options: []
@@ -167,17 +203,16 @@ required_ruby_version: !ruby/object:Gem::Requirement
167
203
  requirements:
168
204
  - - ">="
169
205
  - !ruby/object:Gem::Version
170
- version: 1.9.2
206
+ version: '2.0'
171
207
  required_rubygems_version: !ruby/object:Gem::Requirement
172
208
  requirements:
173
- - - ">="
209
+ - - ">"
174
210
  - !ruby/object:Gem::Version
175
- version: '0'
211
+ version: 1.3.1
176
212
  requirements: []
177
213
  rubyforge_project: rdf-turtle
178
- rubygems_version: 2.4.5.1
214
+ rubygems_version: 2.5.1
179
215
  signing_key:
180
216
  specification_version: 4
181
217
  summary: Turtle reader/writer for Ruby.
182
218
  test_files: []
183
- has_rdoc: false