rdf 1.0.10.2 → 1.1.0.p0
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.
- checksums.yaml +8 -8
- data/CREDITS +0 -2
- data/README +67 -20
- data/VERSION +1 -1
- data/etc/doap.nt +75 -75
- data/lib/rdf.rb +15 -64
- data/lib/rdf/format.rb +11 -20
- data/lib/rdf/mixin/countable.rb +4 -11
- data/lib/rdf/mixin/enumerable.rb +4 -8
- data/lib/rdf/mixin/mutable.rb +1 -4
- data/lib/rdf/mixin/queryable.rb +13 -60
- data/lib/rdf/model/graph.rb +46 -22
- data/lib/rdf/model/list.rb +27 -102
- data/lib/rdf/model/literal.rb +48 -100
- data/lib/rdf/model/literal/date.rb +1 -1
- data/lib/rdf/model/literal/datetime.rb +1 -35
- data/lib/rdf/model/literal/decimal.rb +0 -30
- data/lib/rdf/model/literal/double.rb +6 -14
- data/lib/rdf/model/literal/integer.rb +3 -11
- data/lib/rdf/model/literal/numeric.rb +0 -40
- data/lib/rdf/model/literal/time.rb +4 -3
- data/lib/rdf/model/node.rb +1 -3
- data/lib/rdf/model/statement.rb +7 -47
- data/lib/rdf/model/term.rb +9 -0
- data/lib/rdf/model/uri.rb +28 -68
- data/lib/rdf/model/value.rb +1 -31
- data/lib/rdf/nquads.rb +4 -7
- data/lib/rdf/ntriples.rb +2 -2
- data/lib/rdf/ntriples/format.rb +1 -2
- data/lib/rdf/ntriples/reader.rb +15 -68
- data/lib/rdf/ntriples/writer.rb +13 -53
- data/lib/rdf/query.rb +1 -8
- data/lib/rdf/query/pattern.rb +25 -7
- data/lib/rdf/query/solution.rb +3 -19
- data/lib/rdf/query/solutions.rb +4 -22
- data/lib/rdf/query/variable.rb +1 -3
- data/lib/rdf/reader.rb +8 -22
- data/lib/rdf/repository.rb +23 -5
- data/lib/rdf/transaction.rb +19 -8
- data/lib/rdf/util/aliasing.rb +3 -13
- data/lib/rdf/util/cache.rb +2 -3
- data/lib/rdf/util/file.rb +5 -15
- data/lib/rdf/vocab.rb +19 -20
- data/lib/rdf/writer.rb +5 -44
- metadata +12 -27
- data/lib/rdf/vocab/schema.rb +0 -652
data/lib/rdf/query/solutions.rb
CHANGED
@@ -4,13 +4,13 @@ module RDF; class Query
|
|
4
4
|
#
|
5
5
|
# @example Filtering solutions using a hash
|
6
6
|
# solutions.filter(:author => RDF::URI("http://ar.to/#self"))
|
7
|
-
# solutions.filter(:author => "
|
8
|
-
# solutions.filter(:author => [RDF::URI("http://ar.to/#self"), "
|
7
|
+
# solutions.filter(:author => "Arto Bendiken")
|
8
|
+
# solutions.filter(:author => [RDF::URI("http://ar.to/#self"), "Arto Bendiken"])
|
9
9
|
# solutions.filter(:updated => RDF::Literal(Date.today))
|
10
10
|
#
|
11
11
|
# @example Filtering solutions using a block
|
12
12
|
# solutions.filter { |solution| solution.author.literal? }
|
13
|
-
# solutions.filter { |solution| solution.title
|
13
|
+
# solutions.filter { |solution| solution.title =~ /^SPARQL/ }
|
14
14
|
# solutions.filter { |solution| solution.price < 30.5 }
|
15
15
|
# solutions.filter { |solution| solution.bound?(:date) }
|
16
16
|
# solutions.filter { |solution| solution.age.datatype == RDF::XSD.integer }
|
@@ -93,11 +93,7 @@ module RDF; class Query
|
|
93
93
|
self.reject! do |solution|
|
94
94
|
solution = solution.is_a?(Solution) ? solution : Solution.new(solution)
|
95
95
|
results = criteria.map do |name, value|
|
96
|
-
|
97
|
-
when Array then value.any? {|v| solution[name] == v}
|
98
|
-
when Regexp then solution[name].to_s.match(value)
|
99
|
-
else solution[name] == value
|
100
|
-
end
|
96
|
+
solution[name] == value
|
101
97
|
end
|
102
98
|
!results.all?
|
103
99
|
end
|
@@ -106,20 +102,6 @@ module RDF; class Query
|
|
106
102
|
end
|
107
103
|
alias_method :filter!, :filter
|
108
104
|
|
109
|
-
##
|
110
|
-
# Difference between solution sets, from SPARQL 1.1.
|
111
|
-
#
|
112
|
-
# The `minus` operation on solutions returns those solutions which either have no compatible solution in `other`, or the solution domains are disjoint.
|
113
|
-
#
|
114
|
-
# @param [RDF::Query::Solutions] other
|
115
|
-
# @return [RDF::Query::Solutions] a new solution set
|
116
|
-
# @see http://www.w3.org/TR/2013/REC-sparql11-query-20130321/#defn_algMinus
|
117
|
-
def minus(other)
|
118
|
-
self.dup.filter! do |soln|
|
119
|
-
!other.any? {|soln2| soln.compatible?(soln2) && !soln.disjoint?(soln2)}
|
120
|
-
end
|
121
|
-
end
|
122
|
-
|
123
105
|
##
|
124
106
|
# Reorders this solution sequence by the given `variables`.
|
125
107
|
#
|
data/lib/rdf/query/variable.rb
CHANGED
@@ -12,7 +12,7 @@ class RDF::Query
|
|
12
12
|
# var.name #=> :g2166151240
|
13
13
|
#
|
14
14
|
# @example Unbound variables match any value
|
15
|
-
# var ===
|
15
|
+
# var === 42 #=> true
|
16
16
|
#
|
17
17
|
# @example Creating a bound variable
|
18
18
|
# var = RDF::Query::Variable.new(:y, 123)
|
@@ -20,12 +20,10 @@ class RDF::Query
|
|
20
20
|
# var.value #=> 123
|
21
21
|
#
|
22
22
|
# @example Bound variables match only their actual value
|
23
|
-
# var = RDF::Query::Variable.new(:y, 123)
|
24
23
|
# var === 42 #=> false
|
25
24
|
# var === 123 #=> true
|
26
25
|
#
|
27
26
|
# @example Getting the variable name
|
28
|
-
# var = RDF::Query::Variable.new(:y, 123)
|
29
27
|
# var.named? #=> true
|
30
28
|
# var.name #=> :y
|
31
29
|
# var.to_sym #=> :y
|
data/lib/rdf/reader.rb
CHANGED
@@ -168,7 +168,7 @@ module RDF
|
|
168
168
|
# @param [Hash{Symbol => Object}] options
|
169
169
|
# any additional options
|
170
170
|
# @option options [Encoding] :encoding (Encoding::UTF_8)
|
171
|
-
# the encoding of the input stream
|
171
|
+
# the encoding of the input stream
|
172
172
|
# @option options [Boolean] :validate (false)
|
173
173
|
# whether to validate the parsed statements and values
|
174
174
|
# @option options [Boolean] :canonicalize (false)
|
@@ -189,7 +189,6 @@ module RDF
|
|
189
189
|
@options[:canonicalize] ||= false
|
190
190
|
@options[:intern] ||= true
|
191
191
|
@options[:prefixes] ||= Hash.new
|
192
|
-
@options[:base_uri] ||= input.base_uri if input.respond_to?(:base_uri)
|
193
192
|
|
194
193
|
@input = case input
|
195
194
|
when String then StringIO.new(input)
|
@@ -363,13 +362,6 @@ module RDF
|
|
363
362
|
end
|
364
363
|
alias_method :close!, :close
|
365
364
|
|
366
|
-
##
|
367
|
-
# Current line number being processed. For formats that can associate generated {Statement} with a particular line number from input, this value reflects that line number.
|
368
|
-
# @return [Integer]
|
369
|
-
def lineno
|
370
|
-
@input.lineno
|
371
|
-
end
|
372
|
-
|
373
365
|
protected
|
374
366
|
|
375
367
|
##
|
@@ -422,8 +414,6 @@ module RDF
|
|
422
414
|
##
|
423
415
|
# Returns the encoding of the input stream.
|
424
416
|
#
|
425
|
-
# _Note: this method requires Ruby 1.9 or newer._
|
426
|
-
#
|
427
417
|
# @return [Encoding]
|
428
418
|
def encoding
|
429
419
|
case @options[:encoding]
|
@@ -475,6 +465,12 @@ module RDF
|
|
475
465
|
super
|
476
466
|
end
|
477
467
|
|
468
|
+
##
|
469
|
+
# @return [Integer]
|
470
|
+
def lineno
|
471
|
+
@input.lineno
|
472
|
+
end
|
473
|
+
|
478
474
|
##
|
479
475
|
# @private
|
480
476
|
# @return [String] The most recently read line of the input
|
@@ -488,17 +484,7 @@ module RDF
|
|
488
484
|
@line = @line_rest || @input.readline
|
489
485
|
@line, @line_rest = @line.split("\r", 2)
|
490
486
|
@line = @line.to_s.chomp
|
491
|
-
|
492
|
-
@line.encode!(encoding) if @line.respond_to?(:encode!)
|
493
|
-
rescue Encoding::UndefinedConversionError, Encoding::InvalidByteSequenceError, Encoding::ConverterNotFoundError
|
494
|
-
# It is likely the persisted line was not encoded on initial write
|
495
|
-
# (i.e. persisted via RDF <= 1.0.9 and read via RDF >= 1.0.10)
|
496
|
-
#
|
497
|
-
# Encoding::UndefinedConversionError is raised by MRI.
|
498
|
-
# Encoding::InvalidByteSequenceError is raised by jruby >= 1.7.5
|
499
|
-
# Encoding::ConverterNotFoundError is raised by jruby < 1.7.5
|
500
|
-
@line = RDF::NTriples::Reader.unescape(@line).encode(encoding)
|
501
|
-
end
|
487
|
+
@line.force_encoding(encoding)
|
502
488
|
@line
|
503
489
|
end
|
504
490
|
|
data/lib/rdf/repository.rb
CHANGED
@@ -77,7 +77,7 @@ module RDF
|
|
77
77
|
# @return [void]
|
78
78
|
def self.load(filenames, options = {}, &block)
|
79
79
|
self.new(options) do |repository|
|
80
|
-
|
80
|
+
[filenames].flatten.each do |filename|
|
81
81
|
repository.load(filename, options)
|
82
82
|
end
|
83
83
|
|
@@ -96,10 +96,13 @@ module RDF
|
|
96
96
|
# @param [Hash{Symbol => Object}] options
|
97
97
|
# @option options [URI, #to_s] :uri (nil)
|
98
98
|
# @option options [String, #to_s] :title (nil)
|
99
|
+
# @option options [Boolean] :with_context (true)
|
100
|
+
# Indicates that the repository supports named graphs, otherwise,
|
101
|
+
# only the default graph is supported.
|
99
102
|
# @yield [repository]
|
100
103
|
# @yieldparam [Repository] repository
|
101
104
|
def initialize(options = {}, &block)
|
102
|
-
@options = options
|
105
|
+
@options = {:with_context => true}.merge(options)
|
103
106
|
@uri = @options.delete(:uri)
|
104
107
|
@title = @options.delete(:title)
|
105
108
|
|
@@ -141,6 +144,8 @@ module RDF
|
|
141
144
|
# end
|
142
145
|
#
|
143
146
|
# @param [RDF::Resource] context
|
147
|
+
# Context on which to run the transaction, use `false` for the default
|
148
|
+
# context and `nil` the entire Repository
|
144
149
|
# @yield [tx]
|
145
150
|
# @yieldparam [RDF::Transaction] tx
|
146
151
|
# @yieldreturn [void] ignored
|
@@ -176,7 +181,7 @@ module RDF
|
|
176
181
|
# @return [RDF::Transaction]
|
177
182
|
# @since 0.3.0
|
178
183
|
def begin_transaction(context)
|
179
|
-
RDF::Transaction.new(:
|
184
|
+
RDF::Transaction.new(:graph => context)
|
180
185
|
end
|
181
186
|
|
182
187
|
##
|
@@ -221,10 +226,11 @@ module RDF
|
|
221
226
|
|
222
227
|
##
|
223
228
|
# @private
|
224
|
-
# @see RDF::
|
229
|
+
# @see RDF::Enumerable#supports?
|
225
230
|
def supports?(feature)
|
226
231
|
case feature.to_sym
|
227
|
-
|
232
|
+
# statement contexts / named graphs
|
233
|
+
when :context then @options[:with_context]
|
228
234
|
when :inference then false # forward-chaining inference
|
229
235
|
else false
|
230
236
|
end
|
@@ -237,6 +243,13 @@ module RDF
|
|
237
243
|
false
|
238
244
|
end
|
239
245
|
|
246
|
+
##
|
247
|
+
# @private
|
248
|
+
# @see RDF::Countable#empty?
|
249
|
+
def empty?
|
250
|
+
@data.empty?
|
251
|
+
end
|
252
|
+
|
240
253
|
##
|
241
254
|
# @private
|
242
255
|
# @see RDF::Countable#count
|
@@ -344,6 +357,7 @@ module RDF
|
|
344
357
|
def insert_statement(statement)
|
345
358
|
unless has_statement?(statement)
|
346
359
|
s, p, o, c = statement.to_quad
|
360
|
+
c = DEFAULT_CONTEXT unless supports?(:context)
|
347
361
|
c ||= DEFAULT_CONTEXT
|
348
362
|
@data[c] ||= {}
|
349
363
|
@data[c][s] ||= {}
|
@@ -358,6 +372,7 @@ module RDF
|
|
358
372
|
def delete_statement(statement)
|
359
373
|
if has_statement?(statement)
|
360
374
|
s, p, o, c = statement.to_quad
|
375
|
+
c = DEFAULT_CONTEXT unless supports?(:context)
|
361
376
|
c ||= DEFAULT_CONTEXT
|
362
377
|
@data[c][s][p].delete(o)
|
363
378
|
@data[c][s].delete(p) if @data[c][s][p].empty?
|
@@ -379,4 +394,7 @@ module RDF
|
|
379
394
|
protected :clear_statements
|
380
395
|
end # Implementation
|
381
396
|
end # Repository
|
397
|
+
|
398
|
+
# RDF::Dataset is a synonym for RDF::Repository
|
399
|
+
Dataset = Repository
|
382
400
|
end # RDF
|
data/lib/rdf/transaction.rb
CHANGED
@@ -5,6 +5,10 @@ module RDF
|
|
5
5
|
# Transactions consist of a sequence of RDF statements to delete from and
|
6
6
|
# a sequence of RDF statements to insert into a given named graph.
|
7
7
|
#
|
8
|
+
# Repository implementations may choose to sub-class this class
|
9
|
+
# to provide transactional support for repository updates, when
|
10
|
+
# accessed through {RDF::Repository#begin_transaction}.
|
11
|
+
#
|
8
12
|
# @example Executing a transaction against a repository
|
9
13
|
# repository = ...
|
10
14
|
# RDF::Transaction.execute(repository) do |tx|
|
@@ -30,10 +34,14 @@ module RDF
|
|
30
34
|
end
|
31
35
|
|
32
36
|
##
|
33
|
-
#
|
34
|
-
#
|
37
|
+
# Name of this graph, if it is part of an {RDF::Repository}
|
38
|
+
# @!attribute [rw] context
|
35
39
|
# @return [RDF::Resource]
|
36
|
-
|
40
|
+
# @since 1.1.0
|
41
|
+
attr_accessor :context
|
42
|
+
|
43
|
+
alias_method :graph, :context
|
44
|
+
alias_method :graph=, :context=
|
37
45
|
|
38
46
|
##
|
39
47
|
# RDF statements to delete when executed.
|
@@ -57,14 +65,18 @@ module RDF
|
|
57
65
|
# Initializes this transaction.
|
58
66
|
#
|
59
67
|
# @param [Hash{Symbol => Object}] options
|
68
|
+
# @option options [RDF::Resource] :context (nil)
|
69
|
+
# Name of named graph to be affected if `inserts` or `deletes`
|
70
|
+
# do not have a `context`.
|
60
71
|
# @option options [RDF::Resource] :graph (nil)
|
72
|
+
# Alias for `:context`.
|
61
73
|
# @option options [RDF::Enumerable] :insert (RDF::Graph.new)
|
62
74
|
# @option options [RDF::Enumerable] :delete (RDF::Graph.new)
|
63
75
|
# @yield [tx]
|
64
76
|
# @yieldparam [RDF::Transaction] tx
|
65
77
|
def initialize(options = {}, &block)
|
66
78
|
@options = options.dup
|
67
|
-
@
|
79
|
+
@context = @options.delete(:graph) || @options.delete(:context)
|
68
80
|
@inserts = @options.delete(:insert) || RDF::Graph.new
|
69
81
|
@deletes = @options.delete(:delete) || RDF::Graph.new
|
70
82
|
@inserts.extend(RDF::Enumerable) unless @inserts.kind_of?(RDF::Enumerable)
|
@@ -102,13 +114,13 @@ module RDF
|
|
102
114
|
|
103
115
|
deletes.each_statement do |statement|
|
104
116
|
statement = statement.dup
|
105
|
-
statement.context
|
117
|
+
statement.context ||= graph
|
106
118
|
repository.delete(statement)
|
107
119
|
end
|
108
120
|
|
109
121
|
inserts.each_statement do |statement|
|
110
122
|
statement = statement.dup
|
111
|
-
statement.context
|
123
|
+
statement.context ||= graph
|
112
124
|
repository.insert(statement)
|
113
125
|
end
|
114
126
|
|
@@ -134,6 +146,7 @@ module RDF
|
|
134
146
|
warn(inspect)
|
135
147
|
end
|
136
148
|
|
149
|
+
protected
|
137
150
|
##
|
138
151
|
# Appends an RDF statement to the sequence to insert when executed.
|
139
152
|
#
|
@@ -155,7 +168,5 @@ module RDF
|
|
155
168
|
end
|
156
169
|
|
157
170
|
undef_method :load, :update, :clear
|
158
|
-
protected :insert_statement
|
159
|
-
protected :delete_statement
|
160
171
|
end # Transaction
|
161
172
|
end # RDF
|
data/lib/rdf/util/aliasing.rb
CHANGED
@@ -42,19 +42,9 @@ module RDF; module Util
|
|
42
42
|
def alias_method(new_name, old_name)
|
43
43
|
new_name, old_name = new_name.to_sym, old_name.to_sym
|
44
44
|
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
end
|
49
|
-
EOF
|
50
|
-
|
51
|
-
# NOTE: the following eval-less (and hence slightly less evil)
|
52
|
-
# implementation only works on Ruby 1.8.7+ due to the |&block|
|
53
|
-
# syntax that was introduced in 1.9 and then backported to 1.8.7;
|
54
|
-
# it is a syntax error in earlier versions of Ruby:
|
55
|
-
#self.__send__(:define_method, new_name) do |*args, &block|
|
56
|
-
# __send__(old_name, *args, &block)
|
57
|
-
#end
|
45
|
+
self.__send__(:define_method, new_name) do |*args, &block|
|
46
|
+
__send__(old_name, *args, &block)
|
47
|
+
end
|
58
48
|
|
59
49
|
return self
|
60
50
|
end
|
data/lib/rdf/util/cache.rb
CHANGED
@@ -56,7 +56,7 @@ module RDF; module Util
|
|
56
56
|
|
57
57
|
##
|
58
58
|
# This implementation relies on `ObjectSpace#_id2ref` and performs
|
59
|
-
# optimally on Ruby
|
59
|
+
# optimally on Ruby >= 1.9.x; however, it does not work on JRuby
|
60
60
|
# by default since much `ObjectSpace` functionality on that platform is
|
61
61
|
# disabled unless the `-X+O` startup option is given.
|
62
62
|
#
|
@@ -89,8 +89,7 @@ module RDF; module Util
|
|
89
89
|
|
90
90
|
##
|
91
91
|
# This implementation uses the `WeakRef` class from Ruby's standard
|
92
|
-
# library, and provides adequate performance on JRuby and on Ruby 1.9.x
|
93
|
-
# however, it performs very suboptimally on Ruby 1.8.x.
|
92
|
+
# library, and provides adequate performance on JRuby and on Ruby 1.9.x.
|
94
93
|
#
|
95
94
|
# @see http://ruby-doc.org/ruby-1.9/classes/WeakRef.html
|
96
95
|
class WeakRefCache < Cache
|
data/lib/rdf/util/file.rb
CHANGED
@@ -27,26 +27,16 @@ module RDF; module Util
|
|
27
27
|
# @param [Hash{Symbol => Object}] options
|
28
28
|
# options are ignored in this implementation. Applications are encouraged
|
29
29
|
# to override this implementation to provide more control over HTTP
|
30
|
-
# headers and redirect following.
|
31
|
-
# options are passed to `Kernel.open`.
|
30
|
+
# headers and redirect following.
|
32
31
|
# @option options [Array, String] :headers
|
33
|
-
# HTTP Request headers, passed to Kernel.open.
|
32
|
+
# HTTP Request headers, passed to Kernel.open.
|
34
33
|
# @return [IO] File stream
|
35
34
|
# @yield [IO] File stream
|
36
|
-
# @note HTTP headers not passed to `Kernel.open` for Ruby versions < 1.9.
|
37
35
|
def self.open_file(filename_or_url, options = {}, &block)
|
38
36
|
filename_or_url = $1 if filename_or_url.to_s.match(/^file:(.*)$/)
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
# Open as a URL
|
43
|
-
headers = options.fetch(:headers, {})
|
44
|
-
headers['Accept'] ||= (RDF::Format.reader_types + %w(*/*;q=0.1)).join(", ")
|
45
|
-
Kernel.open(filename_or_url.to_s, headers, &block)
|
46
|
-
else
|
47
|
-
# Open as a file, passing any options
|
48
|
-
Kernel.open(filename_or_url, "r", options, &block)
|
49
|
-
end
|
37
|
+
options[:headers] ||= {}
|
38
|
+
options[:headers]['Accept'] ||= (RDF::Format.reader_types + %w(*/*;q=0.1)).join(", ")
|
39
|
+
Kernel.open(filename_or_url.to_s, options[:headers], &block)
|
50
40
|
end
|
51
41
|
end # File
|
52
42
|
end; end # RDF::Util
|
data/lib/rdf/vocab.rb
CHANGED
@@ -6,26 +6,25 @@ module RDF
|
|
6
6
|
#
|
7
7
|
# The following vocabularies are pre-defined for your convenience:
|
8
8
|
#
|
9
|
-
# * {RDF}
|
10
|
-
# * {RDF::CC}
|
11
|
-
# * {RDF::CERT}
|
12
|
-
# * {RDF::DC}
|
13
|
-
# * {RDF::DC11}
|
14
|
-
# * {RDF::DOAP}
|
15
|
-
# * {RDF::EXIF}
|
16
|
-
# * {RDF::FOAF}
|
17
|
-
# * {RDF::GEO}
|
18
|
-
# * {RDF::HTTP}
|
19
|
-
# * {RDF::OWL}
|
20
|
-
# * {RDF::RDFS}
|
21
|
-
# * {RDF::RSA}
|
22
|
-
# * {RDF::RSS}
|
23
|
-
# * {RDF::
|
24
|
-
# * {RDF::
|
25
|
-
# * {RDF::
|
26
|
-
# * {RDF::
|
27
|
-
# * {RDF::
|
28
|
-
# * {RDF::XSD} - XML Schema (XSD)
|
9
|
+
# * {RDF} - Resource Description Framework (RDF)
|
10
|
+
# * {RDF::CC} - Creative Commons (CC)
|
11
|
+
# * {RDF::CERT} - W3 Authentication Certificate (CERT)
|
12
|
+
# * {RDF::DC} - Dublin Core (DC)
|
13
|
+
# * {RDF::DC11} - Dublin Core 1.1 (DC11) _deprecated_
|
14
|
+
# * {RDF::DOAP} - Description of a Project (DOAP)
|
15
|
+
# * {RDF::EXIF} - Exchangeable Image File Format (EXIF)
|
16
|
+
# * {RDF::FOAF} - Friend of a Friend (FOAF)
|
17
|
+
# * {RDF::GEO} - WGS84 Geo Positioning (GEO)
|
18
|
+
# * {RDF::HTTP} - Hypertext Transfer Protocol (HTTP)
|
19
|
+
# * {RDF::OWL} - Web Ontology Language (OWL)
|
20
|
+
# * {RDF::RDFS} - RDF Schema (RDFS)
|
21
|
+
# * {RDF::RSA} - W3 RSA Keys (RSA)
|
22
|
+
# * {RDF::RSS} - RDF Site Summary (RSS)
|
23
|
+
# * {RDF::SIOC} - Semantically-Interlinked Online Communities (SIOC)
|
24
|
+
# * {RDF::SKOS} - Simple Knowledge Organization System (SKOS)
|
25
|
+
# * {RDF::WOT} - Web of Trust (WOT)
|
26
|
+
# * {RDF::XHTML} - Extensible HyperText Markup Language (XHTML)
|
27
|
+
# * {RDF::XSD} - XML Schema (XSD)
|
29
28
|
#
|
30
29
|
# @example Using pre-defined RDF vocabularies
|
31
30
|
# include RDF
|
data/lib/rdf/writer.rb
CHANGED
@@ -1,4 +1,3 @@
|
|
1
|
-
# -*- encoding: utf-8 -*-
|
2
1
|
module RDF
|
3
2
|
##
|
4
3
|
# The base class for RDF serializers.
|
@@ -106,18 +105,13 @@ module RDF
|
|
106
105
|
##
|
107
106
|
# @param [RDF::Enumerable, #each] data
|
108
107
|
# the graph or repository to dump
|
109
|
-
# @param [IO, File
|
108
|
+
# @param [IO, File] io
|
110
109
|
# the output stream or file to write to
|
111
110
|
# @param [Hash{Symbol => Object}] options
|
112
111
|
# passed to {RDF::Writer#initialize} or {RDF::Writer.buffer}
|
113
112
|
# @return [void]
|
114
113
|
def self.dump(data, io = nil, options = {})
|
115
|
-
if io.is_a?(String)
|
116
|
-
io = File.open(io, 'w')
|
117
|
-
elsif io.respond_to?(:external_encoding) && io.external_encoding
|
118
|
-
options = {:encoding => io.external_encoding}.merge(options)
|
119
|
-
end
|
120
|
-
io.set_encoding(options[:encoding]) if io.respond_to?(:set_encoding) && options[:encoding]
|
114
|
+
io = File.open(io, 'w') if io.is_a?(String)
|
121
115
|
method = data.respond_to?(:each_statement) ? :each_statement : :each
|
122
116
|
if io
|
123
117
|
new(io, options) do |writer|
|
@@ -144,11 +138,9 @@ module RDF
|
|
144
138
|
# @return [String]
|
145
139
|
# @raise [ArgumentError] if no block is provided
|
146
140
|
def self.buffer(*args, &block)
|
147
|
-
options = args.last.is_a?(Hash) ? args.last : {}
|
148
141
|
raise ArgumentError, "block expected" unless block_given?
|
149
142
|
|
150
143
|
StringIO.open do |buffer|
|
151
|
-
buffer.set_encoding(options[:encoding]) if buffer.respond_to?(:set_encoding) && options[:encoding]
|
152
144
|
self.new(buffer, *args) { |writer| block.call(writer) }
|
153
145
|
buffer.string
|
154
146
|
end
|
@@ -164,7 +156,6 @@ module RDF
|
|
164
156
|
# @return [RDF::Writer]
|
165
157
|
def self.open(filename, options = {}, &block)
|
166
158
|
File.open(filename, 'wb') do |file|
|
167
|
-
file.set_encoding(options[:encoding]) if file.respond_to?(:set_encoding) && options[:encoding]
|
168
159
|
format_options = options.dup
|
169
160
|
format_options[:file_name] ||= filename
|
170
161
|
self.for(options[:format] || format_options).new(file, options, &block)
|
@@ -196,12 +187,10 @@ module RDF
|
|
196
187
|
# @param [Hash{Symbol => Object}] options
|
197
188
|
# any additional options
|
198
189
|
# @option options [Encoding, String, Symbol] :encoding
|
199
|
-
# the encoding to use on the output stream
|
190
|
+
# the encoding to use on the output stream.
|
200
191
|
# Defaults to the format associated with `content_encoding`.
|
201
192
|
# @option options [Boolean] :canonicalize (false)
|
202
|
-
# whether to canonicalize
|
203
|
-
# @option options [Boolean] :validate (false)
|
204
|
-
# whether to validate terms when serializing
|
193
|
+
# whether to canonicalize literals when serializing
|
205
194
|
# @option options [Hash] :prefixes (Hash.new)
|
206
195
|
# the prefix mappings to use (not supported by all writers)
|
207
196
|
# @option options [#to_s] :base_uri (nil)
|
@@ -296,11 +285,8 @@ module RDF
|
|
296
285
|
##
|
297
286
|
# Returns the encoding of the output stream.
|
298
287
|
#
|
299
|
-
# _Note: this method requires Ruby 1.9 or newer._
|
300
|
-
#
|
301
288
|
# @return [Encoding]
|
302
289
|
def encoding
|
303
|
-
return nil unless "".respond_to?(:encode)
|
304
290
|
case @options[:encoding]
|
305
291
|
when String, Symbol
|
306
292
|
Encoding.find(@options[:encoding].to_s)
|
@@ -311,24 +297,6 @@ module RDF
|
|
311
297
|
end
|
312
298
|
end
|
313
299
|
|
314
|
-
##
|
315
|
-
# Returns `true` if statements and terms should be validated.
|
316
|
-
#
|
317
|
-
# @return [Boolean] `true` or `false`
|
318
|
-
# @since 1.0.8
|
319
|
-
def validate?
|
320
|
-
@options[:validate]
|
321
|
-
end
|
322
|
-
|
323
|
-
##
|
324
|
-
# Returns `true` if terms should be canonicalized.
|
325
|
-
#
|
326
|
-
# @return [Boolean] `true` or `false`
|
327
|
-
# @since 1.0.8
|
328
|
-
def canonicalize?
|
329
|
-
@options[:canonicalize]
|
330
|
-
end
|
331
|
-
|
332
300
|
##
|
333
301
|
# Flushes the underlying output buffer.
|
334
302
|
#
|
@@ -382,21 +350,15 @@ module RDF
|
|
382
350
|
##
|
383
351
|
# @param [RDF::Statement] statement
|
384
352
|
# @return [void] `self`
|
385
|
-
# @raise [RDF::WriterError] if validating and attempting to write an invalid {RDF::Statement} or if canonicalizing a statement which cannot be canonicalized.
|
386
353
|
def write_statement(statement)
|
387
|
-
statement = statement.canonicalize! if canonicalize?
|
388
|
-
raise RDF::WriterError, "Statement #{statement.inspect} is invalid" if validate? && statement.invalid?
|
389
354
|
write_triple(*statement.to_triple)
|
390
355
|
self
|
391
|
-
rescue ArgumentError => e
|
392
|
-
raise WriterError, e.message
|
393
356
|
end
|
394
357
|
alias_method :insert_statement, :write_statement # support the RDF::Writable interface
|
395
358
|
|
396
359
|
##
|
397
360
|
# @param [Array<Array(RDF::Resource, RDF::URI, RDF::Term)>] triples
|
398
361
|
# @return [void] `self`
|
399
|
-
# @raise [RDF::WriterError] if validating and attempting to write an invalid {RDF::Term}.
|
400
362
|
def write_triples(*triples)
|
401
363
|
triples.each { |triple| write_triple(*triple) }
|
402
364
|
self
|
@@ -408,7 +370,6 @@ module RDF
|
|
408
370
|
# @param [RDF::Term] object
|
409
371
|
# @return [void] `self`
|
410
372
|
# @raise [NotImplementedError] unless implemented in subclass
|
411
|
-
# @raise [RDF::WriterError] if validating and attempting to write an invalid {RDF::Term}.
|
412
373
|
# @abstract
|
413
374
|
def write_triple(subject, predicate, object)
|
414
375
|
raise NotImplementedError.new("#{self.class}#write_triple") # override in subclasses
|
@@ -475,7 +436,7 @@ module RDF
|
|
475
436
|
##
|
476
437
|
# @return [void]
|
477
438
|
def puts(*args)
|
478
|
-
@output.puts(*args
|
439
|
+
@output.puts(*args)
|
479
440
|
end
|
480
441
|
|
481
442
|
##
|