Merge pull request #5 from laurierloi/bom-column-format

Bom column format
This commit is contained in:
Laurier Loiselle 2023-04-21 13:02:18 -04:00 committed by GitHub
commit c4456d5015
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 35 additions and 15 deletions

View File

@ -34,22 +34,33 @@ def partnumbers2list(
return [p.str_list for p in partnumbers if p] return [p.str_list for p in partnumbers if p]
def bom_list(bom, restrict_printed_lengths=True): def bom_list(bom, restrict_printed_lengths=True, filter_entries=False):
entries_as_dict = [] entries_as_dict = []
bom_columns = []
has_content = set() has_content = set()
# First pass, get all bom dict and identify filled columns # First pass, get all bom dict and identify filled columns
for entry in bom.values(): for entry in bom.values():
entry.restrict_printed_lengths = restrict_printed_lengths entry.restrict_printed_lengths = restrict_printed_lengths
has_content = has_content.union(entry.bom_defined) entry_as_dict = entry.bom_dict_pretty_column
entries_as_dict.append(entry.bom_dict) entries_as_dict.append(entry_as_dict)
for k in entry_as_dict:
if k not in bom_columns:
bom_columns.append(k)
if entry_as_dict[k] is not None and entry_as_dict[k] != "":
has_content.add(k)
first_entry = list(bom.values())[0] # Used for column manipulation headers = bom_columns
keys_with_content = [k for k in first_entry.bom_keys if k in has_content] if filter_entries:
headers = [first_entry.bom_column(k) for k in keys_with_content] headers = [k for k in bom_columns if k in has_content]
entries_as_list = [] entries_as_list = []
for entry in entries_as_dict: for entry in entries_as_dict:
entries_as_list.append([v for k, v in entry.items() if k in keys_with_content]) entries_as_list.append([entry.get(k, "") for k in headers])
# sanity check
expected_length = len(entries_as_list[0])
for e in entries_as_list:
assert len(e) == expected_length, f'entries {e} length is not {expected_length}'
table = [headers] + entries_as_list table = [headers] + entries_as_list

View File

@ -342,15 +342,19 @@ class BomEntry:
if not isinstance(self.qty_multiplier, str): if not isinstance(self.qty_multiplier, str):
self.qty *= float(self.qty_multiplier) self.qty *= float(self.qty_multiplier)
def restrict_length(data, max_len):
return f"{data[:max_len]} ..."
@property @property
def description_str(self): def description_str(self):
description = self.description description = self.description
if ( if (
self.restrict_printed_lengths not self.restrict_printed_lengths or
and len(description) > self.MAX_PRINTED_DESCRIPTION 'href' in description or
len(description) < self.MAX_PRINTED_DESCRIPTION
): ):
description = f"{description[:self.MAX_PRINTED_DESCRIPTION]} (...)" return description
return description return f"{description[:self.MAX_PRINTED_DESCRIPTION]} (...)"
@property @property
def designators_str(self): def designators_str(self):
@ -406,6 +410,10 @@ class BomEntry:
return self.partnumbers.BOM_KEY_TO_COLUMNS[key] return self.partnumbers.BOM_KEY_TO_COLUMNS[key]
raise ValueError(f"key '{key}' not found in bom keys") raise ValueError(f"key '{key}' not found in bom keys")
@property
def bom_dict_pretty_column(self):
return {self.bom_column(k): v for k, v in self.bom_dict.items()}
def scale_per_harness(self, qty_multipliers): def scale_per_harness(self, qty_multipliers):
if self.scaled_per_harness: if self.scaled_per_harness:
logging.warn("{self}: Already scaled") logging.warn("{self}: Already scaled")

View File

@ -186,7 +186,7 @@ class Harness:
key=lambda x: (x[1].id,), key=lambda x: (x[1].id,),
) )
) )
# from wireviz.wv_bom import print_bom_table ; print_bom_table(self.bom) # for debugging from wireviz.wv_bom import print_bom_table ; print_bom_table(self.bom) # for debugging
def connect( def connect(
self, self,
@ -386,8 +386,8 @@ class Harness:
if "gv" in fmt: if "gv" in fmt:
graph.save(filename=filename.with_suffix(".gv")) graph.save(filename=filename.with_suffix(".gv"))
# BOM output # BOM output
bomlist = bom_list(self.bom)
if "tsv" in fmt: if "tsv" in fmt:
bomlist = bom_list(self.bom, restrict_printed_lengths=False)
bom_tsv = bom2tsv(bomlist) bom_tsv = bom2tsv(bomlist)
filename.with_suffix(".tsv").open("w").write(bom_tsv) filename.with_suffix(".tsv").open("w").write(bom_tsv)
if "csv" in fmt: if "csv" in fmt:
@ -395,6 +395,7 @@ class Harness:
print("CSV output is not yet supported") print("CSV output is not yet supported")
# HTML output # HTML output
if "html" in fmt: if "html" in fmt:
bomlist = bom_list(self.bom, filter_entries=True)
generate_html_output(filename, bomlist, self.metadata, self.options) generate_html_output(filename, bomlist, self.metadata, self.options)
# PDF output # PDF output
if "pdf" in fmt: if "pdf" in fmt:

View File

@ -104,7 +104,7 @@ def generate_shared_bom(
for bom_item in shared_bom.values(): for bom_item in shared_bom.values():
bom_item.scale_per_harness(qty_multipliers) bom_item.scale_per_harness(qty_multipliers)
shared_bomlist = bom_list(shared_bom, False) shared_bomlist = bom_list(shared_bom, restrict_printed_lengths=False, filter_entries=True)
shared_bom_tsv = bom2tsv(shared_bomlist) shared_bom_tsv = bom2tsv(shared_bomlist)
shared_bom_file.open("w").write(shared_bom_tsv) shared_bom_file.open("w").write(shared_bom_tsv)
@ -271,7 +271,7 @@ def generate_titlepage(yaml_data, extra_metadata, shared_bom, for_pdf=False):
} }
generate_html_output( generate_html_output(
extra_metadata["output_dir"] / extra_metadata["titlepage"], extra_metadata["output_dir"] / extra_metadata["titlepage"],
bom=bom_list(shared_bom), bom=bom_list(shared_bom, restrict_printed_lengths=False, filter_entries=True),
metadata=Metadata(**titlepage_metadata), # TBD what we need to add here metadata=Metadata(**titlepage_metadata), # TBD what we need to add here
options=Options(**titlepage_options), options=Options(**titlepage_options),
) )