rdf 3.0.12 → 3.1.3

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.
Files changed (45) hide show
  1. checksums.yaml +4 -4
  2. data/AUTHORS +1 -1
  3. data/README.md +46 -11
  4. data/VERSION +1 -1
  5. data/etc/doap.nt +74 -80
  6. data/lib/rdf.rb +35 -23
  7. data/lib/rdf/changeset.rb +87 -19
  8. data/lib/rdf/cli.rb +7 -7
  9. data/lib/rdf/format.rb +17 -10
  10. data/lib/rdf/mixin/enumerable.rb +3 -2
  11. data/lib/rdf/mixin/mutable.rb +5 -15
  12. data/lib/rdf/mixin/queryable.rb +12 -4
  13. data/lib/rdf/mixin/writable.rb +9 -14
  14. data/lib/rdf/model/dataset.rb +1 -1
  15. data/lib/rdf/model/graph.rb +5 -2
  16. data/lib/rdf/model/list.rb +5 -5
  17. data/lib/rdf/model/literal.rb +3 -3
  18. data/lib/rdf/model/statement.rb +30 -7
  19. data/lib/rdf/model/uri.rb +44 -23
  20. data/lib/rdf/nquads.rb +6 -6
  21. data/lib/rdf/ntriples.rb +6 -4
  22. data/lib/rdf/ntriples/reader.rb +29 -7
  23. data/lib/rdf/ntriples/writer.rb +10 -1
  24. data/lib/rdf/query.rb +27 -35
  25. data/lib/rdf/query/hash_pattern_normalizer.rb +14 -12
  26. data/lib/rdf/query/pattern.rb +51 -18
  27. data/lib/rdf/query/solution.rb +20 -1
  28. data/lib/rdf/query/solutions.rb +15 -5
  29. data/lib/rdf/query/variable.rb +17 -5
  30. data/lib/rdf/reader.rb +76 -25
  31. data/lib/rdf/repository.rb +32 -18
  32. data/lib/rdf/transaction.rb +1 -1
  33. data/lib/rdf/util.rb +6 -5
  34. data/lib/rdf/util/cache.rb +2 -2
  35. data/lib/rdf/util/coercions.rb +60 -0
  36. data/lib/rdf/util/file.rb +20 -10
  37. data/lib/rdf/util/logger.rb +6 -6
  38. data/lib/rdf/vocab/owl.rb +401 -86
  39. data/lib/rdf/vocab/rdfs.rb +81 -18
  40. data/lib/rdf/vocab/rdfv.rb +147 -1
  41. data/lib/rdf/vocab/writer.rb +41 -3
  42. data/lib/rdf/vocab/xsd.rb +203 -2
  43. data/lib/rdf/vocabulary.rb +108 -14
  44. data/lib/rdf/writer.rb +32 -10
  45. metadata +32 -27
@@ -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,103 @@ 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
89
+ # associated vocabulary Class Name
90
+ #
91
+ # @return [Hash{Symbol => Hash{Symbol => String}}]
92
+ def vocab_map
93
+ # Create an initial duplicate of RDF::VOCABS. We want to
94
+ # ensure the hash itself is modifiable but the values are
95
+ # frozen.
96
+ @vocab_map ||= RDF::VOCABS.transform_values(&:freeze)
97
+ end
98
+
99
+ ##
100
+ # Return the vocabulary based on it's class_name symbol
101
+ #
102
+ # @param [Symbol] sym
103
+ # @return [RDF::Vocabulary]
104
+ def from_sym(sym)
105
+ RDF.const_get(sym.to_sym)
106
+ end
107
+
108
+ ##
109
+ # Register a vocabulary for internal prefix lookups. Parameters
110
+ # of interest include `:uri`, `:class_name`, `:source`, and `:skip`.
111
+ #
112
+ # @param prefix [Symbol] the prefix to use
113
+ # @param vocab [String, Class] either the URI or the vocab class
114
+ # @param params [Hash{Symbol => String}] Relevant parameters
115
+ # @return [Hash] The parameter hash, but frozen
116
+ def register(prefix, vocab, **params)
117
+ # check the input
118
+ raise ArgumentError, "#{prefix} must be symbol-able" unless
119
+ [String, Symbol].any? { |c| prefix.is_a? c }
120
+
121
+ # note an explicit uri: param overrides
122
+ case vocab
123
+ when String then params[:uri] ||= vocab
124
+ when Class
125
+ raise ArgumentError, 'vocab must be an RDF::(Strict)Vocabulary' unless
126
+ vocab.ancestors.include? RDF::Vocabulary
127
+ params[:class] = vocab
128
+ params[:uri] ||= vocab.to_uri.to_s
129
+ end
130
+
131
+ # fill in the class name
132
+ params[:class_name] ||= prefix.to_s.upcase
133
+
134
+ # now freeze and assign
135
+ vocab_map[prefix.to_s.to_sym] = params.freeze
136
+ end
137
+
138
+ ##
139
+ # Limits iteration over vocabularies to just those selected
140
+ #
141
+ # @example limit to set of vocabularies by symbol
142
+ # RDF::Vocabulary.limit_vocabs(:rdf, :rdfs
143
+ # RDF::Vocabulary.find_term('http://www.w3.org/2000/01/rdf-schema#Resource').pname
144
+ # # => 'rdfs:Resource'
145
+ #
146
+ # @example limit to set of vocabularies by class name
147
+ # RDF::Vocabulary.limit_vocabs(RDF::RDFV, RDF::RDFS)
148
+ # RDF::Vocabulary.find_term('http://www.w3.org/2000/01/rdf-schema#Resource').pname
149
+ # # => 'rdfs:Resource'
150
+ #
151
+ # @param [Array<symbol, RDF::Vocabulary>] vocabs
152
+ # A list of vocabularies (symbols or classes) which may
153
+ # be returned by {Vocabulary.each}. Also limits
154
+ # vocabularies that will be inspeced for other methods.
155
+ # Set to nil, or an empty array to reset.
156
+ # @return [Array<RDF::Vocabulary>]
157
+ def limit_vocabs(*vocabs)
158
+ @vocabs = if Array(vocabs).empty?
159
+ nil
160
+ else
161
+ vocabs.map do |vocab|
162
+ vocab = :rdfv if vocab == :rdf
163
+ vocab.is_a?(Symbol) && RDF::VOCABS.key?(vocab) ?
164
+ RDF.const_get(RDF::VOCABS[vocab][:class_name].to_sym) :
165
+ vocab
166
+ end.compact
167
+ end
168
+ end
169
+
80
170
  ##
81
171
  # Is this a strict vocabulary, or a liberal vocabulary allowing arbitrary properties?
82
172
  def strict?; false; end
@@ -291,7 +381,9 @@ module RDF
291
381
  prefix, suffix = pname.to_s.split(":", 2)
292
382
  if prefix == "rdf"
293
383
  RDF[suffix]
294
- elsif vocab = RDF::Vocabulary.each.detect {|v| v.__name__ && v.__prefix__ == prefix.to_sym}
384
+ elsif vocab_detail = RDF::Vocabulary.vocab_map[prefix.to_sym]
385
+ vocab = vocab_detail[:class] ||
386
+ RDF::Vocabulary.from_sym(vocab_detail[:class_name])
295
387
  suffix.to_s.empty? ? vocab.to_uri : vocab[suffix]
296
388
  else
297
389
  (RDF::Vocabulary.find_term(pname) rescue nil) || RDF::URI(pname, validate: true)
@@ -817,11 +909,10 @@ module RDF
817
909
  # @return [RDF::Vocabulary]
818
910
  attr_reader :vocab
819
911
 
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}]
912
+ # Attributes of this vocabulary term, used for finding `label` and `comment` and to serialize the term back to RDF.
913
+ # @return [Hash{Symbol,Resource => Term, #to_s}]
822
914
  attr_reader :attributes
823
915
 
824
-
825
916
  ##
826
917
  # @overload new(uri, attributes:, **options)
827
918
  # @param [URI, String, #to_s] uri
@@ -873,8 +964,8 @@ module RDF
873
964
  #
874
965
  # @param (see #initialize)
875
966
  # @return [RDF::URI] an immutable, frozen URI object
876
- def self.intern(str, *args)
877
- (URI.cache[(str = str.to_s).to_sym] ||= self.new(str, *args)).freeze
967
+ def self.intern(str, *args, **options)
968
+ (URI.cache[(str = str.to_s).to_sym] ||= self.new(str, *args, **options)).freeze
878
969
  end
879
970
 
880
971
  ##
@@ -882,7 +973,10 @@ module RDF
882
973
  #
883
974
  # @return [RDF::URI]
884
975
  def dup
885
- self.class.new((@value || @object).dup, attributes: attributes).extend(Term)
976
+ term = super.extend(Term)
977
+ term.instance_variable_set(:@vocab, vocab)
978
+ term.instance_variable_set(:@attributes, attributes)
979
+ term
886
980
  end
887
981
 
888
982
  ##
@@ -943,7 +1037,7 @@ module RDF
943
1037
  ##
944
1038
  # Values of an attributes as {RDF::Value}
945
1039
  #
946
- # @property [Symbol] prop
1040
+ # @param [Symbol] prop
947
1041
  # @return [RDF::Value, Array<RDF::Value>]
948
1042
  def attribute_value(prop)
949
1043
  values = attributes[prop]
@@ -1001,7 +1095,7 @@ module RDF
1001
1095
  when :domainIncludes, :rangeIncludes
1002
1096
  RDF::Vocabulary.find_term("http://schema.org/#{p}")
1003
1097
  when :broader, :definition, :exactMatch, :hasTopConcept, :inScheme,
1004
- :member, :narrower, :related, :altLabel, :definition, :editorialNote,
1098
+ :member, :narrower, :related, :altLabel, :editorialNote,
1005
1099
  :notation, :note, :prefLabel
1006
1100
  RDF::Vocabulary.find_term("http://www.w3.org/2004/02/skos/core##{p}")
1007
1101
  else
@@ -79,7 +79,7 @@ module RDF
79
79
  # @param [String] filename
80
80
  # @return [Class]
81
81
  #
82
- # @overload for(**options)
82
+ # @overload for(options = {})
83
83
  # Finds an RDF writer class based on various options.
84
84
  #
85
85
  # @param [Hash{Symbol => Object}] options
@@ -89,9 +89,15 @@ module RDF
89
89
  # @return [Class]
90
90
  #
91
91
  # @return [Class]
92
- def self.for(options = {})
93
- options = options.merge(has_writer: true) if options.is_a?(Hash)
94
- if format = self.format || Format.for(options)
92
+ def self.for(*arg, &block)
93
+ case arg.length
94
+ when 0 then arg = nil
95
+ when 1 then arg = arg.first
96
+ else
97
+ raise ArgumentError, "Format.for accepts zero or one argument, got #{arg.length}."
98
+ end
99
+ arg = arg.merge(has_writer: true) if arg.is_a?(Hash)
100
+ if format = self.format || Format.for(arg)
95
101
  format.writer
96
102
  end
97
103
  end
@@ -505,11 +511,12 @@ module RDF
505
511
  # @since 0.3.0
506
512
  def format_term(term, **options)
507
513
  case term
508
- when String then format_literal(RDF::Literal(term, options), options)
509
- when RDF::List then format_list(term, options)
510
- when RDF::Literal then format_literal(term, options)
511
- when RDF::URI then format_uri(term, options)
512
- 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)
513
520
  else nil
514
521
  end
515
522
  end
@@ -553,7 +560,22 @@ module RDF
553
560
  # @abstract
554
561
  # @since 0.2.3
555
562
  def format_list(value, **options)
556
- format_term(value.subject, options)
563
+ format_term(value.subject, **options)
564
+ end
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
557
579
  end
558
580
 
559
581
  protected
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.0.12
4
+ version: 3.1.3
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: 2019-04-17 00:00:00.000000000 Z
13
+ date: 2020-06-16 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: link_header
@@ -52,154 +52,154 @@ dependencies:
52
52
  requirements:
53
53
  - - "~>"
54
54
  - !ruby/object:Gem::Version
55
- version: '3.0'
55
+ version: '3.1'
56
56
  type: :development
57
57
  prerelease: false
58
58
  version_requirements: !ruby/object:Gem::Requirement
59
59
  requirements:
60
60
  - - "~>"
61
61
  - !ruby/object:Gem::Version
62
- version: '3.0'
62
+ version: '3.1'
63
63
  - !ruby/object:Gem::Dependency
64
64
  name: rdf-turtle
65
65
  requirement: !ruby/object:Gem::Requirement
66
66
  requirements:
67
67
  - - "~>"
68
68
  - !ruby/object:Gem::Version
69
- version: '3.0'
69
+ version: '3.1'
70
70
  type: :development
71
71
  prerelease: false
72
72
  version_requirements: !ruby/object:Gem::Requirement
73
73
  requirements:
74
74
  - - "~>"
75
75
  - !ruby/object:Gem::Version
76
- version: '3.0'
76
+ version: '3.1'
77
77
  - !ruby/object:Gem::Dependency
78
78
  name: rdf-vocab
79
79
  requirement: !ruby/object:Gem::Requirement
80
80
  requirements:
81
81
  - - "~>"
82
82
  - !ruby/object:Gem::Version
83
- version: '3.0'
83
+ version: '3.1'
84
84
  type: :development
85
85
  prerelease: false
86
86
  version_requirements: !ruby/object:Gem::Requirement
87
87
  requirements:
88
88
  - - "~>"
89
89
  - !ruby/object:Gem::Version
90
- version: '3.0'
90
+ version: '3.1'
91
91
  - !ruby/object:Gem::Dependency
92
92
  name: rdf-xsd
93
93
  requirement: !ruby/object:Gem::Requirement
94
94
  requirements:
95
95
  - - "~>"
96
96
  - !ruby/object:Gem::Version
97
- version: '3.0'
97
+ version: '3.1'
98
98
  type: :development
99
99
  prerelease: false
100
100
  version_requirements: !ruby/object:Gem::Requirement
101
101
  requirements:
102
102
  - - "~>"
103
103
  - !ruby/object:Gem::Version
104
- version: '3.0'
104
+ version: '3.1'
105
105
  - !ruby/object:Gem::Dependency
106
106
  name: rest-client
107
107
  requirement: !ruby/object:Gem::Requirement
108
108
  requirements:
109
109
  - - "~>"
110
110
  - !ruby/object:Gem::Version
111
- version: '2.0'
111
+ version: '2.1'
112
112
  type: :development
113
113
  prerelease: false
114
114
  version_requirements: !ruby/object:Gem::Requirement
115
115
  requirements:
116
116
  - - "~>"
117
117
  - !ruby/object:Gem::Version
118
- version: '2.0'
118
+ version: '2.1'
119
119
  - !ruby/object:Gem::Dependency
120
120
  name: rspec
121
121
  requirement: !ruby/object:Gem::Requirement
122
122
  requirements:
123
123
  - - "~>"
124
124
  - !ruby/object:Gem::Version
125
- version: '3.7'
125
+ version: '3.9'
126
126
  type: :development
127
127
  prerelease: false
128
128
  version_requirements: !ruby/object:Gem::Requirement
129
129
  requirements:
130
130
  - - "~>"
131
131
  - !ruby/object:Gem::Version
132
- version: '3.7'
132
+ version: '3.9'
133
133
  - !ruby/object:Gem::Dependency
134
134
  name: rspec-its
135
135
  requirement: !ruby/object:Gem::Requirement
136
136
  requirements:
137
137
  - - "~>"
138
138
  - !ruby/object:Gem::Version
139
- version: '1.2'
139
+ version: '1.3'
140
140
  type: :development
141
141
  prerelease: false
142
142
  version_requirements: !ruby/object:Gem::Requirement
143
143
  requirements:
144
144
  - - "~>"
145
145
  - !ruby/object:Gem::Version
146
- version: '1.2'
146
+ version: '1.3'
147
147
  - !ruby/object:Gem::Dependency
148
148
  name: webmock
149
149
  requirement: !ruby/object:Gem::Requirement
150
150
  requirements:
151
151
  - - "~>"
152
152
  - !ruby/object:Gem::Version
153
- version: '3.1'
153
+ version: '3.7'
154
154
  type: :development
155
155
  prerelease: false
156
156
  version_requirements: !ruby/object:Gem::Requirement
157
157
  requirements:
158
158
  - - "~>"
159
159
  - !ruby/object:Gem::Version
160
- version: '3.1'
160
+ version: '3.7'
161
161
  - !ruby/object:Gem::Dependency
162
162
  name: yard
163
163
  requirement: !ruby/object:Gem::Requirement
164
164
  requirements:
165
165
  - - "~>"
166
166
  - !ruby/object:Gem::Version
167
- version: 0.9.12
167
+ version: 0.9.20
168
168
  type: :development
169
169
  prerelease: false
170
170
  version_requirements: !ruby/object:Gem::Requirement
171
171
  requirements:
172
172
  - - "~>"
173
173
  - !ruby/object:Gem::Version
174
- version: 0.9.12
174
+ version: 0.9.20
175
175
  - !ruby/object:Gem::Dependency
176
176
  name: faraday
177
177
  requirement: !ruby/object:Gem::Requirement
178
178
  requirements:
179
179
  - - "~>"
180
180
  - !ruby/object:Gem::Version
181
- version: '0.13'
181
+ version: '0.17'
182
182
  type: :development
183
183
  prerelease: false
184
184
  version_requirements: !ruby/object:Gem::Requirement
185
185
  requirements:
186
186
  - - "~>"
187
187
  - !ruby/object:Gem::Version
188
- version: '0.13'
188
+ version: '0.17'
189
189
  - !ruby/object:Gem::Dependency
190
190
  name: faraday_middleware
191
191
  requirement: !ruby/object:Gem::Requirement
192
192
  requirements:
193
193
  - - "~>"
194
194
  - !ruby/object:Gem::Version
195
- version: '0.12'
195
+ version: '0.13'
196
196
  type: :development
197
197
  prerelease: false
198
198
  version_requirements: !ruby/object:Gem::Requirement
199
199
  requirements:
200
200
  - - "~>"
201
201
  - !ruby/object:Gem::Version
202
- version: '0.12'
202
+ version: '0.13'
203
203
  description: RDF.rb is a pure-Ruby library for working with Resource Description Framework
204
204
  (RDF) data.
205
205
  email: public-rdf-ruby@w3.org
@@ -267,6 +267,7 @@ files:
267
267
  - lib/rdf/util.rb
268
268
  - lib/rdf/util/aliasing.rb
269
269
  - lib/rdf/util/cache.rb
270
+ - lib/rdf/util/coercions.rb
270
271
  - lib/rdf/util/file.rb
271
272
  - lib/rdf/util/logger.rb
272
273
  - lib/rdf/util/uuid.rb
@@ -278,11 +279,15 @@ files:
278
279
  - lib/rdf/vocab/xsd.rb
279
280
  - lib/rdf/vocabulary.rb
280
281
  - lib/rdf/writer.rb
281
- homepage: https://ruby-rdf.github.com/
282
+ homepage: https://github.com/ruby-rdf/rdf
282
283
  licenses:
283
284
  - Unlicense
284
285
  metadata:
285
286
  documentation_uri: https://rubydoc.info/github/ruby-rdf/rdf
287
+ bug_tracker_uri: https://github.com/ruby-rdf/rdf/issues
288
+ homepage_uri: https://ruby-rdf.github.io/rdf
289
+ mailing_list_uri: https://lists.w3.org/Archives/Public/public-rdf-ruby/
290
+ source_code_uri: https://github.com/ruby-rdf/rdf
286
291
  post_install_message:
287
292
  rdoc_options: []
288
293
  require_paths:
@@ -291,14 +296,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
291
296
  requirements:
292
297
  - - ">="
293
298
  - !ruby/object:Gem::Version
294
- version: 2.2.2
299
+ version: '2.4'
295
300
  required_rubygems_version: !ruby/object:Gem::Requirement
296
301
  requirements:
297
302
  - - ">="
298
303
  - !ruby/object:Gem::Version
299
304
  version: '0'
300
305
  requirements: []
301
- rubygems_version: 3.0.3
306
+ rubygems_version: 3.1.3
302
307
  signing_key:
303
308
  specification_version: 4
304
309
  summary: A Ruby library for working with Resource Description Framework (RDF) data.