Skip to content

Commit 365451e

Browse files
authored
gh-127353: Allow to force color output on Windows (#127354)
1 parent f823910 commit 365451e

File tree

3 files changed

+48
-8
lines changed

3 files changed

+48
-8
lines changed

Lib/_colorize.py

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -32,14 +32,6 @@ def get_colors(colorize: bool = False) -> ANSIColors:
3232

3333

3434
def can_colorize() -> bool:
35-
if sys.platform == "win32":
36-
try:
37-
import nt
38-
39-
if not nt._supports_virtual_terminal():
40-
return False
41-
except (ImportError, AttributeError):
42-
return False
4335
if not sys.flags.ignore_environment:
4436
if os.environ.get("PYTHON_COLORS") == "0":
4537
return False
@@ -58,6 +50,15 @@ def can_colorize() -> bool:
5850
if not hasattr(sys.stderr, "fileno"):
5951
return False
6052

53+
if sys.platform == "win32":
54+
try:
55+
import nt
56+
57+
if not nt._supports_virtual_terminal():
58+
return False
59+
except (ImportError, AttributeError):
60+
return False
61+
6162
try:
6263
return os.isatty(sys.stderr.fileno())
6364
except io.UnsupportedOperation:

Lib/test/test__colorize.py

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,10 +50,47 @@ def test_colorized_detection_checks_for_environment_variables(self):
5050
with unittest.mock.patch("os.environ",
5151
{'FORCE_COLOR': '1', "PYTHON_COLORS": '0'}):
5252
self.assertEqual(_colorize.can_colorize(), False)
53+
with unittest.mock.patch("os.environ", {}):
54+
self.assertEqual(_colorize.can_colorize(), True)
55+
5356
isatty_mock.return_value = False
5457
with unittest.mock.patch("os.environ", {}):
5558
self.assertEqual(_colorize.can_colorize(), False)
5659

60+
@force_not_colorized
61+
@unittest.skipUnless(sys.platform == "win32", "Windows only")
62+
def test_colorized_detection_checks_for_environment_variables_no_vt(self):
63+
with (unittest.mock.patch("nt._supports_virtual_terminal", return_value=False),
64+
unittest.mock.patch("os.isatty") as isatty_mock,
65+
unittest.mock.patch("sys.flags", unittest.mock.MagicMock(ignore_environment=False)),
66+
unittest.mock.patch("_colorize.can_colorize", ORIGINAL_CAN_COLORIZE)):
67+
isatty_mock.return_value = True
68+
with unittest.mock.patch("os.environ", {'TERM': 'dumb'}):
69+
self.assertEqual(_colorize.can_colorize(), False)
70+
with unittest.mock.patch("os.environ", {'PYTHON_COLORS': '1'}):
71+
self.assertEqual(_colorize.can_colorize(), True)
72+
with unittest.mock.patch("os.environ", {'PYTHON_COLORS': '0'}):
73+
self.assertEqual(_colorize.can_colorize(), False)
74+
with unittest.mock.patch("os.environ", {'NO_COLOR': '1'}):
75+
self.assertEqual(_colorize.can_colorize(), False)
76+
with unittest.mock.patch("os.environ",
77+
{'NO_COLOR': '1', "PYTHON_COLORS": '1'}):
78+
self.assertEqual(_colorize.can_colorize(), True)
79+
with unittest.mock.patch("os.environ", {'FORCE_COLOR': '1'}):
80+
self.assertEqual(_colorize.can_colorize(), True)
81+
with unittest.mock.patch("os.environ",
82+
{'FORCE_COLOR': '1', 'NO_COLOR': '1'}):
83+
self.assertEqual(_colorize.can_colorize(), False)
84+
with unittest.mock.patch("os.environ",
85+
{'FORCE_COLOR': '1', "PYTHON_COLORS": '0'}):
86+
self.assertEqual(_colorize.can_colorize(), False)
87+
with unittest.mock.patch("os.environ", {}):
88+
self.assertEqual(_colorize.can_colorize(), False)
89+
90+
isatty_mock.return_value = False
91+
with unittest.mock.patch("os.environ", {}):
92+
self.assertEqual(_colorize.can_colorize(), False)
93+
5794

5895
if __name__ == "__main__":
5996
unittest.main()
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
Allow to force color output on Windows using environment variables. Patch by
2+
Andrey Efremov.

0 commit comments

Comments
 (0)