From de9e6739543fd6a589b80184e5452a6a5cdb1196 Mon Sep 17 00:00:00 2001 From: Trygve Laugstøl Date: Sat, 28 Jul 2018 21:59:29 +0200 Subject: o Dumping MpnBomComponent, wtf. o Renaming bom.csv to order.csv. --- src/ee/bom/doit.py | 133 +++++++++++++++++++++++++++++++++++------------------ 1 file changed, 88 insertions(+), 45 deletions(-) (limited to 'src/ee/bom') diff --git a/src/ee/bom/doit.py b/src/ee/bom/doit.py index d7407d8..f793611 100644 --- a/src/ee/bom/doit.py +++ b/src/ee/bom/doit.py @@ -1,13 +1,31 @@ -from typing import Mapping +import logging +from pathlib import Path +from typing import Mapping, Union from configclass import Config +from namedlist import namedlist -from ee.ds import DataSetManager +from ee.ds import DataSetManager, DataSet + +logger = logging.getLogger(__name__) _dsm = None # type: DataSetManager _data_sets = {} + +def change_data_sets_for_task(task, _callable): + _data_sets[task][1] = _callable(_data_sets[task][1]) + + +def output_data_set_for_task(task): + return _data_sets[task][0] + + +def input_data_sets_for_task(task): + return _data_sets[task][1] + + _config_template = Config({ }) @@ -28,62 +46,48 @@ class BomComponent(object): self.mpn = mpn def to_object(self, ds): - return ds.create_object("bom-component", self.ref).\ - set("ref", self.ref).\ - set("mpn", self.mpn) - - -class MpnBomComponent(object): - def __init__(self, ref, mpn): - self.ref = ref - self.mpn = mpn - self.count = 1 - - def to_object(self, ds): - return ds.create_object("mpn-bom-component", self.ref).\ - set("ref", self.ref).\ + return ds.create_object("bom-component", self.ref). \ + set("ref", self.ref). \ set("mpn", self.mpn) def task_bom(): - out_data_set = "bom" - in_data_sets = _data_sets[task_bom] + """ + Takes all schematic components, filters out all virtual/non- + physical components (like power flags and ground components) and + creates 'bom-component' objects. + """ - def action(count=1): - with _dsm.create_ro(in_data_sets) as in_ds: - with _dsm.create_rw(out_data_set, clean=True) as output: - components = [o for o in in_ds.items() if o.object_type.name == "component"] + out_data_set = _data_sets[task_bom][0] + in_data_sets = _data_sets[task_bom][1] - bom_components = {} - mpn_bom_components = {} + def action(): + in_ds = _dsm.load_data_sets(in_data_sets) - for c in components: - ref = c.get("ref") - mpn = c.get("mpn") + with _dsm.create_rw(out_data_set, clean=True) as output: + components = [o for o in in_ds.items() if o.object_type.name == "component"] - if not ref: - raise Exception("Missing ref") + bom_components = {} - if not mpn: - output.create_object("message", "bom-{}".format(ref)). \ - set("level", "error"). \ - set("message", "Missing required field 'mpn'") - continue + for c in components: + ref = c.get("ref") + mpn = c.get("mpn") - if ref in bom_components: - raise Exception("Duplicate ref '{}'".format("ref")) + if not ref: + raise Exception("Missing ref") - bom_components[ref] = BomComponent(ref, mpn) + if not mpn: + output.create_object("message", "bom-{}".format(ref)). \ + set("level", "error"). \ + set("message", "Missing required field 'mpn'") + continue - mpn_bom_component = mpn_bom_components[ref] - if not mpn_bom_component: - mpn_bom_component = MpnBomComponent(ref, mpn) - mpn_bom_components[ref] = mpn_bom_component + if ref in bom_components: + raise Exception("Duplicate ref '{}'".format("ref")) - mpn_bom_component.count += 1 + bom_components[ref] = BomComponent(ref, mpn) - [c.to_object(output) for c in bom_components.values()] - [c.to_object(output) for c in mpn_bom_components.values()] + [c.to_object(output) for c in bom_components.values()] return { "file_dep": [_dsm.cookie_for_ds(ds) for ds in in_data_sets], @@ -92,4 +96,43 @@ def task_bom(): } -_data_sets[task_bom] = ["components"] +_data_sets[task_bom] = ["bom", ["components"]] + + +def order_csv(count: int, group_by_mpn: bool, output_file: Path, data_sets): + ds = _dsm.load_data_sets(data_sets) + + out = DataSet() + + if group_by_mpn: + parts = {} + + Part = namedlist("Part", "mpn, cnt, refs") + + for c in [o for o in ds.items() if o.object_type.name == "bom-component"]: + ref = c.get("ref") + mpn = c.get("mpn") + if mpn in parts: + parts[mpn].cnt += 1 + parts[mpn].refs.append(ref) + else: + parts[mpn] = Part(mpn=mpn, cnt=1, refs=[ref]) + + for part in sorted(parts.values(), key=lambda p: p.mpn): + out.create_object("row", part.mpn). \ + set("MPN", part.mpn). \ + set("Count", part.cnt * count). \ + set("References", ",".join(part.refs)) + + _dsm.store_csv(output_file, out, "row", order_by="MPN") + else: + raise Exception("Not implemented") + + +def create_task_order_csv(output_file: Union[str, Path], data_sets, count: int = 1): + return { + "name": "order-{}".format(count), + "actions": [(order_csv, [count, True, Path(output_file), data_sets])], + "file_dep": [_dsm.cookie_for_ds(ds) for ds in data_sets], + "targets": [output_file], + } -- cgit v1.2.3