[3.12] bpo-43950: handle wide unicode characters in tracebacks (GH-28150) (#111346)

This commit is contained in:
Pablo Galindo Salgado 2023-10-27 06:43:38 +09:00 committed by GitHub
parent e25d8b40cd
commit c81ebf5b3d
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
5 changed files with 187 additions and 16 deletions

View file

@ -922,8 +922,63 @@ class TracebackErrorLocationCaretTestBase:
f" File \"{__file__}\", line {self.callable_line}, in get_exception",
" callable()",
f" File \"{__file__}\", line {f.__code__.co_firstlineno + 4}, in f",
" print(1, (",
" ^^^^",
f" print(1, (",
f" ^^^^^^^",
]
self.assertEqual(actual, expected)
def test_byte_offset_with_wide_characters_term_highlight(self):
def f():
说明说明 = 1
şçöğıĤellö = 0 # not wide but still non-ascii
return 说明说明 / şçöğıĤellö
actual = self.get_exception(f)
expected = [
f"Traceback (most recent call last):",
f" File \"{__file__}\", line {self.callable_line}, in get_exception",
f" callable()",
f" File \"{__file__}\", line {f.__code__.co_firstlineno + 3}, in f",
f" return 说明说明 / şçöğıĤellö",
f" ~~~~~~~~~^~~~~~~~~~~~",
]
self.assertEqual(actual, expected)
def test_byte_offset_with_emojis_term_highlight(self):
def f():
return "✨🐍" + func_说明说明("📗🚛",
"📗🚛") + "🐍"
actual = self.get_exception(f)
expected = [
f"Traceback (most recent call last):",
f" File \"{__file__}\", line {self.callable_line}, in get_exception",
f" callable()",
f" File \"{__file__}\", line {f.__code__.co_firstlineno + 1}, in f",
f' return "✨🐍" + func_说明说明("📗🚛",',
f" ^^^^^^^^^^^^^",
]
self.assertEqual(actual, expected)
def test_byte_offset_wide_chars_subscript(self):
def f():
my_dct = {
"✨🚛✨": {
"说明": {
"🐍🐍🐍": None
}
}
}
return my_dct["✨🚛✨"]["说明"]["🐍"]["说明"]["🐍🐍"]
actual = self.get_exception(f)
expected = [
f"Traceback (most recent call last):",
f" File \"{__file__}\", line {self.callable_line}, in get_exception",
f" callable()",
f" File \"{__file__}\", line {f.__code__.co_firstlineno + 8}, in f",
f' return my_dct["✨🚛✨"]["说明"]["🐍"]["说明"]["🐍🐍"]',
f" ~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^",
]
self.assertEqual(actual, expected)