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