Skip to content

Commit 2b0f20a

Browse files
committed
tablist for json and md
1 parent 55c56c0 commit 2b0f20a

File tree

2 files changed

+127
-32
lines changed

2 files changed

+127
-32
lines changed

tabxlsx.py

+73-32
Original file line numberDiff line numberDiff line change
@@ -856,6 +856,17 @@ def __call__(self, value: str) -> Union[str, Date, Time]:
856856
if t: return t
857857
return value
858858

859+
def tabtotext(data: Iterable[Dict[str, CellValue]], # ..
860+
headers: List[str] = [], selected: List[str] = [],
861+
*, fmt: str = "", tab: Optional[str] = None, padding: Optional[str] = None, minwidth: int = 0, section: str = NIX,
862+
noheaders: bool = False, unique: bool = False, defaultformat: str = "") -> str:
863+
stream = StringIO()
864+
print_tabtotext(stream, data, headers, selected, # ..
865+
tab=tab, padding=padding,
866+
minwidth=minwidth, section=section,
867+
noheaders=noheaders, unique=unique, defaultformat=(fmt or defaultformat))
868+
return stream.getvalue()
869+
859870
def print_tabtotext(output: Union[TextIO, str], data: Iterable[Dict[str, CellValue]], # ..
860871
headers: List[str] = [], selected: List[str] = [],
861872
*, tab: Optional[str] = None, padding: Optional[str] = None, minwidth: int = 0, section: str = NIX,
@@ -1343,49 +1354,79 @@ def extension(filename: str) -> Optional[str]:
13431354
tabs.append(TabSheet(data, headers, title))
13441355
return tabs
13451356

1346-
def print_tablist(output: Union[TextIO, str], tablist: List[TabSheet], selected: List[str] = [],
1347-
*, tab: Optional[str] = None, padding: Optional[str] = None, minwidth: int = 0,
1348-
noheaders: bool = False, unique: bool = False,
1349-
loglevel: int = ERROR, section: Union[None, int, str] = None, defaultformat: str = "") -> str:
1350-
if len(tablist) == 0:
1351-
logg.log(loglevel, "no data in file %s", filename)
1352-
elif len(tablist) == 1:
1353-
tabsheet1 = tablist[0]
1354-
return print_tabtotext(output, tabsheet1.data, tabsheet1.headers, selected, padding=padding, tab=tab,
1355-
noheaders=noheaders, unique=unique, minwidth=minwidth,
1356-
defaultformat=defaultformat)
1357-
elif section:
1358-
tabsheet2: Optional[TabSheet] = None
1357+
def print_tablist(output: Union[TextIO, str], tablist: List[TabSheet] = [], selected: List[str] = [], # ..
1358+
*, tab: Optional[str] = None, padding: Optional[str] = None,
1359+
minwidth: int = 0, section: Union[str, int] = NIX,
1360+
noheaders: bool = False, unique: bool = False, defaultformat: str = "") -> str:
1361+
def extension(filename: str) -> Optional[str]:
1362+
_, ext = fs.splitext(filename.lower())
1363+
if ext: return ext[1:]
1364+
return None
1365+
if section:
13591366
if isinstance(section, int):
13601367
if section > len(tablist):
13611368
logg.error("selected -%i page, but input has only %s pages", section, len(tablist))
1369+
tabsheets = []
13621370
else:
1363-
tabsheet2 = tablist[section - 1]
1371+
tabsheets = [tablist[section - 1]]
13641372
else:
1373+
tabsheets = []
13651374
tabsheetnames = []
13661375
for tabsheet in tablist:
13671376
tabsheetnames += [tabsheet.title]
13681377
if tabsheet.title == section:
1369-
tabsheet2 = tabsheet
1370-
if not tabsheet2:
1378+
tabsheets += [tabsheet]
1379+
if not tabsheets:
13711380
logg.error("selected '-: %s' page, but input has only -: %s", section, " ".join(tabsheetnames))
1372-
if tabsheet2:
1373-
return print_tabtotext(output, tabsheet2.data, tabsheet2.headers, selected, padding=padding, tab=tab,
1374-
noheaders=noheaders, unique=unique, minwidth=minwidth, section=tabsheet2.title,
1375-
defaultformat=defaultformat)
1376-
elif isinstance(output, str) and (defaultformat == "xlsx" and output or output.endswith(".xlsx")):
1377-
workbook3 = tablistmake_workbook(tablist, selected, minwidth)
1378-
if workbook3:
1379-
workbook3.save(output)
1380-
return "SAVED"
13811381
else:
1382-
for tabsheet3 in tablist:
1383-
logg.debug("headers = %s", tabsheet3.headers)
1384-
logg.debug("data = %s", tabsheet3.data)
1385-
return print_tabtotext(output, tabsheet3.data, tabsheet3.headers, selected, padding=padding, tab=tab,
1386-
noheaders=noheaders, unique=unique, minwidth=minwidth, section=tabsheet3.title,
1387-
defaultformat=defaultformat)
1388-
return NIX
1382+
tabsheets = tablist
1383+
if len(tabsheets) == 1:
1384+
if tabsheets[0].title:
1385+
logg.info(" ## %s", tabsheets[0].title)
1386+
title = section if isinstance(section, str) else NIX
1387+
return print_tabtotext(output, tabsheets[0].data, tabsheets[0].headers, selected,
1388+
tab=tab, padding=padding, minwidth=minwidth,
1389+
section=title, noheaders=noheaders, unique=unique, defaultformat=defaultformat)
1390+
if isinstance(output, TextIO) or isinstance(output, StringIO):
1391+
out = output
1392+
fmt = defaultformat
1393+
done = "stream"
1394+
elif "." in output:
1395+
fmt = extension(output) or defaultformat
1396+
if fmt in ["xls", "xlsx", "XLS", "XLSX"]:
1397+
wb1 = tablistmake_workbook(tabsheets, selected) # type: ignore[arg-type]
1398+
if wb1:
1399+
wb1.save(output)
1400+
return "tabxlsx (%s tables)" % len(wb1.worksheets)
1401+
return "tabxlsx"
1402+
out = open(output, "wt", encoding="utf-8")
1403+
done = output
1404+
else:
1405+
fmt = output
1406+
out = sys.stdout
1407+
done = output
1408+
result: List[str] = []
1409+
for tabsheet in tabsheets:
1410+
if tabsheet.title:
1411+
logg.info(" ## %s", tabsheet.title)
1412+
text = tabtotext(tabsheet.data, tabsheet.headers, selected, fmt=fmt,
1413+
tab=tab, padding=padding, minwidth=minwidth,
1414+
section=tabsheet.title, noheaders=noheaders, unique=unique,
1415+
defaultformat=defaultformat)
1416+
result.append(text)
1417+
if fmt in ["jsn", "json", "JSN", "JSON"]:
1418+
for part in range(len(result)-1):
1419+
if result[part].endswith("]}"):
1420+
result[part] = result[part][:-1] + ","
1421+
for part in range(1, len(result)):
1422+
if result[part].startswith('{"'):
1423+
result[part] = result[part][1:]
1424+
for lines in result:
1425+
for line in lines:
1426+
out.write(line)
1427+
if noheaders or "@noheaders" in selected or "@dat" in selected:
1428+
return ""
1429+
return ": %s results %s (%s tables)" % (len(result), done, len(tabsheets))
13891430

13901431

13911432
if __name__ == "__main__":

tabxlsx.tests.py

+54
Original file line numberDiff line numberDiff line change
@@ -723,6 +723,32 @@ def test_5149(self) -> None:
723723
want = [{'a': 'y', 'b': 1}, {'a': 'x', 'b': 2}, {'c': "h"}, ]
724724
logg.info("%s => %s", want, back)
725725
self.assertEqual(want, back)
726+
def test_5821(self) -> None:
727+
tmp = self.testdir()
728+
tablist = { "table01": table01, "table02": table02}
729+
filename = path.join(tmp, "output.json")
730+
text = print_tablist(filename, tablistfor(tablist))
731+
sz = path.getsize(filename)
732+
self.assertGreater(sz, 10)
733+
self.assertGreater(100, sz)
734+
want = { "table01": table01, "table02": table02}
735+
scan = tablistfile(filename)
736+
back = dict(tablistmap(scan))
737+
logg.debug("\n>> %s\n<< %s", want, back)
738+
self.assertEqual(want, back)
739+
def test_5822(self) -> None:
740+
tmp = self.testdir()
741+
tablist = { "table22": table22, "table33": table33}
742+
filename = path.join(tmp, "output.json")
743+
text = print_tablist(filename, tablistfor(tablist))
744+
sz = path.getsize(filename)
745+
self.assertGreater(sz, 100)
746+
self.assertGreater(600, sz)
747+
want = { "table22": table22, "table33": table33}
748+
scan = tablistfile(filename)
749+
back = dict(tablistmap(scan))
750+
logg.debug("\n>> %s\n<< %s", want, back)
751+
self.assertEqual(want, back)
726752

727753
def test_6103(self) -> None:
728754
out = StringIO()
@@ -1059,6 +1085,34 @@ def test_6221(self) -> None:
10591085
back = loadGFM(text)
10601086
del back[0]["a"]
10611087
self.assertEqual(want, back)
1088+
def test_6821(self) -> None:
1089+
tmp = self.testdir()
1090+
tablist = { "table01": table01, "table02": table02}
1091+
filename = path.join(tmp, "output.md")
1092+
text = print_tablist(filename, tablistfor(tablist))
1093+
sz = path.getsize(filename)
1094+
self.assertGreater(sz, 50)
1095+
self.assertGreater(200, sz)
1096+
have = open(filename).read()
1097+
logg.debug("have\n%s", have)
1098+
want = { "table01": table01N, "table02": _date(table02N)}
1099+
scan = tablistfile(filename)
1100+
back = dict(tablistmap(scan))
1101+
logg.debug("\n>> %s\n<< %s", want, back)
1102+
self.assertEqual(want, back)
1103+
def test_6822(self) -> None:
1104+
tmp = self.testdir()
1105+
tablist = { "table22": table22, "table33": table33}
1106+
filename = path.join(tmp, "output.md")
1107+
text = print_tablist(filename, tablistfor(tablist))
1108+
sz = path.getsize(filename)
1109+
self.assertGreater(sz, 40)
1110+
self.assertGreater(600, sz)
1111+
want = { "table22": table22, "table33": _date(table33)}
1112+
scan = tablistfile(filename)
1113+
back = dict(tablistmap(scan))
1114+
logg.debug("\n>> %s\n<< %s", want, back)
1115+
self.assertEqual(want, back)
10621116

10631117
def test_8011(self) -> None:
10641118
tmp = self.testdir()

0 commit comments

Comments
 (0)