Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

ANSI escape codes for colored output not handled correctly with pytest.fail(reason=..., pytrace=False) #12849

Closed
4 tasks done
benverhees opened this issue Oct 1, 2024 · 2 comments · Fixed by #12959
Closed
4 tasks done
Assignees
Labels
topic: reporting related to terminal output and user-facing messages and errors type: bug problem that needs to be addressed

Comments

@benverhees
Copy link

benverhees commented Oct 1, 2024

  • a detailed description of the bug or problem you are having

Description

There seems to be an inconsistency with how ANSI escape codes for colored output are handled in the failure reason when using pytest.fail() with pytrace=True versus pytrace=False.

In the case where pytrace=True, the colored output is rendered correctly in the failure message. However, when pytrace=False, the ANSI escape codes are not processed, and they partly appear as raw text in the terminal output.

  • minimal example if possible

Steps to Reproduce

from pytest import fail


def test_color_pytrace_true():
    fail(reason="\n\x1b[34mThis should be blue\x1b[0m", pytrace=True)


def test_color_pytrace_false():
    fail(reason="\n\x1b[34mThis should be blue\x1b[0m", pytrace=False)

Expected Behavior:

For pytrace=True: The ANSI escape codes for blue text (\x1b[34m...) should render correctly, resulting in the phrase "This should be blue" being displayed in blue.
For pytrace=False: The ANSI escape codes should still render the text in blue.

Actual Behavior:

For pytrace=True: The colored output is handled correctly, and the text "This should be blue" is displayed in blue.
For pytrace=False: The ANSI escape codes are partly displayed as raw text ([34mThis should be blue[0m), and the text is not colored.

Output from running the test

image
  • output of pip list from the virtual environment you are using
Package                   Version                         Editable project location
------------------------- ------------------------------- -----------------------------------
aiofiles                  24.1.0
aiohttp                   3.9.5
aiosignal                 1.3.1
annotated-types           0.6.0
anyio                     4.3.0
argcomplete               3.2.3
async-timeout             4.0.3
asyncio                   3.4.3
attrs                     23.2.0
backports.tarfile         1.1.1
beautifulsoup4            4.12.3
binary                    1.0.0
black                     24.3.0
blessed                   1.20.0
boltons                   21.0.0
bracex                    2.4
build                     1.2.1
cachetools                5.3.3
certifi                   2024.2.2
cfgv                      3.4.0
charset-normalizer        3.3.2
click                     8.1.7
click-option-group        0.5.6
colorama                  0.4.6
contourpy                 1.2.1
coverage                  7.4.4
cycler                    0.12.1
datamodel-code-generator  0.25.9
deepdiff                  6.7.1
defusedxml                0.7.1
distlib                   0.3.8
dnspython                 2.6.1
docutils                  0.21.2
editor                    1.6.6
email_validator           2.1.1
et-xmlfile                1.1.0
exceptiongroup            1.2.0
face                      22.0.0
filelock                  3.13.4
fonttools                 4.53.1
frozenlist                1.4.1
genson                    1.2.2
geojson                   3.1.0
glom                      22.1.0
google-api-core           2.19.0
google-auth               2.29.0
google-cloud-bigquery     3.23.0
google-cloud-core         2.4.1
google-crc32c             1.5.0
google-resumable-media    2.7.0
googleapis-common-protos  1.63.0
grpcio                    1.63.0
grpcio-status             1.62.2
h11                       0.14.0
httpcore                  1.0.5
httpx                     0.27.0
identify                  2.5.35
idna                      3.6
importlib_metadata        7.1.0
inflect                   5.6.2
iniconfig                 2.0.0
inquirer                  3.2.4
isodate                   0.6.1
isort                     5.13.2
jaraco.classes            3.4.0
jaraco.context            5.3.0
jaraco.functools          4.0.1
Jinja2                    3.1.3
jsonschema                4.22.0
jsonschema-specifications 2023.12.1
keyring                   25.2.0
kiwisolver                1.4.5
libcst                    1.3.1
loguru                    0.7.2
lxml                      5.2.2
markdown-it-py            3.0.0
MarkupSafe                2.1.5
matplotlib                3.9.2
mdurl                     0.1.2
more-itertools            10.2.0
multidict                 6.0.5
mypy-extensions           1.0.0
nh3                       0.2.17
nodeenv                   1.8.0
numpy                     1.26.4
openpyxl                  3.1.2
ordered-set               4.1.0
osm2geojson               0.2.5
packaging                 24.0
pandas                    2.2.2
pathspec                  0.12.1
peewee                    3.17.5
pillow                    10.4.0
pip                       23.0.1
pkginfo                   1.10.0
platformdirs              4.2.0
pluggy                    1.5.0
pre-commit                3.3.3
prettytable               3.10.0
proto-plus                1.23.0
protobuf                  4.25.3
pyasn1                    0.6.0
pyasn1_modules            0.4.0
pydantic                  2.6.4
pydantic_core             2.16.3
Pygments                  2.18.0
pyodata                   1.11.1
pyparsing                 3.1.4
pypinfo                   21.0.0
pyproject_hooks           1.1.0
pytest                    8.3.3
pytest-cov                5.0.0
pytest-loguru             0.4.0
python-dateutil           2.9.0.post0
pytz                      2024.1
PyYAML                    6.0.1
rdflib                    7.1.0a0
readchar                  4.0.6
readme_renderer           43.0
referencing               0.35.1
requests                  2.32.3
requests-toolbelt         1.0.0
rfc3986                   2.0.0
rich                      13.7.1
rpds-py                   0.18.1
rsa                       4.9
ruamel.yaml               0.17.40
ruamel.yaml.clib          0.2.8
ruff                      0.3.5
runs                      1.2.2
semgrep                   1.75.0
setuptools                65.5.0
setuptools-scm            8.1.0
shapely                   2.0.6
six                       1.16.0
sniffio                   1.3.1
soupsieve                 2.6
SPARQLWrapper             2.0.0
tinydb                    4.8.0
tinyrecord                0.2.0
toml                      0.10.2
tomli                     2.0.1
twine                     5.0.0
types-python-dateutil     2.9.0.20240821
types-PyYAML              6.0.12.20240311
types-requests            2.31.0.20240406
typing_extensions         4.11.0
tzdata                    2024.1
ujson                     5.10.0
Unidecode                 1.3.8
urllib3                   2.2.1
virtualenv                20.25.1
wcmatch                   8.5.2
wcwidth                   0.2.13
xarray                    2024.7.0
xmod                      1.8.1
yarl                      1.9.4
zipp                      3.18.1
  • pytest and operating system versions
pytest 8.3.3
ProductName:            macOS
ProductVersion:         14.2.1
BuildVersion:           23C71
@RonnyPfannschmidt RonnyPfannschmidt added type: bug problem that needs to be addressed topic: reporting related to terminal output and user-facing messages and errors labels Oct 3, 2024
@leonarduschen
Copy link
Contributor

I'm looking into this

@leonarduschen
Copy link
Contributor

The issue here is that when pytrace=False, the value is passed to TerminalWriter._write_source which in turn is passed to TerminalWriter._highlight.

Working on a PR to fix this

nicoddemus pushed a commit that referenced this issue Nov 25, 2024
- 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 #12959 (comment)

Closes #12849
patchback bot pushed a commit that referenced this issue Nov 25, 2024
- 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 #12959 (comment)

Closes #12849

(cherry picked from commit 76e0444)
nicoddemus pushed a commit that referenced this issue Nov 25, 2024
- 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 #12959 (comment)

Closes #12849

(cherry picked from commit 76e0444)

Co-authored-by: Leonardus Chen <[email protected]>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
topic: reporting related to terminal output and user-facing messages and errors type: bug problem that needs to be addressed
Projects
None yet
3 participants