Skip to content

Commit a50e877

Browse files
committed
Allow to force color output on Windows
1 parent 6446408 commit a50e877

File tree

3 files changed

+57
-8
lines changed

3 files changed

+57
-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: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,9 +28,12 @@ def test_colorized_detection_checks_for_environment_variables(self):
2828

2929
flags = unittest.mock.MagicMock(ignore_environment=False)
3030
with (unittest.mock.patch("os.isatty") as isatty_mock,
31+
unittest.mock.patch("sys.stderr") as stderr_mock,
3132
unittest.mock.patch("sys.flags", flags),
3233
unittest.mock.patch("_colorize.can_colorize", ORIGINAL_CAN_COLORIZE)):
3334
isatty_mock.return_value = True
35+
stderr_mock.fileno.return_value = 2
36+
stderr_mock.isatty.return_value = True
3437
with unittest.mock.patch("os.environ", {'TERM': 'dumb'}):
3538
self.assertEqual(_colorize.can_colorize(), False)
3639
with unittest.mock.patch("os.environ", {'PYTHON_COLORS': '1'}):
@@ -50,10 +53,53 @@ def test_colorized_detection_checks_for_environment_variables(self):
5053
with unittest.mock.patch("os.environ",
5154
{'FORCE_COLOR': '1', "PYTHON_COLORS": '0'}):
5255
self.assertEqual(_colorize.can_colorize(), False)
56+
with unittest.mock.patch("os.environ", {}):
57+
self.assertEqual(_colorize.can_colorize(), True)
58+
5359
isatty_mock.return_value = False
60+
stderr_mock.isatty.return_value = False
5461
with unittest.mock.patch("os.environ", {}):
5562
self.assertEqual(_colorize.can_colorize(), False)
5663

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

58104
if __name__ == "__main__":
59105
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)