From 642f17be688d8fada763fc9b9b9ba8c267db0732 Mon Sep 17 00:00:00 2001 From: Griatch Date: Sat, 11 Apr 2020 20:28:29 +0200 Subject: [PATCH] Fix bug in ANSIString --- evennia/commands/default/help.py | 11 ++++-- evennia/commands/default/tests.py | 2 +- evennia/utils/ansi.py | 2 +- evennia/utils/evmore.py | 5 ++- evennia/utils/tests/test_utils.py | 56 ++++++++++--------------------- evennia/utils/utils.py | 1 - 6 files changed, 32 insertions(+), 45 deletions(-) diff --git a/evennia/commands/default/help.py b/evennia/commands/default/help.py index 59d3f7fb07..2d9967b48c 100644 --- a/evennia/commands/default/help.py +++ b/evennia/commands/default/help.py @@ -187,20 +187,27 @@ class CmdHelp(Command): respectively. You can override this method to return a custom display of the list of commands and topics. """ + category_clr = "|w" + topic_clr = "|G" width = self.client_width() grid = [] verbatim_elements = [] for category in sorted(set(list(hdict_cmds.keys()) + list(hdict_db.keys()))): category_str = f"-- {category.title()} " - grid.append(ANSIString("|w" + category_str + "-" * (width - len(category_str)) + "|G")) + grid.append(ANSIString( + category_clr + + category_str + + "-" * (width - len(category_str)) + + topic_clr)) verbatim_elements.append(len(grid) - 1) entries = sorted(set(hdict_cmds.get(category, []) + hdict_db.get(category, []))) grid.extend(entries) gridrows = format_grid(grid, width, sep=" ", verbatim_elements=verbatim_elements) - return "\n".join(gridrows) + gridrows = ANSIString("\n").join(gridrows) + return gridrows def check_show_help(self, cmd, caller): """ diff --git a/evennia/commands/default/tests.py b/evennia/commands/default/tests.py index 4edaccb51d..9c36ec6425 100644 --- a/evennia/commands/default/tests.py +++ b/evennia/commands/default/tests.py @@ -266,7 +266,7 @@ class TestGeneral(CommandTest): class TestHelp(CommandTest): def test_help(self): - self.call(help.CmdHelp(), "", "Command help entries", cmdset=CharacterCmdSet()) + self.call(help.CmdHelp(), "", "Admin", cmdset=CharacterCmdSet()) def test_set_help(self): self.call( diff --git a/evennia/utils/ansi.py b/evennia/utils/ansi.py index 7129cc8627..cc4cf3dcd0 100644 --- a/evennia/utils/ansi.py +++ b/evennia/utils/ansi.py @@ -822,7 +822,7 @@ class ANSIString(str, metaclass=ANSIMeta): """ if not offset: - return [] + return iterable return [i + offset for i in iterable] @classmethod diff --git a/evennia/utils/evmore.py b/evennia/utils/evmore.py index fea698740b..a1d6e6d1e0 100644 --- a/evennia/utils/evmore.py +++ b/evennia/utils/evmore.py @@ -31,6 +31,7 @@ from django.conf import settings from django.db.models.query import QuerySet from evennia import Command, CmdSet from evennia.commands import cmdhandler +from evennia.utils.ansi import ANSIString from evennia.utils.utils import make_iter, inherits_from, justify _CMD_NOMATCH = cmdhandler.CMD_NOMATCH @@ -42,6 +43,8 @@ _SCREEN_HEIGHT = settings.CLIENT_DEFAULT_HEIGHT _EVTABLE = None +_LBR = ANSIString("\n") + # text _DISPLAY = """{text} @@ -332,7 +335,7 @@ class EvMore(object): # no justification. Simple division by line lines = text.split("\n") - self._data = ["\n".join(lines[i: i + self.height]) + self._data = [_LBR.join(lines[i: i + self.height]) for i in range(0, len(lines), self.height)] self._npages = len(self._data) self._paginator = self.paginator_index diff --git a/evennia/utils/tests/test_utils.py b/evennia/utils/tests/test_utils.py index b16ac6511c..b76d6f1275 100644 --- a/evennia/utils/tests/test_utils.py +++ b/evennia/utils/tests/test_utils.py @@ -99,30 +99,6 @@ class TestMLen(TestCase): self.assertEqual(utils.m_len({"hello": True, "Goodbye": False}), 2) -class TestANSIString(TestCase): - """ - Verifies that ANSIString's string-API works as intended. - """ - - def setUp(self): - self.example_raw = "|relectric |cboogaloo|n" - self.example_ansi = ANSIString(self.example_raw) - self.example_str = "electric boogaloo" - self.example_output = "\x1b[1m\x1b[31melectric \x1b[1m\x1b[36mboogaloo\x1b[0m" - - def test_length(self): - self.assertEqual(len(self.example_ansi), 17) - - def test_clean(self): - self.assertEqual(self.example_ansi.clean(), self.example_str) - - def test_raw(self): - self.assertEqual(self.example_ansi.raw(), self.example_output) - - def test_format(self): - self.assertEqual(f"{self.example_ansi:0<20}", self.example_output + "000") - - class TestTimeformat(TestCase): """ Default function header from utils.py: @@ -287,24 +263,27 @@ class TestFormatGrid(TestCase): def test_even_grid(self): """Grid with small variations""" elements = self._generate_elements(3, 1, 30) - result = utils.format_grid(elements, width=78) - rows = result.split("\n") + rows = utils.format_grid(elements, width=78) + for row in rows: + print(f"'{row}'", len(row)) self.assertEqual(len(rows), 3) self.assertTrue(all(len(row) == 78 for row in rows)) def test_disparate_grid(self): """Grid with big variations""" elements = self._generate_elements(3, 15, 30) - result = utils.format_grid(elements, width=82, sep=" ") - rows = result.split("\n") + rows = utils.format_grid(elements, width=82, sep=" ") + for row in rows: + print(f"'{row}'", len(row)) self.assertEqual(len(rows), 8) self.assertTrue(all(len(row) == 82 for row in rows)) def test_huge_grid(self): """Grid with very long strings""" elements = self._generate_elements(70, 20, 30) - result = utils.format_grid(elements, width=78) - rows = result.split("\n") + rows = utils.format_grid(elements, width=78) + for row in rows: + print(f"'{row}'", len(row)) self.assertEqual(len(rows), 30) self.assertTrue(all(len(row) == 78 for row in rows)) @@ -313,21 +292,20 @@ class TestFormatGrid(TestCase): elements = ("alias", "batchcode", "batchcommands", "cmdsets", "copy", "cpattr", "desc", "destroy", "dig", "examine", "find", "force", "lock") - result = utils.format_grid(elements, width=78) - rows = result.split("\n") + rows = utils.format_grid(elements, width=78) + for row in rows: + print(f"'{row}'", len(row)) self.assertEqual(len(rows), 2) for element in elements: - self.assertTrue(element in result, f"element {element} is missing.") + self.assertTrue(element in rows, f"element {element} is missing.") def test_breakline(self): """Grid with line-long elements in middle""" elements = self._generate_elements(6, 4, 30) elements[10] = elements[20] = "-" * 78 - # from pudb import debugger - # debugger.Debugger().set_trace() - result = utils.format_grid(elements, width=78) - rows = result.split("\n") + rows = utils.format_grid(elements, width=78) + for row in rows: + print(f"'{row}'", len(row)) self.assertEqual(len(rows), 8) for element in elements: - self.assertTrue(element in result, f"element {element} is missing.") - + self.assertTrue(element in rows, f"element {element} is missing.") diff --git a/evennia/utils/utils.py b/evennia/utils/utils.py index 47589c42dd..f723e6ee5c 100644 --- a/evennia/utils/utils.py +++ b/evennia/utils/utils.py @@ -153,7 +153,6 @@ def crop(text, width=None, suffix="[...]"): if ltext <= width: return text else: - from evennia import set_trace;set_trace() lsuffix = len(suffix) text = text[:width] if lsuffix >= width else "%s%s" % (text[: width - lsuffix], suffix) return to_str(text)