Add test.test_support.guard_warnings_filter . This function returns a context

manager that protects warnings.filter from being modified once the context is
exited.
This commit is contained in:
Brett Cannon 2006-12-13 23:09:53 +00:00
parent c745df8519
commit 6d9520c4f0
6 changed files with 37 additions and 26 deletions

View File

@ -263,6 +263,10 @@ If no match is found \var{filename} is returned.
This does not equal a failure since it could be the path to the file. This does not equal a failure since it could be the path to the file.
\end{funcdesc} \end{funcdesc}
\begin{funcdesc}{guard_warnings_filter}{}
Returns a context manager that guards the \module{warnings} module's
filter settings.
\begin{funcdesc}{run_unittest}{*classes} \begin{funcdesc}{run_unittest}{*classes}
Execute \class{unittest.TestCase} subclasses passed to the function. Execute \class{unittest.TestCase} subclasses passed to the function.
The function scans the classes for methods starting with the prefix The function scans the classes for methods starting with the prefix

View File

@ -1,10 +1,11 @@
from test.test_support import TESTFN, run_unittest from test.test_support import TESTFN, run_unittest, guard_warnings_filter
import unittest import unittest
import os import os
import random import random
import sys import sys
import py_compile import py_compile
import warnings
def remove_files(name): def remove_files(name):
@ -204,15 +205,11 @@ class ImportTest(unittest.TestCase):
self.assert_(y is test.test_support, y.__name__) self.assert_(y is test.test_support, y.__name__)
def test_import_initless_directory_warning(self): def test_import_initless_directory_warning(self):
import warnings with guard_warnings_filter():
oldfilters = warnings.filters[:]
warnings.simplefilter('error', ImportWarning);
try:
# Just a random non-package directory we always expect to be # Just a random non-package directory we always expect to be
# somewhere in sys.path... # somewhere in sys.path...
warnings.simplefilter('error', ImportWarning)
self.assertRaises(ImportWarning, __import__, "site-packages") self.assertRaises(ImportWarning, __import__, "site-packages")
finally:
warnings.filters = oldfilters
def test_main(verbose=None): def test_main(verbose=None):
run_unittest(ImportTest) run_unittest(ImportTest)

View File

@ -178,10 +178,9 @@ class WichmannHill_TestBasicOps(TestBasicOps):
def test_bigrand(self): def test_bigrand(self):
# Verify warnings are raised when randrange is too large for random() # Verify warnings are raised when randrange is too large for random()
oldfilters = warnings.filters[:] with test_support.guard_warnings_filter():
warnings.filterwarnings("error", "Underlying random") warnings.filterwarnings("error", "Underlying random")
self.assertRaises(UserWarning, self.gen.randrange, 2**60) self.assertRaises(UserWarning, self.gen.randrange, 2**60)
warnings.filters[:] = oldfilters
class SystemRandom_TestBasicOps(TestBasicOps): class SystemRandom_TestBasicOps(TestBasicOps):
gen = random.SystemRandom() gen = random.SystemRandom()

View File

@ -50,22 +50,17 @@ def any_err(func, *args):
def with_warning_restore(func): def with_warning_restore(func):
def _with_warning_restore(*args, **kw): def _with_warning_restore(*args, **kw):
# The `warnings` module doesn't have an advertised way to restore with test.test_support.guard_warnings_filter():
# its filter list. Cheat. # Grrr, we need this function to warn every time. Without removing
save_warnings_filters = warnings.filters[:] # the warningregistry, running test_tarfile then test_struct would fail
# Grrr, we need this function to warn every time. Without removing # on 64-bit platforms.
# the warningregistry, running test_tarfile then test_struct would fail globals = func.func_globals
# on 64-bit platforms. if '__warningregistry__' in globals:
globals = func.func_globals del globals['__warningregistry__']
if '__warningregistry__' in globals: warnings.filterwarnings("error", r"""^struct.*""", DeprecationWarning)
del globals['__warningregistry__'] warnings.filterwarnings("error", r""".*format requires.*""",
warnings.filterwarnings("error", r"""^struct.*""", DeprecationWarning) DeprecationWarning)
warnings.filterwarnings("error", r""".*format requires.*""",
DeprecationWarning)
try:
return func(*args, **kw) return func(*args, **kw)
finally:
warnings.filters[:] = save_warnings_filters[:]
return _with_warning_restore return _with_warning_restore
def deprecated_err(func, *args): def deprecated_err(func, *args):

View File

@ -3,7 +3,9 @@
if __name__ != 'test.test_support': if __name__ != 'test.test_support':
raise ImportError, 'test_support must be imported from the test package' raise ImportError, 'test_support must be imported from the test package'
from contextlib import contextmanager
import sys import sys
import warnings
class Error(Exception): class Error(Exception):
"""Base class for regression test exceptions.""" """Base class for regression test exceptions."""
@ -269,6 +271,16 @@ def open_urlresource(url):
fn, _ = urllib.urlretrieve(url, filename) fn, _ = urllib.urlretrieve(url, filename)
return open(fn) return open(fn)
@contextmanager
def guard_warnings_filter():
"""Guard the warnings filter from being permanently changed."""
original_filters = warnings.filters[:]
try:
yield
finally:
warnings.filters = original_filters
#======================================================================= #=======================================================================
# Decorator for running a function in a different locale, correctly resetting # Decorator for running a function in a different locale, correctly resetting
# it afterwards. # it afterwards.

View File

@ -302,6 +302,10 @@ Extension Modules
Tests Tests
----- -----
- Added guard_warnings_filter to test.test_support. It returns a context
manager that protects the 'warnings' module's filter from being mutated
once the context has been exited.
- Added some tests for modulefinder. - Added some tests for modulefinder.
- Converted test_imp to use unittest. - Converted test_imp to use unittest.