Class: IORedirect

Inherits:
Object show all
Defined in:
lib/mega/ioredirect.rb

Overview

:title: IORedirect

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

Synopsis

require 'mega/io-redirect'

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

Author(s)

  • Paul Brannan

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(from, to) ⇒ IORedirect

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.



48
49
50
51
52
# File 'lib/mega/ioredirect.rb', line 48

def initialize(from, to)
  @from = from
  @to = to
  start()
end

Class Method Details

.redirect(from, to) ⇒ Object

An exception-safe class method for redirection



80
81
82
83
84
85
86
87
# File 'lib/mega/ioredirect.rb', line 80

def self.redirect(from, to)
  s = self.new(from, to)
  begin
    yield
  ensure
    s.stop
  end
end

Instance Method Details

#startObject

Start redirection, if it has not already been started.



55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
# File 'lib/mega/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

#stopObject

Stop redirection, if it is occurring



74
75
76
77
# File 'lib/mega/ioredirect.rb', line 74

def stop
  raise "Redirection already stopped" if not @t
  @t.kill
end