1
0
Fork 0
mirror of https://github.com/ruby/ruby.git synced 2022-11-09 12:17:21 -05:00

lib/open3.rb: accept IO-like object for :stdin_data argument.

Open3.capture3, Open3.capture2, Open3.capture2e accepts
IO-like object for :stdin_data argument.
[ruby-core:80936] [Feature #13527] proposed by janko.



git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@60236 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
akr 2017-10-21 07:00:58 +00:00
parent b6d97cc9a8
commit 3d9453994c
2 changed files with 46 additions and 3 deletions

View file

@ -264,7 +264,11 @@ module Open3
out_reader = Thread.new { o.read } out_reader = Thread.new { o.read }
err_reader = Thread.new { e.read } err_reader = Thread.new { e.read }
begin begin
if stdin_data.respond_to? :readpartial
IO.copy_stream(stdin_data, i)
else
i.write stdin_data i.write stdin_data
end
rescue Errno::EPIPE rescue Errno::EPIPE
end end
i.close i.close
@ -311,7 +315,11 @@ module Open3
out_reader = Thread.new { o.read } out_reader = Thread.new { o.read }
if stdin_data if stdin_data
begin begin
if stdin_data.respond_to? :readpartial
IO.copy_stream(stdin_data, i)
else
i.write stdin_data i.write stdin_data
end
rescue Errno::EPIPE rescue Errno::EPIPE
end end
end end
@ -346,7 +354,11 @@ module Open3
outerr_reader = Thread.new { oe.read } outerr_reader = Thread.new { oe.read }
if stdin_data if stdin_data
begin begin
if stdin_data.respond_to? :readpartial
IO.copy_stream(stdin_data, i)
else
i.write stdin_data i.write stdin_data
end
rescue Errno::EPIPE rescue Errno::EPIPE
end end
end end

View file

@ -155,6 +155,17 @@ class TestOpen3 < Test::Unit::TestCase
assert(s.success?) assert(s.success?)
end end
def test_capture3_stdin_data_io
IO.pipe {|r, w|
w.write "i"
w.close
o, e, s = Open3.capture3(RUBY, '-e', 'i=STDIN.read; print i+"o"; STDOUT.flush; STDERR.print i+"e"', :stdin_data=>r)
assert_equal("io", o)
assert_equal("ie", e)
assert(s.success?)
}
end
def test_capture3_flip def test_capture3_flip
o, e, s = Open3.capture3(RUBY, '-e', 'STDOUT.sync=true; 1000.times { print "o"*1000; STDERR.print "e"*1000 }') o, e, s = Open3.capture3(RUBY, '-e', 'STDOUT.sync=true; 1000.times { print "o"*1000; STDERR.print "e"*1000 }')
assert_equal("o"*1000000, o) assert_equal("o"*1000000, o)
@ -168,12 +179,32 @@ class TestOpen3 < Test::Unit::TestCase
assert(s.success?) assert(s.success?)
end end
def test_capture2_stdin_data_io
IO.pipe {|r, w|
w.write "i"
w.close
o, s = Open3.capture2(RUBY, '-e', 'i=STDIN.read; print i+"o"', :stdin_data=>r)
assert_equal("io", o)
assert(s.success?)
}
end
def test_capture2e def test_capture2e
oe, s = Open3.capture2e(RUBY, '-e', 'i=STDIN.read; print i+"o"; STDOUT.flush; STDERR.print i+"e"', :stdin_data=>"i") oe, s = Open3.capture2e(RUBY, '-e', 'i=STDIN.read; print i+"o"; STDOUT.flush; STDERR.print i+"e"', :stdin_data=>"i")
assert_equal("ioie", oe) assert_equal("ioie", oe)
assert(s.success?) assert(s.success?)
end end
def test_capture2e_stdin_data_io
IO.pipe {|r, w|
w.write "i"
w.close
oe, s = Open3.capture2e(RUBY, '-e', 'i=STDIN.read; print i+"o"; STDOUT.flush; STDERR.print i+"e"', :stdin_data=>r)
assert_equal("ioie", oe)
assert(s.success?)
}
end
def test_capture3_stdin_data def test_capture3_stdin_data
o, e, s = Open3.capture3(RUBY, '-e', '', :stdin_data=>"z"*(1024*1024)) o, e, s = Open3.capture3(RUBY, '-e', '', :stdin_data=>"z"*(1024*1024))
assert_equal("", o) assert_equal("", o)