streams.rb   [plain text]


# frozen_string_literal: true

require "stringio"

def capture(*args)
  opts = args.pop if args.last.is_a?(Hash)
  opts ||= {}

  args.map!(&:to_s)
  begin
    result = StringIO.new
    result.close if opts[:closed]
    args.each {|stream| eval "$#{stream} = result" }
    yield
  ensure
    args.each {|stream| eval("$#{stream} = #{stream.upcase}") }
  end
  result.string
end