aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTrygve Laugstøl <trygvis@inamo.no>2019-06-03 08:46:51 +0200
committerTrygve Laugstøl <trygvis@inamo.no>2019-06-14 08:57:12 +0200
commitd203763f31428bee3edba4383d37f992b0f8e186 (patch)
treef5709efbeee38fa593bad25b8e15523478c7accc
parent2554f0e774be0e473d650fc206ac7668d4561412 (diff)
downloadee-python-d203763f31428bee3edba4383d37f992b0f8e186.tar.gz
ee-python-d203763f31428bee3edba4383d37f992b0f8e186.tar.bz2
ee-python-d203763f31428bee3edba4383d37f992b0f8e186.tar.xz
ee-python-d203763f31428bee3edba4383d37f992b0f8e186.zip
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.
-rw-r--r--src/ee/project/__init__.py9
-rw-r--r--src/ee/tools/ninja.py25
-rw-r--r--src/ee/tools/templates/build.ninja.j290
3 files changed, 65 insertions, 59 deletions
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