mirror of https://github.com/pytest-dev/pytest.git
pytest.fail: fix ANSI escape codes for colored output (#12959)
- When `ReprEntry.style == "value"` (happens when calling `pytest.fail(..., pytrace=False)`, the message should not be printed to terminal using `TerminalWriter._write_source` because then it'll try to highlight the message as source code - The message should be printed to terminal directly using `TerminalWriter.line` or `TerminalWriter.write`, I went with the later for testing purposes https://github.com/pytest-dev/pytest/pull/12959#discussion_r1842574618 Closes #12849
This commit is contained in:
parent
3b230e06db
commit
76e0444770
1
AUTHORS
1
AUTHORS
|
@ -247,6 +247,7 @@ Kristoffer Nordström
|
||||||
Kyle Altendorf
|
Kyle Altendorf
|
||||||
Lawrence Mitchell
|
Lawrence Mitchell
|
||||||
Lee Kamentsky
|
Lee Kamentsky
|
||||||
|
Leonardus Chen
|
||||||
Lev Maximov
|
Lev Maximov
|
||||||
Levon Saldamli
|
Levon Saldamli
|
||||||
Lewis Cowles
|
Lewis Cowles
|
||||||
|
|
|
@ -0,0 +1 @@
|
||||||
|
ANSI escape codes for colored output now handled correctly in :func:`pytest.fail` with `pytrace=False`.
|
|
@ -1221,6 +1221,15 @@ class ReprEntry(TerminalRepr):
|
||||||
if not self.lines:
|
if not self.lines:
|
||||||
return
|
return
|
||||||
|
|
||||||
|
if self.style == "value":
|
||||||
|
# Using tw.write instead of tw.line for testing purposes due to TWMock implementation;
|
||||||
|
# lines written with TWMock.line and TWMock._write_source cannot be distinguished
|
||||||
|
# from each other, whereas lines written with TWMock.write are marked with TWMock.WRITE
|
||||||
|
for line in self.lines:
|
||||||
|
tw.write(line)
|
||||||
|
tw.write("\n")
|
||||||
|
return
|
||||||
|
|
||||||
# separate indents and source lines that are not failures: we want to
|
# separate indents and source lines that are not failures: we want to
|
||||||
# highlight the code but not the indentation, which may contain markers
|
# highlight the code but not the indentation, which may contain markers
|
||||||
# such as "> assert 0"
|
# such as "> assert 0"
|
||||||
|
@ -1236,11 +1245,8 @@ class ReprEntry(TerminalRepr):
|
||||||
failure_lines.extend(self.lines[index:])
|
failure_lines.extend(self.lines[index:])
|
||||||
break
|
break
|
||||||
else:
|
else:
|
||||||
if self.style == "value":
|
indents.append(line[:indent_size])
|
||||||
source_lines.append(line)
|
source_lines.append(line[indent_size:])
|
||||||
else:
|
|
||||||
indents.append(line[:indent_size])
|
|
||||||
source_lines.append(line[indent_size:])
|
|
||||||
|
|
||||||
tw._write_source(source_lines, indents)
|
tw._write_source(source_lines, indents)
|
||||||
|
|
||||||
|
|
|
@ -1194,6 +1194,23 @@ raise ValueError()
|
||||||
line = tw_mock.lines[-1]
|
line = tw_mock.lines[-1]
|
||||||
assert line == ":3: ValueError"
|
assert line == ":3: ValueError"
|
||||||
|
|
||||||
|
def test_toterminal_value(self, importasmod, tw_mock):
|
||||||
|
mod = importasmod(
|
||||||
|
"""
|
||||||
|
def g(x):
|
||||||
|
raise ValueError(x)
|
||||||
|
def f():
|
||||||
|
g('some_value')
|
||||||
|
"""
|
||||||
|
)
|
||||||
|
excinfo = pytest.raises(ValueError, mod.f)
|
||||||
|
excinfo.traceback = excinfo.traceback.filter(excinfo)
|
||||||
|
repr = excinfo.getrepr(style="value")
|
||||||
|
repr.toterminal(tw_mock)
|
||||||
|
|
||||||
|
assert tw_mock.get_write_msg(0) == "some_value"
|
||||||
|
assert tw_mock.get_write_msg(1) == "\n"
|
||||||
|
|
||||||
@pytest.mark.parametrize(
|
@pytest.mark.parametrize(
|
||||||
"reproptions",
|
"reproptions",
|
||||||
[
|
[
|
||||||
|
|
|
@ -119,8 +119,8 @@ def tw_mock():
|
||||||
return text
|
return text
|
||||||
|
|
||||||
def get_write_msg(self, idx):
|
def get_write_msg(self, idx):
|
||||||
flag, msg = self.lines[idx]
|
assert self.lines[idx][0] == TWMock.WRITE
|
||||||
assert flag == TWMock.WRITE
|
msg = self.lines[idx][1]
|
||||||
return msg
|
return msg
|
||||||
|
|
||||||
fullwidth = 80
|
fullwidth = 80
|
||||||
|
|
Loading…
Reference in New Issue