rdf 3.1.1 → 3.1.2

Sign up to get free protection for your applications and to get access to all the features.
@@ -58,6 +58,9 @@ module RDF
58
58
  class Vocabulary
59
59
  extend ::Enumerable
60
60
 
61
+ autoload :Format, 'rdf/vocab/writer'
62
+ autoload :Writer, 'rdf/vocab/writer'
63
+
61
64
  class << self
62
65
  ##
63
66
  # Enumerates known RDF vocabulary classes.
@@ -67,16 +70,68 @@ module RDF
67
70
  # @return [Enumerator]
68
71
  def each(&block)
69
72
  if self.equal?(Vocabulary)
70
- # This is needed since all vocabulary classes are defined using
71
- # Ruby's autoloading facility, meaning that `@@subclasses` will be
72
- # empty until each subclass has been touched or require'd.
73
- RDF::VOCABS.each { |v| require "rdf/vocab/#{v}" unless v == :rdf }
74
- @@subclasses.select(&:name).each(&block)
73
+ if @vocabs
74
+ @vocabs.select(&:name).each(&block)
75
+ else
76
+ # This is needed since all vocabulary classes are defined using
77
+ # Ruby's autoloading facility, meaning that `@@subclasses` will be
78
+ # empty until each subclass has been touched or require'd.
79
+ RDF::VOCABS.each { |v, p| RDF.const_get(p[:class_name].to_sym) unless v == :rdf }
80
+ @@subclasses.select(&:name).each(&block)
81
+ end
75
82
  else
76
83
  __properties__.each(&block)
77
84
  end
78
85
  end
79
86
 
87
+ ##
88
+ # A hash of all vocabularies by prefix showing relevant URI and associated vocabulary Class Name
89
+ # @return [Hash{Symbol => Hash{Symbol => String}}]
90
+ def vocab_map
91
+ VOCABS
92
+ end
93
+
94
+ ##
95
+ # Return the vocabulary based on it's class_name symbol
96
+ #
97
+ # @param [Symbol] sym
98
+ # @return [RDF::Vocabulary]
99
+ def from_sym(sym)
100
+ RDF.const_get(sym.to_sym)
101
+ end
102
+
103
+ ##
104
+ # Limits iteration over vocabularies to just those selected
105
+ #
106
+ # @example limit to set of vocabularies by symbol
107
+ # RDF::Vocabulary.limit_vocabs(:rdf, :rdfs
108
+ # RDF::Vocabulary.find_term('http://www.w3.org/2000/01/rdf-schema#Resource').pname
109
+ # # => 'rdfs:Resource'
110
+ #
111
+ # @example limit to set of vocabularies by class name
112
+ # RDF::Vocabulary.limit_vocabs(RDF::RDFV, RDF::RDFS)
113
+ # RDF::Vocabulary.find_term('http://www.w3.org/2000/01/rdf-schema#Resource').pname
114
+ # # => 'rdfs:Resource'
115
+ #
116
+ # @param [Array<symbol, RDF::Vocabulary>] vocabs
117
+ # A list of vocabularies (symbols or classes) which may
118
+ # be returned by {Vocabulary.each}. Also limits
119
+ # vocabularies that will be inspeced for other methods.
120
+ # Set to nil, or an empty array to reset.
121
+ # @return [Array<RDF::Vocabulary>]
122
+ def limit_vocabs(*vocabs)
123
+ @vocabs = if Array(vocabs).empty?
124
+ nil
125
+ else
126
+ vocabs.map do |vocab|
127
+ vocab = :rdfv if vocab == :rdf
128
+ vocab.is_a?(Symbol) && RDF::VOCABS.key?(vocab) ?
129
+ RDF.const_get(RDF::VOCABS[vocab][:class_name].to_sym) :
130
+ vocab
131
+ end.compact
132
+ end
133
+ end
134
+
80
135
  ##
81
136
  # Is this a strict vocabulary, or a liberal vocabulary allowing arbitrary properties?
82
137
  def strict?; false; end
@@ -291,7 +346,8 @@ module RDF
291
346
  prefix, suffix = pname.to_s.split(":", 2)
292
347
  if prefix == "rdf"
293
348
  RDF[suffix]
294
- elsif vocab = RDF::Vocabulary.each.detect {|v| v.__name__ && v.__prefix__ == prefix.to_sym}
349
+ elsif vocab_detail = RDF::Vocabulary.vocab_map[prefix.to_sym]
350
+ vocab = RDF::Vocabulary.from_sym(vocab_detail[:class_name])
295
351
  suffix.to_s.empty? ? vocab.to_uri : vocab[suffix]
296
352
  else
297
353
  (RDF::Vocabulary.find_term(pname) rescue nil) || RDF::URI(pname, validate: true)
@@ -817,11 +873,10 @@ module RDF
817
873
  # @return [RDF::Vocabulary]
818
874
  attr_reader :vocab
819
875
 
820
- # Attributes of this vocabulary term, used for finding `label` and `comment` and to serialize the term back to RDF.
821
- # @return [Hash{Symbol,Resource => Term, #to_s}]
876
+ # Attributes of this vocabulary term, used for finding `label` and `comment` and to serialize the term back to RDF.
877
+ # @return [Hash{Symbol,Resource => Term, #to_s}]
822
878
  attr_reader :attributes
823
879
 
824
-
825
880
  ##
826
881
  # @overload new(uri, attributes:, **options)
827
882
  # @param [URI, String, #to_s] uri
@@ -882,7 +937,10 @@ module RDF
882
937
  #
883
938
  # @return [RDF::URI]
884
939
  def dup
885
- self.class.new((@value || @object).dup, attributes: attributes).extend(Term)
940
+ term = super.extend(Term)
941
+ term.instance_variable_set(:@vocab, vocab)
942
+ term.instance_variable_set(:@attributes, attributes)
943
+ term
886
944
  end
887
945
 
888
946
  ##
@@ -943,7 +1001,7 @@ module RDF
943
1001
  ##
944
1002
  # Values of an attributes as {RDF::Value}
945
1003
  #
946
- # @property [Symbol] prop
1004
+ # @param [Symbol] prop
947
1005
  # @return [RDF::Value, Array<RDF::Value>]
948
1006
  def attribute_value(prop)
949
1007
  values = attributes[prop]
@@ -511,11 +511,12 @@ module RDF
511
511
  # @since 0.3.0
512
512
  def format_term(term, **options)
513
513
  case term
514
- when String then format_literal(RDF::Literal(term, **options), **options)
515
- when RDF::List then format_list(term, **options)
516
- when RDF::Literal then format_literal(term, **options)
517
- when RDF::URI then format_uri(term, **options)
518
- when RDF::Node then format_node(term, **options)
514
+ when String then format_literal(RDF::Literal(term, **options), **options)
515
+ when RDF::List then format_list(term, **options)
516
+ when RDF::Literal then format_literal(term, **options)
517
+ when RDF::URI then format_uri(term, **options)
518
+ when RDF::Node then format_node(term, **options)
519
+ when RDF::Statement then format_rdfstar(term, **options)
519
520
  else nil
520
521
  end
521
522
  end
@@ -562,6 +563,21 @@ module RDF
562
563
  format_term(value.subject, **options)
563
564
  end
564
565
 
566
+ ##
567
+ # Formats a referenced triple.
568
+ #
569
+ # @example
570
+ # <<<s> <p> <o>>> <p> <o> .
571
+ #
572
+ # @param [RDF::Statement] value
573
+ # @param [Hash{Symbol => Object}] options = ({})
574
+ # @return [String]
575
+ # @raise [NotImplementedError] unless implemented in subclass
576
+ # @abstract
577
+ def format_rdfstar(value, **options)
578
+ raise NotImplementedError.new("#{self.class}#format_statement") # override in subclasses
579
+ end
580
+
565
581
  protected
566
582
 
567
583
  ##
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rdf
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.1.1
4
+ version: 3.1.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Arto Bendiken
@@ -10,7 +10,7 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2020-01-08 00:00:00.000000000 Z
13
+ date: 2020-05-30 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: link_header
@@ -279,7 +279,7 @@ files:
279
279
  - lib/rdf/vocab/xsd.rb
280
280
  - lib/rdf/vocabulary.rb
281
281
  - lib/rdf/writer.rb
282
- homepage: https://ruby-rdf.github.com/
282
+ homepage: https://github.com/ruby-rdf/rdf
283
283
  licenses:
284
284
  - Unlicense
285
285
  metadata:
@@ -303,7 +303,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
303
303
  - !ruby/object:Gem::Version
304
304
  version: '0'
305
305
  requirements: []
306
- rubygems_version: 3.1.1
306
+ rubygems_version: 3.1.3
307
307
  signing_key:
308
308
  specification_version: 4
309
309
  summary: A Ruby library for working with Resource Description Framework (RDF) data.