class Nuggets::IO::InteractMixin::Interaction

Constants

DEFAULT_MAXLEN

Attributes

maxlen[RW]
readers[R]
timeout[RW]
writers[R]

Public Class Methods

new(input, output, timeout = nil, maxlen = nil) click to toggle source
   # File lib/nuggets/io/interact_mixin.rb
86 def initialize(input, output, timeout = nil, maxlen = nil)
87   @readers, @writers = {}, {}
88 
89   output.each { |key, val| @readers[key] =  initialize_reader(val)      }
90   input.each  { |key, val| @writers[val] = [initialize_writer(key), ''] }
91 
92   @timeout, @maxlen = timeout, maxlen || DEFAULT_MAXLEN
93 end

Public Instance Methods

interact() click to toggle source
    # File lib/nuggets/io/interact_mixin.rb
 99 def interact
100   until readers.empty? && writers.empty?
101     handles = select(readers.keys, writers.keys, nil, timeout) or return
102 
103     handle_readers(handles[0])
104     handle_writers(handles[1])
105   end
106 
107   []
108 end

Private Instance Methods

close(container, item, reading = nil) click to toggle source
    # File lib/nuggets/io/interact_mixin.rb
172 def close(container, item, reading = nil)
173   container.delete(item)
174   reading ? item.close_read : item.close_write
175 end
handle_readers(handles) click to toggle source
    # File lib/nuggets/io/interact_mixin.rb
135 def handle_readers(handles)
136   handles.each { |reader| read(reader, readers[reader]) }
137 end
handle_writers(handles) click to toggle source
    # File lib/nuggets/io/interact_mixin.rb
139 def handle_writers(handles)
140   handles.each { |writer|
141     reader, buffer = writers[writer]
142     read(reader, buffer, writer) or next if buffer.empty?
143 
144     begin
145       bytes = writer.write_nonblock(buffer)
146     rescue ::Errno::EPIPE
147       close(writers, writer)
148     end
149 
150     buffer.force_encoding('BINARY').slice!(0, bytes) if bytes
151   }
152 end
initialize_reader(reader) click to toggle source
    # File lib/nuggets/io/interact_mixin.rb
112 def initialize_reader(reader)
113   if reader.is_a?(::Proc) && !reader.respond_to?(:<<)
114     class << reader; alias_method :<<, :call; end
115   end
116 
117   reader
118 end
initialize_writer(writer) click to toggle source
    # File lib/nuggets/io/interact_mixin.rb
120 def initialize_writer(writer)
121   if writer.is_a?(::String)
122     require 'stringio'
123     writer = ::StringIO.new(writer)
124   end
125 
126   unless writer.respond_to?(:read_nonblock)
127     def writer.read_nonblock(*args)
128       read(*args) or raise ::EOFError, 'end of string reached'
129     end
130   end
131 
132   writer
133 end
read(reader, buffer, writer = nil) click to toggle source
    # File lib/nuggets/io/interact_mixin.rb
154 def read(reader, buffer, writer = nil)
155   container = writer ? writers : readers
156 
157   begin
158     buffer << reader.read_nonblock(maxlen)
159   rescue ::Errno::EAGAIN
160   rescue ::EOFError
161     buffer.force_encoding(
162       reader.internal_encoding  ||
163       reader.external_encoding  ||
164       Encoding.default_internal ||
165       Encoding.default_external
166     ) if buffer.respond_to?(:force_encoding)
167 
168     close(container, writer || reader, !writer)
169   end
170 end