[lnkForumImage]
TotalShareware - Download Free Software

Confronta i prezzi di migliaia di prodotti.
Asp Forum
 Home | Login | Register | Search 


 

Forums >

comp.lang.ruby

capturing standard out?

Giles Bowkett

3/19/2007 10:18:00 PM

Is there an easy way to capture standard out in Ruby, so that "puts"
throws its output into a buffer instead of just popping up on the
screen?

--
Giles Bowkett
http://www.gilesg...
http://gilesbowkett.bl...
http://giles.t...

8 Answers

Robert Dober

3/19/2007 10:43:00 PM

0

On 3/19/07, Giles Bowkett <gilesb@gmail.com> wrote:
> Is there an easy way to capture standard out in Ruby, so that "puts"
> throws its output into a buffer instead of just popping up on the
> screen?
>
> --
> Giles Bowkett
> http://www.gilesg...
> http://gilesbowkett.bl...
> http://giles.t...
>
>

I have a scriopt producing output for bash, for running the test spec
I plugin output into an array, more or less like this:

class Output
@data =[]
class << self
attr_reader :data
end
end
if $TESTING then
def Kernl.puts *args, &blk
Output.data << args.join("")
Output.data << blk.call if blk
end
end

I have also Output.data.clear in #setup of the testsuite.

HTH
Robert
--
You see things; and you say Why?
But I dream things that never were; and I say Why not?
-- George Bernard Shaw

Gary Wright

3/19/2007 10:53:00 PM

0


On Mar 19, 2007, at 6:18 PM, Giles Bowkett wrote:

> Is there an easy way to capture standard out in Ruby, so that "puts"
> throws its output into a buffer instead of just popping up on the
> screen?

This is exactly the problem shell IO redirection was designed to solve.

$ ruby script.rb > output

What is the use case that prevents you from using shell redirection?



Gary Wright




Daniel Schierbeck

3/19/2007 11:09:00 PM

0

On Tue, 2007-03-20 at 07:18 +0900, Giles Bowkett wrote:
> Is there an easy way to capture standard out in Ruby, so that "puts"
> throws its output into a buffer instead of just popping up on the
> screen?

You can set the $stdout global variable to point to whatever object you
like, as long as it adheres to a simple interface. Kernel#puts simply
redirects to $stdout.


Cheers,
Daniel


Robert Dober

3/19/2007 11:52:00 PM

0

On 3/19/07, Daniel Schierbeck <daniel.schierbeck@gmail.com> wrote:
> On Tue, 2007-03-20 at 07:18 +0900, Giles Bowkett wrote:
> > Is there an easy way to capture standard out in Ruby, so that "puts"
> > throws its output into a buffer instead of just popping up on the
> > screen?
>
> You can set the $stdout global variable to point to whatever object you
> like, as long as it adheres to a simple interface. Kernel#puts simply
> redirects to $stdout.
That is a good idea too, especially with this idiom

def xxx(..., out = $stdout)

Robert
>
>
> Cheers,
> Daniel
>
>
>


--
You see things; and you say Why?
But I dream things that never were; and I say Why not?
-- George Bernard Shaw

Giles Bowkett

3/20/2007 12:49:00 AM

0

On 3/19/07, Daniel Schierbeck <daniel.schierbeck@gmail.com> wrote:
> On Tue, 2007-03-20 at 07:18 +0900, Giles Bowkett wrote:
> > Is there an easy way to capture standard out in Ruby, so that "puts"
> > throws its output into a buffer instead of just popping up on the
> > screen?
>
> You can set the $stdout global variable to point to whatever object you
> like, as long as it adheres to a simple interface. Kernel#puts simply
> redirects to $stdout.
>
>
> Cheers,
> Daniel

Hey Daniel, I found an example of the $stdout technique from Matz:

http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-...

That's what I ended up using, although I used $stdout and instead of
$defout, and the documentation I found said assigning to $stdout is
deprecated in favor of $stdout.reopen, which I couldn't seem to get to
work for me.


--
Giles Bowkett
http://www.gilesg...
http://gilesbowkett.bl...
http://giles.t...

Giles Bowkett

3/20/2007 12:51:00 AM

0

On 3/19/07, Gary Wright <gwtmp01@mac.com> wrote:
>
> What is the use case that prevents you from using shell redirection?

I have no idea, I'm solving this for somebody I work with, but I'm
pretty confident they're familiar with shell redirection already.
Thanks tho.

--
Giles Bowkett
http://www.gilesg...
http://gilesbowkett.bl...
http://giles.t...

Erik Veenstra

3/20/2007 6:06:00 PM

0

Here's a code snippet from my log library.

gegroet,
Erik V. - http://www.erikve...

----------------------------------------------------------------

["$stdout", "$stderr"].each do |std|
io = eval(std)
old_write = io.method(:write)

class << io
self
end.module_eval do
define_method(:write) do |text|
unless text =~ /^[\r\n]+$/ # Because puts calls twice.
File.open("logfile.log", "a") do |f|
f.puts [std[1..-1].upcase, caller[2], text].join(" ")
end
end

old_write.call(text)
end
end
end

$stdout.puts "text on stdout"
$stderr.puts "text on stderr"

----------------------------------------------------------------


James Gray

3/26/2007 3:53:00 PM

0

On Mar 19, 2007, at 5:18 PM, Giles Bowkett wrote:

> Is there an easy way to capture standard out in Ruby, so that "puts"
> throws its output into a buffer instead of just popping up on the
> screen?

I would do it like this:

#!/usr/bin/env ruby -w

require "stringio"

def capture_stdout(buffer = StringIO.new)
saved_stdout = $stdout
$stdout = buffer

yield

$stdout = saved_stdout

buffer.string rescue buffer
end

if __FILE__ == $PROGRAM_NAME
puts "This will be printed."
output = capture_stdout { puts "Meanwhile, this was captured." }
puts "This also will be printed."
p output
end

__END__

James Edward Gray II