Class: RDF::Reader Abstract
- Inherits:
-
Object
- Object
- RDF::Reader
- Extended by:
- Enumerable, Util::Aliasing::LateBound
- Includes:
- Enumerable, Readable, Util::Logger
- Defined in:
- lib/rdf/reader.rb
Overview
The base class for RDF parsers.
Direct Known Subclasses
Constant Summary
Constants included from Util::Logger
Instance Attribute Summary collapse
-
#options ⇒ Hash
readonly
Any additional options for this reader.
Class Method Summary collapse
-
.each {|klass| ... } ⇒ Enumerator
Enumerates known RDF reader classes.
-
.for(options = {}, &block) ⇒ Class
Finds an RDF reader class based on the given criteria.
-
.format(klass = nil) ⇒ Class
(also: format_class)
Retrieves the RDF serialization format class for this reader class.
- .inherited(child) ⇒ void
-
.open(filename, format: nil, **options) {|reader| ... } ⇒ Object
Parses input from the given file name or URL.
-
.options ⇒ Array<RDF::CLI::Option>
Options suitable for automatic Reader provisioning.
-
.to_sym ⇒ Symbol
Returns a symbol appropriate to use with RDF::Reader.for().
Instance Method Summary collapse
-
#base_uri ⇒ RDF::URI
Returns the base URI determined by this reader.
-
#canonicalize? ⇒ Boolean
Returns
trueif parsed values should be canonicalized. -
#close ⇒ void
(also: #close!)
Closes the input stream, after which an
IOErrorwill be raised for further read attempts. -
#each_statement(&block) ⇒ void
(also: #each)
Iterates the given block for each RDF statement.
-
#each_triple(&block) ⇒ void
Iterates the given block for each RDF triple.
-
#encoding ⇒ Encoding
Returns the encoding of the input stream.
-
#initialize(input = $stdin, encoding: Encoding::UTF_8, validate: false, canonicalize: false, intern: true, prefixes: Hash.new, base_uri: nil, **options) {|reader| ... } ⇒ Reader
constructor
Initializes the reader.
-
#intern? ⇒ Boolean
Returns
trueif parsed URIs should be interned. -
#lineno ⇒ Integer
Current line number being processed.
-
#prefix(name, uri = nil) ⇒ RDF::URI
(also: #prefix!)
Defines the given named URI prefix for this reader.
-
#prefixes ⇒ Hash{Symbol => RDF::URI}
Returns the URI prefixes currently defined for this reader.
-
#prefixes=(prefixes) ⇒ Hash{Symbol => RDF::URI}
Defines the given URI prefixes for this reader.
-
#rewind ⇒ void
(also: #rewind!)
Rewinds the input stream to the beginning of input.
-
#to_sym ⇒ Symbol
Returns a symbol appropriate to use with RDF::Reader.for().
- #valid? ⇒ Boolean
-
#validate? ⇒ Boolean
Returns
trueif parsed statements and values should be validated.
Methods included from Util::Aliasing::LateBound
Methods included from Enumerable
#dump, #each_graph, #each_object, #each_predicate, #each_quad, #each_subject, #each_term, #enum_graph, #enum_object, #enum_predicate, #enum_quad, #enum_statement, #enum_subject, #enum_term, #enum_triple, #graph_names, #has_graph?, #has_object?, #has_predicate?, #has_quad?, #has_statement?, #has_subject?, #has_term?, #has_triple?, #invalid?, #objects, #predicates, #project_graph, #quads, #statements, #subjects, #supports?, #terms, #to_a, #to_h, #to_set, #triples, #validate!
Methods included from Countable
Methods included from Readable
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(input = $stdin, encoding: Encoding::UTF_8, validate: false, canonicalize: false, intern: true, prefixes: Hash.new, base_uri: nil, **options) {|reader| ... } ⇒ Reader
Initializes the reader.
276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 |
# File 'lib/rdf/reader.rb', line 276 def initialize(input = $stdin, encoding: Encoding::UTF_8, validate: false, canonicalize: false, intern: true, prefixes: Hash.new, base_uri: nil, **, &block) base_uri ||= input.base_uri if input.respond_to?(:base_uri) @options = .merge({ encoding: encoding, validate: validate, canonicalize: canonicalize, intern: intern, prefixes: prefixes, base_uri: base_uri }) @input = case input when String then StringIO.new(input) else input end if block_given? case block.arity when 0 then instance_eval(&block) else block.call(self) end end end |
Dynamic Method Handling
This class handles dynamic methods through the method_missing method in the class RDF::Enumerable
Instance Attribute Details
#options ⇒ Hash (readonly)
Any additional options for this reader.
314 315 316 |
# File 'lib/rdf/reader.rb', line 314 def @options end |
Class Method Details
.each {|klass| ... } ⇒ Enumerator
Enumerates known RDF reader classes.
53 54 55 |
# File 'lib/rdf/reader.rb', line 53 def self.each(&block) RDF::Format.map(&:reader).reject(&:nil?).each(&block) end |
.for(format) ⇒ Class .for(filename) ⇒ Class .for(options = {}) ⇒ Class
Finds an RDF reader class based on the given criteria.
If the reader class has a defined format, use that.
91 92 93 94 95 96 |
# File 'lib/rdf/reader.rb', line 91 def self.for( = {}, &block) = .merge(has_reader: true) if .is_a?(Hash) if format = self.format || Format.for(, &block) format.reader end end |
.format(klass = nil) ⇒ Class Also known as: format_class
Retrieves the RDF serialization format class for this reader class.
102 103 104 105 106 107 108 109 110 111 |
# File 'lib/rdf/reader.rb', line 102 def self.format(klass = nil) if klass.nil? Format.each do |format| if format.reader == self return format end end nil # not found end end |
.inherited(child) ⇒ void
This method returns an undefined value.
597 598 599 600 |
# File 'lib/rdf/reader.rb', line 597 def self.inherited(child) @@subclasses << child super end |
.open(filename, format: nil, **options) {|reader| ... } ⇒ Object
A reader returned via this method may not be readable depending on the processing model of the specific reader, as the file is only open during the scope of open. The reader is intended to be accessed through a block.
Parses input from the given file name or URL.
197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 |
# File 'lib/rdf/reader.rb', line 197 def self.open(filename, format: nil, **, &block) # If we're the abstract reader, and we can figure out a concrete reader from format, use that. if self == RDF::Reader && format && reader = self.for(format) return reader.open(filename, format: format, **, &block) end # If we are a concrete reader class or format is not nil, set accept header from our content_types. unless self == RDF::Reader headers = ([:headers] ||= {}) headers['Accept'] ||= (self.format.accept_type + %w(*/*;q=0.1)).join(", ") end Util::File.open_file(filename, ) do |file| = .dup [:content_type] ||= file.content_type if file.respond_to?(:content_type) && !file.content_type.to_s.include?('text/plain') [:file_name] ||= filename reader = if self == RDF::Reader # We are the abstract reader class, find an appropriate reader self.for(format || ) do # Return a sample from the input file sample = file.read(1000) file.rewind sample end else # We are a concrete reader class self end [:encoding] ||= file.encoding if file.respond_to?(:encoding) [:filename] ||= filename if reader reader.new(file, , &block) else raise FormatError, "unknown RDF format: #{.inspect}#{"\nThis may be resolved with a require of the 'linkeddata' gem." unless Object.const_defined?(:LinkedData)}" end end end |
.options ⇒ Array<RDF::CLI::Option>
Options suitable for automatic Reader provisioning.
116 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 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 |
# File 'lib/rdf/reader.rb', line 116 def self. [ RDF::CLI::Option.new( symbol: :canonicalize, datatype: TrueClass, on: ["--canonicalize"], control: :checkbox, default: false, 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: :intern, datatype: TrueClass, control: :none, on: ["--intern"], description: "Intern all parsed URIs."), RDF::CLI::Option.new( symbol: :prefixes, datatype: Hash, control: :none, multiple: true, on: ["--prefixes PREFIX:URI,PREFIX:URI"], 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: :base_uri, control: :url, datatype: RDF::URI, on: ["--uri URI"], description: "Base URI of input file, defaults to the filename.") {|arg| RDF::URI(arg)}, RDF::CLI::Option.new( symbol: :validate, datatype: TrueClass, control: :checkbox, on: ["--validate"], description: "Validate input file."), RDF::CLI::Option.new( symbol: :verifySSL, datatype: TrueClass, default: true, control: :checkbox, on: ["--[no-]verifySSL"], description: "Verify SSL results on HTTP GET") ] end |
.to_sym ⇒ Symbol
Returns a symbol appropriate to use with RDF::Reader.for()
242 243 244 |
# File 'lib/rdf/reader.rb', line 242 def self.to_sym self.format.to_sym end |
Instance Method Details
#base_uri ⇒ RDF::URI
Returns the base URI determined by this reader.
324 325 326 |
# File 'lib/rdf/reader.rb', line 324 def base_uri RDF::URI(@options[:base_uri]) if @options[:base_uri] end |
#canonicalize? ⇒ Boolean
Returns true if parsed values should be canonicalized.
577 578 579 |
# File 'lib/rdf/reader.rb', line 577 def canonicalize? @options[:canonicalize] end |
#close ⇒ void Also known as: close!
This method returns an undefined value.
Closes the input stream, after which an IOError will be raised for further read attempts.
If the input stream is already closed, does nothing.
464 465 466 |
# File 'lib/rdf/reader.rb', line 464 def close @input.close unless @input.closed? end |
#each_statement {|statement| ... } ⇒ void #each_statement ⇒ Enumerator Also known as: each
This method returns an undefined value.
Iterates the given block for each RDF statement.
If no block was given, returns an enumerator.
Statements are yielded in the order that they are read from the input stream.
399 400 401 402 403 404 405 406 407 408 |
# File 'lib/rdf/reader.rb', line 399 def each_statement(&block) if block_given? begin loop { block.call(read_statement) } rescue EOFError rewind rescue nil end end enum_for(:each_statement) end |
#each_triple {|subject, predicate, object| ... } ⇒ void #each_triple ⇒ Enumerator
This method returns an undefined value.
Iterates the given block for each RDF triple.
If no block was given, returns an enumerator.
Triples are yielded in the order that they are read from the input stream.
433 434 435 436 437 438 439 440 441 442 |
# File 'lib/rdf/reader.rb', line 433 def each_triple(&block) if block_given? begin loop { block.call(*read_triple) } rescue EOFError rewind rescue nil end end enum_for(:each_triple) end |
#encoding ⇒ Encoding
Returns the encoding of the input stream.
552 553 554 555 556 557 558 559 560 561 |
# File 'lib/rdf/reader.rb', line 552 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 |
#intern? ⇒ Boolean
Returns true if parsed URIs should be interned.
586 587 588 |
# File 'lib/rdf/reader.rb', line 586 def intern? @options[:intern] end |
#lineno ⇒ Integer
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.
472 473 474 |
# File 'lib/rdf/reader.rb', line 472 def lineno @input.lineno end |
#prefix(name, uri) ⇒ RDF::URI #prefix(name) ⇒ RDF::URI Also known as: prefix!
Defines the given named URI prefix for this reader.
372 373 374 375 |
# File 'lib/rdf/reader.rb', line 372 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 reader.
336 337 338 |
# File 'lib/rdf/reader.rb', line 336 def prefixes @options[:prefixes] ||= {} end |
#prefixes=(prefixes) ⇒ Hash{Symbol => RDF::URI}
Defines the given URI prefixes for this reader.
351 352 353 |
# File 'lib/rdf/reader.rb', line 351 def prefixes=(prefixes) @options[:prefixes] = prefixes end |
#rewind ⇒ void Also known as: rewind!
This method returns an undefined value.
Rewinds the input stream to the beginning of input.
450 451 452 |
# File 'lib/rdf/reader.rb', line 450 def rewind @input.rewind end |
#to_sym ⇒ Symbol
Returns a symbol appropriate to use with RDF::Reader.for()
249 250 251 |
# File 'lib/rdf/reader.rb', line 249 def to_sym self.class.to_sym end |
#valid? ⇒ Boolean
this parses the full input and is valid only in the reader block. Use ‘Reader.new(input, validate: true)` if you intend to capture the result.
491 492 493 494 495 496 |
# File 'lib/rdf/reader.rb', line 491 def valid? super && !log_statistics[:error] rescue ArgumentError, RDF::ReaderError => e log_error(e.) false end |
#validate? ⇒ Boolean
Returns true if parsed statements and values should be validated.
568 569 570 |
# File 'lib/rdf/reader.rb', line 568 def validate? @options[:validate] end |