rdf 3.0.11 → 3.1.2

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