Class: RDF::Writer Abstract
- Inherits:
-
Object
- Object
- RDF::Writer
- Extended by:
- Enumerable, Util::Aliasing::LateBound
- Includes:
- Util::Logger, Writable
- Defined in:
- lib/rdf/writer.rb
Overview
The base class for RDF serializers.
Direct Known Subclasses
Constant Summary
Constants included from Util::Logger
Instance Attribute Summary collapse
-
#options ⇒ Hash
readonly
Any additional options for this writer.
Class Method Summary collapse
-
.accept?(accept_params) {|accept_params| ... } ⇒ Boolean
Use parameters from accept-params to determine if the parameters are acceptable to invoke this writer.
-
.buffer(*args, **options) {|writer| ... } ⇒ String
Buffers output into a string buffer.
- .dump(data, io = nil, **options) ⇒ void
-
.each {|klass| ... } ⇒ Enumerator
Enumerates known RDF writer classes.
-
.for(options = {}) ⇒ Class
Finds an RDF writer class based on the given criteria.
-
.format(klass = nil) ⇒ Class
(also: format_class)
Retrieves the RDF serialization format class for this writer class.
- .inherited(child) ⇒ void
-
.open(filename, format: nil, **options, &block) ⇒ RDF::Writer
Writes output to the given
filename. -
.options ⇒ Array<RDF::CLI::Option>
Options suitable for automatic Writer provisioning.
-
.to_sym ⇒ Symbol
Returns a symbol appropriate to use with RDF::Writer.for().
Instance Method Summary collapse
-
#base_uri ⇒ RDF::URI
Returns the base URI used for this writer.
-
#canonicalize? ⇒ Boolean
Returns
trueif terms should be canonicalized. -
#encoding ⇒ Encoding
Returns the encoding of the output stream.
-
#flush ⇒ self
(also: #flush!)
Flushes the underlying output buffer.
- #format_list(value, **options) ⇒ String abstract
- #format_literal(value, **options) ⇒ String abstract
- #format_node(value, **options) ⇒ String abstract
- #format_term(term, **options) ⇒ String
- #format_uri(value, **options) ⇒ String abstract
-
#initialize(output = $stdout, **options) {|writer| ... } ⇒ Writer
constructor
Initializes the writer.
-
#prefix(name, uri = nil) ⇒ RDF::URI
(also: #prefix!)
Defines the given named URI prefix for this writer.
-
#prefixes ⇒ Hash{Symbol => RDF::URI}
Returns the URI prefixes currently defined for this writer.
-
#prefixes=(prefixes) ⇒ Hash{Symbol => RDF::URI}
Defines the given URI prefixes for this writer.
-
#to_sym ⇒ Symbol
Returns a symbol appropriate to use with RDF::Writer.for().
-
#validate? ⇒ Boolean
Returns
trueif statements and terms should be validated. - #write_comment(text) ⇒ self abstract
- #write_epilogue ⇒ self abstract
- #write_prologue ⇒ self abstract
-
#write_statement(statement) ⇒ self
(also: #insert_statement)
Add a statement to the writer.
- #write_triple(subject, predicate, object) ⇒ self abstract
- #write_triples(*triples) ⇒ self
Methods included from Util::Aliasing::LateBound
Methods included from Writable
Methods included from Util::Logger
#log_debug, #log_depth, #log_error, #log_fatal, #log_info, #log_recover, #log_recovering?, #log_statistics, #log_warn, #logger
Constructor Details
#initialize(output = $stdout, **options) {|writer| ... } ⇒ Writer
Initializes the writer.
281 282 283 284 285 286 287 288 289 290 291 292 293 |
# File 'lib/rdf/writer.rb', line 281 def initialize(output = $stdout, **, &block) @output, @options = output, .dup @nodes, @node_id, @node_id_map = {}, 0, {} if block_given? write_prologue case block.arity when 1 then block.call(self) else instance_eval(&block) end write_epilogue end end |
Instance Attribute Details
#options ⇒ Hash (readonly)
Any additional options for this writer.
300 301 302 |
# File 'lib/rdf/writer.rb', line 300 def @options end |
Class Method Details
.accept?(accept_params) {|accept_params| ... } ⇒ Boolean
Use parameters from accept-params to determine if the parameters are acceptable to invoke this writer. The accept_params will subsequently be provided to the writer instance.
167 168 169 |
# File 'lib/rdf/writer.rb', line 167 def accept?(accept_params) block_given? ? yield(accept_params) : true end |
.buffer(*args, **options) {|writer| ... } ⇒ String
Buffers output into a string buffer.
210 211 212 213 214 215 216 217 218 219 220 |
# File 'lib/rdf/writer.rb', line 210 def self.buffer(*args, **, &block) raise ArgumentError, "block expected" unless block_given? StringIO.open do |buffer| self.new(buffer, *args, **) do |writer| buffer.set_encoding(writer.encoding) block.call(writer) end buffer.string end end |
.dump(data, io = nil, **options) ⇒ void
This method returns an undefined value.
180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 |
# File 'lib/rdf/writer.rb', line 180 def self.dump(data, io = nil, **) io = File.open(io, 'w') if io.is_a?(String) method = data.respond_to?(:each_statement) ? :each_statement : :each if io new(io, **) do |writer| io.set_encoding(writer.encoding) if io.respond_to?(:set_encoding) data.send(method) do |statement| writer << statement end writer.flush end else buffer(**) do |writer| data.send(method) do |statement| writer << statement end end end end |
.each {|klass| ... } ⇒ Enumerator
Enumerates known RDF writer classes.
63 64 65 |
# File 'lib/rdf/writer.rb', line 63 def self.each(&block) RDF::Format.map(&:writer).reject(&:nil?).each(&block) end |
.for(format) ⇒ Class .for(filename) ⇒ Class .for(**options) ⇒ Class
Finds an RDF writer class based on the given criteria.
92 93 94 95 96 97 |
# File 'lib/rdf/writer.rb', line 92 def self.for( = {}) = .merge(has_writer: true) if .is_a?(Hash) if format = self.format || Format.for() format.writer end end |
.format(klass = nil) ⇒ Class Also known as: format_class
Retrieves the RDF serialization format class for this writer class.
103 104 105 106 107 108 109 110 111 112 |
# File 'lib/rdf/writer.rb', line 103 def self.format(klass = nil) if klass.nil? Format.each do |format| if format.writer == self return format end end nil # not found end end |
.inherited(child) ⇒ void
This method returns an undefined value.
614 615 616 617 |
# File 'lib/rdf/writer.rb', line 614 def self.inherited(child) @@subclasses << child super end |
.open(filename, format: nil, **options, &block) ⇒ RDF::Writer
Writes output to the given filename.
230 231 232 233 234 235 236 237 238 239 |
# File 'lib/rdf/writer.rb', line 230 def self.open(filename, format: nil, **, &block) File.open(filename, 'wb') do |file| = .dup [:file_name] ||= filename self.for(format || ).new(file, **) do |writer| file.set_encoding(writer.encoding) block.call(writer) end end end |
.options ⇒ Array<RDF::CLI::Option>
Options suitable for automatic Writer provisioning.
117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 |
# File 'lib/rdf/writer.rb', line 117 def self. [ RDF::CLI::Option.new( symbol: :canonicalize, datatype: TrueClass, control: :checkbox, on: ["--canonicalize"], description: "Canonicalize input/output.") {true}, RDF::CLI::Option.new( symbol: :encoding, datatype: Encoding, control: :text, on: ["--encoding ENCODING"], description: "The encoding of the input stream.") {|arg| Encoding.find arg}, RDF::CLI::Option.new( symbol: :prefixes, datatype: Hash, multiple: true, control: :none, on: ["--prefixes PREFIX,PREFIX"], description: "A comma-separated list of prefix:uri pairs.") do |arg| arg.split(',').inject({}) do |memo, pfxuri| pfx,uri = pfxuri.split(':', 2) memo.merge(pfx.to_sym => RDF::URI(uri)) end end, RDF::CLI::Option.new( symbol: :unique_bnodes, datatype: TrueClass, control: :checkbox, on: ["--unique-bnodes"], description: "Use unique Node identifiers.") {true}, ] end |
.to_sym ⇒ Symbol
Returns a symbol appropriate to use with RDF::Writer.for()
244 245 246 |
# File 'lib/rdf/writer.rb', line 244 def self.to_sym self.format.to_sym end |
Instance Method Details
#base_uri ⇒ RDF::URI
Returns the base URI used for this writer.
310 311 312 |
# File 'lib/rdf/writer.rb', line 310 def base_uri RDF::URI(@options[:base_uri]) if @options[:base_uri] end |
#canonicalize? ⇒ Boolean
Returns true if terms should be canonicalized.
393 394 395 |
# File 'lib/rdf/writer.rb', line 393 def canonicalize? @options[:canonicalize] end |
#encoding ⇒ Encoding
Returns the encoding of the output stream.
368 369 370 371 372 373 374 375 376 377 |
# File 'lib/rdf/writer.rb', line 368 def encoding case @options[:encoding] when String, Symbol Encoding.find(@options[:encoding].to_s) when Encoding @options[:encoding] else @options[:encoding] ||= Encoding.find(self.class.format.content_encoding.to_s) end end |
#flush ⇒ self Also known as: flush!
Flushes the underlying output buffer.
401 402 403 404 |
# File 'lib/rdf/writer.rb', line 401 def flush @output.flush if @output.respond_to?(:flush) self end |
#format_list(value, **options) ⇒ String
555 556 557 |
# File 'lib/rdf/writer.rb', line 555 def format_list(value, **) format_term(value.subject, ) end |
#format_literal(value, **options) ⇒ String
545 546 547 |
# File 'lib/rdf/writer.rb', line 545 def format_literal(value, **) raise NotImplementedError.new("#{self.class}#format_literal") # override in subclasses end |
#format_node(value, **options) ⇒ String
525 526 527 |
# File 'lib/rdf/writer.rb', line 525 def format_node(value, **) raise NotImplementedError.new("#{self.class}#format_node") # override in subclasses end |
#format_term(term, **options) ⇒ String
506 507 508 509 510 511 512 513 514 515 |
# File 'lib/rdf/writer.rb', line 506 def format_term(term, **) case term when String then format_literal(RDF::Literal(term, ), ) when RDF::List then format_list(term, ) when RDF::Literal then format_literal(term, ) when RDF::URI then format_uri(term, ) when RDF::Node then format_node(term, ) else nil end end |
#format_uri(value, **options) ⇒ String
535 536 537 |
# File 'lib/rdf/writer.rb', line 535 def format_uri(value, **) raise NotImplementedError.new("#{self.class}#format_uri") # override in subclasses end |
#prefix(name, uri) ⇒ RDF::URI #prefix(name) ⇒ RDF::URI Also known as: prefix!
Defines the given named URI prefix for this writer.
358 359 360 361 |
# File 'lib/rdf/writer.rb', line 358 def prefix(name, uri = nil) name = name.to_s.empty? ? nil : (name.respond_to?(:to_sym) ? name.to_sym : name.to_s.to_sym) uri.nil? ? prefixes[name] : prefixes[name] = uri end |
#prefixes ⇒ Hash{Symbol => RDF::URI}
Returns the URI prefixes currently defined for this writer.
322 323 324 |
# File 'lib/rdf/writer.rb', line 322 def prefixes @options[:prefixes] ||= {} end |
#prefixes=(prefixes) ⇒ Hash{Symbol => RDF::URI}
Defines the given URI prefixes for this writer.
337 338 339 |
# File 'lib/rdf/writer.rb', line 337 def prefixes=(prefixes) @options[:prefixes] = prefixes end |
#to_sym ⇒ Symbol
Returns a symbol appropriate to use with RDF::Writer.for()
251 252 253 |
# File 'lib/rdf/writer.rb', line 251 def to_sym self.class.to_sym end |
#validate? ⇒ Boolean
Returns true if statements and terms should be validated.
384 385 386 |
# File 'lib/rdf/writer.rb', line 384 def validate? @options[:validate] end |
#write_comment(text) ⇒ self
430 431 432 |
# File 'lib/rdf/writer.rb', line 430 def write_comment(text) self end |
#write_epilogue ⇒ self
419 420 421 422 423 424 |
# File 'lib/rdf/writer.rb', line 419 def write_epilogue if log_statistics[:error].to_i > @logged_errors_at_prolog raise RDF::WriterError, "Errors found during processing" end self end |
#write_prologue ⇒ self
410 411 412 413 |
# File 'lib/rdf/writer.rb', line 410 def write_prologue @logged_errors_at_prolog = log_statistics[:error].to_i self end |
#write_statement(statement) ⇒ self Also known as: insert_statement
logs error if attempting to write an invalid Statement or if canonicalizing a statement which cannot be canonicalized.
Add a statement to the writer. This will check to ensure that the statement is complete (no nil terms) and is valid, if the :validation option is set.
Additionally, it will de-duplicate BNode terms sharing a common identifier.
442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 |
# File 'lib/rdf/writer.rb', line 442 def write_statement(statement) statement = statement.canonicalize! if canonicalize? # Make sure BNodes in statement use unique identifiers if statement.node? statement.to_quad.map do |term| if term.is_a?(RDF::Node) term = term.original while term.original @nodes[term] ||= begin # Account for duplicated nodes @node_id_map[term.to_s] ||= term if !@node_id_map[term.to_s].equal?(term) # Rename node term.make_unique! @node_id_map[term.to_s] = term end end else term end end statement = RDF::Statement.from(statement.to_quad) end if statement.incomplete? log_error "Statement #{statement.inspect} is incomplete" elsif validate? && statement.invalid? log_error "Statement #{statement.inspect} is invalid" elsif respond_to?(:write_quad) write_quad(*statement.to_quad) else write_triple(*statement.to_triple) end self rescue ArgumentError => e log_error e. end |
#write_triple(subject, predicate, object) ⇒ self
logs error if attempting to write an invalid Statement or if canonicalizing a statement which cannot be canonicalized.
498 499 500 |
# File 'lib/rdf/writer.rb', line 498 def write_triple(subject, predicate, object) raise NotImplementedError.new("#{self.class}#write_triple") # override in subclasses end |
#write_triples(*triples) ⇒ self
logs error if attempting to write an invalid Statement or if canonicalizing a statement which cannot be canonicalized.
485 486 487 488 |
# File 'lib/rdf/writer.rb', line 485 def write_triples(*triples) triples.each { |triple| write_triple(*triple) } self end |