rdf-raptor 0.4.2 → 1.0.0.beta1

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.
data/README CHANGED
@@ -2,8 +2,8 @@ Raptor RDF Parser Plugin for RDF.rb
2
2
  ===================================
3
3
  [![Build Status](https://secure.travis-ci.org/ruby-rdf/rdf-raptor.png?branch=master)](http://travis-ci.org/ruby-rdf/rdf-raptor)
4
4
 
5
- This is an [RDF.rb][] plugin that adds support for parsing/serializing
6
- [RDF/XML][], [Turtle][] and [RDFa][] data using the [Raptor RDF Parser][Raptor]
5
+ This is an [RDF.rb][] plugin that adds support for parsing/serializing [NTriples][],
6
+ [RDF/XML][], [Turtle][], [RDFa][], and [Graphviz][] data using the [Raptor RDF Parser][Raptor]
7
7
  library.
8
8
 
9
9
  * <http://github.com/ruby-rdf/rdf-raptor>
@@ -12,12 +12,13 @@ library.
12
12
  Features
13
13
  --------
14
14
 
15
- * Requires the [Raptor][] library and/or command-line utilities.
16
- * Parses and serializes RDF data from/into the RDF/XML or Turtle formats.
15
+ * Uses the fast [Raptor][] C library.
16
+ * Parses and serializes RDF data from/into the NTriples, RDF/XML, and Turtle formats.
17
17
  * Extracts RDF statements from XHTML+RDFa documents.
18
+ * Serializes RDF statements into Graphviz format.
18
19
  * Provides serialization format autodetection for RDF/XML, Turtle and RDFa.
19
20
  * Compatible with any operating system supported by Raptor and Ruby.
20
- * Compatible with MRI 1.8.x, 1.9.x and JRuby (tested with JRuby 1.8 and 1.9 mode).
21
+ * Compatible with MRI 1.8.x, 1.9.x, REE, JRuby and Rubinius (1.8 and 1.9 mode).
21
22
 
22
23
  Examples
23
24
  --------
@@ -27,7 +28,15 @@ Examples
27
28
  ### Ensuring Raptor is installed and obtaining the version number
28
29
 
29
30
  RDF::Raptor.available? #=> true
30
- RDF::Raptor.version #=> "1.4.21"
31
+ RDF::Raptor.version #=> "2.0.8"
32
+
33
+ ### Parsing RDF statements from an NTriples file
34
+
35
+ RDF::Reader.open("http://datagraph.org/jhacker/foaf.nt") do |reader|
36
+ reader.each_statement do |statement|
37
+ puts statement.inspect
38
+ end
39
+ end
31
40
 
32
41
  ### Parsing RDF statements from an RDF/XML file
33
42
 
@@ -105,6 +114,14 @@ Examples
105
114
  RDF::Format.for(:file_extension => "html")
106
115
  RDF::Format.for(:content_type => "application/xhtml+xml")
107
116
 
117
+ ### Obtaining the Graphviz format specification class
118
+
119
+ RDF::Format.for(:graphviz) #=> RDF::Raptor::Graphviz::Format
120
+ RDF::Format.for("output.dot")
121
+ RDF::Format.for(:file_name => "output.dot")
122
+ RDF::Format.for(:file_extension => "")
123
+ RDF::Format.for(:content_type => "text/vnd.graphviz")
124
+
108
125
  Documentation
109
126
  -------------
110
127
 
@@ -120,9 +137,9 @@ Documentation
120
137
  Dependencies
121
138
  ------------
122
139
 
123
- * [RDF.rb](http://rubygems.org/gems/rdf) (>= 0.3.0)
140
+ * [RDF.rb](http://rubygems.org/gems/rdf) (>= 0.3.8)
124
141
  * [FFI](http://rubygems.org/gems/ffi) (>= 1.0.0)
125
- * [Raptor][] (>= 1.4.21), the `libraptor` library or the `rapper` binary
142
+ * [Raptor][] (>= 2.0), the `libraptor` library or the `rapper` binary
126
143
 
127
144
  Installation
128
145
  ------------
@@ -140,7 +157,8 @@ Mac and the most common Linux and BSD distributions:
140
157
  % [sudo] port install raptor # Mac OS X with MacPorts
141
158
  % [sudo] fink install raptor-bin # Mac OS X with Fink
142
159
  % brew install raptor # Mac OS X with Homebrew
143
- % [sudo] aptitude install raptor-utils # Ubuntu / Debian
160
+ % [sudo] aptitude install raptor-utils # Ubuntu / Debian with aptitude
161
+ % [sudo] apt-get install libraptor2-0 # Ubuntu / Debian with apt-get
144
162
  % [sudo] yum install raptor # Fedora / CentOS / RHEL
145
163
  % [sudo] zypper install raptor # openSUSE
146
164
  % [sudo] emerge raptor # Gentoo Linux
@@ -175,18 +193,21 @@ Contributors
175
193
  ------------
176
194
 
177
195
  * [Ben Lavender](http://github.com/bhuga) - <http://bhuga.net/>
178
- * [David Butler](http://github.com/dwbutler)
196
+ * [David Butler](http://github.com/dwbutler) - <http://github.com/dwbutler>
179
197
  * [Gregg Kellogg](http://github.com/gkellogg) - <http://greggkellogg.net/>
180
198
 
181
199
  License
182
200
  -------
183
201
 
184
202
  This is free and unencumbered public domain software. For more information,
185
- see <http://unlicense.org/> or the accompanying {file:UNLICENSE} file.
203
+ see <http://unlicense.org/> or the accompanying [UNLICENSE][] file.
186
204
 
187
205
  [RDF.rb]: http://rdf.rubyforge.org/
206
+ [NTriples]: http://en.wikipedia.org/wiki/N-Triples
188
207
  [RDF/XML]: http://www.w3.org/TR/REC-rdf-syntax/
189
208
  [Turtle]: http://en.wikipedia.org/wiki/Turtle_(syntax)
190
209
  [RDFa]: http://rdfa.info/
210
+ [Graphviz]: http://www.graphviz.org/
191
211
  [Raptor]: http://librdf.org/raptor/
192
212
  [rapper]: http://librdf.org/raptor/rapper.html
213
+ [UNLICENSE]:https://github.com/ruby-rdf/rdf-raptor/blob/master/UNLICENSE
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.4.2
1
+ 1.0.0.beta1
@@ -19,7 +19,6 @@ module RDF::Raptor
19
19
  [$1, $2, $3].join('.')
20
20
  end
21
21
  end
22
- module_function :version
23
22
 
24
23
  ##
25
24
  # CLI reader implementation.
@@ -59,7 +59,7 @@ module RDF::Raptor::FFI::V1
59
59
  # @param [Proc] handler
60
60
  # @return [void]
61
61
  def statement_handler=(handler)
62
- V1.raptor_set_statement_handler(self, self, handler)
62
+ V1.raptor_parser_set_statement_handler(self, self, handler)
63
63
  end
64
64
 
65
65
  ##
@@ -0,0 +1,56 @@
1
+ module RDF::Raptor::FFI::V2
2
+ ##
3
+ # This class provides an I/O stream that can write to filenames, `FILE*`,
4
+ # strings and user-defined output via callbacks.
5
+ #
6
+ # @see http://librdf.org/raptor/api-1.4/raptor-section-iostream.html
7
+ class IOStream < ::FFI::ManagedStruct
8
+ include RDF::Raptor::FFI
9
+ layout :world, :pointer,
10
+ :user_data, :pointer,
11
+ :handler, :pointer,
12
+ :offset, :size_t,
13
+ :mode, :int,
14
+ :flags, :int
15
+
16
+ ##
17
+ # @overload initialize(ptr)
18
+ # @param [FFI::Pointer] ptr
19
+ #
20
+ # @overload initialize(handler)
21
+ # @param [V2::IOStreamHandler] handler
22
+ #
23
+ # @overload initialize(file)
24
+ # @param [File, Tempfile] file
25
+ #
26
+ def initialize(ptr_or_obj, options = {})
27
+ ptr = case ptr_or_obj
28
+ when FFI::Pointer
29
+ ptr_or_obj
30
+ when V2::IOStreamHandler
31
+ @handler = ptr_or_obj # prevents premature GC
32
+ V2.raptor_new_iostream_from_handler(V2.world, self, @handler)
33
+ when File, Tempfile
34
+ V2.raptor_new_iostream_to_filename(V2.world, File.expand_path(ptr_or_obj.path))
35
+ when false
36
+ V2.raptor_new_iostream_to_sink(V2.world)
37
+ else nil
38
+ end
39
+ raise ArgumentError, "invalid argument: #{ptr_or_obj.inspect}" if ptr.nil? || ptr.null?
40
+
41
+ @free_iostream = options[:free_iostream] || true
42
+ super(ptr)
43
+ end
44
+
45
+ ##
46
+ # Releases `libraptor` memory associated with this structure.
47
+ #
48
+ # @param [FFI::Pointer] ptr
49
+ # @return [void]
50
+ def self.release(ptr)
51
+ if @free_iostream
52
+ V2.raptor_free_iostream(ptr)
53
+ end
54
+ end
55
+ end # IOStream
56
+ end # RDF::Raptor::FFI::V2
@@ -0,0 +1,153 @@
1
+ module RDF::Raptor::FFI::V2
2
+ ##
3
+ # @see http://librdf.org/raptor/api-1.4/raptor-section-iostream.html
4
+ class IOStreamHandler < ::FFI::Struct
5
+ include RDF::Raptor::FFI
6
+ layout :version, :int,
7
+ :init, :raptor_iostream_init_func,
8
+ :finish, :raptor_iostream_finish_func,
9
+ :write_byte, :raptor_iostream_write_byte_func,
10
+ :write_bytes, :raptor_iostream_write_bytes_func,
11
+ :write_end, :raptor_iostream_write_end_func,
12
+ :read_bytes, :raptor_iostream_read_bytes_func,
13
+ :read_eof, :raptor_iostream_read_eof_func
14
+
15
+ HANDLERS = [:init, :finish, :write_byte, :write_bytes, :read_bytes, :read_eof]
16
+
17
+ ##
18
+ # The IO object to operate upon.
19
+ #
20
+ # @return [IO]
21
+ attr_accessor :io
22
+
23
+ ##
24
+ # @overload initialize(ptr)
25
+ # @param [FFI::Pointer] ptr
26
+ #
27
+ # @overload initialize(io)
28
+ # @param [IO, StringIO] io
29
+ #
30
+ def initialize(ptr_or_io = nil)
31
+ if ptr_or_io.respond_to?(:write)
32
+ @io = ptr_or_io
33
+ super()
34
+ else
35
+ case ptr_or_io
36
+ when FFI::Pointer
37
+ super(ptr_or_io)
38
+ when nil
39
+ super()
40
+ else
41
+ raise ArgumentError, "invalid argument: #{ptr_or_io.inspect}"
42
+ end
43
+ end
44
+ initialize!
45
+ end
46
+
47
+ ##
48
+ # @return [void]
49
+ def initialize!
50
+ self[:version] = 2
51
+
52
+ #define_handler(:init) do |context|
53
+ # $stderr.puts("#{self.class}: init")
54
+ #end
55
+ #define_handler(:finish) do |context|
56
+ # $stderr.puts("#{self.class}: finish")
57
+ #end
58
+ define_handler(:write_byte) do |context, byte|
59
+ begin
60
+ @io.putc(byte)
61
+ 0
62
+ rescue => e
63
+ $stderr.puts("#{e} in #{self.class}#write_byte")
64
+ 1
65
+ end
66
+ end
67
+ define_handler(:write_bytes) do |context, data, size, nmemb|
68
+ begin
69
+ @io.write(data.read_string(size * nmemb))
70
+ 0
71
+ rescue => e
72
+ $stderr.puts("#{e} in #{self.class}#write_bytes")
73
+ 1
74
+ end
75
+ end
76
+ #define_handler(:write_end) do |context|
77
+ # $stderr.puts("#{self.class}: write_end")
78
+ #end
79
+ #define_handler(:read_bytes) do |context, data, size, nmemb|
80
+ # $stderr.puts("#{self.class}: read_bytes")
81
+ #end
82
+ #define_handler(:read_eof) do |context|
83
+ # $stderr.puts("#{self.class}: read_eof")
84
+ #end
85
+ end
86
+
87
+ ##
88
+ # @param [Proc] func
89
+ # @return [void]
90
+ def init_handler=(func)
91
+ define_handler(:init, &func)
92
+ end
93
+ alias_method :init=, :init_handler=
94
+
95
+ ##
96
+ # @param [Proc] func
97
+ # @return [void]
98
+ def finish_handler=(func)
99
+ define_handler(:finish, &func)
100
+ end
101
+ alias_method :finish=, :finish_handler=
102
+
103
+ ##
104
+ # @param [Proc] func
105
+ # @return [void]
106
+ def write_byte_handler=(func)
107
+ define_handler(:write_byte, &func)
108
+ end
109
+ alias_method :write_byte=, :write_byte_handler=
110
+
111
+ ##
112
+ # @param [Proc] func
113
+ # @return [void]
114
+ def write_bytes_handler=(func)
115
+ define_handler(:write_bytes, &func)
116
+ end
117
+ alias_method :write_bytes=, :write_bytes_handler=
118
+
119
+ ##
120
+ # @param [Proc] func
121
+ # @return [void]
122
+ def write_end_handler=(func)
123
+ define_handler(:write_end, &func)
124
+ end
125
+ alias_method :write_end=, :write_end_handler=
126
+
127
+ ##
128
+ # @param [Proc] func
129
+ # @return [void]
130
+ def read_bytes_handler=(func)
131
+ define_handler(:read_bytes, &func)
132
+ end
133
+ alias_method :read_bytes=, :read_bytes_handler=
134
+
135
+ ##
136
+ # @param [Proc] func
137
+ # @return [void]
138
+ def read_eof_handler=(func)
139
+ define_handler(:read_eof, &func)
140
+ end
141
+ alias_method :read_eof=, :read_eof_handler=
142
+
143
+ ##
144
+ # @param [Symbol, #to_sym] name
145
+ # @return [void]
146
+ def define_handler(name, &block)
147
+ name = name.to_sym
148
+ raise ArgumentError, "invalid IOStreamHandler function name: #{name}" unless HANDLERS.include?(name)
149
+ @procs ||= {} # prevents premature GC of the procs
150
+ @procs[name] = self[name] = block
151
+ end
152
+ end # IOStreamHandler
153
+ end # RDF::Raptor::FFI::V1
@@ -0,0 +1,205 @@
1
+ module RDF::Raptor::FFI::V2
2
+ ##
3
+ # This class provides the functionality of turning syntaxes into RDF
4
+ # triples - RDF parsing.
5
+ #
6
+ # @see http://librdf.org/raptor/api-1.4/raptor-section-parser.html
7
+ class Parser < ::FFI::ManagedStruct
8
+ include RDF::Raptor::FFI
9
+ layout :world, :pointer # the actual layout is private
10
+
11
+ # The default base URI
12
+ BASE_URI = 'file:///dev/stdin'
13
+
14
+ # The maximum chunk size for `#parse_stream`
15
+ BUFFER_SIZE = 64 * 1024
16
+
17
+ ##
18
+ # @overload initialize(ptr)
19
+ # @param [FFI::Pointer] ptr
20
+ #
21
+ # @overload initialize(name)
22
+ # @param [Symbol, String] name
23
+ #
24
+ def initialize(ptr_or_name)
25
+ ptr = case ptr_or_name
26
+ when FFI::Pointer then ptr_or_name
27
+ when Symbol then V2.raptor_new_parser(V2.world, ptr_or_name.to_s)
28
+ when String then V2.raptor_new_parser(V2.world, ptr_or_name)
29
+ else nil
30
+ end
31
+ raise ArgumentError, "invalid argument: #{ptr_or_name.inspect}" if ptr.nil? || ptr.null?
32
+ super(ptr)
33
+ end
34
+
35
+ ##
36
+ # Releases `libraptor` memory associated with this structure.
37
+ #
38
+ # @param [FFI::Pointer] ptr
39
+ # @return [void]
40
+ def self.release(ptr)
41
+ V2.raptor_free_parser(ptr)
42
+ end
43
+
44
+ ##
45
+ # @param [Proc] handler
46
+ # @return [void]
47
+ def error_handler=(handler)
48
+ #V2.raptor_set_error_handler(self, self, handler)
49
+ end
50
+
51
+ ##
52
+ # @param [Proc] handler
53
+ # @return [void]
54
+ def warning_handler=(handler)
55
+ #V2.raptor_set_warning_handler(self, self, handler)
56
+ end
57
+
58
+ ##
59
+ # @param [Proc] handler
60
+ # @return [void]
61
+ def statement_handler=(handler)
62
+ V2.raptor_parser_set_statement_handler(self, self, handler)
63
+ end
64
+
65
+ ##
66
+ # @param [Object] input
67
+ # the input to parse
68
+ # @param [Hash{Symbol => Object}] options
69
+ # any additional options for parsing
70
+ # @option options [String, #to_s] :base_uri (nil)
71
+ # the base URI to use when resolving relative URIs
72
+ # @yield [parser, statement]
73
+ # each statement in the input
74
+ # @yieldparam [FFI::Pointer] parser
75
+ # @yieldparam [FFI::Pointer] statement
76
+ # @yieldreturn [void] ignored
77
+ # @return [void]
78
+ def parse(input, options = {}, &block)
79
+ case input
80
+ when RDF::URI, URI, %r(^(file|https|http|ftp)://)
81
+ parse_url(input, options, &block)
82
+ when File, Tempfile
83
+ parse_file(input, options, &block)
84
+ when IO, StringIO
85
+ parse_stream(input, options, &block)
86
+ when String
87
+ parse_buffer(input, options, &block)
88
+ else
89
+ raise ArgumentError, "don't know how to parse #{input.inspect}"
90
+ end
91
+ end
92
+
93
+ ##
94
+ # @param [RDF::URI, String, #to_s] url
95
+ # the input URL to parse
96
+ # @param [Hash{Symbol => Object}] options
97
+ # any additional options for parsing (see {#parse})
98
+ # @yield [parser, statement]
99
+ # each statement in the input
100
+ # @yieldparam [FFI::Pointer] parser
101
+ # @yieldparam [FFI::Pointer] statement
102
+ # @yieldreturn [void] ignored
103
+ # @return [void]
104
+ def parse_url(url, options = {}, &block)
105
+ self.statement_handler = block if block_given?
106
+
107
+ data_url = V2::URI.new((url.respond_to?(:to_uri) ? url.to_uri : url).to_s)
108
+ base_uri = options[:base_uri].to_s.empty? ? nil : V2::URI.new(options[:base_uri].to_s)
109
+
110
+ result = V2.raptor_parser_parse_uri(self, data_url, base_uri)
111
+ # TODO: error handling if result.nonzero?
112
+ end
113
+ alias_method :parse_uri, :parse_url
114
+
115
+ ##
116
+ # @param [File, Tempfile, #path] file
117
+ # the input file to parse
118
+ # @param [Hash{Symbol => Object}] options
119
+ # any additional options for parsing (see {#parse})
120
+ # @yield [parser, statement]
121
+ # each statement in the input
122
+ # @yieldparam [FFI::Pointer] parser
123
+ # @yieldparam [FFI::Pointer] statement
124
+ # @yieldreturn [void] ignored
125
+ # @return [void]
126
+ def parse_file(file, options = {}, &block)
127
+ self.statement_handler = block if block_given?
128
+
129
+ data_url = V2::URI.new("file://#{File.expand_path(file.path)}")
130
+ base_uri = options[:base_uri].to_s.empty? ? nil : V2::URI.new(options[:base_uri].to_s)
131
+
132
+ result = V2.raptor_parser_parse_file(self, data_url, base_uri)
133
+ # TODO: error handling if result.nonzero?
134
+ end
135
+
136
+ ##
137
+ # @param [IO, StringIO, #readpartial] stream
138
+ # the input stream to parse
139
+ # @param [Hash{Symbol => Object}] options
140
+ # any additional options for parsing (see {#parse})
141
+ # @yield [parser, statement]
142
+ # each statement in the input
143
+ # @yieldparam [FFI::Pointer] parser
144
+ # @yieldparam [FFI::Pointer] statement
145
+ # @yieldreturn [void] ignored
146
+ # @return [void]
147
+ def parse_stream(stream, options = {}, &block)
148
+ self.statement_handler = block if block_given?
149
+
150
+ begin
151
+ parse_start!(options[:base_uri] || BASE_URI)
152
+ loop do
153
+ parse_chunk(stream.sysread(BUFFER_SIZE))
154
+ end
155
+ rescue EOFError => e
156
+ parse_end!
157
+ end
158
+ end
159
+
160
+ ##
161
+ # @param [String, #to_str] buffer
162
+ # the input buffer to parse
163
+ # @param [Hash{Symbol => Object}] options
164
+ # any additional options for parsing (see {#parse})
165
+ # @yield [parser, statement]
166
+ # each statement in the input
167
+ # @yieldparam [FFI::Pointer] parser
168
+ # @yieldparam [FFI::Pointer] statement
169
+ # @yieldreturn [void] ignored
170
+ # @return [void]
171
+ def parse_buffer(buffer, options = {}, &block)
172
+ self.statement_handler = block if block_given?
173
+
174
+ parse_start!((options[:base_uri] || BASE_URI).to_s)
175
+ parse_chunk(buffer.to_str)
176
+ parse_end!
177
+ end
178
+
179
+ ##
180
+ # @private
181
+ # @param [String] base_uri
182
+ # @return [void]
183
+ def parse_start!(base_uri = BASE_URI)
184
+ result = V2.raptor_parser_parse_start(self, V2::URI.new(base_uri))
185
+ # TODO: error handling if result.nonzero?
186
+ end
187
+
188
+ ##
189
+ # @private
190
+ # @param [String] buffer
191
+ # the input chunk to parse
192
+ # @return [void]
193
+ def parse_chunk(buffer)
194
+ result = V2.raptor_parser_parse_chunk(self, buffer, buffer.bytesize, 0)
195
+ # TODO: error handling if result.nonzero?
196
+ end
197
+
198
+ ##
199
+ # @private
200
+ # @return [void]
201
+ def parse_end!
202
+ result = V2.raptor_parser_parse_chunk(self, nil, 0, 1) # EOF
203
+ end
204
+ end # Parser
205
+ end # RDF::Raptor::FFI::V2
@@ -0,0 +1,137 @@
1
+ module RDF::Raptor::FFI::V2
2
+ ##
3
+ # This class provides the functionality of turning RDF triples into
4
+ # syntaxes - RDF serializing.
5
+ #
6
+ # @see http://librdf.org/raptor/api-1.4/raptor-section-serializer.html
7
+ class Serializer < ::FFI::ManagedStruct
8
+ include RDF::Raptor::FFI
9
+
10
+ # Note this layout is private
11
+ layout :world, :pointer,
12
+ :locator, :pointer,
13
+ :failed, :bool,
14
+ :base_uri, :pointer,
15
+ :context, :pointer,
16
+ :iostream, :pointer,
17
+ :free_iostream_on_end, :bool,
18
+ :factory, :pointer,
19
+ :options, :pointer
20
+
21
+ ##
22
+ # @overload initialize(ptr)
23
+ # @param [FFI::Pointer] ptr
24
+ #
25
+ # @overload initialize(name)
26
+ # @param [Symbol, String] name
27
+ #
28
+ def initialize(ptr_or_name)
29
+ ptr = case ptr_or_name
30
+ when FFI::Pointer then ptr_or_name
31
+ when Symbol then V2.raptor_new_serializer(V2.world, ptr_or_name.to_s)
32
+ when String then V2.raptor_new_serializer(V2.world, ptr_or_name)
33
+ else nil
34
+ end
35
+ raise ArgumentError, "invalid argument: #{ptr_or_name.inspect}" if ptr.nil? || ptr.null?
36
+ super(ptr)
37
+ end
38
+
39
+ ##
40
+ # Releases `libraptor` memory associated with this structure.
41
+ #
42
+ # @param [FFI::Pointer] ptr
43
+ # @return [void]
44
+ def self.release(ptr)
45
+ V2.raptor_free_serializer(ptr)
46
+ end
47
+
48
+ ##
49
+ # @param [Proc] handler
50
+ # @return [void]
51
+ def error_handler=(handler)
52
+ V2.raptor_serializer_set_error_handler(self, self, handler)
53
+ end
54
+
55
+ ##
56
+ # @param [Proc] handler
57
+ # @return [void]
58
+ def warning_handler=(handler)
59
+ V2.raptor_serializer_set_warning_handler(self, self, handler)
60
+ end
61
+
62
+ ##
63
+ # @param [Object] output
64
+ # where output should be written to
65
+ # @param [Hash{Symbol => Object}] options
66
+ # any additional options for serializing
67
+ # @option options [String, #to_s] :base_uri (nil)
68
+ # the base URI to use when resolving relative URIs
69
+ # @return [void]
70
+ def start_to(output, options = {})
71
+ if output.respond_to?(:write)
72
+ start_to_stream(output, options)
73
+ else
74
+ raise ArgumentError, "don't know how to serialize to #{output.inspect}"
75
+ end
76
+ end
77
+
78
+ ##
79
+ # @param [IO, StringIO] stream
80
+ # @param [Hash{Symbol => Object}] options
81
+ # any additional options for serializing (see {#start_to})
82
+ # @return [void]
83
+ def start_to_stream(stream, options = {})
84
+ iostream = V2::IOStream.new(V2::IOStreamHandler.new(stream), :free_iostream => self[:free_iostream_on_end])
85
+ start_to_iostream(iostream, options)
86
+ end
87
+
88
+ ##
89
+ # @param [V2::IOStream] iostream
90
+ # @param [Hash{Symbol => Object}] options
91
+ # any additional options for serializing (see {#start_to})
92
+ # @return [void]
93
+ def start_to_iostream(iostream, options = {})
94
+ @iostream = iostream # prevents premature GC
95
+ @base_uri = options[:base_uri].to_s.empty? ? nil : V2::URI.new(options[:base_uri].to_s)
96
+ if V2.raptor_serializer_start_to_iostream(self, @base_uri, @iostream).nonzero?
97
+ raise RDF::WriterError, "raptor_serialize_start_to_iostream() failed"
98
+ end
99
+ end
100
+
101
+ ##
102
+ # @return [void]
103
+ def finish
104
+ if V2.raptor_serializer_serialize_end(self).nonzero?
105
+ raise RDF::WriterError, "raptor_serialize_end() failed"
106
+ end
107
+ @iostream = @base_uri = nil # allows GC
108
+ end
109
+
110
+ ##
111
+ # @param [RDF::Resource] subject
112
+ # @param [RDF::URI] predicate
113
+ # @param [RDF::Term] object
114
+ # @return [void]
115
+ def serialize_triple(subject, predicate, object)
116
+ raptor_statement = V2::Statement.new
117
+ raptor_statement.subject = subject
118
+ raptor_statement.predicate = predicate
119
+ raptor_statement.object = object
120
+ begin
121
+ serialize_raw_statement(raptor_statement)
122
+ ensure
123
+ raptor_statement.release
124
+ raptor_statement = nil
125
+ end
126
+ end
127
+
128
+ ##
129
+ # @param [V2::Statement] statement
130
+ # @return [void]
131
+ def serialize_raw_statement(statement)
132
+ if V2.raptor_serializer_serialize_statement(self, statement).nonzero?
133
+ raise RDF::WriterError, "raptor_serialize_statement() failed"
134
+ end
135
+ end
136
+ end # Serializer
137
+ end # RDF::Raptor::FFI::V2