rdf 2.2.12 → 3.0.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: be0cbf64352e33151dc2088a76821eda0841aaa3
4
- data.tar.gz: ba0f580f634e0b452ae8c69844a98da5092e4634
2
+ SHA256:
3
+ metadata.gz: faf85190255c4c7a4d081a70108143f0aa084c62fbb75b9a61bd063d75d1b324
4
+ data.tar.gz: f851e574e23e8a795a008e150827a24e3daab79c79abb26a84b29cc768060810
5
5
  SHA512:
6
- metadata.gz: 1ded75ac7fa976a561f52de5cd53baddfc4b9cb4ece209e2408dd5d037dd429748a17bd5ccd3a83702c7f6feba5cc0a75b00fe118e65f4b60b9988ac10bd74fc
7
- data.tar.gz: 93a8e9f0b699e1c965fbd9d17a7fa453a57f02c94b3f2d9219705db8c2a80e1ef05eff366a4726b42f2b1aad370b48d62ec7d1ecda87f22073ff0654f8c205e9
6
+ metadata.gz: fd23a8bb42a9f9a0eabf5d378c9ef128917c96a4b8030738c60ef2babc0edc049d16118692d0825cb8058d70da1909df0bbe202b020881eca01eb8b387a19a07
7
+ data.tar.gz: 7972ad893f01703c35ea71f6fa7962fd2552359e79aeb317511da52c0a91b5e459573a6a729b3477653e62ac7360a6f539945fa9a18abb37c8afc43c61283ade
data/README.md CHANGED
@@ -333,7 +333,7 @@ from BNode identity (i.e., they each entail the other)
333
333
 
334
334
  ## Dependencies
335
335
 
336
- * [Ruby](http://ruby-lang.org/) (>= 2.0)
336
+ * [Ruby](http://ruby-lang.org/) (>= 2.2)
337
337
  * [LinkHeader][] (>= 0.0.8)
338
338
  * Soft dependency on [RestClient][] (>= 1.7)
339
339
 
data/VERSION CHANGED
@@ -1 +1 @@
1
- 2.2.12
1
+ 3.0.0
data/lib/rdf.rb CHANGED
@@ -55,7 +55,7 @@ module RDF
55
55
  # RDF vocabularies
56
56
  autoload :Vocabulary, 'rdf/vocabulary'
57
57
  autoload :StrictVocabulary, 'rdf/vocabulary'
58
- VOCABS = Dir.glob(File.join(File.dirname(__FILE__), 'rdf', 'vocab', '*.rb')).map { |f| File.basename(f)[0...-(File.extname(f).size)].to_sym } rescue []
58
+ VOCABS = Dir.glob(File.expand_path("../rdf/vocab/*.rb", __FILE__)).map { |f| File.basename(f)[0...-(File.extname(f).size)].to_sym } rescue []
59
59
 
60
60
  # Use const_missing instead of autoload to load most vocabularies so we can provide deprecation messages
61
61
  def self.const_missing(constant)
data/lib/rdf/format.rb CHANGED
@@ -48,11 +48,83 @@ module RDF
48
48
  ##
49
49
  # Enumerates known RDF serialization format classes.
50
50
  #
51
+ # Given options from {Format.for}, it returns just those formats that match the specified criteria.
52
+ #
53
+ # @example finding all formats that have a writer supporting text/html
54
+ # RDF::Format.each(content_type: 'text/html', has_writer: true).to_a
55
+ # #=> RDF::RDFa::Format
56
+ #
57
+ # @param [String, #to_s] file_name (nil)
58
+ # @param [Symbol, #to_sym] file_extension (nil)
59
+ # @param [String, #to_s] content_type (nil)
60
+ # Content type may include wildcard characters, which will select among matching formats.
61
+ # Note that content_type will be taken from a URL opened using {RDF::Util::File.open_file}.
62
+ # @param [Boolean] has_reader (false)
63
+ # Only return a format having a reader.
64
+ # @param [Boolean] has_writer (false)
65
+ # Only return a format having a writer.
66
+ # @param [String, Proc] sample (nil)
67
+ # A sample of input used for performing format detection. If we find no formats, or we find more than one, and we have a sample, we can perform format detection to find a specific format to use, in which case we pick the last one we find
51
68
  # @yield [klass]
52
69
  # @yieldparam [Class]
53
70
  # @return [Enumerator]
54
- def self.each(&block)
55
- @@subclasses.each(&block)
71
+ def self.each(file_name: nil,
72
+ file_extension: nil,
73
+ content_type: nil,
74
+ has_reader: false,
75
+ has_writer: false,
76
+ sample: nil,
77
+ **options,
78
+ &block)
79
+ formats = case
80
+ # Find a format based on the MIME content type:
81
+ when content_type
82
+ # @see http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.17
83
+ # @see http://www.w3.org/Protocols/rfc2616/rfc2616-sec3.html#sec3.7
84
+ mime_type = content_type.to_s.split(';').first # remove any media type parameters
85
+
86
+ # Ignore text/plain, a historical encoding for N-Triples, which is
87
+ # problematic in format detection, as many web servers will serve
88
+ # content by default text/plain.
89
+ if (mime_type == 'text/plain' && sample) || mime_type == '*/*'
90
+ # All content types
91
+ @@subclasses
92
+ elsif mime_type.end_with?('/*')
93
+ # All content types that have the first part of the mime-type as a prefix
94
+ prefix = mime_type[0..-3]
95
+ content_types.map do |ct, fmts|
96
+ ct.start_with?(prefix) ? fmts : []
97
+ end.flatten.uniq
98
+ else
99
+ content_types[mime_type]
100
+ end
101
+ # Find a format based on the file name:
102
+ when file_name
103
+ ext = File.extname(RDF::URI(file_name).path.to_s)[1..-1].to_s
104
+ file_extensions[ext.to_sym]
105
+ # Find a format based on the file extension:
106
+ when file_extension
107
+ file_extensions[file_extension.to_sym]
108
+ else
109
+ @@subclasses
110
+ end || (sample ? @@subclasses : []) # If we can sample, check all classes
111
+
112
+ # Subset by available reader or writer
113
+ formats = formats.select do |f|
114
+ has_reader ? f.reader : (has_writer ? f.writer : true)
115
+ end
116
+
117
+ # If we have multiple formats and a sample, use that for format detection
118
+ if formats.length != 1 && sample
119
+ sample = case sample
120
+ when Proc then sample.call.to_s
121
+ else sample.dup.to_s
122
+ end.force_encoding(Encoding::ASCII_8BIT)
123
+ # Given a sample, perform format detection across the appropriate formats, choosing the last that matches
124
+ # Return last format that has a positive detection
125
+ formats = formats.select {|f| f.detect(sample)}
126
+ end
127
+ formats.each(&block)
56
128
  end
57
129
 
58
130
  ##
@@ -77,6 +149,7 @@ module RDF
77
149
  # @option options [String, #to_s] :file_name (nil)
78
150
  # @option options [Symbol, #to_sym] :file_extension (nil)
79
151
  # @option options [String, #to_s] :content_type (nil)
152
+ # Content type may include wildcard characters, which will select among matching formats.
80
153
  # Note that content_type will be taken from a URL opened using {RDF::Util::File.open_file}.
81
154
  # @option options [Boolean] :has_reader (false)
82
155
  # Only return a format having a reader.
@@ -88,73 +161,31 @@ module RDF
88
161
  # @yieldreturn [String] another way to provide a sample, allows lazy for retrieving the sample.
89
162
  #
90
163
  # @return [Class]
91
- def self.for(options = {})
92
- format = case options
93
- when String, RDF::URI
94
- # Find a format based on the file name
95
- fn, options = options, {}
96
- self.for(file_name: fn) { yield if block_given? }
97
-
98
- when Hash
99
- case
100
- # Find a format based on the MIME content type:
101
- when mime_type = options[:content_type]
102
- # @see http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.17
103
- # @see http://www.w3.org/Protocols/rfc2616/rfc2616-sec3.html#sec3.7
104
- mime_type = mime_type.to_s
105
- mime_type = mime_type.split(';').first # remove any media type parameters
106
-
107
- # Ignore text/plain, a historical encoding for N-Triples, which is
108
- # problematic in format detection, as many web servers will serve
109
- # content by default text/plain.
110
- content_types[mime_type] unless mime_type == 'text/plain' && (options[:sample] || block_given?)
111
- # Find a format based on the file name:
112
- when file_name = options[:file_name]
113
- self.for(file_extension: File.extname(RDF::URI(file_name).path.to_s)[1..-1]) { yield if block_given? }
114
- # Find a format based on the file extension:
115
- when file_ext = options[:file_extension]
116
- file_extensions[file_ext.to_sym]
117
- end
118
-
119
- when Symbol
120
- # Try to find a match based on the full class name
121
- # We want this to work even if autoloading fails
122
- fmt, options = options, {}
123
- classes = @@subclasses.select { |klass| klass.symbols.include?(fmt) }
124
- if classes.empty?
125
- classes = case fmt
126
- when :ntriples then [RDF::NTriples::Format]
127
- when :nquads then [RDF::NQuads::Format]
128
- else []
129
- end
164
+ def self.for(*args, **options, &block)
165
+ options = {sample: block}.merge(options) if block_given?
166
+ formats = case args.first
167
+ when String, RDF::URI
168
+ # Find a format based on the file name
169
+ self.each(file_name: args.first, **options).to_a
170
+ when Symbol
171
+ # Try to find a match based on the full class name
172
+ # We want this to work even if autoloading fails
173
+ fmt = args.first
174
+ classes = self.each(options).select {|f| f.symbols.include?(fmt)}
175
+ if classes.empty?
176
+ classes = case fmt
177
+ when :ntriples then [RDF::NTriples::Format]
178
+ when :nquads then [RDF::NQuads::Format]
179
+ else []
130
180
  end
131
- classes
132
- end
133
-
134
- if format.is_a?(Array)
135
- format = format.select {|f| f.reader} if options[:has_reader]
136
- format = format.select {|f| f.writer} if options[:has_writer]
137
-
138
- return format.last if format.uniq.length == 1
139
- elsif !format.nil?
140
- return format
141
- end
142
-
143
- # If we have a sample, use that for format detection
144
- if sample = (options[:sample] if options.is_a?(Hash)) || (yield if block_given?)
145
- sample = sample.dup.to_s
146
- sample.force_encoding(Encoding::ASCII_8BIT) if sample.respond_to?(:force_encoding)
147
- # Given a sample, perform format detection across the appropriate formats, choosing the last that matches
148
- format ||= @@subclasses
149
-
150
- # Return last format that has a positive detection
151
- format.reverse.detect {|f| f.detect(sample)} || format.last
152
- elsif format.is_a?(Array)
153
- # Otherwise, just return the last matching format
154
- format.last
181
+ end
182
+ classes
155
183
  else
156
- nil
184
+ self.each(options).to_a
157
185
  end
186
+
187
+ # Return the last detected format
188
+ formats.last
158
189
  end
159
190
 
160
191
  ##
@@ -747,15 +747,6 @@ module RDF
747
747
  protected
748
748
 
749
749
  ##
750
- # @overload #to_hash
751
- # Returns all RDF object terms indexed by their subject and predicate
752
- # terms.
753
- #
754
- # The return value is a `Hash` instance that has the structure:
755
- # `{subject => {predicate => [*objects]}}`.
756
- #
757
- # @return [Hash]
758
- # @deprecated Use {#to_h} instead.
759
750
  # @overload #to_writer
760
751
  # Implements #to_writer for each available instance of {RDF::Writer},
761
752
  # based on the writer symbol.
@@ -763,14 +754,6 @@ module RDF
763
754
  # @return [String]
764
755
  # @see {RDF::Writer.sym}
765
756
  def method_missing(meth, *args)
766
- case meth
767
- when :to_hash
768
- warn "[DEPRECATION] RDF::Enumerable#to_hash is deprecated, use RDF::Enumerable#to_h instead.\n" +
769
- "This is due to the introduction of keyword arugments that attempt to turn the last argument into a hash using #to_hash.\n" +
770
- "This can be avoided by explicitly passing an options hash as the last argument.\n" +
771
- "Called from #{Gem.location_of_caller.join(':')}"
772
- return self.to_h
773
- end
774
757
  writer = RDF::Writer.for(meth.to_s[3..-1].to_sym) if meth.to_s[0,3] == "to_"
775
758
  if writer
776
759
  writer.buffer(standard_prefixes: true) {|w| w << self}
@@ -13,23 +13,6 @@ module RDF
13
13
  def to_a
14
14
  return super.to_a.extend(RDF::Queryable, RDF::Enumerable)
15
15
  end
16
-
17
- protected
18
-
19
- ##
20
- # @overload #to_ary
21
- # @see #to_a
22
- # @deprecated use {#to_a} instead
23
- def method_missing(name, *args)
24
- if name == :to_ary
25
- warn "[DEPRECATION] #{self.class}#to_ary is deprecated, use " \
26
- "#{self.class}#to_a instead. Called from " \
27
- "#{Gem.location_of_caller.join(':')}"
28
- to_a
29
- else
30
- super
31
- end
32
- end
33
16
  end
34
17
  end
35
18
 
@@ -52,23 +35,6 @@ module RDF
52
35
  def to_a
53
36
  return super.to_a.extend(RDF::Queryable, RDF::Enumerable)
54
37
  end
55
-
56
- protected
57
-
58
- ##
59
- # @overload #to_ary
60
- # @see #to_a
61
- # @deprecated use {#to_a} instead
62
- def method_missing(name, *args)
63
- if name == :to_ary
64
- warn "[DEPRECATION] #{self.class}#to_ary is deprecated, use " \
65
- "#{self.class}#to_a instead. Called from " \
66
- "#{Gem.location_of_caller.join(':')}"
67
- self.to_a
68
- else
69
- super
70
- end
71
- end
72
38
  end
73
39
  end
74
40
  end
@@ -19,7 +19,7 @@ module RDF; class Literal
19
19
  when value.is_a?(::Date) then value
20
20
  when value.respond_to?(:to_date) then value.to_date
21
21
  else ::Date.parse(value.to_s)
22
- end rescue nil
22
+ end rescue ::Date.new
23
23
  end
24
24
 
25
25
  ##
@@ -19,7 +19,7 @@ module RDF; class Literal
19
19
  when value.is_a?(::DateTime) then value
20
20
  when value.respond_to?(:to_datetime) then value.to_datetime
21
21
  else ::DateTime.parse(value.to_s)
22
- end rescue nil
22
+ end rescue ::DateTime.new
23
23
  end
24
24
 
25
25
  ##
@@ -27,7 +27,7 @@ module RDF; class Literal
27
27
  else
28
28
  value = value.to_s
29
29
  value += "0" if value.end_with?(".") # Normalization required in Ruby 2.4
30
- BigDecimal(value) rescue nil
30
+ BigDecimal(value) rescue BigDecimal(0)
31
31
  end
32
32
  end
33
33
 
@@ -30,7 +30,7 @@ module RDF; class Literal
30
30
  end
31
31
  when value.is_a?(::Float) then value
32
32
  when value.respond_to?(:to_f) then value.to_f
33
- else Float(value.to_s) rescue nil # FIXME
33
+ else 0.0 # FIXME
34
34
  end
35
35
  end
36
36
 
@@ -24,7 +24,7 @@ module RDF; class Literal
24
24
  @object = case
25
25
  when value.is_a?(::Integer) then value
26
26
  when value.respond_to?(:to_i) then value.to_i
27
- else Integer(value.to_s) rescue nil
27
+ else 0
28
28
  end
29
29
  end
30
30
 
@@ -24,7 +24,7 @@ module RDF; class Literal
24
24
  when value.is_a?(::DateTime) then value
25
25
  when value.respond_to?(:to_datetime) then value.to_datetime rescue ::DateTime.parse(value.to_s)
26
26
  else ::DateTime.parse(value.to_s)
27
- end rescue nil
27
+ end rescue ::DateTime.new
28
28
  end
29
29
 
30
30
  ##
@@ -37,22 +37,11 @@ module RDF
37
37
  # * `:default` Produces 36 characters, including hyphens separating the UUID value parts
38
38
  # * `:compact` Produces a 32 digits (hexadecimal) value with no hyphens
39
39
  # * `:urn` Adds the prefix urn:uuid: to the default format
40
- # @param [Regexp] grammar (nil)
41
- # a grammar specification that the generated UUID must match
42
- # The UUID is generated such that its initial part is guaranteed
43
- # to match the given `grammar`, e.g. `/^[A-Za-z][A-Za-z0-9]*/`.
44
- # Some RDF storage systems (e.g. AllegroGraph) require this.
40
+ #
45
41
  # Requires that the `uuid` gem be loadable to use `format`
46
42
  # @return [RDF::Node]
47
- def self.uuid(format: :default, grammar: nil)
48
- case
49
- when grammar
50
- warn "[DEPRECATION] The grammar parameter to RDF::Node#uri is deprecated.\n" +
51
- "Called from #{Gem.location_of_caller.join(':')}"
52
- uuid = RDF::Util::UUID.generate(format: format) until uuid =~ grammar
53
- else
54
- uuid = RDF::Util::UUID.generate(format: format)
55
- end
43
+ def self.uuid(format: :default)
44
+ uuid = RDF::Util::UUID.generate(format: format)
56
45
  self.new(uuid)
57
46
  end
58
47
 
@@ -339,13 +339,6 @@ module RDF
339
339
  end
340
340
  alias_method :to_a, :to_triple
341
341
 
342
- ##
343
- # @deprecated use {#to_a} or {#to_triple} instead
344
- # @see #to_triple
345
- def to_ary
346
- to_triple
347
- end
348
-
349
342
  ##
350
343
  # Canonicalizes each unfrozen term in the statement
351
344
  #
@@ -414,26 +407,5 @@ module RDF
414
407
  graph << [subject, RDF.object, self.object]
415
408
  end
416
409
  end
417
-
418
- protected
419
- ##
420
- # @overload #to_hash
421
- # Returns the terms of this statement as a `Hash`.
422
- #
423
- # @param (see #to_h)
424
- # @return (see #to_h)
425
- # @deprecated Use {#to_h} instead.
426
- def method_missing(meth, *args)
427
- case meth
428
- when :to_hash
429
- warn "[DEPRECATION] RDF::Statement#to_hash is deprecated, use RDF::Statement#to_h instead.\n" +
430
- "This is due to the introduction of keyword arugments that attempt to turn the last argument into a hash using #to_hash.\n" +
431
- "This can be avoided by explicitly passing an options hash as the last argument.\n" +
432
- "Called from #{Gem.location_of_caller.join(':')}"
433
- self.to_h
434
- else
435
- super
436
- end
437
- end
438
410
  end
439
411
  end
data/lib/rdf/model/uri.rb CHANGED
@@ -139,10 +139,9 @@ module RDF
139
139
  # object can't be returned for some reason, this method will fall back
140
140
  # to returning a freshly-allocated one.
141
141
  #
142
- # @param (see #initialize)
142
+ # (see #initialize)
143
143
  # @return [RDF::URI] an immutable, frozen URI object
144
144
  def self.intern(str, *args)
145
- args << {} unless args.last.is_a?(Hash) # FIXME: needed until #to_hash is removed to avoid DEPRECATION warning.
146
145
  (cache[(str = str.to_s).to_sym] ||= self.new(str, *args)).freeze
147
146
  end
148
147
 
@@ -200,10 +199,10 @@ module RDF
200
199
  end
201
200
 
202
201
  ##
203
- # @overload URI(uri, **options)
202
+ # @overload initialize(uri, **options)
204
203
  # @param [URI, String, #to_s] uri
205
204
  #
206
- # @overload URI(**options)
205
+ # @overload initialize(**options)
207
206
  # @param [Hash{Symbol => Object}] options
208
207
  # @option [String, #to_s] :scheme The scheme component.
209
208
  # @option [String, #to_s] :user The user component.
@@ -1293,26 +1292,6 @@ module RDF
1293
1292
  ""
1294
1293
  end
1295
1294
  end
1296
-
1297
- protected
1298
- ##
1299
- # @overload #to_hash
1300
- # Returns object representation of this URI, broken into components
1301
- #
1302
- # @return (see #object)
1303
- # @deprecated Use {#to_h} instead.
1304
- def method_missing(meth, *args)
1305
- case meth
1306
- when :to_hash
1307
- warn "[DEPRECATION] RDF::URI#to_hash is deprecated, use RDF::URI#to_h instead.\n" +
1308
- "This is due to the introduction of keyword arugments that attempt to turn the last argument into a hash using #to_hash.\n" +
1309
- "This can be avoided by explicitly passing an options hash as the last argument.\n" +
1310
- "Called from #{Gem.location_of_caller.join(':')}"
1311
- self.to_h
1312
- else
1313
- super
1314
- end
1315
- end
1316
1295
  end
1317
1296
 
1318
1297
  # RDF::IRI is a synonym for RDF::URI