Merge pull request #4244 from RonnyPfannschmidt/fix-4243
fix #4243 - support positional argument stacklevel on python2
This commit is contained in:
commit
56989a8350
|
@ -0,0 +1 @@
|
||||||
|
Fix regression when ``stacklevel`` for warnings was passed as positional argument on python2.
|
|
@ -156,21 +156,27 @@ class WarningsRecorder(warnings.catch_warnings):
|
||||||
# trivial patching of `warnings.warn` seems to be enough somehow?
|
# trivial patching of `warnings.warn` seems to be enough somehow?
|
||||||
if six.PY2:
|
if six.PY2:
|
||||||
|
|
||||||
def warn(*args, **kwargs):
|
def warn(message, category=None, stacklevel=1):
|
||||||
kwargs.setdefault("stacklevel", 1)
|
# duplicate the stdlib logic due to
|
||||||
kwargs["stacklevel"] += 1
|
# bad handing in the c version of warnings
|
||||||
|
if isinstance(message, Warning):
|
||||||
|
category = message.__class__
|
||||||
|
# Check category argument
|
||||||
|
if category is None:
|
||||||
|
category = UserWarning
|
||||||
|
assert issubclass(category, Warning)
|
||||||
|
|
||||||
# emulate resetting the warn registry
|
# emulate resetting the warn registry
|
||||||
f_globals = sys._getframe(kwargs["stacklevel"] - 1).f_globals
|
f_globals = sys._getframe(stacklevel).f_globals
|
||||||
if "__warningregistry__" in f_globals:
|
if "__warningregistry__" in f_globals:
|
||||||
orig = f_globals["__warningregistry__"]
|
orig = f_globals["__warningregistry__"]
|
||||||
f_globals["__warningregistry__"] = None
|
f_globals["__warningregistry__"] = None
|
||||||
try:
|
try:
|
||||||
return self._saved_warn(*args, **kwargs)
|
return self._saved_warn(message, category, stacklevel + 1)
|
||||||
finally:
|
finally:
|
||||||
f_globals["__warningregistry__"] = orig
|
f_globals["__warningregistry__"] = orig
|
||||||
else:
|
else:
|
||||||
return self._saved_warn(*args, **kwargs)
|
return self._saved_warn(message, category, stacklevel + 1)
|
||||||
|
|
||||||
warnings.warn, self._saved_warn = warn, warnings.warn
|
warnings.warn, self._saved_warn = warn, warnings.warn
|
||||||
return self
|
return self
|
||||||
|
|
|
@ -46,6 +46,12 @@ class TestWarningsRecorderChecker(object):
|
||||||
assert values is rec.list
|
assert values is rec.list
|
||||||
pytest.raises(AssertionError, "rec.pop()")
|
pytest.raises(AssertionError, "rec.pop()")
|
||||||
|
|
||||||
|
@pytest.mark.issue(4243)
|
||||||
|
def test_warn_stacklevel(self):
|
||||||
|
rec = WarningsRecorder()
|
||||||
|
with rec:
|
||||||
|
warnings.warn("test", DeprecationWarning, 2)
|
||||||
|
|
||||||
def test_typechecking(self):
|
def test_typechecking(self):
|
||||||
from _pytest.recwarn import WarningsChecker
|
from _pytest.recwarn import WarningsChecker
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue