Merge pull request #4244 from RonnyPfannschmidt/fix-4243

fix #4243 - support positional argument stacklevel on python2
This commit is contained in:
Bruno Oliveira 2018-10-26 08:09:33 -03:00 committed by GitHub
commit 56989a8350
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 19 additions and 6 deletions

View File

@ -0,0 +1 @@
Fix regression when ``stacklevel`` for warnings was passed as positional argument on python2.

View File

@ -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

View File

@ -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