adding combinable tables

This commit is contained in:
evilchili 2022-07-30 20:44:16 -07:00
parent 3c22594fd1
commit 50379e9a2a
3 changed files with 85 additions and 2 deletions

View File

@ -13,6 +13,7 @@ python = "^3.7"
typer = "latest" typer = "latest"
rich = "latest" rich = "latest"
pyyaml = "latest" pyyaml = "latest"
pytest = "latest"
[tool.poetry.scripts] [tool.poetry.scripts]

View File

@ -91,7 +91,7 @@ class RollTable:
if not self._rows: if not self._rows:
rows = [] rows = []
if self.headers: if self.headers:
rows.append(self.headers) rows.append(['Roll'] + self.headers)
if self._collapsed: if self._collapsed:
for line in self._collapsed_rows(): for line in self._collapsed_rows():
rows.append(line) rows.append(line)
@ -172,10 +172,55 @@ class RollTable:
Return the rows as a single string. Return the rows as a single string.
""" """
rows = list(self.rows) rows = list(self.rows)
str_format = '\t'.join(['{:s}'] * len(rows[0])) str_format = '\t'.join(['{:10s}'] * len(rows[0]))
return "\n".join([str_format.format(*row) for row in rows]) return "\n".join([str_format.format(*row) for row in rows])
class CombinedTable(RollTable):
"""
Create a table that is a union of other tables.
"""
def __init__(self, tables: List[str], die: Optional[int] = 20):
self._die = die
self._tables = tables
self._rows = None
self._headers = None
# reset any cached values
for t in self._tables:
t._rows = None
t._values = None
t._collapsed = False
t._die = self._die
@property
def tables(self) -> List:
return self._tables
@property
def rows(self) -> List:
"""
Compute the rows of the table by concatenating the rows of the individual tables.
"""
if not self._rows:
# if one table has headers, they must all have them, so fill with empty strings.
if sum([1 for t in self.tables if t.headers]) < len(self.tables):
for t in self.tables:
if not t.headers:
t._headers = ['.'] * len(t.values[0])
self._rows = []
for i in range(self._die):
row = [self.tables[0].rows[i][0]]
for x in range(len(self.tables)):
for col in self.tables[x].rows[i][1:]:
row.append(col)
self._rows.append(row)
return self._rows
if __name__ == '__main__': if __name__ == '__main__':
import sys import sys
print(RollTable(path=sys.argv[1], die=int(sys.argv[2]))) print(RollTable(path=sys.argv[1], die=int(sys.argv[2])))

View File

@ -50,6 +50,43 @@ option 1:
- choice 1 - choice 1
""" """
fixture_combined_A = """
A1:
- A choice 1
- A choice 2
- A choice 3
A2:
- A choice 4
- A choice 5
- A choice 6
A3:
- A choice 7
- A choice 8
- A choice 9
"""
fixture_combined_B = """
metadata:
headers:
- HeaderB
- HeaderB_Choice
B1:
- B choice 1
B2:
- B choice 2
B3:
- B choice 3
"""
def test_combined_tables():
tA = tables.RollTable(fixture_combined_A)
tB = tables.RollTable(fixture_combined_B)
combined = tables.CombinedTable(tables=[tA, tB], die=6)
assert 'A1' in str(combined)
assert 'B1' in str(combined)
def test_table_end_to_end(): def test_table_end_to_end():
assert str(tables.RollTable(fixture_source)) assert str(tables.RollTable(fixture_source))