module Nuggets::IO::InteractMixin
Public Instance Methods
Interact with both ends of a pipe in a non-blocking manner.
input represents the sending end and is a mapping from the actual input IO (to send into the pipe) to the pipe's input handle (stdin). The input IO must support read_nonblock. If it's a StringIO it will be extended appropriately. If it's a String it will be converted to a StringIO.
output represents the receiving end and is a mapping from the pipe's output handle (stdout) to the designated output IO (to receive data from the pipe), and, optionally, from the pipe's error handle (stderr) to the designated error IO. The output and error IO must support << with a string argument. If either of them is a Proc it will be extended such that << delegates to call.
timeout, if given, will be passed to IO::select and nil is returned if the select call times out; in all other cases an empty array is returned.
maxlen is the chunk size for read_nonblock.
Examples:
require 'open3' # simply prints 'input string' on STDOUT, ignores +stderr+ Open3.popen3('cat') { |stdin, stdout, stderr| IO.interact({ "input string\n" => stdin }, { stdout => STDOUT }) } # prints lines you type in reverse order to a string str = '' Open3.popen3('tac') { |stdin, stdout, stderr| IO.interact({ STDIN => stdin }, { stdout => str }) } puts str # prints the IP adresses from /etc/hosts on STDOUT and their lengths # on STDERR cmd = %q{ruby -ne 'i = $_.split.first or next; warn i.length; puts i'} Open3.popen3(cmd) { |stdin, stdout, stderr| File.open('/etc/hosts') { |f| IO.interact({ f => stdin }, { stdout => STDOUT, stderr => STDERR }) } }
# File lib/nuggets/io/interact_mixin.rb 78 def interact(input, output, timeout = nil, maxlen = nil) 79 Interaction.new(input, output, timeout, maxlen).interact 80 end