IORedirect

A class to redirect $stdout, or other IO object, to a StringIO object, or any other object with a write() method.

Synopsis

  s = StringIO.new
  r = Redirector.redirect($stdout, s) do
    $stdout.puts "this is a test"
  end
Methods
Public Class methods
new(from, to)

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.

# File lib/facets/more/ioredirect.rb, line 44
  def initialize(from, to)
    @from = from
    @to = to
    start()
  end
redirect(from, to) {|| ...}

An exception-safe class method for redirection

# File lib/facets/more/ioredirect.rb, line 76
  def self.redirect(from, to)
    s = self.new(from, to)
    begin
      yield
    ensure
      s.stop
    end
  end
Public Instance methods
start()

Start redirection, if it has not already been started.

# File lib/facets/more/ioredirect.rb, line 51
  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()

Stop redirection, if it is occurring

# File lib/facets/more/ioredirect.rb, line 70
  def stop
    raise "Redirection already stopped" if not @t
    @t.kill
  end