From 1b431d66448fccb94b804d5b2b4f57a80114a5ea Mon Sep 17 00:00:00 2001 From: Marcin Biernat Date: Fri, 12 Feb 2016 15:54:36 +0100 Subject: [PATCH] fix formatting utf-8 error explanation --- CHANGELOG.rst | 5 +++++ _pytest/assertion/util.py | 18 ++++++++++-------- testing/test_assertion.py | 3 +++ 3 files changed, 18 insertions(+), 8 deletions(-) diff --git a/CHANGELOG.rst b/CHANGELOG.rst index 132c2a2f6..acbe12c87 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -62,12 +62,17 @@ * Fix (`#1290`_): support Python 3.5's `@` operator in assertion rewriting. Thanks `@Shinkenjoe`_ for report with test case and `@tomviner`_ for the PR. +* Fix formatting utf-8 explanation messages (`#1379`_). + Thanks `@biern`_ for the PR. + +.. _#1379: https://github.com/pytest-dev/pytest/issues/1379 .. _#1366: https://github.com/pytest-dev/pytest/issues/1366 .. _#1040: https://github.com/pytest-dev/pytest/pull/1040 .. _#680: https://github.com/pytest-dev/pytest/issues/680 .. _#1287: https://github.com/pytest-dev/pytest/pull/1287 .. _#1226: https://github.com/pytest-dev/pytest/pull/1226 .. _#1290: https://github.com/pytest-dev/pytest/pull/1290 +.. _@biern: https://github.com/biern .. _@MichaelAquilina: https://github.com/MichaelAquilina .. _@bukzor: https://github.com/bukzor .. _@hpk42: https://github.com/hpk42 diff --git a/_pytest/assertion/util.py b/_pytest/assertion/util.py index 2c1e39c02..f2f23efea 100644 --- a/_pytest/assertion/util.py +++ b/_pytest/assertion/util.py @@ -18,6 +18,15 @@ u = py.builtin._totext _reprcompare = None +# the re-encoding is needed for python2 repr +# with non-ascii characters (see issue 877 and 1379) +def ecu(s): + try: + return u(s, 'utf-8', 'replace') + except TypeError: + return s + + def format_explanation(explanation): """This formats an explanation @@ -28,6 +37,7 @@ def format_explanation(explanation): for when one explanation needs to span multiple lines, e.g. when displaying diffs. """ + explanation = ecu(explanation) explanation = _collapse_false(explanation) lines = _split_explanation(explanation) result = _format_lines(lines) @@ -131,14 +141,6 @@ def assertrepr_compare(config, op, left, right): left_repr = py.io.saferepr(left, maxsize=int(width/2)) right_repr = py.io.saferepr(right, maxsize=width-len(left_repr)) - # the re-encoding is needed for python2 repr - # with non-ascii characters (see issue 877) - def ecu(s): - try: - return u(s, 'utf-8', 'replace') - except TypeError: - return s - summary = u('%s %s %s') % (ecu(left_repr), op, ecu(right_repr)) issequence = lambda x: (isinstance(x, (list, tuple, Sequence)) and diff --git a/testing/test_assertion.py b/testing/test_assertion.py index f259f7fa1..347278e19 100644 --- a/testing/test_assertion.py +++ b/testing/test_assertion.py @@ -242,6 +242,9 @@ class TestAssert_reprcompare: expl = callequal(A(), '1') assert expl + def test_format_nonascii_explanation(self): + assert util.format_explanation('λ') + def test_mojibake(self): # issue 429 left = 'e'