From d203763f31428bee3edba4383d37f992b0f8e186 Mon Sep 17 00:00:00 2001
From: Trygve Laugstøl <trygvis@inamo.no>
Date: Mon, 3 Jun 2019 08:46:51 +0200
Subject: ninja: o Reading list of suppliers from Project. The project still
 has a   hard-coded list, but at least now there is only one list. o Using
 Project.public_dir instead of "ee". Also in generated ninja   files. o
 Removing part_dbs list from internal code, only use suppliers. If the   user
 want to have it's own internal list of parts that should become a   supplier.

---
 src/ee/project/__init__.py            |  9 +++-
 src/ee/tools/ninja.py                 | 25 +++++-----
 src/ee/tools/templates/build.ninja.j2 | 90 +++++++++++++++++------------------
 3 files changed, 65 insertions(+), 59 deletions(-)

(limited to 'src/ee')

diff --git a/src/ee/project/__init__.py b/src/ee/project/__init__.py
index 6c04c07..395d204 100644
--- a/src/ee/project/__init__.py
+++ b/src/ee/project/__init__.py
@@ -1,6 +1,7 @@
 import configparser
 import uuid
 from pathlib import Path
+from typing import List
 
 from ee import EeException
 from ee.digikey import DigikeyStore
@@ -29,9 +30,9 @@ class SupplierDescriptor(object):
 
 class Project(object):
     def __init__(self, project_dir: Path, cfg: configparser.ConfigParser):
-        self.report_dir = project_dir / "ee" / "reports"
         self.public_dir = project_dir / "ee"
-        self.cache_dir = project_dir / "ee" / "cache"
+        self.report_dir = self.public_dir / "reports"
+        self.cache_dir = self.public_dir / "cache"
         self.project_dir = project_dir
         self._cfg = cfg
 
@@ -47,6 +48,10 @@ class Project(object):
         digikey_store = DigikeyStore.from_store_code("us")
         self._suppliers.append(SupplierDescriptor("digikey", digikey_store.url, "Digikey"))
 
+    @property
+    def suppliers(self) -> List[SupplierDescriptor]:
+        return self._suppliers
+
     def get_supplier_by_key(self, key) -> SupplierDescriptor:
         sd = next((s for s in self._suppliers if s.key == key), None)
         if sd:
diff --git a/src/ee/tools/ninja.py b/src/ee/tools/ninja.py
index a26a474..aa6952b 100644
--- a/src/ee/tools/ninja.py
+++ b/src/ee/tools/ninja.py
@@ -8,7 +8,18 @@ from jinja2 import Environment, PackageLoader, select_autoescape
 
 import ee.tools
 from ee.kicad import read_schematics
-from ee.project import Project
+from ee.project import Project, SupplierDescriptor
+
+
+class NinjaSupplier(object):
+    def __init__(self, project: Project, supplier: SupplierDescriptor):
+        self.project = project
+        self.supplier = supplier
+        self.key = supplier.key
+
+    @property
+    def part_db(self):
+        return "$public_dir/{}/parts.xml".format(self.key)
 
 
 def ninja_path_filter(s: Union[Path, str, List[str]]) -> str:
@@ -54,16 +65,14 @@ def generate(project: Project):
         e.filters["noext"] = noext_filter
         return e
 
-    part_dbs = []
     params = {
         "ee": "{} -m ee".format(os.path.relpath(sys.executable, Path("."))),
         "project": project,
-        "part_dbs": part_dbs,
         "souffle_ee_src": str(Path(__file__).parent.parent / "souffle"),
         "is_file": lambda p: os.path.isfile(str(p)),
     }
 
-    kicad_souffle_dl = project.project_dir / "ee" / "custom" / "kicad-souffle.dl"
+    kicad_souffle_dl = project.public_dir / "custom" / "kicad-souffle.dl"
     if kicad_souffle_dl.is_file():
         params["kicad_souffle_dl"] = str(kicad_souffle_dl)
 
@@ -84,9 +93,7 @@ def generate(project: Project):
             params["pcb"] = Path(project.cfg["kicad-project"]["pcb"])
             gerber_zip = "prod/gerber.zip"
 
-    # TODO: read from config
-    distributors = ["digikey"]
-    params["distributors"] = distributors
+    params["suppliers"] = [NinjaSupplier(project, s) for s in project.suppliers]
 
     if gerber_zip is not None:
         params["gerber_zip"] = gerber_zip
@@ -98,10 +105,6 @@ def generate(project: Project):
     parts_yaml_files = [path for path in project.project_dir.iterdir() if str(path).endswith("-parts.yaml")]
     params["parts_yaml_files"] = parts_yaml_files
 
-    # Local part databases first
-    part_dbs.extend([parent_dir_filter(p) / noext_filter(p) for p in parts_yaml_files])
-    part_dbs.extend([Path("ee") / d / "parts" for d in distributors])
-
     if not build_ninja.exists():
         with build_ninja.open("w") as f:
             f.writelines(["# This file was generated by eetools. Add your own rules and build commands\n",
diff --git a/src/ee/tools/templates/build.ninja.j2 b/src/ee/tools/templates/build.ninja.j2
index d742791..9fff519 100644
--- a/src/ee/tools/templates/build.ninja.j2
+++ b/src/ee/tools/templates/build.ninja.j2
@@ -1,6 +1,7 @@
 {% set reports=[] -%}
 ee = {{ ee }}
 uuid = {{ project.uuid }}
+public_dir = {{ project.public_dir }}
 report_dir = {{ project.report_dir }}
 {%- if sch is defined %}
 sch = {{ sch | ninja_path }}
@@ -56,7 +57,7 @@ rule create-bom
     command = $ee create-bom {{ log }} --schematic $schematic --part-db $part_dbs --out $out $strategy
 
 rule split-parts-by-supplier
-    command = $ee split-parts-by-supplier {{ log }} --parts $order $part_dbs --out-dir $out_dir
+    command = $ee split-parts-by-supplier {{ log }} --parts $in --out $out $part_dbs
 
 rule import-parts-yaml
     description = import-parts-yaml $in
@@ -84,9 +85,9 @@ default gerbers
 
 {% if sch is defined -%}
 {%- set cfg = project.cfg["kicad-project"] %}
-build ee/kicad/sch.xml: kicad-make-bom $sch
+build $public_dir/kicad/sch.xml: kicad-make-bom $sch
 {#
-build ee/sch.xml: part-apply-function ee/kicad/sch.xml
+build $public_dir/sch.xml: part-apply-function $public_dir/kicad/sch.xml
     execution = kicad
 {%- if cfg and "functions" in cfg and cfg["functions"] %}
     functions = --function {{ cfg["functions"] }}
@@ -96,42 +97,42 @@ build ee/sch.xml: part-apply-function ee/kicad/sch.xml
 {%- endif %}
 #}
 
-build ee/kicad/souffle/facts.dl: part-apply-souffle-pre ee/kicad/sch.xml
-    work = ee/kicad/souffle
+build $public_dir/kicad/souffle/facts.dl: part-apply-souffle-pre $public_dir/kicad/sch.xml
+    work = $public_dir/kicad/souffle
 
-build ee/kicad/souffle/out/fact.csv: souffle {{ kicad_souffle_dl if kicad_souffle_dl else souffle_ee_src + "/kicad.dl" }} | ee/kicad/souffle/facts.dl
-    work = ee/kicad/souffle
+build $public_dir/kicad/souffle/out/fact.csv: souffle {{ kicad_souffle_dl if kicad_souffle_dl else souffle_ee_src + "/kicad.dl" }} | $public_dir/kicad/souffle/facts.dl
+    work = $public_dir/kicad/souffle
 {#-    includes = {{ (souffle_ee_src + "/kicad.dl") if kicad_souffle_dl else "" }}#}
 
-build ee/sch.xml: part-apply-souffle-post ee/kicad/souffle/out/fact.csv
-    in_sch = ee/kicad/sch.xml
-    work = ee/kicad/souffle
+build $public_dir/sch.xml: part-apply-souffle-post $public_dir/kicad/souffle/out/fact.csv
+    in_sch = $public_dir/kicad/sch.xml
+    work = $public_dir/kicad/souffle
 {%- endif %}
 
-build $report_dir/part-validate-parts.rst: part-validate-parts ee/bom.xml ee/sch.xml
-    sch = ee/sch.xml
-    bom = ee/bom.xml
-    part_dbs ={%- for p in part_dbs %} {{ p }}.xml{% endfor %}
+build $report_dir/part-validate-parts.rst: part-validate-parts $public_dir/bom.xml $public_dir/sch.xml
+    sch = $public_dir/sch.xml
+    bom = $public_dir/bom.xml
+    part_dbs ={%- for s in suppliers %} {{ s.part_db }}{% endfor %}
 {%- set reports=reports+["$report_dir/part-validate-parts.rst"] %}
 
 {#- TODO: complete
-build ee/requirements.xml | $report_dir/requirements.rst: part-find-requirements ee/sch.xml
+build $public_dir/requirements.xml | $report_dir/requirements.rst: part-find-requirements $public_dir/sch.xml
     report = --report $report_dir/requirements.rst
 {%- set reports=reports+["$report_dir/requirements.rst"] %}
 #}
 
-{% for s in distributors %}
-{%- set cfg = project.cfg["supplier:" + s] if "supplier:" + s in project.cfg else None %}
-# Supplier {{ s }}
-build ee/{{ s }}/pn-part-search-list.xml: pn-part-search-list ee/sch.xml
-    supplier = {{ s }}
+{% for s in suppliers %}
+{%- set cfg = project.cfg["supplier:" + s.key] if "supplier:" + s.key in project.cfg else None %}
+# Supplier {{ s.key }}
+build $public_dir/{{ s.key }}/pn-part-search-list.xml: pn-part-search-list $public_dir/sch.xml
+    supplier = {{ s.key }}
 
-build ee/{{ s }}/downloaded.xml | ee/{{ s }}/downloaded.rst: {{ s }}-search-parts ee/{{ s }}/pn-part-search-list.xml
-{%- set reports=reports+["$report_dir/" + s + "/downloaded.rst"] %}
+build $public_dir/{{ s.key }}/downloaded.xml | $public_dir/{{ s.key }}/downloaded.rst: {{ s.key }}-search-parts $public_dir/{{ s.key }}/pn-part-search-list.xml
+{%- set reports=reports+["$report_dir/" + s.key + "/downloaded.rst"] %}
 
 {#
-build ee/{{ s }}/parts.xml: part-apply-function ee/{{ s }}/downloaded.xml
-    execution = {{ s }}
+build $public_dir/{{ s.key }}/parts.xml: part-apply-function $public_dir/{{ s.key }}/downloaded.xml
+    execution = {{ s.key }}
 {%- if cfg and "functions" in cfg and cfg["functions"] %}
     functions = --function {{ cfg["functions"] }}
 {%- endif %}
@@ -139,17 +140,17 @@ build ee/{{ s }}/parts.xml: part-apply-function ee/{{ s }}/downloaded.xml
     arguments = --argument {{ cfg["function-arguments"] }}
 {%- endif %}
 #}
-build ee/{{ s }}/souffle/facts.dl: part-apply-souffle-pre ee/{{ s }}/downloaded.xml
-    work = ee/{{ s }}/souffle
+build $public_dir/{{ s.key }}/souffle/facts.dl: part-apply-souffle-pre $public_dir/{{ s.key }}/downloaded.xml
+    work = $public_dir/{{ s.key }}/souffle
 
-{%- set main=souffle_ee_src + "/" + s + ".dl" %}
-{%- set alt="ee/custom/" + s + "-souffle.dl" %}
-build ee/{{ s }}/souffle/out/fact.csv: souffle {{ alt if is_file(alt) else main }} | {{ main }} ee/{{ s }}/souffle/facts.dl
-    work = ee/{{ s }}/souffle
+{%- set main=souffle_ee_src + "/" + s.key + ".dl" %}
+{%- set alt="$public_dir/custom/" + s.key + "-souffle.dl" %}
+build $public_dir/{{ s.key }}/souffle/out/fact.csv: souffle {{ alt if is_file(alt) else main }} | {{ main }} $public_dir/{{ s.key }}/souffle/facts.dl
+    work = $public_dir/{{ s.key }}/souffle
 
-build ee/{{ s }}/parts.xml: part-apply-souffle-post ee/{{ s }}/souffle/out/fact.csv
-    in_sch = ee/{{ s }}/downloaded.xml
-    work = ee/{{ s }}/souffle
+build {{ s.part_db }}: part-apply-souffle-post $public_dir/{{ s.key }}/souffle/out/fact.csv
+    in_sch = $public_dir/{{ s.key }}/downloaded.xml
+    work = $public_dir/{{ s.key }}/souffle
 {%- endfor %}
 
 {%- for f in parts_yaml_files %}
@@ -158,21 +159,18 @@ build {{ out }}: import-parts-yaml {{ f }}
 # default {{ out }}
 {% endfor %}
 
-build ee/bom.xml | $report_dir/bom.rst: create-bom ee/sch.xml {%- for p in part_dbs %} {{ p }}.xml{% endfor %}
-    schematic = ee/sch.xml
-    part_dbs ={%- for p in part_dbs %} {{ p }}.xml{% endfor %}
+build $public_dir/bom.xml | $report_dir/bom.rst: create-bom $public_dir/sch.xml {%- for s in suppliers %} {{ s.part_db }}{% endfor %}
+    schematic = $public_dir/sch.xml
+    part_dbs = {%- for s in suppliers %} {{ s.part_db }}{% endfor %}
 {%- if project.cfg["create-bom"] and project.cfg["create-bom"]["strategy"] %}
     strategy = --strategy {{ project.cfg["create-bom"]["strategy"] }}
 {%- endif %}
 {%- set reports=reports+["$report_dir/bom.rst"] %}
 
-{#- TODO: complete
-build ee/orders/index.xml: split-parts-by-supplier ee/bom.xml {%- for p in part_dbs %} {{ p }}.xml{% endfor %}
-    order = ee/bom.xml
-    part_dbs ={%- for p in part_dbs %} --part-db {{ p }}.xml{% endfor %}
-    out_dir = ee/orders
-
-default ee/orders/index.xml
+{#
+build $public_dir/orders/index.xml: split-parts-by-supplier $public_dir/bom.xml | {%- for s in suppliers %} {{ s.part_db }}{% endfor %}
+    part_dbs ={%- for s in suppliers %} {{ s.part_db }}{% endfor %}
+    suppliers = {% s for s in suppliers %}
 #}
 
 rule seeed-download-opl
@@ -181,16 +179,16 @@ rule seeed-download-opl
 
 {%- if project.cfg.has_section("seeed-opl") %}
 {%- set opls=project.cfg["seeed-opl"]["opls"].split(",") %}
-build seeed-download-opls: phony{%- for opl in opls %} ee/seeed/opl/{{ opl.strip() }}.xml{% endfor %}
+build seeed-download-opls: phony {%- for opl in opls %} $public_dir/seeed/opl/{{ opl.strip() }}.xml{% endfor %}
 {%- for opl in opls %}
 {%- set opl=opl.strip() %}
 
-build ee/seeed/opl/{{ opl }}.xml: seeed-download-opl
+build $public_dir/seeed/opl/{{ opl }}.xml: seeed-download-opl
     opl = {{ opl }}
 {%- endfor %}
 {%- endif %}
 
 # Reports
 build ee-reports: phony {{ " ".join(reports) }}
-build part-dbs: phony {%- for p in part_dbs %} {{ p }}.xml{% endfor %}
+build part-dbs: phony {%- for s in suppliers %} {{ s.part_db }}{% endfor %}
 build ee-all: phony ee-reports part-dbs
-- 
cgit v1.2.3