Class IORedirect
In: lib/more/facets/ioredirect.rb
Parent: Object

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 = Redirector.redirect($stdout, s) do
    $stdout.puts "this is a test"
  end

Methods

new   redirect   start   stop  

Public Class methods

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.

[Source]

# File lib/more/facets/ioredirect.rb, line 48
  def initialize(from, to)
    @from = from
    @to = to
    start()
  end

An exception-safe class method for redirection

[Source]

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

Public Instance methods

Start redirection, if it has not already been started.

[Source]

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

[Source]

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

[Validate]