From c9cab183f5b5230ece7642d85e20a36eb7da89d0 Mon Sep 17 00:00:00 2001 From: Griatch Date: Sat, 11 Apr 2020 11:33:13 +0200 Subject: [PATCH] Further fixes to format_grid --- evennia/utils/tests/test_utils.py | 13 ++++++--- evennia/utils/utils.py | 47 +++++++++++++++++++++++-------- 2 files changed, 45 insertions(+), 15 deletions(-) diff --git a/evennia/utils/tests/test_utils.py b/evennia/utils/tests/test_utils.py index e07fd996aa..2571f3ec01 100644 --- a/evennia/utils/tests/test_utils.py +++ b/evennia/utils/tests/test_utils.py @@ -289,6 +289,8 @@ class TestFormatGrid(TestCase): elements = self._generate_elements(3, 1, 30) result = utils.format_grid(elements, width=78) rows = result.split("\n") + for row in rows: + print(f"'{row}'") self.assertEqual(len(rows), 3) self.assertTrue(all(len(row) == 78 for row in rows)) @@ -297,24 +299,28 @@ class TestFormatGrid(TestCase): elements = self._generate_elements(3, 15, 30) result = utils.format_grid(elements, width=82, sep=" ") rows = result.split("\n") + for row in rows: + print(f"'{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""" + # from pudb import debugger + # debugger.Debugger().set_trace() elements = self._generate_elements(70, 20, 30) result = utils.format_grid(elements, width=78) rows = result.split("\n") + for row in rows: + print(f"'{row}'") self.assertEqual(len(rows), 30) self.assertTrue(all(len(row) == 78 for row in rows)) def test_overlap(self): + """Grid with elements overlapping into the next slot""" elements = ("alias", "batchcode", "batchcommands", "cmdsets", "copy", "cpattr", "desc", "destroy", "dig", "examine", "find", "force", "lock") - # from evennia import set_trace;set_trace() - from pudb import debugger - debugger.Debugger().set_trace() result = utils.format_grid(elements, width=78) rows = result.split("\n") self.assertEqual(len(rows), 2) @@ -322,4 +328,3 @@ class TestFormatGrid(TestCase): print(f"'{row}'") for element in elements: self.assertTrue(element in result, f"element {element} is missing.") - diff --git a/evennia/utils/utils.py b/evennia/utils/utils.py index 08835a467b..fc407ea90d 100644 --- a/evennia/utils/utils.py +++ b/evennia/utils/utils.py @@ -1686,10 +1686,11 @@ def format_table(table, extra_space=1): ) return ftable -import functools + +import functools # noqa -def percentile(iterable, percent, key=lambda x:x): +def percentile(iterable, percent, key=lambda x: x): """ Find the percentile of a list of values. @@ -1743,31 +1744,55 @@ def format_grid(elements, width=78, sep=" "): row = "" for ie, element in enumerate(elements): wl = wls[ie] + lrow = len(row) + debug = row.replace(" ", ".") # from evennia import set_trace;set_trace() - if ic >= aver_per_row - 1 or ie >= nelements - 1: - if ic == 0: - row = crop(element) + if ie >= nelements - 1: + # last element in list - make sure to add it + if lrow + wl > width: + # last slot extends outside grid, move to next line + row += " " * (width - lrow) + rows.append(row) + row = crop(element, width) + else: + row += crop(element, width) row += " " * max(0, (width - len(row))) rows.append(row) - row = "" - ic = 0 - elif indices[ic] + wl > width: - row += " " * (width - len(row)) + elif ic >= aver_per_row - 1: + # last slot on the line + if ic == 0: + # one slot per line + row = crop(element, width) + row += " " * max(0, (width - len(row))) + rows.append(row) + else: + # finish line, put slot on next line + row += " " * max(0, (width - lrow)) + rows.append(row) + row = crop(element, width) + ic = 0 + elif lrow + wl > width: + # last slot extends outside grid, move to next line + row += " " * (width - lrow) rows.append(row) row = crop(element, width) ic = 0 else: try: - while len(row) > indices[ic] - 1: + while lrow > max(0, indices[ic]): + # slot too wide, extend into adjacent slot ic += 1 + row += " " * max(0, indices[ic] - lrow) except IndexError: + # we extended past edge of grid, crop or move to next line if ic == 0: row = crop(element, width) else: - row += " " * max(0, width - len(row)) + row += " " * max(0, width - lrow) rows.append(row) ic = 0 else: + # add a new slot row += element + " " * max(0, averlen - wl) ic += 1