mirror of
https://github.com/python/cpython.git
synced 2025-08-01 15:43:13 +00:00
warnings.catch_warnings() now returns a list or None instead of the custom
WarningsRecorder object. This makes the API simpler to use as no special object must be learned. Closes issue 3781. Review by Benjamin Peterson.
This commit is contained in:
parent
631be01252
commit
672237dc6c
24 changed files with 268 additions and 253 deletions
|
@ -72,64 +72,69 @@ class FilterTests(object):
|
|||
"""Testing the filtering functionality."""
|
||||
|
||||
def test_error(self):
|
||||
with test_support.catch_warning(self.module) as w:
|
||||
with original_warnings.catch_warnings(module=self.module) as w:
|
||||
self.module.resetwarnings()
|
||||
self.module.filterwarnings("error", category=UserWarning)
|
||||
self.assertRaises(UserWarning, self.module.warn,
|
||||
"FilterTests.test_error")
|
||||
|
||||
def test_ignore(self):
|
||||
with test_support.catch_warning(module=self.module) as w:
|
||||
with original_warnings.catch_warnings(record=True,
|
||||
module=self.module) as w:
|
||||
self.module.resetwarnings()
|
||||
self.module.filterwarnings("ignore", category=UserWarning)
|
||||
self.module.warn("FilterTests.test_ignore", UserWarning)
|
||||
self.assertEquals(len(w), 0)
|
||||
|
||||
def test_always(self):
|
||||
with test_support.catch_warning(module=self.module) as w:
|
||||
with original_warnings.catch_warnings(record=True,
|
||||
module=self.module) as w:
|
||||
self.module.resetwarnings()
|
||||
self.module.filterwarnings("always", category=UserWarning)
|
||||
message = "FilterTests.test_always"
|
||||
self.module.warn(message, UserWarning)
|
||||
self.assert_(message, w.message)
|
||||
self.assert_(message, w[-1].message)
|
||||
self.module.warn(message, UserWarning)
|
||||
self.assert_(w.message, message)
|
||||
self.assert_(w[-1].message, message)
|
||||
|
||||
def test_default(self):
|
||||
with test_support.catch_warning(self.module) as w:
|
||||
with original_warnings.catch_warnings(record=True,
|
||||
module=self.module) as w:
|
||||
self.module.resetwarnings()
|
||||
self.module.filterwarnings("default", category=UserWarning)
|
||||
message = UserWarning("FilterTests.test_default")
|
||||
for x in xrange(2):
|
||||
self.module.warn(message, UserWarning)
|
||||
if x == 0:
|
||||
self.assertEquals(w.message, message)
|
||||
w.reset()
|
||||
self.assertEquals(w[-1].message, message)
|
||||
del w[:]
|
||||
elif x == 1:
|
||||
self.assert_(not len(w), "unexpected warning: " + str(w))
|
||||
self.assertEquals(len(w), 0)
|
||||
else:
|
||||
raise ValueError("loop variant unhandled")
|
||||
|
||||
def test_module(self):
|
||||
with test_support.catch_warning(self.module) as w:
|
||||
with original_warnings.catch_warnings(record=True,
|
||||
module=self.module) as w:
|
||||
self.module.resetwarnings()
|
||||
self.module.filterwarnings("module", category=UserWarning)
|
||||
message = UserWarning("FilterTests.test_module")
|
||||
self.module.warn(message, UserWarning)
|
||||
self.assertEquals(w.message, message)
|
||||
w.reset()
|
||||
self.assertEquals(w[-1].message, message)
|
||||
del w[:]
|
||||
self.module.warn(message, UserWarning)
|
||||
self.assert_(not len(w), "unexpected message: " + str(w))
|
||||
self.assertEquals(len(w), 0)
|
||||
|
||||
def test_once(self):
|
||||
with test_support.catch_warning(self.module) as w:
|
||||
with original_warnings.catch_warnings(record=True,
|
||||
module=self.module) as w:
|
||||
self.module.resetwarnings()
|
||||
self.module.filterwarnings("once", category=UserWarning)
|
||||
message = UserWarning("FilterTests.test_once")
|
||||
self.module.warn_explicit(message, UserWarning, "test_warnings.py",
|
||||
42)
|
||||
self.assertEquals(w.message, message)
|
||||
w.reset()
|
||||
self.assertEquals(w[-1].message, message)
|
||||
del w[:]
|
||||
self.module.warn_explicit(message, UserWarning, "test_warnings.py",
|
||||
13)
|
||||
self.assertEquals(len(w), 0)
|
||||
|
@ -138,19 +143,20 @@ class FilterTests(object):
|
|||
self.assertEquals(len(w), 0)
|
||||
|
||||
def test_inheritance(self):
|
||||
with test_support.catch_warning(self.module) as w:
|
||||
with original_warnings.catch_warnings(module=self.module) as w:
|
||||
self.module.resetwarnings()
|
||||
self.module.filterwarnings("error", category=Warning)
|
||||
self.assertRaises(UserWarning, self.module.warn,
|
||||
"FilterTests.test_inheritance", UserWarning)
|
||||
|
||||
def test_ordering(self):
|
||||
with test_support.catch_warning(self.module) as w:
|
||||
with original_warnings.catch_warnings(record=True,
|
||||
module=self.module) as w:
|
||||
self.module.resetwarnings()
|
||||
self.module.filterwarnings("ignore", category=UserWarning)
|
||||
self.module.filterwarnings("error", category=UserWarning,
|
||||
append=True)
|
||||
w.reset()
|
||||
del w[:]
|
||||
try:
|
||||
self.module.warn("FilterTests.test_ordering", UserWarning)
|
||||
except UserWarning:
|
||||
|
@ -160,28 +166,29 @@ class FilterTests(object):
|
|||
def test_filterwarnings(self):
|
||||
# Test filterwarnings().
|
||||
# Implicitly also tests resetwarnings().
|
||||
with test_support.catch_warning(self.module) as w:
|
||||
with original_warnings.catch_warnings(record=True,
|
||||
module=self.module) as w:
|
||||
self.module.filterwarnings("error", "", Warning, "", 0)
|
||||
self.assertRaises(UserWarning, self.module.warn, 'convert to error')
|
||||
|
||||
self.module.resetwarnings()
|
||||
text = 'handle normally'
|
||||
self.module.warn(text)
|
||||
self.assertEqual(str(w.message), text)
|
||||
self.assert_(w.category is UserWarning)
|
||||
self.assertEqual(str(w[-1].message), text)
|
||||
self.assert_(w[-1].category is UserWarning)
|
||||
|
||||
self.module.filterwarnings("ignore", "", Warning, "", 0)
|
||||
text = 'filtered out'
|
||||
self.module.warn(text)
|
||||
self.assertNotEqual(str(w.message), text)
|
||||
self.assertNotEqual(str(w[-1].message), text)
|
||||
|
||||
self.module.resetwarnings()
|
||||
self.module.filterwarnings("error", "hex*", Warning, "", 0)
|
||||
self.assertRaises(UserWarning, self.module.warn, 'hex/oct')
|
||||
text = 'nonmatching text'
|
||||
self.module.warn(text)
|
||||
self.assertEqual(str(w.message), text)
|
||||
self.assert_(w.category is UserWarning)
|
||||
self.assertEqual(str(w[-1].message), text)
|
||||
self.assert_(w[-1].category is UserWarning)
|
||||
|
||||
class CFilterTests(BaseTest, FilterTests):
|
||||
module = c_warnings
|
||||
|
@ -195,40 +202,51 @@ class WarnTests(unittest.TestCase):
|
|||
"""Test warnings.warn() and warnings.warn_explicit()."""
|
||||
|
||||
def test_message(self):
|
||||
with test_support.catch_warning(self.module) as w:
|
||||
with original_warnings.catch_warnings(record=True,
|
||||
module=self.module) as w:
|
||||
for i in range(4):
|
||||
text = 'multi %d' %i # Different text on each call.
|
||||
self.module.warn(text)
|
||||
self.assertEqual(str(w.message), text)
|
||||
self.assert_(w.category is UserWarning)
|
||||
self.assertEqual(str(w[-1].message), text)
|
||||
self.assert_(w[-1].category is UserWarning)
|
||||
|
||||
def test_filename(self):
|
||||
with warnings_state(self.module):
|
||||
with test_support.catch_warning(self.module) as w:
|
||||
with original_warnings.catch_warnings(record=True,
|
||||
module=self.module) as w:
|
||||
warning_tests.inner("spam1")
|
||||
self.assertEqual(os.path.basename(w.filename), "warning_tests.py")
|
||||
self.assertEqual(os.path.basename(w[-1].filename),
|
||||
"warning_tests.py")
|
||||
warning_tests.outer("spam2")
|
||||
self.assertEqual(os.path.basename(w.filename), "warning_tests.py")
|
||||
self.assertEqual(os.path.basename(w[-1].filename),
|
||||
"warning_tests.py")
|
||||
|
||||
def test_stacklevel(self):
|
||||
# Test stacklevel argument
|
||||
# make sure all messages are different, so the warning won't be skipped
|
||||
with warnings_state(self.module):
|
||||
with test_support.catch_warning(self.module) as w:
|
||||
with original_warnings.catch_warnings(record=True,
|
||||
module=self.module) as w:
|
||||
warning_tests.inner("spam3", stacklevel=1)
|
||||
self.assertEqual(os.path.basename(w.filename), "warning_tests.py")
|
||||
self.assertEqual(os.path.basename(w[-1].filename),
|
||||
"warning_tests.py")
|
||||
warning_tests.outer("spam4", stacklevel=1)
|
||||
self.assertEqual(os.path.basename(w.filename), "warning_tests.py")
|
||||
self.assertEqual(os.path.basename(w[-1].filename),
|
||||
"warning_tests.py")
|
||||
|
||||
warning_tests.inner("spam5", stacklevel=2)
|
||||
self.assertEqual(os.path.basename(w.filename), "test_warnings.py")
|
||||
self.assertEqual(os.path.basename(w[-1].filename),
|
||||
"test_warnings.py")
|
||||
warning_tests.outer("spam6", stacklevel=2)
|
||||
self.assertEqual(os.path.basename(w.filename), "warning_tests.py")
|
||||
self.assertEqual(os.path.basename(w[-1].filename),
|
||||
"warning_tests.py")
|
||||
warning_tests.outer("spam6.5", stacklevel=3)
|
||||
self.assertEqual(os.path.basename(w.filename), "test_warnings.py")
|
||||
self.assertEqual(os.path.basename(w[-1].filename),
|
||||
"test_warnings.py")
|
||||
|
||||
warning_tests.inner("spam7", stacklevel=9999)
|
||||
self.assertEqual(os.path.basename(w.filename), "sys")
|
||||
self.assertEqual(os.path.basename(w[-1].filename),
|
||||
"sys")
|
||||
|
||||
def test_missing_filename_not_main(self):
|
||||
# If __file__ is not specified and __main__ is not the module name,
|
||||
|
@ -237,9 +255,10 @@ class WarnTests(unittest.TestCase):
|
|||
try:
|
||||
del warning_tests.__file__
|
||||
with warnings_state(self.module):
|
||||
with test_support.catch_warning(self.module) as w:
|
||||
with original_warnings.catch_warnings(record=True,
|
||||
module=self.module) as w:
|
||||
warning_tests.inner("spam8", stacklevel=1)
|
||||
self.assertEqual(w.filename, warning_tests.__name__)
|
||||
self.assertEqual(w[-1].filename, warning_tests.__name__)
|
||||
finally:
|
||||
warning_tests.__file__ = filename
|
||||
|
||||
|
@ -254,9 +273,10 @@ class WarnTests(unittest.TestCase):
|
|||
del warning_tests.__file__
|
||||
warning_tests.__name__ = '__main__'
|
||||
with warnings_state(self.module):
|
||||
with test_support.catch_warning(self.module) as w:
|
||||
with original_warnings.catch_warnings(record=True,
|
||||
module=self.module) as w:
|
||||
warning_tests.inner('spam9', stacklevel=1)
|
||||
self.assertEqual(w.filename, sys.argv[0])
|
||||
self.assertEqual(w[-1].filename, sys.argv[0])
|
||||
finally:
|
||||
warning_tests.__file__ = filename
|
||||
warning_tests.__name__ = module_name
|
||||
|
@ -272,9 +292,10 @@ class WarnTests(unittest.TestCase):
|
|||
warning_tests.__name__ = '__main__'
|
||||
del sys.argv
|
||||
with warnings_state(self.module):
|
||||
with test_support.catch_warning(self.module) as w:
|
||||
with original_warnings.catch_warnings(record=True,
|
||||
module=self.module) as w:
|
||||
warning_tests.inner('spam10', stacklevel=1)
|
||||
self.assertEqual(w.filename, '__main__')
|
||||
self.assertEqual(w[-1].filename, '__main__')
|
||||
finally:
|
||||
warning_tests.__file__ = filename
|
||||
warning_tests.__name__ = module_name
|
||||
|
@ -292,9 +313,10 @@ class WarnTests(unittest.TestCase):
|
|||
warning_tests.__name__ = '__main__'
|
||||
sys.argv = ['']
|
||||
with warnings_state(self.module):
|
||||
with test_support.catch_warning(self.module) as w:
|
||||
with original_warnings.catch_warnings(record=True,
|
||||
module=self.module) as w:
|
||||
warning_tests.inner('spam11', stacklevel=1)
|
||||
self.assertEqual(w.filename, '__main__')
|
||||
self.assertEqual(w[-1].filename, '__main__')
|
||||
finally:
|
||||
warning_tests.__file__ = file_name
|
||||
warning_tests.__name__ = module_name
|
||||
|
@ -328,7 +350,7 @@ class WCmdLineTests(unittest.TestCase):
|
|||
def test_improper_input(self):
|
||||
# Uses the private _setoption() function to test the parsing
|
||||
# of command-line warning arguments
|
||||
with test_support.catch_warning(self.module):
|
||||
with original_warnings.catch_warnings(module=self.module):
|
||||
self.assertRaises(self.module._OptionError,
|
||||
self.module._setoption, '1:2:3:4:5:6')
|
||||
self.assertRaises(self.module._OptionError,
|
||||
|
@ -353,7 +375,7 @@ class _WarningsTests(BaseTest):
|
|||
|
||||
def test_filter(self):
|
||||
# Everything should function even if 'filters' is not in warnings.
|
||||
with test_support.catch_warning(self.module) as w:
|
||||
with original_warnings.catch_warnings(module=self.module) as w:
|
||||
self.module.filterwarnings("error", "", Warning, "", 0)
|
||||
self.assertRaises(UserWarning, self.module.warn,
|
||||
'convert to error')
|
||||
|
@ -368,21 +390,22 @@ class _WarningsTests(BaseTest):
|
|||
try:
|
||||
original_registry = self.module.onceregistry
|
||||
__warningregistry__ = {}
|
||||
with test_support.catch_warning(self.module) as w:
|
||||
with original_warnings.catch_warnings(record=True,
|
||||
module=self.module) as w:
|
||||
self.module.resetwarnings()
|
||||
self.module.filterwarnings("once", category=UserWarning)
|
||||
self.module.warn_explicit(message, UserWarning, "file", 42)
|
||||
self.failUnlessEqual(w.message, message)
|
||||
w.reset()
|
||||
self.failUnlessEqual(w[-1].message, message)
|
||||
del w[:]
|
||||
self.module.warn_explicit(message, UserWarning, "file", 42)
|
||||
self.assertEquals(len(w), 0)
|
||||
# Test the resetting of onceregistry.
|
||||
self.module.onceregistry = {}
|
||||
__warningregistry__ = {}
|
||||
self.module.warn('onceregistry test')
|
||||
self.failUnlessEqual(w.message.args, message.args)
|
||||
self.failUnlessEqual(w[-1].message.args, message.args)
|
||||
# Removal of onceregistry is okay.
|
||||
w.reset()
|
||||
del w[:]
|
||||
del self.module.onceregistry
|
||||
__warningregistry__ = {}
|
||||
self.module.warn_explicit(message, UserWarning, "file", 42)
|
||||
|
@ -393,7 +416,7 @@ class _WarningsTests(BaseTest):
|
|||
def test_showwarning_missing(self):
|
||||
# Test that showwarning() missing is okay.
|
||||
text = 'del showwarning test'
|
||||
with test_support.catch_warning(self.module):
|
||||
with original_warnings.catch_warnings(module=self.module):
|
||||
self.module.filterwarnings("always", category=UserWarning)
|
||||
del self.module.showwarning
|
||||
with test_support.captured_output('stderr') as stream:
|
||||
|
@ -414,7 +437,7 @@ class _WarningsTests(BaseTest):
|
|||
def test_show_warning_output(self):
|
||||
# With showarning() missing, make sure that output is okay.
|
||||
text = 'test show_warning'
|
||||
with test_support.catch_warning(self.module):
|
||||
with original_warnings.catch_warnings(module=self.module):
|
||||
self.module.filterwarnings("always", category=UserWarning)
|
||||
del self.module.showwarning
|
||||
with test_support.captured_output('stderr') as stream:
|
||||
|
@ -486,7 +509,6 @@ class PyWarningsDisplayTests(BaseTest, WarningsDisplayTests):
|
|||
module = py_warnings
|
||||
|
||||
|
||||
|
||||
class CatchWarningTests(BaseTest):
|
||||
|
||||
"""Test catch_warnings()."""
|
||||
|
@ -511,12 +533,12 @@ class CatchWarningTests(BaseTest):
|
|||
self.assertRaises(AttributeError, getattr, w, 'message')
|
||||
wmod.simplefilter("always")
|
||||
wmod.warn("foo")
|
||||
self.assertEqual(str(w.message), "foo")
|
||||
self.assertEqual(str(w[-1].message), "foo")
|
||||
wmod.warn("bar")
|
||||
self.assertEqual(str(w.message), "bar")
|
||||
self.assertEqual(str(w[-1].message), "bar")
|
||||
self.assertEqual(str(w[0].message), "foo")
|
||||
self.assertEqual(str(w[1].message), "bar")
|
||||
w.reset()
|
||||
del w[:]
|
||||
self.assertEqual(w, [])
|
||||
orig_showwarning = wmod.showwarning
|
||||
with wmod.catch_warnings(module=wmod, record=False) as w:
|
||||
|
@ -545,7 +567,7 @@ class ShowwarningDeprecationTests(BaseTest):
|
|||
def test_deprecation(self):
|
||||
# message, category, filename, lineno[, file[, line]]
|
||||
args = ("message", UserWarning, "file name", 42)
|
||||
with test_support.catch_warning(module=self.module):
|
||||
with original_warnings.catch_warnings(module=self.module):
|
||||
self.module.filterwarnings("error", category=DeprecationWarning)
|
||||
self.module.showwarning = self.bad_showwarning
|
||||
self.assertRaises(DeprecationWarning, self.module.warn_explicit,
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue