Merge pull request #4195 from nicoddemus/issue-3691
Use safe_str() to format warning message about unicode in Python 2
This commit is contained in:
commit
2abd005cc9
|
@ -0,0 +1,2 @@
|
||||||
|
Python 2: safely format warning message about passing unicode strings to ``warnings.warn``, which may cause
|
||||||
|
surprising ``MemoryError`` exception when monkey patching ``warnings.warn`` itself.
|
|
@ -123,7 +123,7 @@ def warning_record_to_str(warning_message):
|
||||||
if unicode_warning:
|
if unicode_warning:
|
||||||
warnings.warn(
|
warnings.warn(
|
||||||
"Warning is using unicode non convertible to ascii, "
|
"Warning is using unicode non convertible to ascii, "
|
||||||
"converting to a safe representation:\n %s" % msg,
|
"converting to a safe representation:\n {!r}".format(compat.safe_str(msg)),
|
||||||
UnicodeWarning,
|
UnicodeWarning,
|
||||||
)
|
)
|
||||||
return msg
|
return msg
|
||||||
|
|
|
@ -3,6 +3,8 @@ from __future__ import unicode_literals
|
||||||
|
|
||||||
import sys
|
import sys
|
||||||
|
|
||||||
|
import six
|
||||||
|
|
||||||
import pytest
|
import pytest
|
||||||
|
|
||||||
|
|
||||||
|
@ -562,3 +564,30 @@ class TestDeprecationWarningsByDefault:
|
||||||
monkeypatch.setenv(str("PYTHONWARNINGS"), str("once::UserWarning"))
|
monkeypatch.setenv(str("PYTHONWARNINGS"), str("once::UserWarning"))
|
||||||
result = testdir.runpytest_subprocess()
|
result = testdir.runpytest_subprocess()
|
||||||
assert WARNINGS_SUMMARY_HEADER not in result.stdout.str()
|
assert WARNINGS_SUMMARY_HEADER not in result.stdout.str()
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.mark.skipif(six.PY3, reason="Python 2 only issue")
|
||||||
|
def test_infinite_loop_warning_against_unicode_usage_py2(testdir):
|
||||||
|
"""
|
||||||
|
We need to be careful when raising the warning about unicode usage with "warnings.warn"
|
||||||
|
because it might be overwritten by users and this itself causes another warning (#3691).
|
||||||
|
"""
|
||||||
|
testdir.makepyfile(
|
||||||
|
"""
|
||||||
|
# -*- coding: utf8 -*-
|
||||||
|
from __future__ import unicode_literals
|
||||||
|
import warnings
|
||||||
|
import pytest
|
||||||
|
|
||||||
|
def _custom_showwarning(message, *a, **b):
|
||||||
|
return "WARNING: {}".format(message)
|
||||||
|
|
||||||
|
warnings.formatwarning = _custom_showwarning
|
||||||
|
|
||||||
|
@pytest.mark.filterwarnings("default")
|
||||||
|
def test_custom_warning_formatter():
|
||||||
|
warnings.warn("¥")
|
||||||
|
"""
|
||||||
|
)
|
||||||
|
result = testdir.runpytest_subprocess()
|
||||||
|
result.stdout.fnmatch_lines(["*1 passed, * warnings in*"])
|
||||||
|
|
6
tox.ini
6
tox.ini
|
@ -18,7 +18,7 @@ envlist =
|
||||||
|
|
||||||
[testenv]
|
[testenv]
|
||||||
commands =
|
commands =
|
||||||
{env:_PYTEST_TOX_COVERAGE_RUN:} pytest --lsof
|
{env:_PYTEST_TOX_COVERAGE_RUN:} pytest --lsof {posargs}
|
||||||
coverage: coverage combine
|
coverage: coverage combine
|
||||||
coverage: coverage report
|
coverage: coverage report
|
||||||
passenv = USER USERNAME COVERAGE_* TRAVIS
|
passenv = USER USERNAME COVERAGE_* TRAVIS
|
||||||
|
@ -41,7 +41,7 @@ deps =
|
||||||
py27: mock
|
py27: mock
|
||||||
nose
|
nose
|
||||||
commands =
|
commands =
|
||||||
pytest -n auto --runpytest=subprocess
|
pytest -n auto --runpytest=subprocess {posargs}
|
||||||
|
|
||||||
|
|
||||||
[testenv:linting]
|
[testenv:linting]
|
||||||
|
@ -58,7 +58,7 @@ deps =
|
||||||
hypothesis>=3.56
|
hypothesis>=3.56
|
||||||
{env:_PYTEST_TOX_EXTRA_DEP:}
|
{env:_PYTEST_TOX_EXTRA_DEP:}
|
||||||
commands =
|
commands =
|
||||||
{env:_PYTEST_TOX_COVERAGE_RUN:} pytest -n auto
|
{env:_PYTEST_TOX_COVERAGE_RUN:} pytest -n auto {posargs}
|
||||||
|
|
||||||
[testenv:py36-xdist]
|
[testenv:py36-xdist]
|
||||||
# NOTE: copied from above due to https://github.com/tox-dev/tox/issues/706.
|
# NOTE: copied from above due to https://github.com/tox-dev/tox/issues/706.
|
||||||
|
|
Loading…
Reference in New Issue