Add support for NO_COLOR and FORCE_COLOR (#7466)

Co-authored-by: Bruno Oliveira <nicoddemus@gmail.com>
This commit is contained in:
Hugo van Kemenade 2020-07-10 14:49:10 +03:00 committed by GitHub
parent 2ae721cda5
commit c1c5a2b34a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 61 additions and 14 deletions

View File

@ -0,0 +1,3 @@
Added support for ``NO_COLOR`` and ``FORCE_COLOR`` environment variables to control colored output.
For more information, see `the docs <https://docs.pytest.org/en/stable/reference.html#environment-variables>`__.

View File

@ -988,10 +988,20 @@ Environment variables that can be used to change pytest's behavior.
This contains a command-line (parsed by the py:mod:`shlex` module) that will be **prepended** to the command line given This contains a command-line (parsed by the py:mod:`shlex` module) that will be **prepended** to the command line given
by the user, see :ref:`adding default options` for more information. by the user, see :ref:`adding default options` for more information.
.. envvar:: PYTEST_CURRENT_TEST
This is not meant to be set by users, but is set by pytest internally with the name of the current test so other
processes can inspect it, see :ref:`pytest current test env` for more information.
.. envvar:: PYTEST_DEBUG .. envvar:: PYTEST_DEBUG
When set, pytest will print tracing and debug information. When set, pytest will print tracing and debug information.
.. envvar:: PYTEST_DISABLE_PLUGIN_AUTOLOAD
When set, disables plugin auto-loading through setuptools entrypoints. Only explicitly specified plugins will be
loaded.
.. envvar:: PYTEST_PLUGINS .. envvar:: PYTEST_PLUGINS
Contains comma-separated list of modules that should be loaded as plugins: Contains comma-separated list of modules that should be loaded as plugins:
@ -1000,15 +1010,22 @@ Contains comma-separated list of modules that should be loaded as plugins:
export PYTEST_PLUGINS=mymodule.plugin,xdist export PYTEST_PLUGINS=mymodule.plugin,xdist
.. envvar:: PYTEST_DISABLE_PLUGIN_AUTOLOAD .. envvar:: PY_COLORS
When set, disables plugin auto-loading through setuptools entrypoints. Only explicitly specified plugins will be When set to ``1``, pytest will use color in terminal output.
loaded. When set to ``0``, pytest will not use color.
``PY_COLORS`` takes precedence over ``NO_COLOR`` and ``FORCE_COLOR``.
.. envvar:: PYTEST_CURRENT_TEST .. envvar:: NO_COLOR
This is not meant to be set by users, but is set by pytest internally with the name of the current test so other When set (regardless of value), pytest will not use color in terminal output.
processes can inspect it, see :ref:`pytest current test env` for more information. ``PY_COLORS`` takes precedence over ``NO_COLOR``, which takes precedence over ``FORCE_COLOR``.
See `no-color.org <https://no-color.org/>`__ for other libraries supporting this community standard.
.. envvar:: FORCE_COLOR
When set (regardless of value), pytest will use color in terminal output.
``PY_COLORS`` and ``NO_COLOR`` take precedence over ``FORCE_COLOR``.
Exceptions Exceptions
---------- ----------

View File

@ -27,11 +27,12 @@ def should_do_markup(file: TextIO) -> bool:
return True return True
if os.environ.get("PY_COLORS") == "0": if os.environ.get("PY_COLORS") == "0":
return False return False
if "NO_COLOR" in os.environ:
return False
if "FORCE_COLOR" in os.environ:
return True
return ( return (
hasattr(file, "isatty") hasattr(file, "isatty") and file.isatty() and os.environ.get("TERM") != "dumb"
and file.isatty()
and os.environ.get("TERM") != "dumb"
and not (sys.platform.startswith("java") and os._name == "nt")
) )

View File

@ -154,8 +154,7 @@ def test_attr_hasmarkup() -> None:
assert "\x1b[0m" in s assert "\x1b[0m" in s
def test_should_do_markup_PY_COLORS_eq_1(monkeypatch: MonkeyPatch) -> None: def assert_color_set():
monkeypatch.setitem(os.environ, "PY_COLORS", "1")
file = io.StringIO() file = io.StringIO()
tw = terminalwriter.TerminalWriter(file) tw = terminalwriter.TerminalWriter(file)
assert tw.hasmarkup assert tw.hasmarkup
@ -166,8 +165,7 @@ def test_should_do_markup_PY_COLORS_eq_1(monkeypatch: MonkeyPatch) -> None:
assert "\x1b[0m" in s assert "\x1b[0m" in s
def test_should_do_markup_PY_COLORS_eq_0(monkeypatch: MonkeyPatch) -> None: def assert_color_not_set():
monkeypatch.setitem(os.environ, "PY_COLORS", "0")
f = io.StringIO() f = io.StringIO()
f.isatty = lambda: True # type: ignore f.isatty = lambda: True # type: ignore
tw = terminalwriter.TerminalWriter(file=f) tw = terminalwriter.TerminalWriter(file=f)
@ -177,6 +175,34 @@ def test_should_do_markup_PY_COLORS_eq_0(monkeypatch: MonkeyPatch) -> None:
assert s == "hello\n" assert s == "hello\n"
def test_should_do_markup_PY_COLORS_eq_1(monkeypatch: MonkeyPatch) -> None:
monkeypatch.setitem(os.environ, "PY_COLORS", "1")
assert_color_set()
def test_should_not_do_markup_PY_COLORS_eq_0(monkeypatch: MonkeyPatch) -> None:
monkeypatch.setitem(os.environ, "PY_COLORS", "0")
assert_color_not_set()
def test_should_not_do_markup_NO_COLOR(monkeypatch: MonkeyPatch) -> None:
monkeypatch.setitem(os.environ, "NO_COLOR", "1")
assert_color_not_set()
def test_should_do_markup_FORCE_COLOR(monkeypatch: MonkeyPatch) -> None:
monkeypatch.setitem(os.environ, "FORCE_COLOR", "1")
assert_color_set()
def test_should_not_do_markup_NO_COLOR_and_FORCE_COLOR(
monkeypatch: MonkeyPatch,
) -> None:
monkeypatch.setitem(os.environ, "NO_COLOR", "1")
monkeypatch.setitem(os.environ, "FORCE_COLOR", "1")
assert_color_not_set()
class TestTerminalWriterLineWidth: class TestTerminalWriterLineWidth:
def test_init(self) -> None: def test_init(self) -> None:
tw = terminalwriter.TerminalWriter() tw = terminalwriter.TerminalWriter()