Event-based stdout content capturing

  • Thread starter Daniel Vartanov
  • Start date
D

Daniel Vartanov

Some legacy code produces output to STDOUT during execution. I need to
capture it on even-based model, something like the following:

capture the_legacy_code_lambda do |content|
# do something with content each time something appears in STDOUT
end

how can I manage this? Are there any idioms?
 
S

Sean O'Halpin

Some legacy code produces output to STDOUT during execution. I need to
capture it on even-based model, something like the following:

capture the_legacy_code_lambda do |content|
# do something with content each time something appears in STDOUT
end

how can I manage this? Are there any idioms?

You can reassign to the global $stdout object any object which
provides the method #write. You could use that to capture the output
something like this:

class Capture
def initialize(*args, &block)
@block = block
end
def write(txt)
@block.call(txt)
end
end

def capture(code, &block)
old_stdout = $stdout
begin
$stdout = Capture.new(&block)
code.call
ensure
$stdout = old_stdout
end
end

def legacy_code
puts "hello world"
puts "me again"
raise Exception, "Oh no!"
end

puts "start"
begin
capture(proc { legacy_code }) do |txt|
STDOUT.print "captured ["
STDOUT.print txt
STDOUT.puts "]"
STDOUT.flush
end
rescue Object => e
puts "Got exception"
raise
end
puts "end"

# $ ruby capture-stdout.rb
# start
# captured [hello world]
# captured [
# ]
# captured [me again]
# captured [
# ]
# Got exception
# capture-stdout.rb:23:in `legacy_code': Oh no! (Exception)
# etc.

Regards,
Sean
 
D

Daniel Vartanov

Thank you very much, great idea! I missed in my mind, that puts just
uses global variable $stdout.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,755
Messages
2,569,536
Members
45,009
Latest member
GidgetGamb

Latest Threads

Top