--- /dev/null
+module Kernel
+ # Sets $VERBOSE to nil for the duration of the block and back to its original value afterwards.
+ #
+ # silence_warnings do
+ # value = noisy_call # no warning voiced
+ # end
+ #
+ # noisy_call # warning voiced
+ def silence_warnings
+ old_verbose, $VERBOSE = $VERBOSE, nil
+ yield
+ ensure
+ $VERBOSE = old_verbose
+ end
+
+ # Sets $VERBOSE to true for the duration of the block and back to its original value afterwards.
+ def enable_warnings
+ old_verbose, $VERBOSE = $VERBOSE, true
+ yield
+ ensure
+ $VERBOSE = old_verbose
+ end
+
+ # For compatibility
+ def silence_stderr #:nodoc:
+ silence_stream(STDERR) { yield }
+ end
+
+ # Silences any stream for the duration of the block.
+ #
+ # silence_stream(STDOUT) do
+ # puts 'This will never be seen'
+ # end
+ #
+ # puts 'But this will'
+ def silence_stream(stream)
+ old_stream = stream.dup
+ stream.reopen(RUBY_PLATFORM =~ /mswin/ ? 'NUL:' : '/dev/null')
+ stream.sync = true
+ yield
+ ensure
+ stream.reopen(old_stream)
+ end
+
+ # Blocks and ignores any exception passed as argument if raised within the block.
+ #
+ # suppress(ZeroDivisionError) do
+ # 1/0
+ # puts "This code is NOT reached"
+ # end
+ #
+ # puts "This code gets executed and nothing related to ZeroDivisionError was seen"
+ def suppress(*exception_classes)
+ begin yield
+ rescue Exception => e
+ raise unless exception_classes.any? { |cls| e.kind_of?(cls) }
+ end
+ end
+end
\ No newline at end of file