rdf 3.0.12 → 3.1.3

Sign up to get free protection for your applications and to get access to all the features.
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.