Sha256: 6a289d578b6e341c2aeb0f6089ba00477d3e93b6cbbe6b0cc55f8f979bb693e8

Contents?: true

Size: 1.38 KB

Versions: 23

Compression:

Stored size: 1.38 KB

Contents

# Safe way to intercept IO stream
# where just replacing STDOUT doesn't work:
# http://rubyforge.org/tracker/index.php?func=detail&aid=5217&group_id=426&atid=1698
#
module IoInterceptor
  def intercept
    begin
      @intercept = true
      @intercepted = ""
      yield
    ensure
      @intercept = false
    end
    @intercepted
  end

  def supress
    begin
      @supress = true
      yield
    ensure
      @supress = false
    end
  end

  def write(str)
    if @supress || @intercept
      @intercepted << str.to_s unless @supress 
      str.size
    else
      super
    end
  end
end

if $PROGRAM_NAME == __FILE__
  require 'spec'

  describe IoInterceptor do
    before do
      STDOUT.extend(IoInterceptor)
    end

    it "intercepts output to stream when the stream is extended with it" do
      STDOUT.intercept { STDOUT.puts("42") }.should == "42\n"
      STDOUT.intercept { STDOUT.puts("24") }.should == "24\n"
    end

    it "intercepted IO#write still returns the number of bytes written" do
      STDOUT.intercept { STDOUT.write("42").should == 2 }
    end

    it "intercepted IO#write argument is converted using to_s" do
      obj = "42"
      def obj.to_s
        "custom to_s"
      end
      
      STDOUT.intercept { STDOUT.puts(obj) }.should == "#{ obj.to_s }\n"
    end
  end

  exit ::Spec::Runner::CommandLine.run
end

Version data entries

23 entries across 23 versions & 2 rubygems

Version Path
dolzenko-0.0.27 lib/dolzenko/io_interceptor.rb
dolzenko-0.0.26 lib/dolzenko/io_interceptor.rb
dolzenko-0.0.25 lib/dolzenko/io_interceptor.rb
dolzenko-0.0.24 lib/dolzenko/io_interceptor.rb
dolzenko-0.0.23 lib/dolzenko/io_interceptor.rb
dolzenko-0.0.22 lib/dolzenko/io_interceptor.rb
dolzenko-0.0.21 lib/dolzenko/io_interceptor.rb
dolzenko-0.0.20 lib/dolzenko/io_interceptor.rb
dolzenko-0.0.19 lib/dolzenko/io_interceptor.rb
dolzenko-0.0.18 lib/dolzenko/io_interceptor.rb
dolzenko-0.0.17 lib/dolzenko/io_interceptor.rb
dolzenko-0.0.16 lib/dolzenko/io_interceptor.rb
dolzenko-0.0.15 lib/dolzenko/io_interceptor.rb
dolzenko-0.0.14 lib/dolzenko/io_interceptor.rb
dolzenko-0.0.13 lib/dolzenko/io_interceptor.rb
dolzenko-0.0.12 lib/dolzenko/io_interceptor.rb
dolzenko-0.0.11 lib/dolzenko/io_interceptor.rb
reflexive-0.1.2 spec/io_interceptor.rb
reflexive-0.1.1 spec/io_interceptor.rb
reflexive-0.1.0 spec/io_interceptor.rb