Merge pull request #5 from laurierloi/bom-column-format
Bom column format
This commit is contained in:
commit
c4456d5015
@ -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
|
||||||
|
|
||||||
|
|||||||
@ -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")
|
||||||
|
|||||||
@ -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:
|
||||||
|
|||||||
@ -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),
|
||||||
)
|
)
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user