|
35 | 35 | multiline_input, |
36 | 36 | code_to_events, |
37 | 37 | ) |
| 38 | +from _colorize import ANSIColors, get_theme |
38 | 39 | from _pyrepl.console import Event |
39 | 40 | from _pyrepl.completing_reader import stripcolor |
40 | 41 | from _pyrepl._module_completer import ( |
41 | 42 | ImportParser, |
42 | 43 | ModuleCompleter, |
43 | 44 | HARDCODED_SUBMODULES, |
44 | 45 | ) |
45 | | -from _pyrepl.fancycompleter import Completer as FancyCompleter |
| 46 | +from _pyrepl.fancycompleter import Completer as FancyCompleter, colorize_matches |
46 | 47 | import _pyrepl.readline as pyrepl_readline |
47 | 48 | from _pyrepl.readline import ( |
48 | 49 | ReadlineAlikeReader, |
@@ -1642,38 +1643,37 @@ def test_suggestions_and_messages(self) -> None: |
1642 | 1643 | self.assertSetEqual(new_imports, expected_imports) |
1643 | 1644 |
|
1644 | 1645 | def test_colorize_import_completions(self) -> None: |
1645 | | - from _colorize import get_theme |
1646 | | - from _pyrepl.fancycompleter import colorize_matches |
1647 | | - from _pyrepl.completing_reader import stripcolor |
1648 | | - |
1649 | 1646 | theme = get_theme() |
| 1647 | + type_color = theme.fancycompleter.type |
| 1648 | + module_color = theme.fancycompleter.module |
| 1649 | + R = ANSIColors.RESET |
| 1650 | + |
1650 | 1651 | colorize = lambda names, values: colorize_matches(names, values, theme) |
1651 | 1652 | config = ReadlineConfig(colorize_completions=colorize) |
1652 | | - |
1653 | 1653 | reader = ReadlineAlikeReader( |
1654 | 1654 | console=FakeConsole(events=[]), |
1655 | 1655 | config=config, |
1656 | 1656 | ) |
1657 | 1657 |
|
1658 | | - # Multiple completions should be colorized (contain ANSI codes) |
1659 | | - reader.buffer = list("from collections import d") |
| 1658 | + # "from collections import de" -> defaultdict (type) and deque (type) |
| 1659 | + reader.buffer = list("from collections import de") |
1660 | 1660 | reader.pos = len(reader.buffer) |
1661 | | - result = reader.get_module_completions() |
1662 | | - self.assertIsNotNone(result) |
1663 | | - names, action = result |
1664 | | - self.assertTrue(len(names) > 1) |
1665 | | - # Colorized names contain ANSI escape sequences |
1666 | | - self.assertTrue(any(name != stripcolor(name) for name in names |
1667 | | - if name.strip())) |
1668 | | - |
1669 | | - # Single completion should NOT be colorized |
1670 | | - reader.buffer = list("from collections import Order") |
| 1661 | + names, action = reader.get_module_completions() |
| 1662 | + self.assertEqual(names, [ |
| 1663 | + f"{type_color}defaultdict{R}", |
| 1664 | + f"{type_color}deque{R}", |
| 1665 | + ]) |
| 1666 | + self.assertIsNone(action) |
| 1667 | + |
| 1668 | + # "from importlib.m" has submodule completions colored as modules |
| 1669 | + reader.buffer = list("from importlib.m") |
1671 | 1670 | reader.pos = len(reader.buffer) |
1672 | | - result = reader.get_module_completions() |
1673 | | - self.assertIsNotNone(result) |
1674 | | - names, action = result |
1675 | | - self.assertEqual(len(names), 1) |
1676 | | - self.assertEqual(names[0], stripcolor(names[0])) |
| 1671 | + names, action = reader.get_module_completions() |
| 1672 | + self.assertEqual(names, [ |
| 1673 | + f"{module_color}importlib.machinery{R}", |
| 1674 | + f"{module_color}importlib.metadata{R}", |
| 1675 | + ]) |
| 1676 | + self.assertIsNone(action) |
1677 | 1677 |
|
1678 | 1678 |
|
1679 | 1679 | # Audit hook used to check for stdlib modules import side-effects |
|
0 commit comments