Fix BOM output in TSV and HTML

This commit is contained in:
Daniel Rojas 2022-08-05 14:16:31 +02:00 committed by KV
parent af230a4a5c
commit 7d49f50984
4 changed files with 35 additions and 33 deletions

View File

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

View File

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

View File

@ -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 = " <tr>\n"
for item in bom[0]:
@ -110,7 +107,7 @@ def generate_html_output(
row_html = " <tr>\n"
for i, item in enumerate(row):
td_class = f"bom_col_{bom[0][i].lower()}"
row_html = f'{row_html} <td class="{td_class}">{item}</td>\n'
row_html = f'{row_html} <td class="{td_class}">{item if item is not None else ""}</td>\n'
row_html = f"{row_html} </tr>\n"
bom_contents.append(row_html)

View File

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