aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--activesupport/CHANGELOG4
-rw-r--r--activesupport/lib/active_support/core_ext/kernel.rb26
-rw-r--r--activesupport/test/core_ext/kernel_test.rb10
3 files changed, 40 insertions, 0 deletions
diff --git a/activesupport/CHANGELOG b/activesupport/CHANGELOG
index be4ed83c54..faf281f0a5 100644
--- a/activesupport/CHANGELOG
+++ b/activesupport/CHANGELOG
@@ -1,5 +1,9 @@
*SVN*
+* Added Kernel#silence_stderr to silence stderr for the duration of the given block [Sam Stephenson]
+
+* Changed Kernel#` to print a message to stderr (like Unix) instead of raising Errno::ENOENT on Win32 [Sam Stephenson]
+
* Changed 0.blank? to false rather than true since it violates everyone's expectation of blankness. #2518, #2705 [rails@jeffcole.net]
* When loading classes using const_missing, raise a NameError if and only if the file we tried to load was not present. [Nicholas Seckar]
diff --git a/activesupport/lib/active_support/core_ext/kernel.rb b/activesupport/lib/active_support/core_ext/kernel.rb
index 168c9cddd3..310bba0904 100644
--- a/activesupport/lib/active_support/core_ext/kernel.rb
+++ b/activesupport/lib/active_support/core_ext/kernel.rb
@@ -29,6 +29,32 @@ module Kernel
$VERBOSE = old_verbose
end
+ # Silences stderr for the duration of the block.
+ #
+ # silence_stderr do
+ # $stderr.puts 'This will never be seen'
+ # end
+ #
+ # $stderr.puts 'But this will'
+ def silence_stderr
+ old_stderr = STDERR.dup
+ STDERR.reopen(RUBY_PLATFORM =~ /mswin/ ? 'NUL:' : '/dev/null')
+ STDERR.sync = true
+ yield
+ ensure
+ STDERR.reopen(old_stderr)
+ end
+
+ # Makes backticks behave (somewhat more) similarly on all platforms.
+ # On win32 `nonexistent_command` raises Errno::ENOENT; on Unix, the
+ # spawned shell prints a message to stderr and sets $?. We emulate
+ # Unix on the former but not the latter.
+ def `(command) #:nodoc:
+ super
+ rescue Errno::ENOENT => e
+ STDERR.puts "#$0: #{e}"
+ end
+
# Method that requires a library, ensuring that rubygems is loaded
def require_library_or_gem(library_name)
begin
diff --git a/activesupport/test/core_ext/kernel_test.rb b/activesupport/test/core_ext/kernel_test.rb
index 7d1565157a..e2d89176b9 100644
--- a/activesupport/test/core_ext/kernel_test.rb
+++ b/activesupport/test/core_ext/kernel_test.rb
@@ -20,4 +20,14 @@ class KernelTest < Test::Unit::TestCase
def test_silence_warnings_with_return_value
assert_equal 1, silence_warnings { 1 }
end
+
+ def test_silence_stderr
+ old_stderr_position = STDERR.tell
+ silence_stderr { STDERR.puts 'hello world' }
+ assert_equal old_stderr_position, STDERR.tell
+ end
+
+ def test_silence_stderr_with_return_value
+ assert_equal 1, silence_stderr { 1 }
+ end
end