use wcwidth
This commit is contained in:
parent
f599172add
commit
df377b589f
1
setup.py
1
setup.py
|
@ -14,6 +14,7 @@ INSTALL_REQUIRES = [
|
||||||
'pathlib2>=2.2.0;python_version<"3.6"',
|
'pathlib2>=2.2.0;python_version<"3.6"',
|
||||||
'colorama;sys_platform=="win32"',
|
'colorama;sys_platform=="win32"',
|
||||||
"pluggy>=0.9",
|
"pluggy>=0.9",
|
||||||
|
"wcwidth",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -206,11 +206,13 @@ def pytest_terminal_summary(terminalreporter):
|
||||||
|
|
||||||
def _get_line_with_reprcrash_message(config, rep, termwidth):
|
def _get_line_with_reprcrash_message(config, rep, termwidth):
|
||||||
"""Get summary line for a report, trying to add reprcrash message."""
|
"""Get summary line for a report, trying to add reprcrash message."""
|
||||||
|
from wcwidth import wcswidth
|
||||||
|
|
||||||
verbose_word = _get_report_str(config, rep)
|
verbose_word = _get_report_str(config, rep)
|
||||||
pos = _get_pos(config, rep)
|
pos = _get_pos(config, rep)
|
||||||
|
|
||||||
line = "%s %s" % (verbose_word, pos)
|
line = "%s %s" % (verbose_word, pos)
|
||||||
len_line = len(line)
|
len_line = wcswidth(line)
|
||||||
ellipsis, len_ellipsis = "...", 3
|
ellipsis, len_ellipsis = "...", 3
|
||||||
if len_line > termwidth - len_ellipsis:
|
if len_line > termwidth - len_ellipsis:
|
||||||
# No space for an additional message.
|
# No space for an additional message.
|
||||||
|
@ -225,13 +227,17 @@ def _get_line_with_reprcrash_message(config, rep, termwidth):
|
||||||
i = msg.find("\n")
|
i = msg.find("\n")
|
||||||
if i != -1:
|
if i != -1:
|
||||||
msg = msg[:i]
|
msg = msg[:i]
|
||||||
len_msg = len(msg)
|
len_msg = wcswidth(msg)
|
||||||
|
|
||||||
sep, len_sep = " - ", 3
|
sep, len_sep = " - ", 3
|
||||||
max_len_msg = termwidth - len_line - len_sep
|
max_len_msg = termwidth - len_line - len_sep
|
||||||
if max_len_msg >= len_ellipsis:
|
if max_len_msg >= len_ellipsis:
|
||||||
if len_msg > max_len_msg:
|
if len_msg > max_len_msg:
|
||||||
msg = msg[: (max_len_msg - len_ellipsis)] + ellipsis
|
max_len_msg -= len_ellipsis
|
||||||
|
msg = msg[:max_len_msg]
|
||||||
|
while wcswidth(msg) > max_len_msg:
|
||||||
|
msg = msg[:-1]
|
||||||
|
msg += ellipsis
|
||||||
line += sep + msg
|
line += sep + msg
|
||||||
return line
|
return line
|
||||||
|
|
||||||
|
|
|
@ -1216,50 +1216,67 @@ def test_summary_list_after_errors(testdir):
|
||||||
def test_line_with_reprcrash(monkeypatch):
|
def test_line_with_reprcrash(monkeypatch):
|
||||||
import _pytest.skipping
|
import _pytest.skipping
|
||||||
from _pytest.skipping import _get_line_with_reprcrash_message
|
from _pytest.skipping import _get_line_with_reprcrash_message
|
||||||
|
from wcwidth import wcswidth
|
||||||
|
|
||||||
|
mocked_verbose_word = "FAILED"
|
||||||
|
|
||||||
def mock_get_report_str(*args):
|
def mock_get_report_str(*args):
|
||||||
return "FAILED"
|
return mocked_verbose_word
|
||||||
|
|
||||||
def mock_get_pos(*args):
|
|
||||||
return "some::nodeid"
|
|
||||||
|
|
||||||
monkeypatch.setattr(_pytest.skipping, "_get_report_str", mock_get_report_str)
|
monkeypatch.setattr(_pytest.skipping, "_get_report_str", mock_get_report_str)
|
||||||
|
|
||||||
|
mocked_pos = "some::nodeid"
|
||||||
|
|
||||||
|
def mock_get_pos(*args):
|
||||||
|
return mocked_pos
|
||||||
|
|
||||||
monkeypatch.setattr(_pytest.skipping, "_get_pos", mock_get_pos)
|
monkeypatch.setattr(_pytest.skipping, "_get_pos", mock_get_pos)
|
||||||
|
|
||||||
class config:
|
class config:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
class rep:
|
|
||||||
pass
|
|
||||||
|
|
||||||
f = _get_line_with_reprcrash_message
|
|
||||||
assert f(config, rep, 80) == "FAILED some::nodeid"
|
|
||||||
|
|
||||||
class rep:
|
class rep:
|
||||||
class longrepr:
|
class longrepr:
|
||||||
class reprcrash:
|
class reprcrash:
|
||||||
message = "msg"
|
pass
|
||||||
|
|
||||||
assert f(config, rep, 80) == "FAILED some::nodeid - msg"
|
def check(msg, width, expected):
|
||||||
assert f(config, rep, 3) == "FAILED some::nodeid"
|
if msg:
|
||||||
|
rep.longrepr.reprcrash.message = msg
|
||||||
|
actual = _get_line_with_reprcrash_message(config, rep, width)
|
||||||
|
|
||||||
assert f(config, rep, 24) == "FAILED some::nodeid"
|
assert actual == expected
|
||||||
assert f(config, rep, 25) == "FAILED some::nodeid - msg"
|
if actual != "%s %s" % (mocked_verbose_word, mocked_pos):
|
||||||
|
assert len(actual) <= width
|
||||||
|
assert wcswidth(actual) <= width
|
||||||
|
|
||||||
rep.longrepr.reprcrash.message = "some longer message"
|
# AttributeError with message
|
||||||
assert f(config, rep, 24) == "FAILED some::nodeid"
|
check(None, 80, "FAILED some::nodeid")
|
||||||
assert f(config, rep, 25) == "FAILED some::nodeid - ..."
|
|
||||||
assert f(config, rep, 26) == "FAILED some::nodeid - s..."
|
|
||||||
|
|
||||||
rep.longrepr.reprcrash.message = "some\nmessage"
|
check("msg", 80, "FAILED some::nodeid - msg")
|
||||||
assert f(config, rep, 25) == "FAILED some::nodeid - ..."
|
check("msg", 3, "FAILED some::nodeid")
|
||||||
assert f(config, rep, 26) == "FAILED some::nodeid - some"
|
|
||||||
assert f(config, rep, 80) == "FAILED some::nodeid - some"
|
check("msg", 24, "FAILED some::nodeid")
|
||||||
|
check("msg", 25, "FAILED some::nodeid - msg")
|
||||||
|
|
||||||
|
check("some longer msg", 24, "FAILED some::nodeid")
|
||||||
|
check("some longer msg", 25, "FAILED some::nodeid - ...")
|
||||||
|
check("some longer msg", 26, "FAILED some::nodeid - s...")
|
||||||
|
|
||||||
|
check("some\nmessage", 25, "FAILED some::nodeid - ...")
|
||||||
|
check("some\nmessage", 26, "FAILED some::nodeid - some")
|
||||||
|
check("some\nmessage", 80, "FAILED some::nodeid - some")
|
||||||
|
|
||||||
# Test unicode safety.
|
# Test unicode safety.
|
||||||
rep.longrepr.reprcrash.message = "😄😄😄😄😄\n2nd line"
|
check("😄😄😄😄😄\n2nd line", 25, "FAILED some::nodeid - ...")
|
||||||
assert f(config, rep, 26) == "FAILED some::nodeid - 😄..."
|
check("😄😄😄😄😄\n2nd line", 26, "FAILED some::nodeid - ...")
|
||||||
# XXX: this is actually wrong - since the character uses two terminal
|
check("😄😄😄😄😄\n2nd line", 27, "FAILED some::nodeid - 😄...")
|
||||||
# cells.
|
check("😄😄😄😄😄\n2nd line", 28, "FAILED some::nodeid - 😄...")
|
||||||
rep.longrepr.reprcrash.message = "😄😄😄😄\n2nd line"
|
check("😄😄😄😄😄\n2nd line", 29, "FAILED some::nodeid - 😄😄...")
|
||||||
assert f(config, rep, 26) == "FAILED some::nodeid - 😄😄😄😄"
|
|
||||||
|
mocked_pos = "nodeid::😄::withunicode"
|
||||||
|
check("😄😄😄😄😄\n2nd line", 29, "FAILED nodeid::😄::withunicode")
|
||||||
|
check("😄😄😄😄😄\n2nd line", 40, "FAILED nodeid::😄::withunicode - 😄😄...")
|
||||||
|
check("😄😄😄😄😄\n2nd line", 41, "FAILED nodeid::😄::withunicode - 😄😄...")
|
||||||
|
check("😄😄😄😄😄\n2nd line", 42, "FAILED nodeid::😄::withunicode - 😄😄😄...")
|
||||||
|
check("😄😄😄😄😄\n2nd line", 80, "FAILED nodeid::😄::withunicode - 😄😄😄😄😄")
|
||||||
|
|
Loading…
Reference in New Issue