openlogic-rdf 0.3.6
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.
- data/AUTHORS +3 -0
- data/CREDITS +9 -0
- data/README +361 -0
- data/UNLICENSE +24 -0
- data/VERSION +1 -0
- data/bin/rdf +18 -0
- data/etc/doap.nt +62 -0
- data/lib/df.rb +1 -0
- data/lib/rdf/cli.rb +200 -0
- data/lib/rdf/format.rb +383 -0
- data/lib/rdf/mixin/countable.rb +39 -0
- data/lib/rdf/mixin/durable.rb +31 -0
- data/lib/rdf/mixin/enumerable.rb +637 -0
- data/lib/rdf/mixin/indexable.rb +26 -0
- data/lib/rdf/mixin/inferable.rb +5 -0
- data/lib/rdf/mixin/mutable.rb +191 -0
- data/lib/rdf/mixin/queryable.rb +265 -0
- data/lib/rdf/mixin/readable.rb +15 -0
- data/lib/rdf/mixin/type_check.rb +21 -0
- data/lib/rdf/mixin/writable.rb +152 -0
- data/lib/rdf/model/graph.rb +263 -0
- data/lib/rdf/model/list.rb +731 -0
- data/lib/rdf/model/literal/boolean.rb +121 -0
- data/lib/rdf/model/literal/date.rb +73 -0
- data/lib/rdf/model/literal/datetime.rb +72 -0
- data/lib/rdf/model/literal/decimal.rb +86 -0
- data/lib/rdf/model/literal/double.rb +189 -0
- data/lib/rdf/model/literal/integer.rb +126 -0
- data/lib/rdf/model/literal/numeric.rb +184 -0
- data/lib/rdf/model/literal/time.rb +87 -0
- data/lib/rdf/model/literal/token.rb +47 -0
- data/lib/rdf/model/literal/xml.rb +39 -0
- data/lib/rdf/model/literal.rb +373 -0
- data/lib/rdf/model/node.rb +156 -0
- data/lib/rdf/model/resource.rb +28 -0
- data/lib/rdf/model/statement.rb +296 -0
- data/lib/rdf/model/term.rb +77 -0
- data/lib/rdf/model/uri.rb +570 -0
- data/lib/rdf/model/value.rb +133 -0
- data/lib/rdf/nquads.rb +152 -0
- data/lib/rdf/ntriples/format.rb +48 -0
- data/lib/rdf/ntriples/reader.rb +239 -0
- data/lib/rdf/ntriples/writer.rb +219 -0
- data/lib/rdf/ntriples.rb +104 -0
- data/lib/rdf/query/pattern.rb +329 -0
- data/lib/rdf/query/solution.rb +252 -0
- data/lib/rdf/query/solutions.rb +237 -0
- data/lib/rdf/query/variable.rb +221 -0
- data/lib/rdf/query.rb +404 -0
- data/lib/rdf/reader.rb +511 -0
- data/lib/rdf/repository.rb +389 -0
- data/lib/rdf/transaction.rb +161 -0
- data/lib/rdf/util/aliasing.rb +63 -0
- data/lib/rdf/util/cache.rb +139 -0
- data/lib/rdf/util/file.rb +38 -0
- data/lib/rdf/util/uuid.rb +36 -0
- data/lib/rdf/util.rb +6 -0
- data/lib/rdf/version.rb +19 -0
- data/lib/rdf/vocab/cc.rb +18 -0
- data/lib/rdf/vocab/cert.rb +13 -0
- data/lib/rdf/vocab/dc.rb +63 -0
- data/lib/rdf/vocab/dc11.rb +23 -0
- data/lib/rdf/vocab/doap.rb +45 -0
- data/lib/rdf/vocab/exif.rb +168 -0
- data/lib/rdf/vocab/foaf.rb +69 -0
- data/lib/rdf/vocab/geo.rb +13 -0
- data/lib/rdf/vocab/http.rb +26 -0
- data/lib/rdf/vocab/owl.rb +59 -0
- data/lib/rdf/vocab/rdfs.rb +17 -0
- data/lib/rdf/vocab/rsa.rb +12 -0
- data/lib/rdf/vocab/rss.rb +14 -0
- data/lib/rdf/vocab/sioc.rb +93 -0
- data/lib/rdf/vocab/skos.rb +36 -0
- data/lib/rdf/vocab/wot.rb +21 -0
- data/lib/rdf/vocab/xhtml.rb +9 -0
- data/lib/rdf/vocab/xsd.rb +58 -0
- data/lib/rdf/vocab.rb +215 -0
- data/lib/rdf/writer.rb +475 -0
- data/lib/rdf.rb +192 -0
- metadata +173 -0
@@ -0,0 +1,570 @@
|
|
1
|
+
require 'addressable/uri'
|
2
|
+
|
3
|
+
module RDF
|
4
|
+
##
|
5
|
+
# A Uniform Resource Identifier (URI).
|
6
|
+
#
|
7
|
+
# `RDF::URI` supports all the instance methods of `Addressable::URI`.
|
8
|
+
#
|
9
|
+
# @example Creating a URI reference (1)
|
10
|
+
# uri = RDF::URI.new("http://rdf.rubyforge.org/")
|
11
|
+
#
|
12
|
+
# @example Creating a URI reference (2)
|
13
|
+
# uri = RDF::URI.new(:scheme => 'http', :host => 'rdf.rubyforge.org', :path => '/')
|
14
|
+
#
|
15
|
+
# @example Creating an interned URI reference
|
16
|
+
# uri = RDF::URI.intern("http://rdf.rubyforge.org/")
|
17
|
+
#
|
18
|
+
# @example Getting the string representation of a URI
|
19
|
+
# uri.to_s #=> "http://rdf.rubyforge.org/"
|
20
|
+
#
|
21
|
+
# @see http://en.wikipedia.org/wiki/Uniform_Resource_Identifier
|
22
|
+
# @see http://addressable.rubyforge.org/
|
23
|
+
class URI
|
24
|
+
include RDF::Resource
|
25
|
+
|
26
|
+
##
|
27
|
+
# Defines the maximum number of interned URI references that can be held
|
28
|
+
# cached in memory at any one time.
|
29
|
+
CACHE_SIZE = -1 # unlimited by default
|
30
|
+
|
31
|
+
##
|
32
|
+
# @return [RDF::Util::Cache]
|
33
|
+
# @private
|
34
|
+
def self.cache
|
35
|
+
require 'rdf/util/cache' unless defined?(::RDF::Util::Cache)
|
36
|
+
@cache ||= RDF::Util::Cache.new(CACHE_SIZE)
|
37
|
+
end
|
38
|
+
|
39
|
+
##
|
40
|
+
# Returns an interned `RDF::URI` instance based on the given `uri`
|
41
|
+
# string.
|
42
|
+
#
|
43
|
+
# The maximum number of cached interned URI references is given by the
|
44
|
+
# `CACHE_SIZE` constant. This value is unlimited by default, in which
|
45
|
+
# case an interned URI object will be purged only when the last strong
|
46
|
+
# reference to it is garbage collected (i.e., when its finalizer runs).
|
47
|
+
#
|
48
|
+
# Excepting special memory-limited circumstances, it should always be
|
49
|
+
# safe and preferred to construct new URI references using
|
50
|
+
# `RDF::URI.intern` instead of `RDF::URI.new`, since if an interned
|
51
|
+
# object can't be returned for some reason, this method will fall back
|
52
|
+
# to returning a freshly-allocated one.
|
53
|
+
#
|
54
|
+
# @param [String, #to_s] str
|
55
|
+
# @return [RDF::URI] an immutable, frozen URI object
|
56
|
+
def self.intern(str)
|
57
|
+
(cache[str = str.to_s] ||= self.new(str)).freeze
|
58
|
+
end
|
59
|
+
|
60
|
+
##
|
61
|
+
# Creates a new `RDF::URI` instance based on the given `uri` string.
|
62
|
+
#
|
63
|
+
# This is just an alias for {#initialize RDF::URI.new} for compatibity
|
64
|
+
# with `Addressable::URI.parse`.
|
65
|
+
#
|
66
|
+
# @param [String, #to_s] str
|
67
|
+
# @return [RDF::URI]
|
68
|
+
def self.parse(str)
|
69
|
+
self.new(str)
|
70
|
+
end
|
71
|
+
|
72
|
+
##
|
73
|
+
# @overload URI.new(uri)
|
74
|
+
# @param [RDF::URI, String, #to_s] uri
|
75
|
+
#
|
76
|
+
# @overload URI.new(options = {})
|
77
|
+
# @param [Hash{Symbol => Object} options
|
78
|
+
def initialize(uri_or_options)
|
79
|
+
case uri_or_options
|
80
|
+
when Hash
|
81
|
+
@uri = Addressable::URI.new(uri_or_options)
|
82
|
+
when Addressable::URI
|
83
|
+
@uri = uri_or_options
|
84
|
+
else
|
85
|
+
@uri = Addressable::URI.parse(uri_or_options.to_s)
|
86
|
+
end
|
87
|
+
end
|
88
|
+
|
89
|
+
##
|
90
|
+
# Returns `false`.
|
91
|
+
#
|
92
|
+
# @return [Boolean] `true` or `false`
|
93
|
+
def anonymous?
|
94
|
+
false
|
95
|
+
end
|
96
|
+
|
97
|
+
##
|
98
|
+
# Returns `true`.
|
99
|
+
#
|
100
|
+
# @return [Boolean] `true` or `false`
|
101
|
+
# @see http://en.wikipedia.org/wiki/Uniform_Resource_Identifier
|
102
|
+
def uri?
|
103
|
+
true
|
104
|
+
end
|
105
|
+
|
106
|
+
##
|
107
|
+
# Returns `true` if this URI is a URN.
|
108
|
+
#
|
109
|
+
# @example
|
110
|
+
# RDF::URI('http://example.org/').urn? #=> false
|
111
|
+
#
|
112
|
+
# @return [Boolean] `true` or `false`
|
113
|
+
# @see http://en.wikipedia.org/wiki/Uniform_Resource_Name
|
114
|
+
# @since 0.2.0
|
115
|
+
def urn?
|
116
|
+
self.start_with?('urn:')
|
117
|
+
end
|
118
|
+
|
119
|
+
##
|
120
|
+
# Returns `true` if this URI is a URL.
|
121
|
+
#
|
122
|
+
# @example
|
123
|
+
# RDF::URI('http://example.org/').url? #=> true
|
124
|
+
#
|
125
|
+
# @return [Boolean] `true` or `false`
|
126
|
+
# @see http://en.wikipedia.org/wiki/Uniform_Resource_Locator
|
127
|
+
# @since 0.2.0
|
128
|
+
def url?
|
129
|
+
!urn?
|
130
|
+
end
|
131
|
+
|
132
|
+
##
|
133
|
+
# Returns the string length of this URI.
|
134
|
+
#
|
135
|
+
# @example
|
136
|
+
# RDF::URI('http://example.org/').length #=> 19
|
137
|
+
#
|
138
|
+
# @return [Integer]
|
139
|
+
# @since 0.3.0
|
140
|
+
def length
|
141
|
+
to_s.length
|
142
|
+
end
|
143
|
+
alias_method :size, :length
|
144
|
+
|
145
|
+
##
|
146
|
+
# Validates this URI, raising an error if it is invalid.
|
147
|
+
#
|
148
|
+
# @return [RDF::URI] `self`
|
149
|
+
# @raise [ArgumentError] if the URI is invalid
|
150
|
+
# @since 0.3.0
|
151
|
+
def validate!
|
152
|
+
# TODO: raise error if the URI fails validation
|
153
|
+
self
|
154
|
+
end
|
155
|
+
alias_method :validate, :validate!
|
156
|
+
|
157
|
+
##
|
158
|
+
# Returns a copy of this URI converted into its canonical lexical
|
159
|
+
# representation.
|
160
|
+
#
|
161
|
+
# @return [RDF::URI]
|
162
|
+
# @since 0.3.0
|
163
|
+
def canonicalize
|
164
|
+
self.dup.canonicalize!
|
165
|
+
end
|
166
|
+
|
167
|
+
##
|
168
|
+
# Converts this URI into its canonical lexical representation.
|
169
|
+
#
|
170
|
+
# @return [RDF::URI] `self`
|
171
|
+
# @since 0.3.0
|
172
|
+
def canonicalize!
|
173
|
+
# TODO: canonicalize this URI
|
174
|
+
self
|
175
|
+
end
|
176
|
+
|
177
|
+
##
|
178
|
+
# Joins several URIs together.
|
179
|
+
#
|
180
|
+
# This method conforms to join normalization semantics as per RFC3986,
|
181
|
+
# section 5.2. This method normalizes URIs, removes some duplicate path
|
182
|
+
# information, such as double slashes, and other behavior specified in the
|
183
|
+
# RFC.
|
184
|
+
#
|
185
|
+
# Other URI building methods are `#/` and `#+`.
|
186
|
+
#
|
187
|
+
# For an up-to-date list of edge case behavior, see the shared examples for
|
188
|
+
# RDF::URI in the rdf-spec project.
|
189
|
+
#
|
190
|
+
# @example Joining two URIs
|
191
|
+
# RDF::URI.new('http://example.org/foo/bar').join('/foo')
|
192
|
+
# #=> RDF::URI('http://example.org/foo')
|
193
|
+
# @see <http://github.com/bendiken/rdf-spec/blob/master/lib/rdf/spec/uri.rb>
|
194
|
+
# @see <http://tools.ietf.org/html/rfc3986#section-5.2>
|
195
|
+
# @see RDF::URI#/
|
196
|
+
# @see RDF::URI#+
|
197
|
+
# @param [Array<String, RDF::URI, #to_s>] uris
|
198
|
+
# @return [RDF::URI]
|
199
|
+
def join(*uris)
|
200
|
+
result = @uri.dup
|
201
|
+
uris.each do |uri|
|
202
|
+
result = result.join(uri)
|
203
|
+
end
|
204
|
+
self.class.new(result)
|
205
|
+
end
|
206
|
+
|
207
|
+
##
|
208
|
+
# 'Smart separator' URI builder
|
209
|
+
#
|
210
|
+
# This method attempts to use some understanding of the most common use
|
211
|
+
# cases for URLs and URNs to create a simple method for building new URIs
|
212
|
+
# from fragments. This means that it will always insert a separator of
|
213
|
+
# some sort, will remove duplicate seperators, will always assume that a
|
214
|
+
# fragment argument represents a relative and not absolute path, and throws
|
215
|
+
# an exception when an absolute URI is received for a fragment argument.
|
216
|
+
#
|
217
|
+
# This is separate from the semantics for `#join`, which are well-defined by
|
218
|
+
# RFC3986 section 5.2 as part of the merging and normalization process;
|
219
|
+
# this method does not perform any normalization, removal of spurious
|
220
|
+
# paths, or removal of parent directory references `(/../)`.
|
221
|
+
#
|
222
|
+
# See also `#+`, which concatenates the string forms of two URIs without
|
223
|
+
# any sort of checking or processing.
|
224
|
+
#
|
225
|
+
# For an up-to-date list of edge case behavior, see the shared examples for
|
226
|
+
# RDF::URI in the rdf-spec project.
|
227
|
+
#
|
228
|
+
# @param [Any] fragment A URI fragment to be appended to this URI
|
229
|
+
# @return [RDF::URI]
|
230
|
+
# @see RDF::URI#+
|
231
|
+
# @see RDF::URI#join
|
232
|
+
# @see <http://tools.ietf.org/html/rfc3986#section-5.2>
|
233
|
+
# @see <http://github.com/bendiken/rdf-spec/blob/master/lib/rdf/spec/uri.rb>
|
234
|
+
# @example Building a HTTP URL
|
235
|
+
# RDF::URI.new('http://example.org') / 'jhacker' / 'foaf.ttl'
|
236
|
+
# #=> RDF::URI('http://example.org/jhacker/foaf.ttl')
|
237
|
+
# @example Building a HTTP URL
|
238
|
+
# RDF::URI.new('http://example.org/') / '/jhacker/' / '/foaf.ttl'
|
239
|
+
# #=> RDF::URI('http://example.org/jhacker/foaf.ttl')
|
240
|
+
# @example Using an anchored base URI
|
241
|
+
# RDF::URI.new('http://example.org/users#') / 'jhacker'
|
242
|
+
# #=> RDF::URI('http://example.org/users#jhacker')
|
243
|
+
# @example Building a URN
|
244
|
+
# RDF::URI.new('urn:isbn') / 125235111
|
245
|
+
# #=> RDF::URI('urn:isbn:125235111')
|
246
|
+
def /(fragment)
|
247
|
+
frag = fragment.respond_to?(:to_uri) ? fragment.to_uri : RDF::URI(fragment.to_s)
|
248
|
+
raise ArgumentError, "Non-absolute URI or string required, got #{frag}" unless frag.relative?
|
249
|
+
if urn?
|
250
|
+
RDF::URI.intern(to_s.sub(/:+$/,'') + ':' + fragment.to_s.sub(/^:+/,''))
|
251
|
+
else # !urn?
|
252
|
+
case to_s[-1].chr
|
253
|
+
when '#'
|
254
|
+
case fragment.to_s[0].chr
|
255
|
+
when '/' then # Base ending with '#', fragment beginning with '/'. The fragment wins, we use '/'.
|
256
|
+
RDF::URI.intern(to_s.sub(/#+$/,'') + '/' + fragment.to_s.sub(/^\/+/,''))
|
257
|
+
else
|
258
|
+
RDF::URI.intern(to_s.sub(/#+$/,'') + '#' + fragment.to_s.sub(/^#+/,''))
|
259
|
+
end
|
260
|
+
else # includes '/'. Results from bases ending in '/' are the same as if there were no trailing slash.
|
261
|
+
case fragment.to_s[0].chr
|
262
|
+
when '#' then # Base ending with '/', fragment beginning with '#'. The fragment wins, we use '#'.
|
263
|
+
RDF::URI.intern(to_s.sub(/\/+$/,'') + '#' + fragment.to_s.sub(/^#+/,''))
|
264
|
+
else
|
265
|
+
RDF::URI.intern(to_s.sub(/\/+$/,'') + '/' + fragment.to_s.sub(/^\/+/,''))
|
266
|
+
end
|
267
|
+
end
|
268
|
+
end
|
269
|
+
end
|
270
|
+
|
271
|
+
##
|
272
|
+
# Simple concatenation operator. Returns a URI formed from concatenating
|
273
|
+
# the string form of two elements.
|
274
|
+
#
|
275
|
+
# For building URIs from fragments, you may want to use the smart
|
276
|
+
# separator, `#/`. `#join` implements another set of URI building
|
277
|
+
# semantics.
|
278
|
+
#
|
279
|
+
# @example Concatenating a string to a URI
|
280
|
+
# RDF::URI.new('http://example.org/test') + 'test'
|
281
|
+
# #=> RDF::URI('http://example.org/testtest')
|
282
|
+
# @example Concatenating two URIs
|
283
|
+
# RDF::URI.new('http://example.org/test') + RDF::URI.new('test')
|
284
|
+
# #=> RDF::URI('http://example.org/testtest')
|
285
|
+
# @see RDF::URI#/
|
286
|
+
# @see RDF::URI#join
|
287
|
+
# @param [Any]
|
288
|
+
# @return [RDF::URI]
|
289
|
+
def +(other)
|
290
|
+
RDF::URI.intern(self.to_s + other.to_s)
|
291
|
+
end
|
292
|
+
|
293
|
+
##
|
294
|
+
# Returns `true` if this URI's path component is equal to `/`.
|
295
|
+
#
|
296
|
+
# @example
|
297
|
+
# RDF::URI('http://example.org/').root? #=> true
|
298
|
+
# RDF::URI('http://example.org/path/').root? #=> false
|
299
|
+
#
|
300
|
+
# @return [Boolean] `true` or `false`
|
301
|
+
def root?
|
302
|
+
self.path == '/' || self.path.empty?
|
303
|
+
end
|
304
|
+
|
305
|
+
##
|
306
|
+
# Returns a copy of this URI with the path component set to `/`.
|
307
|
+
#
|
308
|
+
# @example
|
309
|
+
# RDF::URI('http://example.org/').root #=> RDF::URI('http://example.org/')
|
310
|
+
# RDF::URI('http://example.org/path/').root #=> RDF::URI('http://example.org/')
|
311
|
+
#
|
312
|
+
# @return [RDF::URI]
|
313
|
+
def root
|
314
|
+
if root?
|
315
|
+
self
|
316
|
+
else
|
317
|
+
uri = self.dup
|
318
|
+
uri.path = '/'
|
319
|
+
uri
|
320
|
+
end
|
321
|
+
end
|
322
|
+
|
323
|
+
##
|
324
|
+
# Returns `true` if this URI's path component isn't equal to `/`.
|
325
|
+
#
|
326
|
+
# @example
|
327
|
+
# RDF::URI('http://example.org/').has_parent? #=> false
|
328
|
+
# RDF::URI('http://example.org/path/').has_parent? #=> true
|
329
|
+
#
|
330
|
+
# @return [Boolean] `true` or `false`
|
331
|
+
def has_parent?
|
332
|
+
!root?
|
333
|
+
end
|
334
|
+
|
335
|
+
##
|
336
|
+
# Returns a copy of this URI with the path component ascended to the
|
337
|
+
# parent directory, if any.
|
338
|
+
#
|
339
|
+
# @example
|
340
|
+
# RDF::URI('http://example.org/').parent #=> nil
|
341
|
+
# RDF::URI('http://example.org/path/').parent #=> RDF::URI('http://example.org/')
|
342
|
+
#
|
343
|
+
# @return [RDF::URI]
|
344
|
+
def parent
|
345
|
+
case
|
346
|
+
when root? then nil
|
347
|
+
else
|
348
|
+
require 'pathname' unless defined?(Pathname)
|
349
|
+
if path = Pathname.new(self.path).parent
|
350
|
+
uri = self.dup
|
351
|
+
uri.path = path.to_s
|
352
|
+
uri.path << '/' unless uri.root?
|
353
|
+
uri
|
354
|
+
end
|
355
|
+
end
|
356
|
+
end
|
357
|
+
|
358
|
+
##
|
359
|
+
# Returns a qualified name (QName) for this URI, if possible.
|
360
|
+
#
|
361
|
+
# @example
|
362
|
+
# RDF::URI('http://purl.org/dc/terms/').qname #=> [:dc, nil]
|
363
|
+
# RDF::URI('http://purl.org/dc/terms/title').qname #=> [:dc, :title]
|
364
|
+
# RDF::DC.title.qname #=> [:dc, :title]
|
365
|
+
#
|
366
|
+
# @return [Array(Symbol, Symbol)] or `nil` if no QName found
|
367
|
+
def qname
|
368
|
+
if self.to_s =~ %r([:/#]([^:/#]*)$)
|
369
|
+
local_name = $1
|
370
|
+
vocab_uri = local_name.empty? ? self.to_s : self.to_s[0...-(local_name.length)]
|
371
|
+
Vocabulary.each do |vocab|
|
372
|
+
if vocab.to_uri == vocab_uri
|
373
|
+
prefix = vocab.equal?(RDF) ? :rdf : vocab.__prefix__
|
374
|
+
return [prefix, local_name.empty? ? nil : local_name.to_sym]
|
375
|
+
end
|
376
|
+
end
|
377
|
+
else
|
378
|
+
Vocabulary.each do |vocab|
|
379
|
+
vocab_uri = vocab.to_uri
|
380
|
+
if self.start_with?(vocab_uri)
|
381
|
+
prefix = vocab.equal?(RDF) ? :rdf : vocab.__prefix__
|
382
|
+
local_name = self.to_s[vocab_uri.length..-1]
|
383
|
+
return [prefix, local_name.empty? ? nil : local_name.to_sym]
|
384
|
+
end
|
385
|
+
end
|
386
|
+
end
|
387
|
+
return nil # no QName found
|
388
|
+
end
|
389
|
+
|
390
|
+
##
|
391
|
+
# Returns a duplicate copy of `self`.
|
392
|
+
#
|
393
|
+
# @return [RDF::URI]
|
394
|
+
def dup
|
395
|
+
self.class.new(@uri.dup)
|
396
|
+
end
|
397
|
+
|
398
|
+
##
|
399
|
+
# @private
|
400
|
+
def freeze
|
401
|
+
@uri.freeze
|
402
|
+
super
|
403
|
+
end
|
404
|
+
|
405
|
+
##
|
406
|
+
# Returns `true` if this URI starts with the given `string`.
|
407
|
+
#
|
408
|
+
# @example
|
409
|
+
# RDF::URI('http://example.org/').start_with?('http') #=> true
|
410
|
+
# RDF::URI('http://example.org/').start_with?('ftp') #=> false
|
411
|
+
#
|
412
|
+
# @param [String, #to_s] string
|
413
|
+
# @return [Boolean] `true` or `false`
|
414
|
+
# @see String#start_with?
|
415
|
+
# @since 0.3.0
|
416
|
+
def start_with?(string)
|
417
|
+
to_s.start_with?(string.to_s)
|
418
|
+
end
|
419
|
+
alias_method :starts_with?, :start_with?
|
420
|
+
|
421
|
+
##
|
422
|
+
# Returns `true` if this URI ends with the given `string`.
|
423
|
+
#
|
424
|
+
# @example
|
425
|
+
# RDF::URI('http://example.org/').end_with?('/') #=> true
|
426
|
+
# RDF::URI('http://example.org/').end_with?('#') #=> false
|
427
|
+
#
|
428
|
+
# @param [String, #to_s] string
|
429
|
+
# @return [Boolean] `true` or `false`
|
430
|
+
# @see String#end_with?
|
431
|
+
# @since 0.3.0
|
432
|
+
def end_with?(string)
|
433
|
+
to_s.end_with?(string.to_s)
|
434
|
+
end
|
435
|
+
alias_method :ends_with?, :end_with?
|
436
|
+
|
437
|
+
##
|
438
|
+
# Checks whether this URI the same term as `other'.
|
439
|
+
#
|
440
|
+
# @example
|
441
|
+
# RDF::URI('http://t.co/').eql?(RDF::URI('http://t.co/')) #=> true
|
442
|
+
# RDF::URI('http://t.co/').eql?('http://t.co/') #=> false
|
443
|
+
# RDF::URI('http://purl.org/dc/terms/').eql?(RDF::DC) #=> false
|
444
|
+
#
|
445
|
+
# @param [RDF::URI] other
|
446
|
+
# @return [Boolean] `true` or `false`
|
447
|
+
def eql?(other)
|
448
|
+
other.is_a?(URI) && self == other
|
449
|
+
end
|
450
|
+
|
451
|
+
##
|
452
|
+
# Checks whether this URI is equal to `other` (type checking).
|
453
|
+
#
|
454
|
+
# Per SPARQL data-r2/expr-equal/eq-2-2, numeric can't be compared with other types
|
455
|
+
#
|
456
|
+
# @example
|
457
|
+
# RDF::URI('http://t.co/') == RDF::URI('http://t.co/') #=> true
|
458
|
+
# RDF::URI('http://t.co/') == 'http://t.co/' #=> true
|
459
|
+
# RDF::URI('http://purl.org/dc/terms/') == RDF::DC #=> true
|
460
|
+
#
|
461
|
+
# @param [Object] other
|
462
|
+
# @return [Boolean] `true` or `false`
|
463
|
+
# @see http://www.w3.org/TR/rdf-sparql-query/#func-RDFterm-equal
|
464
|
+
def ==(other)
|
465
|
+
case other
|
466
|
+
when Literal
|
467
|
+
# If other is a Literal, reverse test to consolodate complex type checking logic
|
468
|
+
other == self
|
469
|
+
when String then to_s == other
|
470
|
+
when URI, Addressable::URI then to_s == other.to_s
|
471
|
+
else other.respond_to?(:to_uri) && to_s == other.to_uri.to_s
|
472
|
+
end
|
473
|
+
end
|
474
|
+
|
475
|
+
##
|
476
|
+
# Checks for case equality to the given `other` object.
|
477
|
+
#
|
478
|
+
# @example
|
479
|
+
# RDF::URI('http://example.org/') === /example/ #=> true
|
480
|
+
# RDF::URI('http://example.org/') === /foobar/ #=> false
|
481
|
+
# RDF::URI('http://t.co/') === RDF::URI('http://t.co/') #=> true
|
482
|
+
# RDF::URI('http://t.co/') === 'http://t.co/' #=> true
|
483
|
+
# RDF::URI('http://purl.org/dc/terms/') === RDF::DC #=> true
|
484
|
+
#
|
485
|
+
# @param [Object] other
|
486
|
+
# @return [Boolean] `true` or `false`
|
487
|
+
# @since 0.3.0
|
488
|
+
def ===(other)
|
489
|
+
case other
|
490
|
+
when Regexp then other === to_s
|
491
|
+
else self == other
|
492
|
+
end
|
493
|
+
end
|
494
|
+
|
495
|
+
##
|
496
|
+
# Performs a pattern match using the given regular expression.
|
497
|
+
#
|
498
|
+
# @example
|
499
|
+
# RDF::URI('http://example.org/') =~ /example/ #=> 7
|
500
|
+
# RDF::URI('http://example.org/') =~ /foobar/ #=> nil
|
501
|
+
#
|
502
|
+
# @param [Regexp] pattern
|
503
|
+
# @return [Integer] the position the match starts
|
504
|
+
# @see String#=~
|
505
|
+
# @since 0.3.0
|
506
|
+
def =~(pattern)
|
507
|
+
case pattern
|
508
|
+
when Regexp then to_s =~ pattern
|
509
|
+
else super # `Object#=~` returns `false`
|
510
|
+
end
|
511
|
+
end
|
512
|
+
|
513
|
+
##
|
514
|
+
# Returns `self`.
|
515
|
+
#
|
516
|
+
# @return [RDF::URI] `self`
|
517
|
+
def to_uri
|
518
|
+
self
|
519
|
+
end
|
520
|
+
|
521
|
+
##
|
522
|
+
# Returns the string representation of this URI.
|
523
|
+
#
|
524
|
+
# @example
|
525
|
+
# RDF::URI('http://example.org/').to_str #=> 'http://example.org/'
|
526
|
+
#
|
527
|
+
# @return [String]
|
528
|
+
def to_str
|
529
|
+
@uri.to_s
|
530
|
+
end
|
531
|
+
alias_method :to_s, :to_str
|
532
|
+
|
533
|
+
##
|
534
|
+
# Returns a hash code for this URI.
|
535
|
+
#
|
536
|
+
# @return [Fixnum]
|
537
|
+
def hash
|
538
|
+
@uri.hash
|
539
|
+
end
|
540
|
+
|
541
|
+
##
|
542
|
+
# Returns `true` if this URI instance supports the `symbol` method.
|
543
|
+
#
|
544
|
+
# @param [Symbol, String, #to_s] symbol
|
545
|
+
# @return [Boolean] `true` or `false`
|
546
|
+
def respond_to?(symbol)
|
547
|
+
@uri.respond_to?(symbol) || super
|
548
|
+
end
|
549
|
+
|
550
|
+
protected
|
551
|
+
|
552
|
+
##
|
553
|
+
# @param [Symbol, String, #to_s] symbol
|
554
|
+
# @param [Array<Object>] args
|
555
|
+
# @yield
|
556
|
+
# @return [Object]
|
557
|
+
# @private
|
558
|
+
def method_missing(symbol, *args, &block)
|
559
|
+
if @uri.respond_to?(symbol)
|
560
|
+
case result = @uri.send(symbol, *args, &block)
|
561
|
+
when Addressable::URI
|
562
|
+
self.class.new(result)
|
563
|
+
else result
|
564
|
+
end
|
565
|
+
else
|
566
|
+
super
|
567
|
+
end
|
568
|
+
end
|
569
|
+
end # URI
|
570
|
+
end # RDF
|
@@ -0,0 +1,133 @@
|
|
1
|
+
module RDF
|
2
|
+
##
|
3
|
+
# An RDF value.
|
4
|
+
#
|
5
|
+
# This is the basis for the RDF.rb class hierarchy. Anything that can be a
|
6
|
+
# term of {RDF::Statement RDF statements} should directly or indirectly
|
7
|
+
# include this module.
|
8
|
+
#
|
9
|
+
# @example Checking if a value is a resource (blank node or URI reference)
|
10
|
+
# value.resource?
|
11
|
+
#
|
12
|
+
# @example Checking if a value is a blank node
|
13
|
+
# value.node?
|
14
|
+
#
|
15
|
+
# @example Checking if a value is a URI reference
|
16
|
+
# value.uri?
|
17
|
+
# value.iri?
|
18
|
+
#
|
19
|
+
# @example Checking if a value is a literal
|
20
|
+
# value.literal?
|
21
|
+
#
|
22
|
+
# @see RDF::Graph
|
23
|
+
# @see RDF::Literal
|
24
|
+
# @see RDF::Node
|
25
|
+
# @see RDF::Resource
|
26
|
+
# @see RDF::Statement
|
27
|
+
# @see RDF::URI
|
28
|
+
module Value
|
29
|
+
##
|
30
|
+
# Returns `true` if `self` is a graph.
|
31
|
+
#
|
32
|
+
# @return [Boolean]
|
33
|
+
def graph?
|
34
|
+
false
|
35
|
+
end
|
36
|
+
|
37
|
+
##
|
38
|
+
# Returns `true` if `self` is a literal.
|
39
|
+
#
|
40
|
+
# @return [Boolean]
|
41
|
+
def literal?
|
42
|
+
false
|
43
|
+
end
|
44
|
+
|
45
|
+
##
|
46
|
+
# Returns `true` if `self` is a blank node.
|
47
|
+
#
|
48
|
+
# @return [Boolean]
|
49
|
+
def node?
|
50
|
+
false
|
51
|
+
end
|
52
|
+
|
53
|
+
##
|
54
|
+
# Returns `true` if `self` is a resource.
|
55
|
+
#
|
56
|
+
# @return [Boolean]
|
57
|
+
def resource?
|
58
|
+
false
|
59
|
+
end
|
60
|
+
|
61
|
+
##
|
62
|
+
# Returns `true` if `self` is a statement.
|
63
|
+
#
|
64
|
+
# @return [Boolean]
|
65
|
+
def statement?
|
66
|
+
false
|
67
|
+
end
|
68
|
+
|
69
|
+
##
|
70
|
+
# Returns `true` if `self` is an IRI reference.
|
71
|
+
#
|
72
|
+
# By default this is simply an alias for {#uri?}.
|
73
|
+
#
|
74
|
+
# @return [Boolean]
|
75
|
+
def iri?
|
76
|
+
uri?
|
77
|
+
end
|
78
|
+
|
79
|
+
##
|
80
|
+
# Returns `true` if `self` is a URI reference.
|
81
|
+
#
|
82
|
+
# @return [Boolean]
|
83
|
+
def uri?
|
84
|
+
false
|
85
|
+
end
|
86
|
+
|
87
|
+
##
|
88
|
+
# Returns `true` if `self` is a query variable.
|
89
|
+
#
|
90
|
+
# @return [Boolean]
|
91
|
+
# @since 0.1.7
|
92
|
+
def variable?
|
93
|
+
false
|
94
|
+
end
|
95
|
+
|
96
|
+
##
|
97
|
+
# Returns an `RDF::Value` representation of `self`.
|
98
|
+
#
|
99
|
+
# @return [RDF::Value]
|
100
|
+
def to_rdf
|
101
|
+
self
|
102
|
+
end
|
103
|
+
|
104
|
+
##
|
105
|
+
# Returns a developer-friendly representation of `self`.
|
106
|
+
#
|
107
|
+
# The result will be of the format `#<RDF::Value::0x12345678(...)>`,
|
108
|
+
# where `...` is the string returned by `#to_s`.
|
109
|
+
#
|
110
|
+
# @return [String]
|
111
|
+
def inspect
|
112
|
+
sprintf("#<%s:%#0x(%s)>", self.class.name, __id__, to_s)
|
113
|
+
end
|
114
|
+
|
115
|
+
##
|
116
|
+
# Outputs a developer-friendly representation of `self` to `stderr`.
|
117
|
+
#
|
118
|
+
# @return [void]
|
119
|
+
def inspect!
|
120
|
+
warn(inspect)
|
121
|
+
end
|
122
|
+
|
123
|
+
##
|
124
|
+
# Default implementation of raise_error, which returns false.
|
125
|
+
# Classes including RDF::TypeCheck will raise TypeError
|
126
|
+
# instead.
|
127
|
+
#
|
128
|
+
# @return [false]
|
129
|
+
def type_error(message)
|
130
|
+
false
|
131
|
+
end
|
132
|
+
end # Value
|
133
|
+
end # RDF
|