adding combinable tables
This commit is contained in:
parent
3c22594fd1
commit
50379e9a2a
|
@ -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]
|
||||||
|
|
|
@ -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])))
|
||||||
|
|
|
@ -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))
|
||||||
|
|
Loading…
Reference in New Issue
Block a user