Further fixes to format_grid

This commit is contained in:
Griatch 2020-04-11 11:33:13 +02:00
parent 2a18cb0a2d
commit c9cab183f5
2 changed files with 45 additions and 15 deletions

View file

@ -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.")

View file

@ -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