Merge pull request #2437 from coldnight/master
Correct warnings that contains Unicode message
This commit is contained in:
commit
8df3e55a31
|
@ -1,3 +1,9 @@
|
||||||
|
3.1.1 (unreleased)
|
||||||
|
==================
|
||||||
|
|
||||||
|
* Fix encoding errors for unicode warnings in Python 2.
|
||||||
|
|
||||||
|
|
||||||
3.1.0 (2017-05-22)
|
3.1.0 (2017-05-22)
|
||||||
==================
|
==================
|
||||||
|
|
||||||
|
|
|
@ -126,6 +126,7 @@ if _PY3:
|
||||||
import codecs
|
import codecs
|
||||||
imap = map
|
imap = map
|
||||||
STRING_TYPES = bytes, str
|
STRING_TYPES = bytes, str
|
||||||
|
UNICODE_TYPES = str,
|
||||||
|
|
||||||
def _escape_strings(val):
|
def _escape_strings(val):
|
||||||
"""If val is pure ascii, returns it as a str(). Otherwise, escapes
|
"""If val is pure ascii, returns it as a str(). Otherwise, escapes
|
||||||
|
@ -157,6 +158,7 @@ if _PY3:
|
||||||
return val.encode('unicode_escape').decode('ascii')
|
return val.encode('unicode_escape').decode('ascii')
|
||||||
else:
|
else:
|
||||||
STRING_TYPES = bytes, str, unicode
|
STRING_TYPES = bytes, str, unicode
|
||||||
|
UNICODE_TYPES = unicode,
|
||||||
|
|
||||||
from itertools import imap # NOQA
|
from itertools import imap # NOQA
|
||||||
|
|
||||||
|
|
|
@ -5,6 +5,8 @@ from contextlib import contextmanager
|
||||||
|
|
||||||
import pytest
|
import pytest
|
||||||
|
|
||||||
|
from _pytest import compat
|
||||||
|
|
||||||
|
|
||||||
def _setoption(wmod, arg):
|
def _setoption(wmod, arg):
|
||||||
"""
|
"""
|
||||||
|
@ -61,11 +63,24 @@ def catch_warnings_for_item(item):
|
||||||
yield
|
yield
|
||||||
|
|
||||||
for warning in log:
|
for warning in log:
|
||||||
|
warn_msg = warning.message
|
||||||
|
unicode_warning = False
|
||||||
|
|
||||||
|
if compat._PY2 and any(isinstance(m, compat.UNICODE_TYPES) for m in warn_msg.args):
|
||||||
|
warn_msg.args = [compat.safe_str(m) for m in warn_msg.args]
|
||||||
|
unicode_warning = True
|
||||||
|
|
||||||
msg = warnings.formatwarning(
|
msg = warnings.formatwarning(
|
||||||
warning.message, warning.category,
|
warn_msg, warning.category,
|
||||||
warning.filename, warning.lineno, warning.line)
|
warning.filename, warning.lineno, warning.line)
|
||||||
item.warn("unused", msg)
|
item.warn("unused", msg)
|
||||||
|
|
||||||
|
if unicode_warning:
|
||||||
|
warnings.warn(
|
||||||
|
"This warning %s is broken as it's message is not a str instance"
|
||||||
|
"(after all this is a stdlib problem workaround)" % msg,
|
||||||
|
UnicodeWarning)
|
||||||
|
|
||||||
|
|
||||||
@pytest.hookimpl(hookwrapper=True)
|
@pytest.hookimpl(hookwrapper=True)
|
||||||
def pytest_runtest_protocol(item):
|
def pytest_runtest_protocol(item):
|
||||||
|
|
|
@ -1,3 +1,8 @@
|
||||||
|
# -*- coding: utf8 -*-
|
||||||
|
from __future__ import unicode_literals
|
||||||
|
|
||||||
|
import sys
|
||||||
|
|
||||||
import pytest
|
import pytest
|
||||||
|
|
||||||
|
|
||||||
|
@ -106,3 +111,58 @@ def test_ignore(testdir, pyfile_with_warnings, method):
|
||||||
])
|
])
|
||||||
assert WARNINGS_SUMMARY_HEADER not in result.stdout.str()
|
assert WARNINGS_SUMMARY_HEADER not in result.stdout.str()
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.mark.skipif(sys.version_info < (3, 0),
|
||||||
|
reason='warnings message is unicode is ok in python3')
|
||||||
|
def test_unicode(testdir, pyfile_with_warnings):
|
||||||
|
testdir.makepyfile('''
|
||||||
|
# -*- coding: utf8 -*-
|
||||||
|
import warnings
|
||||||
|
import pytest
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.fixture
|
||||||
|
def fix():
|
||||||
|
warnings.warn(u"测试")
|
||||||
|
yield
|
||||||
|
|
||||||
|
def test_func(fix):
|
||||||
|
pass
|
||||||
|
''')
|
||||||
|
result = testdir.runpytest()
|
||||||
|
result.stdout.fnmatch_lines([
|
||||||
|
'*== %s ==*' % WARNINGS_SUMMARY_HEADER,
|
||||||
|
|
||||||
|
'*test_unicode.py:8: UserWarning: \u6d4b\u8bd5',
|
||||||
|
'*warnings.warn(u"\u6d4b\u8bd5")',
|
||||||
|
'* 1 passed, 1 warnings*',
|
||||||
|
])
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.mark.skipif(sys.version_info >= (3, 0),
|
||||||
|
reason='warnings message is broken as it is not str instance')
|
||||||
|
def test_py2_unicode(testdir, pyfile_with_warnings):
|
||||||
|
testdir.makepyfile('''
|
||||||
|
# -*- coding: utf8 -*-
|
||||||
|
import warnings
|
||||||
|
import pytest
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.fixture
|
||||||
|
def fix():
|
||||||
|
warnings.warn(u"测试")
|
||||||
|
yield
|
||||||
|
|
||||||
|
def test_func(fix):
|
||||||
|
pass
|
||||||
|
''')
|
||||||
|
result = testdir.runpytest()
|
||||||
|
result.stdout.fnmatch_lines([
|
||||||
|
'*== %s ==*' % WARNINGS_SUMMARY_HEADER,
|
||||||
|
|
||||||
|
'*test_py2_unicode.py:8: UserWarning: \u6d4b\u8bd5',
|
||||||
|
'*warnings.warn(u"\u6d4b\u8bd5")',
|
||||||
|
'*warnings.py:82: UnicodeWarning: This warning*\u6d4b\u8bd5',
|
||||||
|
'* 1 passed, 2 warnings*',
|
||||||
|
])
|
||||||
|
|
Loading…
Reference in New Issue