From 1c0c78c61f440de7187f62ecdd1cc828f0a2e95e Mon Sep 17 00:00:00 2001 From: Mark Dickinson Date: Fri, 5 Mar 2010 14:36:20 +0000 Subject: [PATCH] Fix incorrect stacklevel for DeprecationWarnings originating from the struct module. Also clean up related tests in test_struct. The stacklevel fix should be backported to 2.6 once that branch is unfrozen. --- Lib/test/test_struct.py | 51 ++++++++++++----------------------------- Modules/_struct.c | 2 +- 2 files changed, 16 insertions(+), 37 deletions(-) diff --git a/Lib/test/test_struct.py b/Lib/test/test_struct.py index fc48c11e6b..c315d8a315 100644 --- a/Lib/test/test_struct.py +++ b/Lib/test/test_struct.py @@ -23,13 +23,6 @@ except struct.error: else: HAVE_LONG_LONG = True -try: - import _struct -except ImportError: - PY_STRUCT_FLOAT_COERCE = 2 -else: - PY_STRUCT_FLOAT_COERCE = getattr(_struct, '_PY_STRUCT_FLOAT_COERCE', 0) - def string_reverse(s): return "".join(reversed(s)) @@ -39,39 +32,25 @@ def bigendian_to_native(value): else: return string_reverse(value) -def with_warning_restore(func): - @wraps(func) - def decorator(*args, **kw): - with warnings.catch_warnings(): - # We need this function to warn every time, so stick an - # unqualifed 'always' at the head of the filter list - warnings.simplefilter("always") - warnings.filterwarnings("error", category=DeprecationWarning) - return func(*args, **kw) - return decorator - class StructTest(unittest.TestCase): - @with_warning_restore def check_float_coerce(self, format, number): # SF bug 1530559. struct.pack raises TypeError where it used to convert. - if PY_STRUCT_FLOAT_COERCE == 2: - # Test for pre-2.5 struct module - packed = struct.pack(format, number) - floored = struct.unpack(format, packed)[0] - self.assertEqual(floored, int(number), - "did not correcly coerce float to int") - return - try: - struct.pack(format, number) - except struct.error: - if PY_STRUCT_FLOAT_COERCE: - self.fail("expected DeprecationWarning for float coerce") - except DeprecationWarning: - if not PY_STRUCT_FLOAT_COERCE: - self.fail("expected to raise struct.error for float coerce") - else: - self.fail("did not raise error for float coerce") + with warnings.catch_warnings(): + warnings.filterwarnings( + "ignore", + category=DeprecationWarning, + message=".*integer argument expected, got float", + module=__name__) + self.assertEqual(struct.pack(format, number), struct.pack(format, int(number))) + + with warnings.catch_warnings(): + warnings.filterwarnings( + "error", + category=DeprecationWarning, + message=".*integer argument expected, got float", + module="unittest") + self.assertRaises(DeprecationWarning, struct.pack, format, number) def test_isbigendian(self): self.assertEqual((struct.pack('=i', 1)[0] == chr(0)), ISBIGENDIAN) diff --git a/Modules/_struct.c b/Modules/_struct.c index 27f8881fc0..d7cc77fb0e 100644 --- a/Modules/_struct.c +++ b/Modules/_struct.c @@ -121,7 +121,7 @@ get_pylong(PyObject *v) } #ifdef PY_STRUCT_FLOAT_COERCE if (PyFloat_Check(v)) { - if (PyErr_WarnEx(PyExc_DeprecationWarning, FLOAT_COERCE, 2)<0) + if (PyErr_WarnEx(PyExc_DeprecationWarning, FLOAT_COERCE, 1)<0) return NULL; return PyNumber_Long(v); } -- 2.50.0