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:
parent
b6d97cc9a8
commit
3d9453994c
2 changed files with 46 additions and 3 deletions
12
lib/open3.rb
12
lib/open3.rb
|
@ -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
|
||||||
|
|
|
@ -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)
|
||||||
|
|
Loading…
Reference in a new issue