From 7d49f5098427ee24d30849cad074407e56e8ab39 Mon Sep 17 00:00:00 2001 From: Daniel Rojas Date: Fri, 5 Aug 2022 14:16:31 +0200 Subject: [PATCH] Fix BOM output in TSV and HTML --- src/wireviz/wv_bom.py | 34 +++++++++++++++++++++------------- src/wireviz/wv_harness.py | 23 ++++++++++------------- src/wireviz/wv_output.py | 7 ++----- src/wireviz/wv_utils.py | 4 ++-- 4 files changed, 35 insertions(+), 33 deletions(-) diff --git a/src/wireviz/wv_bom.py b/src/wireviz/wv_bom.py index de71e4b..cb18dff 100644 --- a/src/wireviz/wv_bom.py +++ b/src/wireviz/wv_bom.py @@ -67,8 +67,11 @@ def pn_info_string( return None -def print_bom_debug(bom): - headers = "# qty unit description amount unit designators category pn manufacturer mpn supplier spn".split(" ") +def bom_list(bom): + headers = ( + "# Qty Unit Description Amount Unit Designators " + "P/N Manufacturer MPN Supplier SPN Category".split(" ") + ) rows = [] rows.append(headers) # fill rows @@ -81,18 +84,20 @@ def print_bom_debug(bom): hash.amount.number if hash.amount else None, hash.amount.unit if hash.amount else None, ", ".join(sorted(entry["designators"])), - f"{entry['category']} ({entry['category'].name})", ] if hash.partnumbers: - cells.extend([ - hash.partnumbers.pn, - hash.partnumbers.manufacturer, - hash.partnumbers.mpn, - hash.partnumbers.supplier, - hash.partnumbers.spn, - ]) + cells.extend( + [ + hash.partnumbers.pn, + hash.partnumbers.manufacturer, + hash.partnumbers.mpn, + hash.partnumbers.supplier, + hash.partnumbers.spn, + ] + ) else: - cells.extend([None,None,None,None,None]) + cells.extend([None, None, None, None, None]) + # cells.extend([f"{entry['category']} ({entry['category'].name})"]) # for debugging rows.append(cells) # remove empty columns transposed = list(map(list, zip(*rows))) @@ -103,7 +108,10 @@ def print_bom_debug(bom): # ^ ignore header cell in check ] rows = list(map(list, zip(*transposed))) - # output + return rows + + +def print_bom_table(bom): print() - print(tabulate_module.tabulate(rows, headers="firstrow")) + print(tabulate_module.tabulate(bom_list(bom), headers="firstrow")) print() diff --git a/src/wireviz/wv_harness.py b/src/wireviz/wv_harness.py index 7443bc0..b41cfc1 100644 --- a/src/wireviz/wv_harness.py +++ b/src/wireviz/wv_harness.py @@ -8,7 +8,7 @@ from typing import List from graphviz import Graph import wireviz.wv_colors -from wireviz.wv_bom import BomCategory, BomEntry, print_bom_debug +from wireviz.wv_bom import BomCategory, BomEntry, bom_list, print_bom_table from wireviz.wv_dataclasses import ( AUTOGENERATED_PREFIX, AdditionalComponent, @@ -36,7 +36,7 @@ from wireviz.wv_graphviz import ( set_dot_basics, ) from wireviz.wv_output import embed_svg_images_file, generate_html_output -from wireviz.wv_utils import open_file_write, tuplelist2tsv +from wireviz.wv_utils import bom2tsv, open_file_write @dataclass @@ -130,7 +130,7 @@ class Harness: continue item.bom_id = self.bom[item.bom_hash]["id"] - print_bom_debug(self.bom) + print_bom_table(self.bom) def _add_to_internal_bom(self, item: Component): if item.ignore_in_bom: @@ -293,7 +293,9 @@ class Harness: for connector in self.connectors.values(): # generate connector node gv_html = gv_node_component(connector) - gv_html.update_attribs(bgcolor=calculate_node_bgcolor(connector, self.options)) + gv_html.update_attribs( + bgcolor=calculate_node_bgcolor(connector, self.options) + ) dot.node( connector.designator, label=f"<\n{gv_html}\n>", @@ -401,11 +403,11 @@ class Harness: if "gv" in fmt: graph.save(filename=f"{filename}.gv") # BOM output - # bommy = self.bom - # bomlist = bom_list(bommy) - bomlist = [[]] + bomlist = bom_list(self.bom) + # bomlist = [[]] if "tsv" in fmt: - open_file_write(f"{filename}.tsv").write(tuplelist2tsv(bomlist)) + tsv = bom2tsv(bomlist) + open_file_write(f"{filename}.tsv").write(tsv) if "csv" in fmt: # TODO: implement CSV output (preferrably using CSV library) print("CSV output is not yet supported") @@ -422,8 +424,3 @@ class Harness: Path(f"{filename}.tmp.svg").unlink() elif "svg" in fmt: Path(f"{filename}.tmp.svg").replace(f"{filename}.svg") - - # def bom(self): - # if not self._bom: - # self._bom = generate_bom(self) - # return self._bom diff --git a/src/wireviz/wv_output.py b/src/wireviz/wv_output.py index c61f4be..2f1cf33 100644 --- a/src/wireviz/wv_output.py +++ b/src/wireviz/wv_output.py @@ -9,7 +9,6 @@ import wireviz # for doing wireviz.__file__ from wireviz import APP_NAME, APP_URL, __version__ from wireviz.wv_dataclasses import Metadata, Options from wireviz.wv_utils import ( - flatten2d, html_line_breaks, open_file_read, open_file_write, @@ -65,7 +64,7 @@ def embed_svg_images_file( def generate_html_output( filename: Union[str, Path], - bom_list: List[List[str]], + bom: List[List[str]], metadata: Metadata, options: Options, ): @@ -95,8 +94,6 @@ def generate_html_output( ) # generate BOM table - bom = flatten2d(bom_list) - # generate BOM header (may be at the top or bottom of the table) bom_header_html = " \n" for item in bom[0]: @@ -110,7 +107,7 @@ def generate_html_output( row_html = " \n" for i, item in enumerate(row): td_class = f"bom_col_{bom[0][i].lower()}" - row_html = f'{row_html} {item}\n' + row_html = f'{row_html} {item if item is not None else ""}\n' row_html = f"{row_html} \n" bom_contents.append(row_html) diff --git a/src/wireviz/wv_utils.py b/src/wireviz/wv_utils.py index f1b4993..a2bff03 100644 --- a/src/wireviz/wv_utils.py +++ b/src/wireviz/wv_utils.py @@ -90,12 +90,12 @@ def flatten2d(inp): ] -def tuplelist2tsv(inp, header=None): +def bom2tsv(inp, header=None): output = "" if header is not None: inp.insert(0, header) - inp = flatten2d(inp) for row in inp: + row = [item if item is not None else "" for item in row] output = output + "\t".join(str(remove_links(item)) for item in row) + "\n" return output