Sha256: 58593d3704cbe299fad6a167baa713a3e55613e383f37269e7a46eac6865a741
Contents?: true
Size: 1.99 KB
Versions: 1
Compression:
Stored size: 1.99 KB
Contents
=begin rdoc = IO::Redirect A class to redirect $stdout, or other IO object, to a StringIO object, or any other object with a write() method. == Synopsis require 'raspberry/new/io-redirect' s = StringIO.new r = Redirector.redirect($stdout, s) do $stdout.puts "this is a test" end == Legal Ported from Ruby treasures Copyright (C) 2002 Paul Brannan <paul@atdesk.com> You may distribute this software under the same terms as Ruby (see the file COPYING that was distributed with this library). == Version $id: io-redirect.rb 2004/10/27 10:00:01 transami Exp $ =end class IO::Redirect # Start redirection from one IO object to any other object with a # write() method. +from+ is the IO object to redirect from, # and +to+ is the object to redirect to. def initialize(from, to) @from = from @to = to start() end # Start redirection, if it has not already been started. def start raise "Redirection already in progress" if @t tmp = @from.dup r, w = IO.pipe @from.reopen(w) @t = Thread.new do begin loop do s = r.read(1) # TODO: can I make this buffered? @to.write(s) end ensure @from.reopen(tmp) @t = nil end end end # Stop redirection, if it is occurring def stop raise "Redirection already stopped" if not @t @t.kill end # An exception-safe class method for redirection def self.redirect(from, to) s = self.new(from, to) begin yield ensure s.stop end end end # --- test --- if __FILE__ == $0 then class SimpleStringIO attr_reader :str def initialize; @str = ''; end def write(str); @str << str; end end Thread.abort_on_exception = true s = SimpleStringIO.new r = Redirector.redirect($stdout, s) do $stdout.puts "this is a test" $stdout.puts "of the StringIO redirection system" end puts "Done redirecting." puts "Result:\n#{s.str}" end
Version data entries
1 entries across 1 versions & 1 rubygems
Version | Path |
---|---|
carats-0.3.0 | lib/carat/io-redirect.rb |