rdf-turtle 1.1.1 → 1.1.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (4) hide show
  1. checksums.yaml +4 -4
  2. data/VERSION +1 -1
  3. data/lib/rdf/turtle/writer.rb +73 -65
  4. metadata +4 -4
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 5004a2bfbcbc8d75238b755771340ebbe325a241
4
- data.tar.gz: 40cad14298f7929b642bcd99aaca635c4a157fc0
3
+ metadata.gz: 9093a424b624c733fd209a33dc7ac8ceb650bd2f
4
+ data.tar.gz: ab2bb587fdb532cbb6a7068df58d0c40c4fb2b98
5
5
  SHA512:
6
- metadata.gz: cf72942195654605441c0820d74d5f58a3cc7ef5b964cab32bf311863ebe906c1244b2de605a1de6525c4746fe336443ac24bae27b001ef1007b3312c315be1e
7
- data.tar.gz: efa7a8565340a01d43b0273547b48bf33aee0fafdfe1f4e20b6d6d8c1acf28a69dc5aa1a2c7ab3cdb30caca7be4d551321313143543b3ecb45035b0ab3fce7b2
6
+ metadata.gz: 05ba9c14422a1be8c51ca24f6e2c7e87fafae3ee24b04023a96f726cf112bb51b7fde1cc053659c61ee6cf87e04dff92d719065a44705dd84ca3fa65cf417c10
7
+ data.tar.gz: 5020e9eb963ea2433c173557750cfb8d62de8a218deee5e5ff406642e53d1e8b3ef8b7979199827c93f86241e974b198e8e439e2611ce7066cb9ed53f709d9aa
data/VERSION CHANGED
@@ -1 +1 @@
1
- 1.1.1
1
+ 1.1.2
@@ -208,8 +208,6 @@ module RDF::Turtle
208
208
  end
209
209
 
210
210
  @uri_to_pname[uri] = pname
211
- rescue Addressable::URI::InvalidURIError => e
212
- raise RDF::WriterError, "Invalid URI #{resource.inspect}: #{e.message}"
213
211
  end
214
212
 
215
213
  # Take a hash from predicate uris to lists of values.
@@ -365,8 +363,7 @@ module RDF::Turtle
365
363
  # @param [Statement] statement
366
364
  def preprocess_statement(statement)
367
365
  #debug("preprocess") {statement.inspect}
368
- references = ref_count(statement.object) + 1
369
- @references[statement.object] = references
366
+ bump_reference(statement.object)
370
367
  @subjects[statement.subject] = true
371
368
 
372
369
  # Pre-fetch pnames, to fill prefixes
@@ -374,14 +371,6 @@ module RDF::Turtle
374
371
  get_pname(statement.predicate)
375
372
  get_pname(statement.object)
376
373
  get_pname(statement.object.datatype) if statement.object.literal? && statement.object.datatype
377
-
378
- @references[statement.predicate] = ref_count(statement.predicate) + 1
379
- end
380
-
381
- # Return the number of times this node has been referenced in the object position
382
- # @return [Integer]
383
- def ref_count(node)
384
- @references.fetch(node, 0)
385
374
  end
386
375
 
387
376
  # Returns indent string multiplied by the depth
@@ -414,8 +403,6 @@ module RDF::Turtle
414
403
  end
415
404
  end
416
405
 
417
- protected
418
-
419
406
  ##
420
407
  # Add debug event to debug array, if specified
421
408
  #
@@ -455,10 +442,10 @@ module RDF::Turtle
455
442
  position = :object
456
443
  end
457
444
  end
458
-
459
- def p_list(node, position)
445
+
446
+ def collection(node, position)
460
447
  return false if !is_valid_list?(node)
461
- #debug("p_list") {"#{node.inspect}, #{position}"}
448
+ #debug("collection") {"#{node.inspect}, #{position}"}
462
449
 
463
450
  @output.write(position == :subject ? "(" : " (")
464
451
  @depth += 2
@@ -466,55 +453,61 @@ module RDF::Turtle
466
453
  @depth -= 2
467
454
  @output.write(')')
468
455
  end
469
-
470
- def p_squared?(node, position)
471
- node.is_a?(RDF::Node) &&
472
- !@serialized.has_key?(node) &&
473
- ref_count(node) <= 1
456
+
457
+ # Can object be represented using a predicateObjectList?
458
+ def p_squared?(resource, position)
459
+ resource.is_a?(RDF::Node) &&
460
+ !@serialized.has_key?(resource) &&
461
+ ref_count(resource) <= 1
474
462
  end
475
-
476
- def p_squared(node, position)
477
- return false unless p_squared?(node, position)
478
463
 
479
- #debug("p_squared") {"#{node.inspect}, #{position}"}
480
- subject_done(node)
464
+ # Represent an object as a predicateObjectList
465
+ def p_squared(resource, position)
466
+ return false unless p_squared?(resource, position)
467
+
468
+ #debug("p_squared") {"#{resource.inspect}, #{position}"}
469
+ subject_done(resource)
481
470
  @output.write(position == :subject ? '[' : ' [')
482
471
  @depth += 2
483
- predicate_list(node)
472
+ predicateObjectList(resource)
484
473
  @depth -= 2
485
474
  @output.write(']')
486
475
 
487
476
  true
488
477
  end
489
-
490
- def p_default(node, position)
491
- #debug("p_default") {"#{node.inspect}, #{position}"}
492
- l = (position == :subject ? "" : " ") + format_value(node)
478
+
479
+ # Default singular resource representation.
480
+ def p_default(resource, position)
481
+ #debug("p_default") {"#{resource.inspect}, #{position}"}
482
+ l = (position == :subject ? "" : " ") + format_value(resource)
493
483
  @output.write(l)
494
484
  end
495
-
496
- def path(node, position)
485
+
486
+ # Represent a resource in subject, predicate or object position.
487
+ # Use either collection, blankNodePropertyList or singular resource notation.
488
+ def path(resource, position)
497
489
  debug("path") do
498
- "#{node.inspect}, " +
490
+ "#{resource.inspect}, " +
499
491
  "pos: #{position}, " +
500
- "[]: #{is_valid_list?(node)}, " +
501
- "p2?: #{p_squared?(node, position)}, " +
502
- "rc: #{ref_count(node)}"
492
+ "[]: #{is_valid_list?(resource)}, " +
493
+ "p2?: #{p_squared?(resource, position)}, " +
494
+ "rc: #{ref_count(resource)}"
503
495
  end
504
- raise RDF::WriterError, "Cannot serialize node '#{node}'" unless p_list(node, position) || p_squared(node, position) || p_default(node, position)
496
+ raise RDF::WriterError, "Cannot serialize resource '#{resource}'" unless collection(resource, position) || p_squared(resource, position) || p_default(resource, position)
505
497
  end
506
498
 
507
- def verb(node)
508
- debug("verb") {node.inspect}
509
- if node == RDF.type
499
+ def predicate(resource)
500
+ debug("predicate") {resource.inspect}
501
+ if resource == RDF.type
510
502
  @output.write(" a")
511
503
  else
512
- path(node, :predicate)
504
+ path(resource, :predicate)
513
505
  end
514
506
  end
515
-
516
- def object_list(objects)
517
- debug("object_list") {objects.inspect}
507
+
508
+ # Render an objectList having a common subject and predicate
509
+ def objectList(objects)
510
+ debug("objectList") {objects.inspect}
518
511
  return if objects.empty?
519
512
 
520
513
  objects.each_with_index do |obj, i|
@@ -522,8 +515,9 @@ module RDF::Turtle
522
515
  path(obj, :object)
523
516
  end
524
517
  end
525
-
526
- def predicate_list(subject)
518
+
519
+ # Render a predicateObjectList having a common subject.
520
+ def predicateObjectList(subject)
527
521
  properties = {}
528
522
  @graph.query(:subject => subject) do |st|
529
523
  properties[st.predicate.to_s] ||= []
@@ -531,49 +525,50 @@ module RDF::Turtle
531
525
  end
532
526
 
533
527
  prop_list = sort_properties(properties) - [RDF.first.to_s, RDF.rest.to_s]
534
- debug("predicate_list") {prop_list.inspect}
528
+ debug("predicateObjectList") {prop_list.inspect}
535
529
  return if prop_list.empty?
536
530
 
537
531
  prop_list.each_with_index do |prop, i|
538
532
  begin
539
533
  @output.write(";\n#{indent(2)}") if i > 0
540
534
  prop[0, 2] == "_:"
541
- verb(prop[0, 2] == "_:" ? RDF::Node.new(prop.split(':').last) : RDF::URI.intern(prop))
542
- object_list(properties[prop])
543
- rescue Addressable::URI::InvalidURIError => e
544
- debug {"Predicate #{prop.inspect} is an invalid URI: #{e.message}"}
535
+ predicate(prop[0, 2] == "_:" ? RDF::Node.new(prop.split(':').last) : RDF::URI.intern(prop))
536
+ objectList(properties[prop])
545
537
  end
546
538
  end
547
539
  end
548
-
549
- def s_squared?(subject)
540
+
541
+ # Can subject be represented as a blankNodePropertyList?
542
+ def blankNodePropertyList?(subject)
550
543
  ref_count(subject) == 0 && subject.is_a?(RDF::Node) && !is_valid_list?(subject)
551
544
  end
552
-
553
- def s_squared(subject)
554
- return false unless s_squared?(subject)
545
+
546
+ # Represent subject as a blankNodePropertyList?
547
+ def blankNodePropertyList(subject)
548
+ return false unless blankNodePropertyList?(subject)
555
549
 
556
- debug("s_squared") {subject.inspect}
550
+ debug("blankNodePropertyList") {subject.inspect}
557
551
  @output.write("\n#{indent} [")
558
552
  @depth += 1
559
- predicate_list(subject)
553
+ predicateObjectList(subject)
560
554
  @depth -= 1
561
555
  @output.write("] .")
562
556
  true
563
557
  end
564
-
565
- def s_default(subject)
558
+
559
+ # Render triples having the same subject using an explicit subject
560
+ def triples(subject)
566
561
  @output.write("\n#{indent}")
567
562
  path(subject, :subject)
568
- predicate_list(subject)
563
+ predicateObjectList(subject)
569
564
  @output.write(" .")
570
565
  true
571
566
  end
572
567
 
573
568
  def statement(subject)
574
- debug("statement") {"#{subject.inspect}, s2?: #{s_squared?(subject)}"}
569
+ debug("statement") {"#{subject.inspect}, bnodePL?: #{blankNodePropertyList?(subject)}"}
575
570
  subject_done(subject)
576
- s_squared(subject) || s_default(subject)
571
+ blankNodePropertyList(subject) || triples(subject)
577
572
  @output.puts
578
573
  end
579
574
 
@@ -581,6 +576,19 @@ module RDF::Turtle
581
576
  @serialized.include?(subject)
582
577
  end
583
578
 
579
+ # Return the number of times this node has been referenced in the object position
580
+ # @return [Integer]
581
+ def ref_count(resource)
582
+ @references.fetch(resource, 0)
583
+ end
584
+
585
+ # Increase the reference count of this resource
586
+ # @param [RDF::Resource] resource
587
+ # @return [Integer] resulting reference count
588
+ def bump_reference(resource)
589
+ @references[resource] = ref_count(resource) + 1
590
+ end
591
+
584
592
  # Mark a subject as done.
585
593
  def subject_done(subject)
586
594
  @serialized[subject] = true
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.1
4
+ version: 1.1.2
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-12-22 00:00:00.000000000 Z
11
+ date: 2013-12-26 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rdf
@@ -16,14 +16,14 @@ dependencies:
16
16
  requirements:
17
17
  - - '>='
18
18
  - !ruby/object:Gem::Version
19
- version: '1.1'
19
+ version: 1.1.1.1
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - '>='
25
25
  - !ruby/object:Gem::Version
26
- version: '1.1'
26
+ version: 1.1.1.1
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: ebnf
29
29
  requirement: !ruby/object:Gem::Requirement