mirror of
https://github.com/python/cpython.git
synced 2025-08-31 05:58:33 +00:00
gh-117225: Move colorize functionality to own internal module (#118283)
This commit is contained in:
parent
164e2c31c0
commit
3b3f8dea57
8 changed files with 218 additions and 180 deletions
|
@ -26,9 +26,9 @@ from test.support import force_not_colorized
|
|||
import json
|
||||
import textwrap
|
||||
import traceback
|
||||
import contextlib
|
||||
from functools import partial
|
||||
from pathlib import Path
|
||||
import _colorize
|
||||
|
||||
MODULE_PREFIX = f'{__name__}.' if __name__ == '__main__' else ''
|
||||
|
||||
|
@ -40,25 +40,18 @@ test_tb = namedtuple('tb', ['tb_frame', 'tb_lineno', 'tb_next', 'tb_lasti'])
|
|||
|
||||
LEVENSHTEIN_DATA_FILE = Path(__file__).parent / 'levenshtein_examples.json'
|
||||
|
||||
ORIGINAL_CAN_COLORIZE = traceback._can_colorize
|
||||
|
||||
def setUpModule():
|
||||
traceback._can_colorize = lambda: False
|
||||
|
||||
def tearDownModule():
|
||||
traceback._can_colorize = ORIGINAL_CAN_COLORIZE
|
||||
|
||||
class TracebackCases(unittest.TestCase):
|
||||
# For now, a very minimal set of tests. I want to be sure that
|
||||
# formatting of SyntaxErrors works based on changes for 2.1.
|
||||
def setUp(self):
|
||||
super().setUp()
|
||||
self.colorize = traceback._COLORIZE
|
||||
traceback._COLORIZE = False
|
||||
self.colorize = _colorize.COLORIZE
|
||||
_colorize.COLORIZE = False
|
||||
|
||||
def tearDown(self):
|
||||
super().tearDown()
|
||||
traceback._COLORIZE = self.colorize
|
||||
_colorize.COLORIZE = self.colorize
|
||||
|
||||
def get_exception_format(self, func, exc):
|
||||
try:
|
||||
|
@ -4478,9 +4471,9 @@ class TestColorizedTraceback(unittest.TestCase):
|
|||
e, capture_locals=True
|
||||
)
|
||||
lines = "".join(exc.format(colorize=True))
|
||||
red = traceback._ANSIColors.RED
|
||||
boldr = traceback._ANSIColors.BOLD_RED
|
||||
reset = traceback._ANSIColors.RESET
|
||||
red = _colorize.ANSIColors.RED
|
||||
boldr = _colorize.ANSIColors.BOLD_RED
|
||||
reset = _colorize.ANSIColors.RESET
|
||||
self.assertIn("y = " + red + "x['a']['b']" + reset + boldr + "['c']" + reset, lines)
|
||||
self.assertIn("return " + red + "(lambda *args: foo(*args))" + reset + boldr + "(1,2,3,4)" + reset, lines)
|
||||
self.assertIn("return (lambda *args: " + red + "foo" + reset + boldr + "(*args)" + reset + ")(1,2,3,4)", lines)
|
||||
|
@ -4496,11 +4489,11 @@ class TestColorizedTraceback(unittest.TestCase):
|
|||
e, capture_locals=True
|
||||
)
|
||||
actual = "".join(exc.format(colorize=True))
|
||||
red = traceback._ANSIColors.RED
|
||||
magenta = traceback._ANSIColors.MAGENTA
|
||||
boldm = traceback._ANSIColors.BOLD_MAGENTA
|
||||
boldr = traceback._ANSIColors.BOLD_RED
|
||||
reset = traceback._ANSIColors.RESET
|
||||
red = _colorize.ANSIColors.RED
|
||||
magenta = _colorize.ANSIColors.MAGENTA
|
||||
boldm = _colorize.ANSIColors.BOLD_MAGENTA
|
||||
boldr = _colorize.ANSIColors.BOLD_RED
|
||||
reset = _colorize.ANSIColors.RESET
|
||||
expected = "".join([
|
||||
f' File {magenta}"<string>"{reset}, line {magenta}1{reset}\n',
|
||||
f' a {boldr}${reset} b\n',
|
||||
|
@ -4519,15 +4512,15 @@ class TestColorizedTraceback(unittest.TestCase):
|
|||
self.fail("No exception thrown.")
|
||||
except Exception as e:
|
||||
with captured_output("stderr") as tbstderr:
|
||||
with unittest.mock.patch('traceback._can_colorize', return_value=True):
|
||||
with unittest.mock.patch('_colorize.can_colorize', return_value=True):
|
||||
exception_print(e)
|
||||
actual = tbstderr.getvalue().splitlines()
|
||||
|
||||
red = traceback._ANSIColors.RED
|
||||
boldr = traceback._ANSIColors.BOLD_RED
|
||||
magenta = traceback._ANSIColors.MAGENTA
|
||||
boldm = traceback._ANSIColors.BOLD_MAGENTA
|
||||
reset = traceback._ANSIColors.RESET
|
||||
red = _colorize.ANSIColors.RED
|
||||
boldr = _colorize.ANSIColors.BOLD_RED
|
||||
magenta = _colorize.ANSIColors.MAGENTA
|
||||
boldm = _colorize.ANSIColors.BOLD_MAGENTA
|
||||
reset = _colorize.ANSIColors.RESET
|
||||
lno_foo = foo.__code__.co_firstlineno
|
||||
expected = ['Traceback (most recent call last):',
|
||||
f' File {magenta}"{__file__}"{reset}, '
|
||||
|
@ -4541,38 +4534,6 @@ class TestColorizedTraceback(unittest.TestCase):
|
|||
f'{boldm}ZeroDivisionError{reset}: {magenta}division by zero{reset}']
|
||||
self.assertEqual(actual, expected)
|
||||
|
||||
@force_not_colorized
|
||||
def test_colorized_detection_checks_for_environment_variables(self):
|
||||
if sys.platform == "win32":
|
||||
virtual_patching = unittest.mock.patch("nt._supports_virtual_terminal", return_value=True)
|
||||
else:
|
||||
virtual_patching = contextlib.nullcontext()
|
||||
with virtual_patching:
|
||||
|
||||
flags = unittest.mock.MagicMock(ignore_environment=False)
|
||||
with (unittest.mock.patch("os.isatty") as isatty_mock,
|
||||
unittest.mock.patch("sys.flags", flags),
|
||||
unittest.mock.patch("traceback._can_colorize", ORIGINAL_CAN_COLORIZE)):
|
||||
isatty_mock.return_value = True
|
||||
with unittest.mock.patch("os.environ", {'TERM': 'dumb'}):
|
||||
self.assertEqual(traceback._can_colorize(), False)
|
||||
with unittest.mock.patch("os.environ", {'PYTHON_COLORS': '1'}):
|
||||
self.assertEqual(traceback._can_colorize(), True)
|
||||
with unittest.mock.patch("os.environ", {'PYTHON_COLORS': '0'}):
|
||||
self.assertEqual(traceback._can_colorize(), False)
|
||||
with unittest.mock.patch("os.environ", {'NO_COLOR': '1'}):
|
||||
self.assertEqual(traceback._can_colorize(), False)
|
||||
with unittest.mock.patch("os.environ", {'NO_COLOR': '1', "PYTHON_COLORS": '1'}):
|
||||
self.assertEqual(traceback._can_colorize(), True)
|
||||
with unittest.mock.patch("os.environ", {'FORCE_COLOR': '1'}):
|
||||
self.assertEqual(traceback._can_colorize(), True)
|
||||
with unittest.mock.patch("os.environ", {'FORCE_COLOR': '1', 'NO_COLOR': '1'}):
|
||||
self.assertEqual(traceback._can_colorize(), False)
|
||||
with unittest.mock.patch("os.environ", {'FORCE_COLOR': '1', "PYTHON_COLORS": '0'}):
|
||||
self.assertEqual(traceback._can_colorize(), False)
|
||||
isatty_mock.return_value = False
|
||||
with unittest.mock.patch("os.environ", {}):
|
||||
self.assertEqual(traceback._can_colorize(), False)
|
||||
|
||||
if __name__ == "__main__":
|
||||
unittest.main()
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue