aboutsummaryrefslogtreecommitdiff
path: root/src/ee/bom/doit.py
diff options
context:
space:
mode:
Diffstat (limited to 'src/ee/bom/doit.py')
-rw-r--r--src/ee/bom/doit.py133
1 files changed, 88 insertions, 45 deletions
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],
+ }