From 720fce3a3771e0d67b77632f33a8240db5f6b838 Mon Sep 17 00:00:00 2001 From: Laurier Loiselle Date: Fri, 21 Apr 2023 11:57:54 -0400 Subject: [PATCH 1/3] bom: column-format update initial --- src/wireviz/wv_bom.py | 20 +++++++++++++------- src/wireviz/wv_harness.py | 5 +++-- src/wireviz/wv_output.py | 2 +- 3 files changed, 17 insertions(+), 10 deletions(-) diff --git a/src/wireviz/wv_bom.py b/src/wireviz/wv_bom.py index 20291db..bd848ed 100644 --- a/src/wireviz/wv_bom.py +++ b/src/wireviz/wv_bom.py @@ -34,22 +34,28 @@ def partnumbers2list( 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 = [] - has_content = set() # First pass, get all bom dict and identify filled columns for entry in bom.values(): entry.restrict_printed_lengths = restrict_printed_lengths - has_content = has_content.union(entry.bom_defined) entries_as_dict.append(entry.bom_dict) - first_entry = list(bom.values())[0] # Used for column manipulation - keys_with_content = [k for k in first_entry.bom_keys if k in has_content] - headers = [first_entry.bom_column(k) for k in keys_with_content] + has_content = {} + bom_columns = list(entries_as_dict[0].keys()) + has_content = { + k + for k in bom_columns + if any(e[k] for e in entries_as_dict) + } + + headers = bom_columns + if filter_entries: + headers = [k for k in bom_columns if k in has_content] entries_as_list = [] 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([v for k, v in entry.items() if k in headers]) table = [headers] + entries_as_list diff --git a/src/wireviz/wv_harness.py b/src/wireviz/wv_harness.py index f48fb54..bc187cf 100644 --- a/src/wireviz/wv_harness.py +++ b/src/wireviz/wv_harness.py @@ -186,7 +186,7 @@ class Harness: 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( self, @@ -386,8 +386,8 @@ class Harness: if "gv" in fmt: graph.save(filename=filename.with_suffix(".gv")) # BOM output - bomlist = bom_list(self.bom) if "tsv" in fmt: + bomlist = bom_list(self.bom, restrict_printed_lengths=False) bom_tsv = bom2tsv(bomlist) filename.with_suffix(".tsv").open("w").write(bom_tsv) if "csv" in fmt: @@ -395,6 +395,7 @@ class Harness: print("CSV output is not yet supported") # HTML output if "html" in fmt: + bomlist = bom_list(self.bom, filter_entries=True) generate_html_output(filename, bomlist, self.metadata, self.options) # PDF output if "pdf" in fmt: diff --git a/src/wireviz/wv_output.py b/src/wireviz/wv_output.py index 9ad21d0..560e6f4 100644 --- a/src/wireviz/wv_output.py +++ b/src/wireviz/wv_output.py @@ -104,7 +104,7 @@ def generate_shared_bom( for bom_item in shared_bom.values(): 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_file.open("w").write(shared_bom_tsv) From 60abe071a2453f10586578f27bb518bbebef421a Mon Sep 17 00:00:00 2001 From: Laurier Loiselle Date: Fri, 21 Apr 2023 12:53:53 -0400 Subject: [PATCH 2/3] wv_bom: fix bom columns --- src/wireviz/wv_bom.py | 25 +++++++++++++++---------- src/wireviz/wv_dataclasses.py | 16 ++++++++++++---- 2 files changed, 27 insertions(+), 14 deletions(-) diff --git a/src/wireviz/wv_bom.py b/src/wireviz/wv_bom.py index bd848ed..d68afd5 100644 --- a/src/wireviz/wv_bom.py +++ b/src/wireviz/wv_bom.py @@ -36,18 +36,18 @@ def partnumbers2list( def bom_list(bom, restrict_printed_lengths=True, filter_entries=False): entries_as_dict = [] + bom_columns = [] + has_content = set() # First pass, get all bom dict and identify filled columns for entry in bom.values(): entry.restrict_printed_lengths = restrict_printed_lengths - entries_as_dict.append(entry.bom_dict) - - has_content = {} - bom_columns = list(entries_as_dict[0].keys()) - has_content = { - k - for k in bom_columns - if any(e[k] for e in entries_as_dict) - } + entry_as_dict = entry.bom_dict_pretty_column + 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) headers = bom_columns if filter_entries: @@ -55,7 +55,12 @@ def bom_list(bom, restrict_printed_lengths=True, filter_entries=False): entries_as_list = [] for entry in entries_as_dict: - entries_as_list.append([v for k, v in entry.items() if k in headers]) + 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 diff --git a/src/wireviz/wv_dataclasses.py b/src/wireviz/wv_dataclasses.py index ffd36a7..acb5c72 100644 --- a/src/wireviz/wv_dataclasses.py +++ b/src/wireviz/wv_dataclasses.py @@ -342,15 +342,19 @@ class BomEntry: if not isinstance(self.qty_multiplier, str): self.qty *= float(self.qty_multiplier) + def restrict_length(data, max_len): + return f"{data[:max_len]} ..." + @property def description_str(self): description = self.description if ( - self.restrict_printed_lengths - and len(description) > self.MAX_PRINTED_DESCRIPTION + not self.restrict_printed_lengths or + '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 def designators_str(self): @@ -406,6 +410,10 @@ class BomEntry: return self.partnumbers.BOM_KEY_TO_COLUMNS[key] 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): if self.scaled_per_harness: logging.warn("{self}: Already scaled") From 8ea239a216652f6f4599f759ad6ae59745b6428d Mon Sep 17 00:00:00 2001 From: Laurier Loiselle Date: Fri, 21 Apr 2023 13:00:26 -0400 Subject: [PATCH 3/3] wv_output: titlepage bom not shortened --- src/wireviz/wv_output.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/wireviz/wv_output.py b/src/wireviz/wv_output.py index 560e6f4..3ff6f6a 100644 --- a/src/wireviz/wv_output.py +++ b/src/wireviz/wv_output.py @@ -271,7 +271,7 @@ def generate_titlepage(yaml_data, extra_metadata, shared_bom, for_pdf=False): } generate_html_output( 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 options=Options(**titlepage_options), )