rdf 3.0.11 → 3.1.2

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 (48) hide show
  1. checksums.yaml +4 -4
  2. data/AUTHORS +1 -1
  3. data/README.md +127 -95
  4. data/UNLICENSE +1 -1
  5. data/VERSION +1 -1
  6. data/etc/doap.nt +79 -85
  7. data/lib/rdf.rb +35 -23
  8. data/lib/rdf/changeset.rb +80 -19
  9. data/lib/rdf/cli.rb +7 -7
  10. data/lib/rdf/format.rb +17 -10
  11. data/lib/rdf/mixin/enumerable.rb +4 -3
  12. data/lib/rdf/mixin/mutable.rb +5 -15
  13. data/lib/rdf/mixin/queryable.rb +12 -4
  14. data/lib/rdf/mixin/transactable.rb +2 -2
  15. data/lib/rdf/mixin/writable.rb +9 -14
  16. data/lib/rdf/model/dataset.rb +1 -1
  17. data/lib/rdf/model/graph.rb +7 -4
  18. data/lib/rdf/model/list.rb +5 -5
  19. data/lib/rdf/model/literal.rb +3 -3
  20. data/lib/rdf/model/statement.rb +32 -9
  21. data/lib/rdf/model/uri.rb +53 -32
  22. data/lib/rdf/nquads.rb +6 -6
  23. data/lib/rdf/ntriples.rb +7 -5
  24. data/lib/rdf/ntriples/reader.rb +29 -7
  25. data/lib/rdf/ntriples/writer.rb +10 -1
  26. data/lib/rdf/query.rb +27 -35
  27. data/lib/rdf/query/hash_pattern_normalizer.rb +14 -12
  28. data/lib/rdf/query/pattern.rb +51 -18
  29. data/lib/rdf/query/solution.rb +20 -1
  30. data/lib/rdf/query/solutions.rb +15 -5
  31. data/lib/rdf/query/variable.rb +17 -5
  32. data/lib/rdf/reader.rb +76 -25
  33. data/lib/rdf/repository.rb +32 -18
  34. data/lib/rdf/transaction.rb +1 -1
  35. data/lib/rdf/util.rb +6 -5
  36. data/lib/rdf/util/cache.rb +2 -2
  37. data/lib/rdf/util/coercions.rb +60 -0
  38. data/lib/rdf/util/file.rb +20 -10
  39. data/lib/rdf/util/logger.rb +6 -6
  40. data/lib/rdf/util/uuid.rb +4 -4
  41. data/lib/rdf/vocab/owl.rb +401 -86
  42. data/lib/rdf/vocab/rdfs.rb +81 -18
  43. data/lib/rdf/vocab/rdfv.rb +147 -1
  44. data/lib/rdf/vocab/writer.rb +41 -3
  45. data/lib/rdf/vocab/xsd.rb +203 -2
  46. data/lib/rdf/vocabulary.rb +73 -15
  47. data/lib/rdf/writer.rb +33 -11
  48. metadata +34 -28
@@ -16,7 +16,7 @@ module RDF
16
16
  # * {RDF::RDFS} - RDF Schema (RDFS)
17
17
  # * {RDF::XSD} - XML Schema (XSD)
18
18
  #
19
- # Other vocabularies are defined in the [rdf-vocab](http://rubygems.org/gems/rdf-vocab) gem
19
+ # Other vocabularies are defined in the [rdf-vocab](https://rubygems.org/gems/rdf-vocab) gem
20
20
  #
21
21
  # @example Using pre-defined RDF vocabularies
22
22
  # include RDF
@@ -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
@@ -873,8 +928,8 @@ module RDF
873
928
  #
874
929
  # @param (see #initialize)
875
930
  # @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
931
+ def self.intern(str, *args, **options)
932
+ (URI.cache[(str = str.to_s).to_sym] ||= self.new(str, *args, **options)).freeze
878
933
  end
879
934
 
880
935
  ##
@@ -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]
@@ -1001,7 +1059,7 @@ module RDF
1001
1059
  when :domainIncludes, :rangeIncludes
1002
1060
  RDF::Vocabulary.find_term("http://schema.org/#{p}")
1003
1061
  when :broader, :definition, :exactMatch, :hasTopConcept, :inScheme,
1004
- :member, :narrower, :related, :altLabel, :definition, :editorialNote,
1062
+ :member, :narrower, :related, :altLabel, :editorialNote,
1005
1063
  :notation, :note, :prefLabel
1006
1064
  RDF::Vocabulary.find_term("http://www.w3.org/2004/02/skos/core##{p}")
1007
1065
  else
@@ -37,7 +37,7 @@ module RDF
37
37
  # logger = Logger.new([])
38
38
  # RDF::Writer.for(:ntriples).buffer(logger: logger) do |writer|
39
39
  # statement = RDF::Statement.new(
40
- # RDF::URI("http://rubygems.org/gems/rdf"),
40
+ # RDF::URI("https://rubygems.org/gems/rdf"),
41
41
  # RDF::URI("http://purl.org/dc/terms/creator"),
42
42
  # nil)
43
43
  # writer << statement
@@ -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.11
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: 2019-04-10 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
@@ -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,10 +279,15 @@ files:
278
279
  - lib/rdf/vocab/xsd.rb
279
280
  - lib/rdf/vocabulary.rb
280
281
  - lib/rdf/writer.rb
281
- homepage: http://ruby-rdf.github.com/
282
+ homepage: https://github.com/ruby-rdf/rdf
282
283
  licenses:
283
284
  - Unlicense
284
- metadata: {}
285
+ metadata:
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
285
291
  post_install_message:
286
292
  rdoc_options: []
287
293
  require_paths:
@@ -290,14 +296,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
290
296
  requirements:
291
297
  - - ">="
292
298
  - !ruby/object:Gem::Version
293
- version: 2.2.2
299
+ version: '2.4'
294
300
  required_rubygems_version: !ruby/object:Gem::Requirement
295
301
  requirements:
296
302
  - - ">="
297
303
  - !ruby/object:Gem::Version
298
304
  version: '0'
299
305
  requirements: []
300
- rubygems_version: 3.0.3
306
+ rubygems_version: 3.1.3
301
307
  signing_key:
302
308
  specification_version: 4
303
309
  summary: A Ruby library for working with Resource Description Framework (RDF) data.