reencode non-ascii python2 assertion reprs, fixes #877

i decided against using a warning since the problem goes away with python3
the support code can be removed once we drop python2 in 10 years or so
This commit is contained in:
Ronny Pfannschmidt 2015-07-25 10:16:05 +02:00
parent f02d9425f9
commit 49c99a41ea
3 changed files with 22 additions and 1 deletions

View File

@ -193,6 +193,9 @@
2.7.3 (compared to 2.7.2) 2.7.3 (compared to 2.7.2)
----------------------------- -----------------------------
- fix issue 877: propperly handle assertion explanations with non-ascii repr
Thanks Mathieu Agopian for the report
- Allow 'dev', 'rc', or other non-integer version strings in `importorskip`. - Allow 'dev', 'rc', or other non-integer version strings in `importorskip`.
Thanks to Eric Hunsberger for the PR. Thanks to Eric Hunsberger for the PR.

View File

@ -129,7 +129,14 @@ def assertrepr_compare(config, op, left, right):
width = 80 - 15 - len(op) - 2 # 15 chars indentation, 1 space around op width = 80 - 15 - len(op) - 2 # 15 chars indentation, 1 space around op
left_repr = py.io.saferepr(left, maxsize=int(width/2)) left_repr = py.io.saferepr(left, maxsize=int(width/2))
right_repr = py.io.saferepr(right, maxsize=width-len(left_repr)) right_repr = py.io.saferepr(right, maxsize=width-len(left_repr))
summary = u('%s %s %s') % (left_repr, op, right_repr)
# the reencoding is needed for python2 repr
# with non-ascii characters (see isssue 877)
summary = u('%s %s %s') % (
u(left_repr, 'utf-8', 'replace'),
op,
u(right_repr, 'utf-8', 'replace'),
)
issequence = lambda x: (isinstance(x, (list, tuple, Sequence)) issequence = lambda x: (isinstance(x, (list, tuple, Sequence))
and not isinstance(x, basestring)) and not isinstance(x, basestring))

View File

@ -231,6 +231,17 @@ class TestAssert_reprcompare:
assert expl[1] == py.builtin._totext('- £€', 'utf-8') assert expl[1] == py.builtin._totext('- £€', 'utf-8')
assert expl[2] == py.builtin._totext('+ £', 'utf-8') assert expl[2] == py.builtin._totext('+ £', 'utf-8')
def test_nonascii_text(self):
"""
:issue: 877
non ascii python2 str caused a UnicodeDecodeError
"""
class A(str):
def __repr__(self):
return '\xff'
expl = callequal(A(), '1')
assert expl
def test_mojibake(self): def test_mojibake(self):
# issue 429 # issue 429
left = 'e' left = 'e'