Class: IORedirect

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

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.

[Source]

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

redirect(from, to) {|| ...}

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()

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()

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]