rdf 0.0.6 → 0.0.7
Sign up to get free protection for your applications and to get access to all the features.
- data/AUTHORS +1 -1
- data/VERSION +1 -1
- data/lib/rdf.rb +25 -22
- data/lib/rdf/enumerable.rb +554 -0
- data/lib/rdf/format.rb +239 -41
- data/lib/rdf/model/graph.rb +82 -0
- data/lib/rdf/{literal.rb → model/literal.rb} +47 -4
- data/lib/rdf/{node.rb → model/node.rb} +0 -0
- data/lib/rdf/{resource.rb → model/resource.rb} +0 -0
- data/lib/rdf/{statement.rb → model/statement.rb} +12 -0
- data/lib/rdf/{uri.rb → model/uri.rb} +20 -7
- data/lib/rdf/model/value.rb +135 -0
- data/lib/rdf/ntriples.rb +35 -2
- data/lib/rdf/ntriples/format.rb +4 -4
- data/lib/rdf/ntriples/reader.rb +2 -2
- data/lib/rdf/ntriples/writer.rb +26 -19
- data/lib/rdf/query.rb +4 -4
- data/lib/rdf/query/pattern.rb +3 -3
- data/lib/rdf/query/solution.rb +2 -2
- data/lib/rdf/query/variable.rb +3 -3
- data/lib/rdf/reader.rb +85 -16
- data/lib/rdf/repository.rb +104 -12
- data/lib/rdf/version.rb +1 -1
- data/lib/rdf/vocab.rb +171 -0
- data/lib/rdf/vocab/cc.rb +18 -0
- data/lib/rdf/vocab/dc.rb +63 -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/http.rb +26 -0
- data/lib/rdf/vocab/owl.rb +59 -0
- data/lib/rdf/{vocabulary → vocab}/rdf.rb +7 -1
- data/lib/rdf/vocab/rdfs.rb +17 -0
- data/lib/rdf/{vocabulary → vocab}/rss.rb +6 -1
- 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/writer.rb +123 -16
- metadata +26 -27
- data/lib/rdf/graph.rb +0 -197
- data/lib/rdf/reader/ntriples.rb +0 -5
- data/lib/rdf/value.rb +0 -76
- data/lib/rdf/vocabulary.rb +0 -133
- data/lib/rdf/vocabulary/cc.rb +0 -9
- data/lib/rdf/vocabulary/dc.rb +0 -9
- data/lib/rdf/vocabulary/doap.rb +0 -9
- data/lib/rdf/vocabulary/exif.rb +0 -9
- data/lib/rdf/vocabulary/foaf.rb +0 -9
- data/lib/rdf/vocabulary/http.rb +0 -9
- data/lib/rdf/vocabulary/owl.rb +0 -9
- data/lib/rdf/vocabulary/rdfs.rb +0 -9
- data/lib/rdf/vocabulary/sioc.rb +0 -9
- data/lib/rdf/vocabulary/skos.rb +0 -9
- data/lib/rdf/vocabulary/wot.rb +0 -9
- data/lib/rdf/vocabulary/xhtml.rb +0 -9
- data/lib/rdf/vocabulary/xsd.rb +0 -9
- data/lib/rdf/writer/ntriples.rb +0 -5
File without changes
|
File without changes
|
@@ -66,6 +66,18 @@ module RDF
|
|
66
66
|
end
|
67
67
|
end
|
68
68
|
|
69
|
+
##
|
70
|
+
# @return [Boolean]
|
71
|
+
def invalid?
|
72
|
+
!valid?
|
73
|
+
end
|
74
|
+
|
75
|
+
##
|
76
|
+
# @return [Boolean]
|
77
|
+
def valid?
|
78
|
+
has_subject? && has_predicate? && has_object?
|
79
|
+
end
|
80
|
+
|
69
81
|
##
|
70
82
|
# @return [Boolean]
|
71
83
|
def asserted?
|
@@ -21,11 +21,19 @@ module RDF
|
|
21
21
|
end
|
22
22
|
|
23
23
|
##
|
24
|
-
# @
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
24
|
+
# @overload uri(uri)
|
25
|
+
# @param [URI, String, #to_s] uri
|
26
|
+
#
|
27
|
+
# @overload uri(options = {})
|
28
|
+
# @param [Hash{Symbol => Object} options
|
29
|
+
def initialize(uri_or_options)
|
30
|
+
case uri_or_options
|
31
|
+
when Hash
|
32
|
+
@uri = Addressable::URI.new(uri_or_options)
|
33
|
+
when Addressable::URI
|
34
|
+
@uri = uri_or_options
|
35
|
+
else
|
36
|
+
@uri = Addressable::URI.parse(uri_or_options.to_s)
|
29
37
|
end
|
30
38
|
end
|
31
39
|
|
@@ -56,13 +64,18 @@ module RDF
|
|
56
64
|
# @param [Object] other
|
57
65
|
# @return [Boolean]
|
58
66
|
def ==(other)
|
59
|
-
|
67
|
+
case other
|
68
|
+
when Addressable::URI
|
69
|
+
to_s == other.to_s
|
70
|
+
else
|
71
|
+
other.respond_to?(:to_uri) && to_s == other.to_uri.to_s
|
72
|
+
end
|
60
73
|
end
|
61
74
|
|
62
75
|
##
|
63
76
|
# @return [URI]
|
64
77
|
def to_uri
|
65
|
-
|
78
|
+
self
|
66
79
|
end
|
67
80
|
|
68
81
|
##
|
@@ -0,0 +1,135 @@
|
|
1
|
+
module RDF
|
2
|
+
##
|
3
|
+
# An RDF value.
|
4
|
+
#
|
5
|
+
# This is the base class for the RDF.rb class hierarchy. The class of
|
6
|
+
# every object that can be a component of {RDF::Statement statements} is a
|
7
|
+
# subclass of this class.
|
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
|
+
# @abstract
|
23
|
+
# @see RDF::Graph
|
24
|
+
# @see RDF::Literal
|
25
|
+
# @see RDF::Node
|
26
|
+
# @see RDF::Resource
|
27
|
+
# @see RDF::Statement
|
28
|
+
# @see RDF::URI
|
29
|
+
class Value
|
30
|
+
include Comparable
|
31
|
+
|
32
|
+
# Prevent the instantiation of this class.
|
33
|
+
private_class_method :new
|
34
|
+
|
35
|
+
##
|
36
|
+
# Returns `true` if this value is a graph.
|
37
|
+
#
|
38
|
+
# @return [Boolean]
|
39
|
+
def graph?
|
40
|
+
false
|
41
|
+
end
|
42
|
+
|
43
|
+
##
|
44
|
+
# Returns `true` if this value is a literal.
|
45
|
+
#
|
46
|
+
# @return [Boolean]
|
47
|
+
def literal?
|
48
|
+
false
|
49
|
+
end
|
50
|
+
|
51
|
+
##
|
52
|
+
# Returns `true` if this value is a blank node.
|
53
|
+
#
|
54
|
+
# @return [Boolean]
|
55
|
+
def node?
|
56
|
+
false
|
57
|
+
end
|
58
|
+
|
59
|
+
##
|
60
|
+
# Returns `true` if this value is a resource.
|
61
|
+
#
|
62
|
+
# @return [Boolean]
|
63
|
+
def resource?
|
64
|
+
false
|
65
|
+
end
|
66
|
+
|
67
|
+
##
|
68
|
+
# Returns `true` if this value is a statement.
|
69
|
+
#
|
70
|
+
# @return [Boolean]
|
71
|
+
def statement?
|
72
|
+
false
|
73
|
+
end
|
74
|
+
|
75
|
+
##
|
76
|
+
# Returns `true` if this value is a URI reference.
|
77
|
+
#
|
78
|
+
# @return [Boolean]
|
79
|
+
def uri?
|
80
|
+
false
|
81
|
+
end
|
82
|
+
|
83
|
+
alias_method :iri?, :uri?
|
84
|
+
|
85
|
+
##
|
86
|
+
# Compares this value to `other` for sorting purposes.
|
87
|
+
#
|
88
|
+
# Subclasses should override this to provide a more meaningful
|
89
|
+
# implementation than the default which simply performs a string
|
90
|
+
# comparison based on `#to_s`.
|
91
|
+
#
|
92
|
+
# @abstract
|
93
|
+
# @param [Object] other
|
94
|
+
# @return [Integer] -1, 0, 1
|
95
|
+
def <=>(other)
|
96
|
+
self.to_s <=> other.to_s
|
97
|
+
end
|
98
|
+
|
99
|
+
##
|
100
|
+
# Returns an RDF::Value representation of this object.
|
101
|
+
#
|
102
|
+
# @return [Value]
|
103
|
+
def to_rdf
|
104
|
+
self
|
105
|
+
end
|
106
|
+
|
107
|
+
##
|
108
|
+
# Returns a developer-friendly representation of this value.
|
109
|
+
#
|
110
|
+
# The result will be of the format `#<RDF::Value::0x12345678(...)>`,
|
111
|
+
# where `...` is the string returned by `#to_s`.
|
112
|
+
#
|
113
|
+
# @return [String]
|
114
|
+
def inspect
|
115
|
+
sprintf("#<%s:%#0x(%s)>", self.class.name, object_id, to_s)
|
116
|
+
end
|
117
|
+
|
118
|
+
##
|
119
|
+
# Outputs a developer-friendly representation of this value to `stderr`.
|
120
|
+
#
|
121
|
+
# @return [void]
|
122
|
+
def inspect!
|
123
|
+
warn(inspect)
|
124
|
+
end
|
125
|
+
|
126
|
+
private
|
127
|
+
|
128
|
+
def self.inherited(child) #:nodoc:
|
129
|
+
# Enable the instantiation of any subclasses.
|
130
|
+
child.send(:public_class_method, :new)
|
131
|
+
super
|
132
|
+
end
|
133
|
+
|
134
|
+
end
|
135
|
+
end
|
data/lib/rdf/ntriples.rb
CHANGED
@@ -1,11 +1,44 @@
|
|
1
1
|
module RDF
|
2
2
|
##
|
3
|
-
# N-Triples serialization
|
3
|
+
# **`RDF::NTriples`** provides support for the N-Triples serialization
|
4
|
+
# format.
|
5
|
+
#
|
6
|
+
# N-Triples is a line-based plain-text format for encoding an RDF graph.
|
7
|
+
# It is a very restricted, explicit and well-defined subset of both
|
8
|
+
# [Turtle](http://www.w3.org/TeamSubmission/turtle/) and
|
9
|
+
# [Notation3](http://www.w3.org/TeamSubmission/n3/) (N3).
|
10
|
+
#
|
11
|
+
# The MIME content type for N-Triples files is `text/plain` and the
|
12
|
+
# recommended file extension is `.nt`.
|
13
|
+
#
|
14
|
+
# An example of an RDF statement in N-Triples format:
|
15
|
+
#
|
16
|
+
# <http://rubyforge.org/> <http://purl.org/dc/terms/title> "RubyForge" .
|
17
|
+
#
|
18
|
+
# Installation
|
19
|
+
# ------------
|
20
|
+
#
|
21
|
+
# This is the only RDF serialization format that is directly supported by
|
22
|
+
# RDF.rb. Support for other formats is available in the form of add-on
|
23
|
+
# gems, e.g. 'rdf-xml' or 'rdf-json'.
|
24
|
+
#
|
25
|
+
# Documentation
|
26
|
+
# -------------
|
27
|
+
#
|
28
|
+
# * {RDF::NTriples::Format}
|
29
|
+
# * {RDF::NTriples::Reader}
|
30
|
+
# * {RDF::NTriples::Writer}
|
31
|
+
#
|
32
|
+
# @example Requiring the `RDF::NTriples` module explicitly
|
33
|
+
# require 'rdf/ntriples'
|
4
34
|
#
|
5
35
|
# @see http://www.w3.org/TR/rdf-testcases/#ntriples
|
6
36
|
# @see http://en.wikipedia.org/wiki/N-Triples
|
37
|
+
# @see http://librdf.org/ntriples/
|
38
|
+
#
|
39
|
+
# @author [Arto Bendiken](http://ar.to/)
|
7
40
|
module NTriples
|
8
|
-
|
41
|
+
require 'rdf/ntriples/format'
|
9
42
|
autoload :Reader, 'rdf/ntriples/reader'
|
10
43
|
autoload :Writer, 'rdf/ntriples/writer'
|
11
44
|
end
|
data/lib/rdf/ntriples/format.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
module RDF
|
1
|
+
module RDF::NTriples
|
2
2
|
##
|
3
3
|
# N-Triples format specification.
|
4
4
|
#
|
@@ -7,7 +7,7 @@ module RDF module NTriples
|
|
7
7
|
content_type 'text/plain', :extension => :nt
|
8
8
|
content_encoding 'ascii'
|
9
9
|
|
10
|
-
reader RDF::NTriples::Reader
|
11
|
-
writer RDF::NTriples::
|
10
|
+
reader { RDF::NTriples::Reader }
|
11
|
+
writer { RDF::NTriples::Writer }
|
12
12
|
end
|
13
|
-
end
|
13
|
+
end
|
data/lib/rdf/ntriples/reader.rb
CHANGED
data/lib/rdf/ntriples/writer.rb
CHANGED
@@ -1,8 +1,8 @@
|
|
1
|
-
module RDF
|
1
|
+
module RDF::NTriples
|
2
2
|
##
|
3
3
|
# N-Triples serializer.
|
4
4
|
#
|
5
|
-
# @see
|
5
|
+
# @see http://www.w3.org/TR/rdf-testcases/#ntriples
|
6
6
|
class Writer < RDF::Writer
|
7
7
|
format RDF::NTriples::Format
|
8
8
|
|
@@ -19,32 +19,39 @@ module RDF module NTriples
|
|
19
19
|
# @param [Value] object
|
20
20
|
# @return [void]
|
21
21
|
def write_triple(subject, predicate, object)
|
22
|
-
s
|
23
|
-
p = format_uri(predicate)
|
24
|
-
o = object.kind_of?(RDF::URI) ? format_uri(object) : format_literal(object)
|
25
|
-
puts "%s %s %s ." % [s, p, o]
|
22
|
+
puts "%s %s %s ." % [subject, predicate, object].map { |value| format_value(value) }
|
26
23
|
end
|
27
24
|
|
28
25
|
##
|
29
|
-
# @param [
|
30
|
-
# @
|
31
|
-
|
32
|
-
|
26
|
+
# @param [URI] value
|
27
|
+
# @param [Hash{Symbol => Object}] options
|
28
|
+
# @return [String]
|
29
|
+
def format_uri(value, options = {})
|
30
|
+
"<%s>" % uri_for(value)
|
33
31
|
end
|
34
32
|
|
35
33
|
##
|
36
|
-
# @param [
|
37
|
-
# @
|
38
|
-
|
39
|
-
|
34
|
+
# @param [Node] value
|
35
|
+
# @param [Hash{Symbol => Object}] options
|
36
|
+
# @return [String]
|
37
|
+
def format_node(value, options = {})
|
38
|
+
"_:%s" % node.id
|
39
|
+
end
|
40
|
+
|
41
|
+
##
|
42
|
+
# @param [Literal, String, #to_s] value
|
43
|
+
# @param [Hash{Symbol => Object}] options
|
44
|
+
# @return [String]
|
45
|
+
def format_literal(value, options = {})
|
46
|
+
case value
|
40
47
|
when RDF::Literal
|
41
|
-
text = quoted(escaped(
|
42
|
-
text << "@#{
|
43
|
-
text << "^^<#{uri_for(
|
48
|
+
text = quoted(escaped(value.value))
|
49
|
+
text << "@#{value.language}" if value.language
|
50
|
+
text << "^^<#{uri_for(value.datatype)}>" if value.datatype
|
44
51
|
text
|
45
52
|
else
|
46
|
-
quoted(escaped(
|
53
|
+
quoted(escaped(value.to_s))
|
47
54
|
end
|
48
55
|
end
|
49
56
|
end
|
50
|
-
end
|
57
|
+
end
|
data/lib/rdf/query.rb
CHANGED
@@ -41,7 +41,7 @@ module RDF
|
|
41
41
|
autoload :Solution, 'rdf/query/solution'
|
42
42
|
autoload :Variable, 'rdf/query/variable'
|
43
43
|
|
44
|
-
include Enumerable
|
44
|
+
include ::Enumerable
|
45
45
|
|
46
46
|
# @return [Hash{Symbol => Variable}]
|
47
47
|
attr_reader :variables
|
@@ -75,7 +75,7 @@ module RDF
|
|
75
75
|
#
|
76
76
|
# @yield [solution]
|
77
77
|
# @yieldparam [Solution]
|
78
|
-
# @return [
|
78
|
+
# @return [Enumerator]
|
79
79
|
def each_solution(&block)
|
80
80
|
solutions.each do |bindings|
|
81
81
|
block.call(Solution.new(bindings))
|
@@ -123,7 +123,7 @@ module RDF
|
|
123
123
|
##
|
124
124
|
# Reorders the solution sequence based on `variables`.
|
125
125
|
#
|
126
|
-
# @param [
|
126
|
+
# @param [Array<Symbol>] variables
|
127
127
|
# @return [Query]
|
128
128
|
def order(*variables)
|
129
129
|
if variables.empty?
|
@@ -145,7 +145,7 @@ module RDF
|
|
145
145
|
##
|
146
146
|
# Restricts the the solution sequence to the given `variables` only.
|
147
147
|
#
|
148
|
-
# @param [
|
148
|
+
# @param [Array<Symbol>] variables
|
149
149
|
# @return [Query]
|
150
150
|
def project(*variables)
|
151
151
|
unless variables.empty?
|
data/lib/rdf/query/pattern.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
|
-
|
1
|
+
class RDF::Query
|
2
2
|
##
|
3
3
|
# An RDF query pattern.
|
4
|
-
class Pattern < Statement
|
4
|
+
class Pattern < RDF::Statement
|
5
5
|
# @return [Hash{Symbol => Object}]
|
6
6
|
attr_reader :options
|
7
7
|
|
@@ -149,4 +149,4 @@ module RDF class Query
|
|
149
149
|
end
|
150
150
|
end
|
151
151
|
end
|
152
|
-
end
|
152
|
+
end
|
data/lib/rdf/query/solution.rb
CHANGED
data/lib/rdf/query/variable.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
|
1
|
+
class RDF::Query
|
2
2
|
##
|
3
3
|
# An RDF query variable.
|
4
4
|
#
|
@@ -38,7 +38,7 @@ module RDF class Query
|
|
38
38
|
# var = RDF::Query::Variable.new(:y, 123)
|
39
39
|
# var.to_s #=> "?y=123"
|
40
40
|
#
|
41
|
-
class Variable < Value
|
41
|
+
class Variable < RDF::Value
|
42
42
|
# @return [Symbol] The variable's name.
|
43
43
|
attr_accessor :name
|
44
44
|
|
@@ -142,4 +142,4 @@ module RDF class Query
|
|
142
142
|
unbound? ? "?#{name}" : "?#{name}=#{value}"
|
143
143
|
end
|
144
144
|
end
|
145
|
-
end
|
145
|
+
end
|
data/lib/rdf/reader.rb
CHANGED
@@ -2,41 +2,114 @@ module RDF
|
|
2
2
|
##
|
3
3
|
# An RDF parser.
|
4
4
|
#
|
5
|
+
# @example Iterating over known RDF reader classes
|
6
|
+
# RDF::Reader.each { |klass| puts klass.name }
|
7
|
+
#
|
8
|
+
# @example Obtaining an RDF reader class
|
9
|
+
# RDF::Reader.for(:ntriples) #=> RDF::NTriples::Reader
|
10
|
+
# RDF::Reader.for("spec/data/test.nt")
|
11
|
+
# RDF::Reader.for(:file_name => "spec/data/test.nt")
|
12
|
+
# RDF::Reader.for(:file_extension => "nt")
|
13
|
+
# RDF::Reader.for(:content_type => "text/plain")
|
14
|
+
#
|
15
|
+
# @example Instantiating an RDF reader class
|
16
|
+
# RDF::Reader.for(:ntriples).new($stdin) { |reader| ... }
|
17
|
+
#
|
18
|
+
# @example Parsing RDF statements from a file
|
19
|
+
# RDF::Reader.open("spec/data/test.nt") do |reader|
|
20
|
+
# reader.each_statement do |statement|
|
21
|
+
# puts statement.inspect
|
22
|
+
# end
|
23
|
+
# end
|
24
|
+
#
|
25
|
+
# @example Parsing RDF statements from a string
|
26
|
+
# data = StringIO.new(File.read("spec/data/test.nt"))
|
27
|
+
# RDF::Reader.for(:ntriples).new(data) do |reader|
|
28
|
+
# reader.each_statement do |statement|
|
29
|
+
# puts statement.inspect
|
30
|
+
# end
|
31
|
+
# end
|
32
|
+
#
|
5
33
|
# @abstract
|
34
|
+
# @see RDF::Format
|
35
|
+
# @see RDF::Writer
|
6
36
|
class Reader
|
7
|
-
|
8
|
-
|
9
|
-
include Enumerable
|
37
|
+
extend ::Enumerable
|
38
|
+
include ::Enumerable
|
10
39
|
|
11
40
|
##
|
12
41
|
# Enumerates known RDF reader classes.
|
13
42
|
#
|
14
43
|
# @yield [klass]
|
15
44
|
# @yieldparam [Class]
|
45
|
+
# @return [Enumerator]
|
16
46
|
def self.each(&block)
|
17
|
-
|
47
|
+
@@subclasses.each(&block)
|
48
|
+
end
|
49
|
+
|
50
|
+
##
|
51
|
+
# Finds an RDF reader class based on the given criteria.
|
52
|
+
#
|
53
|
+
# @overload for(format)
|
54
|
+
# Finds an RDF reader class based on a symbolic name.
|
55
|
+
#
|
56
|
+
# @param [Symbol] format
|
57
|
+
# @return [Class]
|
58
|
+
#
|
59
|
+
# @overload for(filename)
|
60
|
+
# Finds an RDF reader class based on a file name.
|
61
|
+
#
|
62
|
+
# @param [String] filename
|
63
|
+
# @return [Class]
|
64
|
+
#
|
65
|
+
# @overload for(options = {})
|
66
|
+
# Finds an RDF reader class based on various options.
|
67
|
+
#
|
68
|
+
# @param [Hash{Symbol => Object}] options
|
69
|
+
# @option options [String, #to_s] :file_name (nil)
|
70
|
+
# @option options [Symbol, #to_sym] :file_extension (nil)
|
71
|
+
# @option options [String, #to_s] :content_type (nil)
|
72
|
+
# @return [Class]
|
73
|
+
#
|
74
|
+
# @return [Class]
|
75
|
+
def self.for(options = {})
|
76
|
+
if format = Format.for(options)
|
77
|
+
format.reader
|
78
|
+
end
|
18
79
|
end
|
19
80
|
|
20
81
|
##
|
21
|
-
#
|
82
|
+
# Retrieves the RDF serialization format class for this writer class.
|
83
|
+
#
|
22
84
|
# @return [Class]
|
23
|
-
def self.
|
24
|
-
klass
|
25
|
-
|
26
|
-
|
85
|
+
def self.format(klass = nil)
|
86
|
+
if klass.nil?
|
87
|
+
Format.each do |format|
|
88
|
+
if format.reader == self
|
89
|
+
return format
|
90
|
+
end
|
91
|
+
end
|
92
|
+
nil # not found
|
27
93
|
end
|
28
94
|
end
|
29
95
|
|
96
|
+
class << self
|
97
|
+
alias_method :format_class, :format
|
98
|
+
end
|
99
|
+
|
30
100
|
##
|
31
101
|
# @param [String] filename
|
32
102
|
# @option options [Symbol] :format (:ntriples)
|
33
103
|
# @yield [reader]
|
34
104
|
# @yieldparam [Reader]
|
105
|
+
# @raise [FormatError] if no reader available for the specified format
|
35
106
|
def self.open(filename, options = {}, &block)
|
36
|
-
options[:format] ||= :ntriples # FIXME
|
37
|
-
|
38
107
|
File.open(filename, 'rb') do |file|
|
39
|
-
self.for(options[:format]
|
108
|
+
if reader = self.for(options[:format] || filename)
|
109
|
+
reader.new(file, options, &block)
|
110
|
+
else
|
111
|
+
raise FormatError.new("unknown RDF format: #{options[:format] || filename}")
|
112
|
+
end
|
40
113
|
end
|
41
114
|
end
|
42
115
|
|
@@ -118,10 +191,6 @@ module RDF
|
|
118
191
|
super
|
119
192
|
end
|
120
193
|
|
121
|
-
def self.format(klass)
|
122
|
-
# TODO
|
123
|
-
end
|
124
|
-
|
125
194
|
def lineno
|
126
195
|
@input.lineno
|
127
196
|
end
|