rdf 1.99.1 → 2.0.0.beta1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/{README → README.md} +9 -44
- data/VERSION +1 -1
- data/bin/rdf +1 -1
- data/lib/rdf.rb +40 -49
- data/lib/rdf/changeset.rb +161 -0
- data/lib/rdf/cli.rb +195 -33
- data/lib/rdf/cli/vocab-loader.rb +13 -3
- data/lib/rdf/format.rb +44 -26
- data/lib/rdf/mixin/enumerable.rb +133 -97
- data/lib/rdf/mixin/enumerator.rb +8 -0
- data/lib/rdf/mixin/indexable.rb +1 -1
- data/lib/rdf/mixin/mutable.rb +101 -22
- data/lib/rdf/mixin/queryable.rb +21 -32
- data/lib/rdf/mixin/transactable.rb +94 -0
- data/lib/rdf/mixin/writable.rb +12 -3
- data/lib/rdf/model/dataset.rb +48 -0
- data/lib/rdf/model/graph.rb +73 -43
- data/lib/rdf/model/list.rb +61 -33
- data/lib/rdf/model/literal.rb +20 -19
- data/lib/rdf/model/literal/double.rb +20 -4
- data/lib/rdf/model/literal/numeric.rb +15 -13
- data/lib/rdf/model/node.rb +15 -16
- data/lib/rdf/model/statement.rb +1 -43
- data/lib/rdf/model/term.rb +10 -8
- data/lib/rdf/model/uri.rb +35 -34
- data/lib/rdf/model/value.rb +1 -1
- data/lib/rdf/nquads.rb +2 -11
- data/lib/rdf/ntriples.rb +1 -1
- data/lib/rdf/ntriples/reader.rb +33 -46
- data/lib/rdf/ntriples/writer.rb +42 -5
- data/lib/rdf/query.rb +6 -40
- data/lib/rdf/query/pattern.rb +4 -17
- data/lib/rdf/query/solutions.rb +6 -6
- data/lib/rdf/reader.rb +65 -14
- data/lib/rdf/repository.rb +365 -229
- data/lib/rdf/transaction.rb +211 -84
- data/lib/rdf/util.rb +1 -0
- data/lib/rdf/util/cache.rb +5 -5
- data/lib/rdf/util/file.rb +12 -9
- data/lib/rdf/util/logger.rb +272 -0
- data/lib/rdf/version.rb +2 -2
- data/lib/rdf/vocab/owl.rb +82 -77
- data/lib/rdf/vocab/rdfs.rb +22 -17
- data/lib/rdf/vocab/xsd.rb +5 -0
- data/lib/rdf/vocabulary.rb +50 -56
- data/lib/rdf/writer.rb +104 -52
- metadata +45 -90
- data/lib/rdf/mixin/inferable.rb +0 -5
- data/lib/rdf/vocab/cc.rb +0 -128
- data/lib/rdf/vocab/cert.rb +0 -245
- data/lib/rdf/vocab/dc.rb +0 -948
- data/lib/rdf/vocab/dc11.rb +0 -167
- data/lib/rdf/vocab/dcat.rb +0 -214
- data/lib/rdf/vocab/doap.rb +0 -337
- data/lib/rdf/vocab/exif.rb +0 -941
- data/lib/rdf/vocab/foaf.rb +0 -614
- data/lib/rdf/vocab/geo.rb +0 -157
- data/lib/rdf/vocab/gr.rb +0 -1501
- data/lib/rdf/vocab/ht.rb +0 -236
- data/lib/rdf/vocab/ical.rb +0 -528
- data/lib/rdf/vocab/ma.rb +0 -513
- data/lib/rdf/vocab/mo.rb +0 -2412
- data/lib/rdf/vocab/og.rb +0 -222
- data/lib/rdf/vocab/ogc.rb +0 -58
- data/lib/rdf/vocab/prov.rb +0 -1550
- data/lib/rdf/vocab/rsa.rb +0 -72
- data/lib/rdf/vocab/rss.rb +0 -66
- data/lib/rdf/vocab/schema.rb +0 -10569
- data/lib/rdf/vocab/sioc.rb +0 -669
- data/lib/rdf/vocab/skos.rb +0 -238
- data/lib/rdf/vocab/skosxl.rb +0 -57
- data/lib/rdf/vocab/v.rb +0 -383
- data/lib/rdf/vocab/vcard.rb +0 -841
- data/lib/rdf/vocab/vmd.rb +0 -383
- data/lib/rdf/vocab/void.rb +0 -186
- data/lib/rdf/vocab/vs.rb +0 -28
- data/lib/rdf/vocab/wdrs.rb +0 -134
- data/lib/rdf/vocab/wot.rb +0 -167
- data/lib/rdf/vocab/xhtml.rb +0 -8
- data/lib/rdf/vocab/xhv.rb +0 -505
data/lib/rdf/model/literal.rb
CHANGED
@@ -148,6 +148,7 @@ module RDF
|
|
148
148
|
#
|
149
149
|
# @param [Object] value
|
150
150
|
# @option options [Symbol] :language (nil)
|
151
|
+
# Language is downcased to ensure proper matching
|
151
152
|
# @option options [String] :lexical (nil)
|
152
153
|
# Supplied lexical representation of this literal,
|
153
154
|
# otherwise it comes from transforming `value` to a string form
|
@@ -166,7 +167,7 @@ module RDF
|
|
166
167
|
@string = value if !defined?(@string) && value.is_a?(String)
|
167
168
|
@string = @string.encode(Encoding::UTF_8) if @string
|
168
169
|
@object = @string if @string && @object.is_a?(String)
|
169
|
-
@language = options[:language].to_s.to_sym if options[:language]
|
170
|
+
@language = options[:language].to_s.downcase.to_sym if options[:language]
|
170
171
|
@datatype = RDF::URI(options[:datatype]) if options[:datatype]
|
171
172
|
@datatype ||= self.class.const_get(:DATATYPE) if self.class.const_defined?(:DATATYPE)
|
172
173
|
@datatype ||= @language ? RDF.langString : RDF::XSD.string
|
@@ -195,14 +196,6 @@ module RDF
|
|
195
196
|
true
|
196
197
|
end
|
197
198
|
|
198
|
-
##
|
199
|
-
# Returns `false`.
|
200
|
-
#
|
201
|
-
# @return [Boolean] `true` or `false`
|
202
|
-
def anonymous?
|
203
|
-
false
|
204
|
-
end
|
205
|
-
|
206
199
|
##
|
207
200
|
# Term compatibility according to SPARQL
|
208
201
|
#
|
@@ -275,7 +268,7 @@ module RDF
|
|
275
268
|
(self.class.eql?(other.class) &&
|
276
269
|
self.value_hash == other.value_hash &&
|
277
270
|
self.value.eql?(other.value) &&
|
278
|
-
self.language.to_s.
|
271
|
+
self.language.to_s.eql?(other.language.to_s) &&
|
279
272
|
self.datatype.eql?(other.datatype))
|
280
273
|
end
|
281
274
|
|
@@ -296,7 +289,7 @@ module RDF
|
|
296
289
|
case
|
297
290
|
when self.eql?(other)
|
298
291
|
true
|
299
|
-
when self.has_language? && self.language.to_s
|
292
|
+
when self.has_language? && self.language.to_s == other.language.to_s
|
300
293
|
# Literals with languages can compare if languages are identical
|
301
294
|
self.value_hash == other.value_hash && self.value == other.value
|
302
295
|
when self.simple? && other.simple?
|
@@ -412,19 +405,27 @@ module RDF
|
|
412
405
|
# @return [RDF::Literal] `self`
|
413
406
|
# @since 0.3.0
|
414
407
|
def canonicalize!
|
415
|
-
@language = @language.to_s.downcase.to_sym if @language
|
416
408
|
self
|
417
409
|
end
|
418
410
|
|
419
411
|
##
|
420
|
-
#
|
412
|
+
# Escape a literal using ECHAR escapes.
|
413
|
+
#
|
414
|
+
# ECHAR ::= '\' [tbnrf"'\]
|
421
415
|
#
|
422
|
-
# @
|
423
|
-
|
424
|
-
|
425
|
-
|
426
|
-
|
427
|
-
|
416
|
+
# @note N-Triples only requires '\"\n\r' to be escaped.
|
417
|
+
#
|
418
|
+
# @param [String] string
|
419
|
+
# @return [String]
|
420
|
+
# @see {RDF::Term#escape}
|
421
|
+
def escape(string)
|
422
|
+
string.gsub('\\', '\\\\').
|
423
|
+
gsub("\t", '\\t').
|
424
|
+
gsub("\b", '\\b').
|
425
|
+
gsub("\n", '\\n').
|
426
|
+
gsub("\r", '\\r').
|
427
|
+
gsub("\f", '\\f').
|
428
|
+
gsub('"', '\\"')
|
428
429
|
end
|
429
430
|
|
430
431
|
##
|
@@ -18,7 +18,6 @@ module RDF; class Literal
|
|
18
18
|
# @param [Float, #to_f] value
|
19
19
|
# @option options [String] :lexical (nil)
|
20
20
|
def initialize(value, options = {})
|
21
|
-
#require 'byebug'; byebug
|
22
21
|
@datatype = RDF::URI(options[:datatype] || self.class.const_get(:DATATYPE))
|
23
22
|
@string = options[:lexical] if options.has_key?(:lexical)
|
24
23
|
@string ||= value if value.is_a?(String)
|
@@ -66,6 +65,21 @@ module RDF; class Literal
|
|
66
65
|
self
|
67
66
|
end
|
68
67
|
|
68
|
+
##
|
69
|
+
# Returns `true` if this literal is equal to `other`.
|
70
|
+
#
|
71
|
+
# @param [Object] other
|
72
|
+
# @return [Boolean] `true` or `false`
|
73
|
+
# @since 0.3.0
|
74
|
+
def ==(other)
|
75
|
+
if valid? && infinite? && other.respond_to?(:infinite?) && other.infinite?
|
76
|
+
infinite? == other.infinite?
|
77
|
+
# JRuby INF comparisons differ from MRI
|
78
|
+
else
|
79
|
+
super
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
69
83
|
##
|
70
84
|
# Compares this literal to `other` for sorting purposes.
|
71
85
|
#
|
@@ -75,9 +89,11 @@ module RDF; class Literal
|
|
75
89
|
def <=>(other)
|
76
90
|
case other
|
77
91
|
when ::Numeric
|
78
|
-
|
79
|
-
when RDF::Literal::Decimal
|
80
|
-
|
92
|
+
to_f <=> other
|
93
|
+
when RDF::Literal::Decimal
|
94
|
+
to_f <=> other.to_d
|
95
|
+
when RDF::Literal::Double
|
96
|
+
to_f <=> other.to_f
|
81
97
|
else super
|
82
98
|
end
|
83
99
|
end
|
@@ -14,6 +14,8 @@ module RDF; class Literal
|
|
14
14
|
case other
|
15
15
|
when ::Numeric
|
16
16
|
to_d <=> other
|
17
|
+
when Double
|
18
|
+
to_f <=> other.to_f
|
17
19
|
when Numeric
|
18
20
|
to_d <=> other.to_d
|
19
21
|
else super
|
@@ -72,9 +74,9 @@ module RDF; class Literal
|
|
72
74
|
# @since 0.2.3
|
73
75
|
# @see http://www.w3.org/TR/xpath-functions/#func-numeric-add
|
74
76
|
def +(other)
|
75
|
-
if self.class == Double || other.class
|
77
|
+
if self.class == Double || [Double, ::Float].include?(other.class)
|
76
78
|
RDF::Literal::Double.new(to_f + other.to_f)
|
77
|
-
elsif self.class == Float || other.class == Float
|
79
|
+
elsif ((self.class == RDF::Literal::Float || other.class == RDF::Literal::Float) rescue false)
|
78
80
|
RDF::Literal::Float.new(to_f + other.to_f)
|
79
81
|
elsif self.class == Decimal || other.class == Decimal
|
80
82
|
RDF::Literal::Decimal.new(to_d + (other.respond_to?(:to_d) ? other.to_d : BigDecimal(other.to_s)))
|
@@ -91,9 +93,9 @@ module RDF; class Literal
|
|
91
93
|
# @since 0.2.3
|
92
94
|
# @see http://www.w3.org/TR/xpath-functions/#func-numeric-subtract
|
93
95
|
def -(other)
|
94
|
-
if self.class == Double || other.class
|
96
|
+
if self.class == Double || [Double, ::Float].include?(other.class)
|
95
97
|
RDF::Literal::Double.new(to_f - other.to_f)
|
96
|
-
elsif self.class == Float || other.class == Float
|
98
|
+
elsif ((self.class == RDF::Literal::Float || other.class == RDF::Literal::Float) rescue false)
|
97
99
|
RDF::Literal::Float.new(to_f - other.to_f)
|
98
100
|
elsif self.class == Decimal || other.class == Decimal
|
99
101
|
RDF::Literal::Decimal.new(to_d - (other.respond_to?(:to_d) ? other.to_d : BigDecimal(other.to_s)))
|
@@ -110,9 +112,9 @@ module RDF; class Literal
|
|
110
112
|
# @since 0.2.3
|
111
113
|
# @see http://www.w3.org/TR/xpath-functions/#func-numeric-multiply
|
112
114
|
def *(other)
|
113
|
-
if self.class == Double || other.class
|
115
|
+
if self.class == Double || [Double, ::Float].include?(other.class)
|
114
116
|
RDF::Literal::Double.new(to_f * other.to_f)
|
115
|
-
elsif self.class == Float || other.class == Float
|
117
|
+
elsif ((self.class == RDF::Literal::Float || other.class == RDF::Literal::Float) rescue false)
|
116
118
|
RDF::Literal::Float.new(to_f * other.to_f)
|
117
119
|
elsif self.class == Decimal || other.class == Decimal
|
118
120
|
RDF::Literal::Decimal.new(to_d * (other.respond_to?(:to_d) ? other.to_d : BigDecimal(other.to_s)))
|
@@ -124,8 +126,8 @@ module RDF; class Literal
|
|
124
126
|
##
|
125
127
|
# Returns the quotient of `self` divided by `other`.
|
126
128
|
#
|
127
|
-
# As a special case, if the types of both $arg1 and $arg2 are
|
128
|
-
# then the return type is
|
129
|
+
# As a special case, if the types of both $arg1 and $arg2 are xsd:integer,
|
130
|
+
# then the return type is xsd:decimal.
|
129
131
|
#
|
130
132
|
# @param [Literal::Numeric, #to_i, #to_f, #to_d] other
|
131
133
|
# @return [RDF::Literal::Numeric]
|
@@ -133,14 +135,12 @@ module RDF; class Literal
|
|
133
135
|
# @since 0.2.3
|
134
136
|
# @see http://www.w3.org/TR/xpath-functions/#func-numeric-divide
|
135
137
|
def /(other)
|
136
|
-
if self.class == Double || other.class
|
138
|
+
if self.class == Double || [Double, ::Float].include?(other.class)
|
137
139
|
RDF::Literal::Double.new(to_f / other.to_f)
|
138
|
-
elsif self.class == Float || other.class == Float
|
140
|
+
elsif ((self.class == RDF::Literal::Float || other.class == RDF::Literal::Float) rescue false)
|
139
141
|
RDF::Literal::Float.new(to_f / other.to_f)
|
140
|
-
elsif self.class == Decimal || other.class == Decimal
|
141
|
-
RDF::Literal::Decimal.new(to_d / (other.respond_to?(:to_d) ? other.to_d : BigDecimal(other.to_s)))
|
142
142
|
else
|
143
|
-
RDF::Literal::
|
143
|
+
RDF::Literal::Decimal.new(to_d / (other.respond_to?(:to_d) ? other.to_d : BigDecimal(other.to_s)))
|
144
144
|
end
|
145
145
|
end
|
146
146
|
|
@@ -211,6 +211,8 @@ module RDF; class Literal
|
|
211
211
|
# @return [BigDecimal]
|
212
212
|
def to_d
|
213
213
|
@object.respond_to?(:to_d) ? @object.to_d : BigDecimal(@object.to_s)
|
214
|
+
rescue FloatDomainError
|
215
|
+
::Float::NAN
|
214
216
|
end
|
215
217
|
|
216
218
|
##
|
data/lib/rdf/model/node.rb
CHANGED
@@ -30,18 +30,17 @@ module RDF
|
|
30
30
|
##
|
31
31
|
# Returns a blank node with a random UUID-based identifier.
|
32
32
|
#
|
33
|
-
# @param
|
34
|
-
# @option options [Regexp] :grammar (nil)
|
33
|
+
# @param [Regexp] grammar (nil)
|
35
34
|
# a grammar specification that the generated UUID must match
|
36
35
|
# @return [RDF::Node]
|
37
|
-
def self.uuid(
|
36
|
+
def self.uuid(grammar: nil)
|
38
37
|
case
|
39
|
-
when
|
38
|
+
when grammar
|
40
39
|
# The UUID is generated such that its initial part is guaranteed
|
41
40
|
# to match the given `grammar`, e.g. `/^[A-Za-z][A-Za-z0-9]*/`.
|
42
41
|
# Some RDF storage systems (e.g. AllegroGraph) require this.
|
43
42
|
# @see http://github.com/bendiken/rdf/pull/43
|
44
|
-
uuid = RDF::Util::UUID.generate(options) until uuid =~
|
43
|
+
uuid = RDF::Util::UUID.generate(options) until uuid =~ grammar
|
45
44
|
else
|
46
45
|
uuid = RDF::Util::UUID.generate(options)
|
47
46
|
end
|
@@ -121,7 +120,7 @@ module RDF
|
|
121
120
|
end
|
122
121
|
|
123
122
|
##
|
124
|
-
#
|
123
|
+
# Determines if `self` is the same term as `other`.
|
125
124
|
#
|
126
125
|
# In this case, nodes must be the same object
|
127
126
|
#
|
@@ -148,25 +147,25 @@ module RDF
|
|
148
147
|
else
|
149
148
|
other.respond_to?(:node?) && other.node? &&
|
150
149
|
self.hash == other.to_term.hash &&
|
151
|
-
other.respond_to?(:id) && @id == other.id
|
150
|
+
other.respond_to?(:id) && @id == other.to_term.id
|
152
151
|
end
|
153
152
|
end
|
154
153
|
alias_method :===, :==
|
155
154
|
|
156
|
-
##
|
157
|
-
# Returns the base representation of this node.
|
158
|
-
#
|
159
|
-
# @return [Sring]
|
160
|
-
def to_base
|
161
|
-
to_s
|
162
|
-
end
|
163
|
-
|
164
155
|
##
|
165
156
|
# Returns a representation of this node independent of any identifier used to initialize it
|
166
157
|
#
|
167
158
|
# @return [String]
|
168
159
|
def to_unique_base
|
169
|
-
"_:g#{__id__.to_i.abs}"
|
160
|
+
original ? original.to_unique_base : "_:g#{__id__.to_i.abs}"
|
161
|
+
end
|
162
|
+
|
163
|
+
##
|
164
|
+
# Make this term identifier unique, if it is found to be shared with another node having the same identifier
|
165
|
+
# @return [self]
|
166
|
+
def make_unique!
|
167
|
+
@id = to_unique_base[2..-1]
|
168
|
+
self
|
170
169
|
end
|
171
170
|
|
172
171
|
##
|
data/lib/rdf/model/statement.rb
CHANGED
@@ -48,28 +48,6 @@ module RDF
|
|
48
48
|
# @return [RDF::Resource]
|
49
49
|
attr_accessor :graph_name
|
50
50
|
|
51
|
-
##
|
52
|
-
# Name of this graph, if it is part of an {RDF::Repository}
|
53
|
-
# @!attribute [rw] graph_name
|
54
|
-
# @return [RDF::Resource]
|
55
|
-
# @since 1.1.0
|
56
|
-
# @deprecated Use {#graph_name} instead.
|
57
|
-
def context
|
58
|
-
warn "[DEPRECATION] Statement#context is being replaced with Statement@graph_name in RDF.rb 2.0. Called from #{Gem.location_of_caller.join(':')}"
|
59
|
-
graph_name
|
60
|
-
end
|
61
|
-
|
62
|
-
##
|
63
|
-
# Name of this graph, if it is part of an {RDF::Repository}
|
64
|
-
# @!attribute [rw] graph_name
|
65
|
-
# @return [RDF::Resource]
|
66
|
-
# @since 1.1.0
|
67
|
-
# @deprecated Use {#graph_name=} instead.
|
68
|
-
def context=(value)
|
69
|
-
warn "[DEPRECATION] Statement#context= is being replaced with Statement@graph_name= in RDF.rb 2.0. Called from #{Gem.location_of_caller.join(':')}"
|
70
|
-
self.graph_name = value
|
71
|
-
end
|
72
|
-
|
73
51
|
# @return [RDF::Resource]
|
74
52
|
attr_accessor :subject
|
75
53
|
|
@@ -87,8 +65,6 @@ module RDF
|
|
87
65
|
# @option options [RDF::URI] :predicate (nil)
|
88
66
|
# @option options [RDF::Resource] :object (nil)
|
89
67
|
# if not a {Resource}, it is coerced to {Literal} or {Node} depending on if it is a symbol or something other than a {Term}.
|
90
|
-
# @option options [RDF::Term] :context (nil)
|
91
|
-
# Alias for :graph_name, :context is deprecated in RDF.rb.
|
92
68
|
# @option options [RDF::Term] :graph_name (nil)
|
93
69
|
# Note, in RDF 1.1, a graph name MUST be an {Resource}.
|
94
70
|
# @return [RDF::Statement]
|
@@ -100,8 +76,6 @@ module RDF
|
|
100
76
|
# @param [RDF::Resource] object
|
101
77
|
# if not a {Resource}, it is coerced to {Literal} or {Node} depending on if it is a symbol or something other than a {Term}.
|
102
78
|
# @param [Hash{Symbol => Object}] options
|
103
|
-
# @option options [RDF::Term] :context (nil)
|
104
|
-
# Alias for :graph_name, :context is deprecated in RDF.rb.
|
105
79
|
# @option options [RDF::Term] :graph_name (nil)
|
106
80
|
# Note, in RDF 1.1, a graph name MUST be an {Resource}.
|
107
81
|
# @return [RDF::Statement]
|
@@ -117,10 +91,6 @@ module RDF
|
|
117
91
|
@predicate = predicate
|
118
92
|
@object = object
|
119
93
|
end
|
120
|
-
if @options.has_key?(:context)
|
121
|
-
warn "[DEPRECATION] the :contexts option to Mutable#load is deprecated in RDF.rb 2.0, use :graph_name instead. Called from #{Gem.location_of_caller.join(':')}"
|
122
|
-
@options[:graph_name] ||= @options.delete(:context)
|
123
|
-
end
|
124
94
|
@id = @options.delete(:id) if @options.has_key?(:id)
|
125
95
|
@graph_name = @options.delete(:graph_name)
|
126
96
|
initialize!
|
@@ -229,14 +199,6 @@ module RDF
|
|
229
199
|
end
|
230
200
|
alias_method :has_name?, :has_graph?
|
231
201
|
|
232
|
-
##
|
233
|
-
# @return [Boolean]
|
234
|
-
# @deprecated Use {#has_graph?} instead.
|
235
|
-
def has_context?
|
236
|
-
warn "[DEPRECATION] Statement#has_context? is being replaced with Statement#has_grap in RDF.rb 2.0. Called from #{Gem.location_of_caller.join(':')}"
|
237
|
-
!!context
|
238
|
-
end
|
239
|
-
|
240
202
|
##
|
241
203
|
# @return [Boolean]
|
242
204
|
def has_subject?
|
@@ -386,11 +348,7 @@ module RDF
|
|
386
348
|
# @return [RDF::Graph]
|
387
349
|
# @see http://www.w3.org/TR/rdf-primer/#reification
|
388
350
|
def reified(options = {})
|
389
|
-
|
390
|
-
warn "[DEPRECATION] the :contexts option to Mutable#load is deprecated in RDF.rb 2.0, use :graph_name instead. Called from #{Gem.location_of_caller.join(':')}"
|
391
|
-
options[:graph_name] ||= options.delete(:context)
|
392
|
-
end
|
393
|
-
RDF::Graph.new(options[:graph_name]) do |graph|
|
351
|
+
RDF::Graph.new(graph_name: options[:graph_name]) do |graph|
|
394
352
|
subject = options[:subject] || RDF::Node.new(options[:id])
|
395
353
|
graph << [subject, RDF.type, RDF[:Statement]]
|
396
354
|
graph << [subject, RDF.subject, self.subject]
|
data/lib/rdf/model/term.rb
CHANGED
@@ -80,6 +80,14 @@ module RDF
|
|
80
80
|
self
|
81
81
|
end
|
82
82
|
|
83
|
+
##
|
84
|
+
# Returns the base representation of this term.
|
85
|
+
#
|
86
|
+
# @return [Sring]
|
87
|
+
def to_base
|
88
|
+
RDF::NTriples.serialize(self)
|
89
|
+
end
|
90
|
+
|
83
91
|
##
|
84
92
|
# Term compatibility according to SPARQL
|
85
93
|
#
|
@@ -91,18 +99,12 @@ module RDF
|
|
91
99
|
|
92
100
|
protected
|
93
101
|
##
|
94
|
-
# Escape a term using
|
102
|
+
# Escape a term using escapes. This should be implemented as appropriate for the given type of term.
|
95
103
|
#
|
96
104
|
# @param [String] string
|
97
105
|
# @return [String]
|
98
106
|
def escape(string)
|
99
|
-
|
100
|
-
gsub("\b", '\\b').
|
101
|
-
gsub("\f", '\\f').
|
102
|
-
gsub("\t", '\\t').
|
103
|
-
gsub("\n", '\\n').
|
104
|
-
gsub("\r", '\\r').
|
105
|
-
gsub('"', '\\"')
|
107
|
+
raise NotImplementedError, "#{self.class}#escape"
|
106
108
|
end
|
107
109
|
|
108
110
|
end # Term
|
data/lib/rdf/model/uri.rb
CHANGED
@@ -10,7 +10,7 @@ module RDF
|
|
10
10
|
# uri = RDF::URI.new("http://rubygems.org/gems/rdf")
|
11
11
|
#
|
12
12
|
# @example Creating a URI reference (2)
|
13
|
-
# uri = RDF::URI.new(scheme: 'http', host: 'rubygems.org', path: '/rdf')
|
13
|
+
# uri = RDF::URI.new(scheme: 'http', host: 'rubygems.org', path: '/gems/rdf')
|
14
14
|
# #=> RDF::URI.new("http://rubygems.org/gems/rdf")
|
15
15
|
#
|
16
16
|
# @example Creating an interned URI reference
|
@@ -39,7 +39,7 @@ module RDF
|
|
39
39
|
[\\u{40000}-\\u{4FFFD}]|[\\u{50000}-\\u{5FFFD}]|[\\u{60000}-\\u{6FFFD}]|
|
40
40
|
[\\u{70000}-\\u{7FFFD}]|[\\u{80000}-\\u{8FFFD}]|[\\u{90000}-\\u{9FFFD}]|
|
41
41
|
[\\u{A0000}-\\u{AFFFD}]|[\\u{B0000}-\\u{BFFFD}]|[\\u{C0000}-\\u{CFFFD}]|
|
42
|
-
[\\u{D0000}-\\u{DFFFD}]|[\\u{
|
42
|
+
[\\u{D0000}-\\u{DFFFD}]|[\\u{E1000}-\\u{EFFFD}]
|
43
43
|
EOS
|
44
44
|
IPRIVATE = Regexp.compile("[\\uE000-\\uF8FF]|[\\u{F0000}-\\u{FFFFD}]|[\\u100000-\\u10FFFD]").freeze
|
45
45
|
SCHEME = Regexp.compile("[A-za-z](?:[A-Za-z0-9+-\.])*").freeze
|
@@ -202,14 +202,9 @@ module RDF
|
|
202
202
|
##
|
203
203
|
# @overload URI(uri, options = {})
|
204
204
|
# @param [URI, String, #to_s] uri
|
205
|
-
# @param [Hash{Symbol => Object}] options
|
206
|
-
# @option options [Boolean] :validate (false)
|
207
|
-
# @option options [Boolean] :canonicalize (false)
|
208
205
|
#
|
209
206
|
# @overload URI(options = {})
|
210
207
|
# @param [Hash{Symbol => Object}] options
|
211
|
-
# @option options [Boolean] :validate (false)
|
212
|
-
# @option options [Boolean] :canonicalize (false)
|
213
208
|
# @option [String, #to_s] :scheme The scheme component.
|
214
209
|
# @option [String, #to_s] :user The user component.
|
215
210
|
# @option [String, #to_s] :password The password component.
|
@@ -224,33 +219,34 @@ module RDF
|
|
224
219
|
# @option [String, #to_s] :path The path component.
|
225
220
|
# @option [String, #to_s] :query The query component.
|
226
221
|
# @option [String, #to_s] :fragment The fragment component.
|
227
|
-
|
228
|
-
|
222
|
+
#
|
223
|
+
# @param [Boolean] validate (false)
|
224
|
+
# @param [Boolean] canonicalize (false)
|
225
|
+
def initialize(*args, validate: false, canonicalize: false, **options)
|
229
226
|
uri = args.first
|
230
|
-
|
231
|
-
|
227
|
+
if uri
|
228
|
+
@value = uri.to_s
|
229
|
+
if @value.encoding != Encoding::UTF_8
|
230
|
+
@value = @value.dup if @value.frozen?
|
231
|
+
@value.force_encoding(Encoding::UTF_8)
|
232
|
+
end
|
233
|
+
else
|
232
234
|
%w(
|
233
235
|
scheme
|
234
236
|
user password userinfo
|
235
237
|
host port authority
|
236
238
|
path query fragment
|
237
239
|
).map(&:to_sym).each do |meth|
|
238
|
-
if
|
239
|
-
self.send("#{meth}=".to_sym,
|
240
|
+
if options.has_key?(meth)
|
241
|
+
self.send("#{meth}=".to_sym, options[meth])
|
240
242
|
else
|
241
243
|
self.send(meth)
|
242
244
|
end
|
243
245
|
end
|
244
|
-
else
|
245
|
-
@value = uri.to_s
|
246
|
-
if @value.encoding != Encoding::UTF_8
|
247
|
-
@value = @value.dup if @value.frozen?
|
248
|
-
@value.force_encoding(Encoding::UTF_8)
|
249
|
-
end
|
250
246
|
end
|
251
247
|
|
252
|
-
validate! if
|
253
|
-
canonicalize! if
|
248
|
+
validate! if validate
|
249
|
+
canonicalize! if canonicalize
|
254
250
|
end
|
255
251
|
|
256
252
|
##
|
@@ -341,10 +337,11 @@ module RDF
|
|
341
337
|
##
|
342
338
|
# Determine if the URI is a valid according to RFC3987
|
343
339
|
#
|
340
|
+
# Note that RDF URIs syntactically can contain Unicode escapes, which are unencoded in the internal representation. To validate, %-encode specifically excluded characters from IRIREF
|
341
|
+
#
|
344
342
|
# @return [Boolean] `true` or `false`
|
345
343
|
# @since 0.3.9
|
346
344
|
def valid?
|
347
|
-
# Validate relative to RFC3987
|
348
345
|
to_s.match(RDF::URI::IRI) || false
|
349
346
|
end
|
350
347
|
|
@@ -355,7 +352,7 @@ module RDF
|
|
355
352
|
# @raise [ArgumentError] if the URI is invalid
|
356
353
|
# @since 0.3.0
|
357
354
|
def validate!
|
358
|
-
raise ArgumentError, "#{
|
355
|
+
raise ArgumentError, "#{to_base.inspect} is not a valid IRI" if invalid?
|
359
356
|
self
|
360
357
|
end
|
361
358
|
|
@@ -475,7 +472,7 @@ module RDF
|
|
475
472
|
# @example Building a HTTP URL
|
476
473
|
# RDF::URI.new('http://example.org') / 'jhacker' / 'foaf.ttl'
|
477
474
|
# #=> RDF::URI('http://example.org/jhacker/foaf.ttl')
|
478
|
-
# @example Building a HTTP URL
|
475
|
+
# @example Building a HTTP URL (absolute path components)
|
479
476
|
# RDF::URI.new('http://example.org/') / '/jhacker/' / '/foaf.ttl'
|
480
477
|
# #=> RDF::URI('http://example.org/jhacker/foaf.ttl')
|
481
478
|
# @example Using an anchored base URI
|
@@ -790,14 +787,6 @@ module RDF
|
|
790
787
|
self
|
791
788
|
end
|
792
789
|
|
793
|
-
##
|
794
|
-
# Returns the base representation of this URI.
|
795
|
-
#
|
796
|
-
# @return [Sring]
|
797
|
-
def to_base
|
798
|
-
"<#{escape(to_s)}>"
|
799
|
-
end
|
800
|
-
|
801
790
|
##
|
802
791
|
# Returns the string representation of this URI.
|
803
792
|
#
|
@@ -1216,16 +1205,22 @@ module RDF
|
|
1216
1205
|
# Sets the query component for this URI from a Hash object.
|
1217
1206
|
# An empty Hash or Array will result in an empty query string.
|
1218
1207
|
#
|
1219
|
-
# @example
|
1208
|
+
# @example Hash with single and array values
|
1220
1209
|
# uri.query_values = {a: "a", b: ["c", "d", "e"]}
|
1221
1210
|
# uri.query
|
1222
1211
|
# # => "a=a&b=c&b=d&b=e"
|
1212
|
+
#
|
1213
|
+
# @example Array with Array values including repeated variables
|
1223
1214
|
# uri.query_values = [['a', 'a'], ['b', 'c'], ['b', 'd'], ['b', 'e']]
|
1224
1215
|
# uri.query
|
1225
1216
|
# # => "a=a&b=c&b=d&b=e"
|
1217
|
+
#
|
1218
|
+
# @example Array with Array values including multiple elements
|
1226
1219
|
# uri.query_values = [['a', 'a'], ['b', ['c', 'd', 'e']]]
|
1227
1220
|
# uri.query
|
1228
1221
|
# # => "a=a&b=c&b=d&b=e"
|
1222
|
+
#
|
1223
|
+
# @example Array with Array values having only one entry
|
1229
1224
|
# uri.query_values = [['flag'], ['key', 'value']]
|
1230
1225
|
# uri.query
|
1231
1226
|
# # => "flag&key=value"
|
@@ -1245,7 +1240,13 @@ module RDF
|
|
1245
1240
|
if v.nil?
|
1246
1241
|
k
|
1247
1242
|
else
|
1248
|
-
|
1243
|
+
Array(v).map do |vv|
|
1244
|
+
if vv === TrueClass
|
1245
|
+
k
|
1246
|
+
else
|
1247
|
+
"#{k}=#{normalize_segment(vv.to_s, UNRESERVED)}"
|
1248
|
+
end
|
1249
|
+
end.join("&")
|
1249
1250
|
end
|
1250
1251
|
end
|
1251
1252
|
when Hash
|