Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 12 additions & 5 deletions src/termcolor/termcolor.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@

from __future__ import annotations

import io
import os
import sys
import warnings
Expand Down Expand Up @@ -120,11 +121,17 @@ def _can_do_colour(
return False
if "FORCE_COLOR" in os.environ:
return True
return (
hasattr(sys.stdout, "isatty")
and sys.stdout.isatty()
and os.environ.get("TERM") != "dumb"
)

# Then check system:
if os.environ.get("TERM") == "dumb":
return False
if not hasattr(sys.stdout, "fileno"):
return False

try:
return os.isatty(sys.stdout.fileno())
except io.UnsupportedOperation:
return sys.stdout.isatty()


def colored(
Expand Down
13 changes: 12 additions & 1 deletion tests/test_termcolor.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,9 @@ def setup_module() -> None:

def test_basic(monkeypatch: pytest.MonkeyPatch) -> None:
# Arrange
monkeypatch.setattr(os, "isatty", lambda fd: True)
monkeypatch.setattr("sys.stdout.isatty", lambda: True)
monkeypatch.setattr("sys.stdout.fileno", lambda: 1)

# Act / Assert
assert colored("text") == "text\x1b[0m"
Expand Down Expand Up @@ -82,7 +84,9 @@ def test_color(
expected: str,
) -> None:
# Arrange
monkeypatch.setattr(os, "isatty", lambda fd: True)
monkeypatch.setattr("sys.stdout.isatty", lambda: True)
monkeypatch.setattr("sys.stdout.fileno", lambda: 1)

# Act / Assert
assert colored("text", color=color) == expected
Expand Down Expand Up @@ -113,7 +117,9 @@ def test_on_color(
expected: str,
) -> None:
# Arrange
monkeypatch.setattr(os, "isatty", lambda fd: True)
monkeypatch.setattr("sys.stdout.isatty", lambda: True)
monkeypatch.setattr("sys.stdout.fileno", lambda: 1)

# Act / Assert
assert colored("text", on_color=on_color) == expected
Expand All @@ -138,7 +144,9 @@ def test_attrs(
expected: str,
) -> None:
# Arrange
monkeypatch.setattr(os, "isatty", lambda fd: True)
monkeypatch.setattr("sys.stdout.isatty", lambda: True)
monkeypatch.setattr("sys.stdout.fileno", lambda: 1)

# Act / Assert
assert colored("text", attrs=[attr]) == expected
Expand Down Expand Up @@ -197,6 +205,7 @@ def test_environment_variables_force_color(
(None, None, ["FORCE_COLOR=1"], True),
(None, None, ["ANSI_COLORS_DISABLED=1", "NO_COLOR=1", "FORCE_COLOR=1"], False),
(None, None, ["NO_COLOR=1", "FORCE_COLOR=1"], False),
(None, None, ["TERM=dumb"], False),
# Set only parameter overrides
(True, None, [None], False),
(None, True, [None], True),
Expand All @@ -222,7 +231,7 @@ def test_environment_variables(
if not env_var:
continue
name, value = env_var.split("=")
print(name, value)
print(f"{name}={value}")
monkeypatch.setenv(name, value)

assert (
Expand All @@ -241,7 +250,9 @@ def test_environment_variables(
def test_tty(monkeypatch: pytest.MonkeyPatch, test_isatty: bool, expected: str) -> None:
"""Assert color when attached to tty, no color when not attached"""
# Arrange
monkeypatch.setattr(os, "isatty", lambda fd: test_isatty)
monkeypatch.setattr("sys.stdout.isatty", lambda: test_isatty)
monkeypatch.setattr("sys.stdout.fileno", lambda: 1)

# Act / Assert
assert colored("text", color="cyan") == expected
Expand Down