Skip to content

Commit

Permalink
gh-127353: Allow to force color output on Windows (#127354)
Browse files Browse the repository at this point in the history
  • Loading branch information
PalmtopTiger authored Dec 12, 2024
1 parent f823910 commit 365451e
Show file tree
Hide file tree
Showing 3 changed files with 48 additions and 8 deletions.
17 changes: 9 additions & 8 deletions Lib/_colorize.py
Original file line number Diff line number Diff line change
Expand Up @@ -32,14 +32,6 @@ def get_colors(colorize: bool = False) -> ANSIColors:


def can_colorize() -> bool:
if sys.platform == "win32":
try:
import nt

if not nt._supports_virtual_terminal():
return False
except (ImportError, AttributeError):
return False
if not sys.flags.ignore_environment:
if os.environ.get("PYTHON_COLORS") == "0":
return False
Expand All @@ -58,6 +50,15 @@ def can_colorize() -> bool:
if not hasattr(sys.stderr, "fileno"):
return False

if sys.platform == "win32":
try:
import nt

if not nt._supports_virtual_terminal():
return False
except (ImportError, AttributeError):
return False

try:
return os.isatty(sys.stderr.fileno())
except io.UnsupportedOperation:
Expand Down
37 changes: 37 additions & 0 deletions Lib/test/test__colorize.py
Original file line number Diff line number Diff line change
Expand Up @@ -50,10 +50,47 @@ def test_colorized_detection_checks_for_environment_variables(self):
with unittest.mock.patch("os.environ",
{'FORCE_COLOR': '1', "PYTHON_COLORS": '0'}):
self.assertEqual(_colorize.can_colorize(), False)
with unittest.mock.patch("os.environ", {}):
self.assertEqual(_colorize.can_colorize(), True)

isatty_mock.return_value = False
with unittest.mock.patch("os.environ", {}):
self.assertEqual(_colorize.can_colorize(), False)

@force_not_colorized
@unittest.skipUnless(sys.platform == "win32", "Windows only")
def test_colorized_detection_checks_for_environment_variables_no_vt(self):
with (unittest.mock.patch("nt._supports_virtual_terminal", return_value=False),
unittest.mock.patch("os.isatty") as isatty_mock,
unittest.mock.patch("sys.flags", unittest.mock.MagicMock(ignore_environment=False)),
unittest.mock.patch("_colorize.can_colorize", ORIGINAL_CAN_COLORIZE)):
isatty_mock.return_value = True
with unittest.mock.patch("os.environ", {'TERM': 'dumb'}):
self.assertEqual(_colorize.can_colorize(), False)
with unittest.mock.patch("os.environ", {'PYTHON_COLORS': '1'}):
self.assertEqual(_colorize.can_colorize(), True)
with unittest.mock.patch("os.environ", {'PYTHON_COLORS': '0'}):
self.assertEqual(_colorize.can_colorize(), False)
with unittest.mock.patch("os.environ", {'NO_COLOR': '1'}):
self.assertEqual(_colorize.can_colorize(), False)
with unittest.mock.patch("os.environ",
{'NO_COLOR': '1', "PYTHON_COLORS": '1'}):
self.assertEqual(_colorize.can_colorize(), True)
with unittest.mock.patch("os.environ", {'FORCE_COLOR': '1'}):
self.assertEqual(_colorize.can_colorize(), True)
with unittest.mock.patch("os.environ",
{'FORCE_COLOR': '1', 'NO_COLOR': '1'}):
self.assertEqual(_colorize.can_colorize(), False)
with unittest.mock.patch("os.environ",
{'FORCE_COLOR': '1', "PYTHON_COLORS": '0'}):
self.assertEqual(_colorize.can_colorize(), False)
with unittest.mock.patch("os.environ", {}):
self.assertEqual(_colorize.can_colorize(), False)

isatty_mock.return_value = False
with unittest.mock.patch("os.environ", {}):
self.assertEqual(_colorize.can_colorize(), False)


if __name__ == "__main__":
unittest.main()
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
Allow to force color output on Windows using environment variables. Patch by
Andrey Efremov.

0 comments on commit 365451e

Please sign in to comment.