class IORedirect

IORedirect

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

s = StringIO.new
r = IORedirect.redirect($stdout, s) do
  $stdout.puts "this is a test"
end

Public Class Methods

new(from, to) click to toggle source

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/more/facets/ioredirect.rb, line 35
def initialize(from, to)
  @from = from
  @to = to
  start()
end
redirect(from, to) { || ... } click to toggle source

An exception-safe class method for redirection

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

Public Instance Methods

start() click to toggle source

Start redirection, if it has not already been started.

# File lib/more/facets/ioredirect.rb, line 42
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() click to toggle source

Stop redirection, if it is occurring

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