diff --git a/activesupport/CHANGELOG b/activesupport/CHANGELOG index 1708723f8c43e533bece74622547f363d0c8005b..6bd6613a8febacbb788a32fde208c058a7d9be59 100644 --- a/activesupport/CHANGELOG +++ b/activesupport/CHANGELOG @@ -1,6 +1,6 @@ *SVN* -* Turn warnings on when loading a file if Dependencies.mechanism == :load. Common mistakes such as redefined methods will print warnings to stderr. [Jeremy Kemper] +* Introduce enable_warnings counterpart to silence_warnings. Turn warnings on when loading a file if Dependencies.mechanism == :load. Common mistakes such as redefined methods will print warnings to stderr. [Jeremy Kemper] * Add Symbol#to_proc, which allows for, e.g. [:foo, :bar].map(&:to_s). [Marcel Molina Jr.] diff --git a/activesupport/lib/active_support/core_ext/kernel.rb b/activesupport/lib/active_support/core_ext/kernel.rb index b687af03f6d22dc7b098441d725f15c55ad86375..d722c306cd0a9ca594e6ab8acdeb6cc4693453af 100644 --- a/activesupport/lib/active_support/core_ext/kernel.rb +++ b/activesupport/lib/active_support/core_ext/kernel.rb @@ -29,6 +29,14 @@ def silence_warnings $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 + # Silences stderr for the duration of the block. # # silence_stderr do @@ -54,26 +62,27 @@ def `(command) #:nodoc: rescue Errno::ENOENT => e STDERR.puts "#$0: #{e}" end - - # Method that requires a library, ensuring that rubygems is loaded + + # Require a library with fallback to RubyGems. Warnings during library + # loading are silenced to increase signal/noise for application warnings. def require_library_or_gem(library_name) - begin - require library_name - rescue LoadError => cannot_require - # 1. Requiring the module is unsuccessful, maybe it's a gem and nobody required rubygems yet. Try. - begin - require 'rubygems' - rescue LoadError => rubygems_not_installed - raise cannot_require - end - # 2. Rubygems is installed and loaded. Try to load the library again + silence_warnings do begin require library_name - rescue LoadError => gem_not_installed - raise cannot_require + rescue LoadError => cannot_require + # 1. Requiring the module is unsuccessful, maybe it's a gem and nobody required rubygems yet. Try. + begin + require 'rubygems' + rescue LoadError => rubygems_not_installed + raise cannot_require + end + # 2. Rubygems is installed and loaded. Try to load the library again + begin + require library_name + rescue LoadError => gem_not_installed + raise cannot_require + end end end end - - end diff --git a/activesupport/lib/active_support/dependencies.rb b/activesupport/lib/active_support/dependencies.rb index 30911453bc32eb88feae863f0e521b2a24500f9b..b0aca1ee97df56428b2826b2c142290e5c6f7c2a 100644 --- a/activesupport/lib/active_support/dependencies.rb +++ b/activesupport/lib/active_support/dependencies.rb @@ -1,5 +1,6 @@ require File.dirname(__FILE__) + '/module_attribute_accessors' require File.dirname(__FILE__) + '/core_ext/load_error' +require File.dirname(__FILE__) + '/core_ext/kernel' module Dependencies #:nodoc: extend self @@ -37,12 +38,7 @@ def clear def require_or_load(file_name) file_name = "#{file_name}.rb" unless ! load? || file_name[-3..-1] == '.rb' if load? - begin - original_verbosity, $VERBOSE = $VERBOSE, true - load file_name - ensure - $VERBOSE = original_verbosity - end + enable_warnings { load file_name } else require file_name end diff --git a/activesupport/test/core_ext/kernel_test.rb b/activesupport/test/core_ext/kernel_test.rb index 72fd57f6cad97c2f025c77c8e32d8722919be843..60c3d1ba8614e141502994d86a3e27ce802063f5 100644 --- a/activesupport/test/core_ext/kernel_test.rb +++ b/activesupport/test/core_ext/kernel_test.rb @@ -9,24 +9,33 @@ def test_silence_warnings def test_silence_warnings_verbose_invariant old_verbose = $VERBOSE - begin - silence_warnings { raise } - flunk - rescue - assert_equal old_verbose, $VERBOSE - end + silence_warnings { raise } + flunk + rescue + assert_equal old_verbose, $VERBOSE end - - def test_silence_warnings_with_return_value - assert_equal 1, silence_warnings { 1 } + + + def test_enable_warnings + enable_warnings { assert_equal true, $VERBOSE } + assert_equal 1234, enable_warnings { 1234 } + end + + def test_enable_warnings_verbose_invariant + old_verbose = $VERBOSE + enable_warnings { raise } + flunk + rescue + assert_equal old_verbose, $VERBOSE 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