aboutsummaryrefslogtreecommitdiff
path: root/trygvis/eda/cli/make_bom.py
diff options
context:
space:
mode:
Diffstat (limited to 'trygvis/eda/cli/make_bom.py')
-rwxr-xr-xtrygvis/eda/cli/make_bom.py84
1 files changed, 65 insertions, 19 deletions
diff --git a/trygvis/eda/cli/make_bom.py b/trygvis/eda/cli/make_bom.py
index a47e04a..1023c11 100755
--- a/trygvis/eda/cli/make_bom.py
+++ b/trygvis/eda/cli/make_bom.py
@@ -1,7 +1,22 @@
-from trygvis.eda import cli
-import trygvis.eda.digikey.rdf as digikey_rdf
+import argparse
import rdflib
+import trygvis.eda.digikey.rdf as digikey_rdf
+from trygvis.eda import cli, EdaException
+
+
+class MakeBomCommand(cli.CliCommand):
+ def __init__(self):
+ super().__init__("make-bom", "Create a BOM for a project with all info for each part.")
+
+ def run(self, argv):
+ p = argparse.ArgumentParser(prog=self.key, description=self.description)
+ p.add_argument("--project")
+ p.add_argument("--version")
+ args = p.parse_args(argv)
+
+ run(args)
+
class DigiKeyPart(object):
def __init__(self, part_number):
@@ -22,49 +37,80 @@ class Component(object):
self.fields[field_name] = field_value
-def run(project_url):
- cli.with_database(lambda g: work(project_url, g))
+def run(args):
+ cli.with_database(lambda g: work(args, g))
-def work(project_url, g):
+def work(args, g):
+ config = cli.read_config()
+ project_url = args.project if args.project is not None else config['project']['url']
+
components = {}
dk_parts = {}
- cli.info("Loading components")
+ version = None
+ if args.version is not None:
+ version = args.version
+ else:
+ cli.info("Finding latest version")
+ res = cli.sparql(g, """
+SELECT
+?project ?version ?timestamp
+WHERE {
+ ?project a kicad:project .
+ ?version a kicad:project-version;
+ kicad:timestamp ?timestamp;
+ kicad:version-of ?project
+ .
+}
+ORDER BY DESC(?timestamp)
+LIMIT 1
+""", init_bindings={"project": rdflib.URIRef(project_url)})
+
+ for row in res:
+ version = row.version
+ break
+ else:
+ raise EdaException("Could not find any version of project %s" % project_url)
+
+ cli.info("Loading components for version %s" % version)
res = cli.sparql(g, """
SELECT
?ref ?value
WHERE {
- ?project a kicad-type:project ;
+ ?version a kicad:project-version ;
kicad:component ?cmp .
- ?cmp a kicad-type:schematic_component ;
- kicad:value ?value ;
- rdfs:label ?ref .
+ ?cmp a kicad:component ;
+ kicad:value ?value ;
+ rdfs:label ?ref .
}
ORDER BY ?ref
-""", init_bindings={"project": rdflib.URIRef(project_url)})
+""", init_bindings={"version": rdflib.URIRef(version)})
for row in res:
c = Component(row.ref, row.value)
components[row.ref] = c
cli.info('ref=%s, value=%s' % (c.ref, c.value))
+ if len(components) == 0:
+ raise EdaException("Could not find any components")
+
cli.info("Loading custom component attributes")
res = cli.sparql(g, """
SELECT
?ref ?field ?field_name ?field_value
WHERE {
- ?project a kicad-type:project ;
+ ?version a kicad:project-version ;
kicad:component ?cmp .
- ?cmp a kicad-type:schematic_component ;
+ ?cmp a kicad:component ;
rdfs:label ?ref ;
kicad:field ?field .
- ?field a kicad-type:field ; kicad:field_name ?field_name .
- ?field a kicad-type:field ; kicad:field_value ?field_value .
+ ?field a kicad:field ; kicad:field_name ?field_name .
+ ?field a kicad:field ; kicad:field_value ?field_value .
}
ORDER BY ?ref ?field_name
-""", init_bindings={"project": rdflib.URIRef(project_url)})
+""", init_bindings={"version": rdflib.URIRef(version)})
for row in res:
c = components[row.ref]
@@ -78,7 +124,7 @@ SELECT
?ref ?part_number ?type ?value ?attr_type
WHERE {
?project kicad:component ?cmp .
- ?cmp a kicad-type:schematic_component ;
+ ?cmp a kicad:component ;
rdfs:label ?ref ;
kicad:field ?d .
?d kicad:field_name "digikey" ;
@@ -114,7 +160,7 @@ SELECT
# *
WHERE {
?project kicad:component ?cmp .
- ?cmp a kicad-type:schematic_component ;
+ ?cmp a kicad:component ;
rdfs:label ?ref ;
kicad:field ?dk_field .
optional {
@@ -138,7 +184,7 @@ WHERE {
# ?case_type a dk:attributeType ; dk:value ?case_url .
# } .
-# VALUES (?project_url) { (<https://trygvis/purl/kicad-board#SweetZpot+Sensor>) } .
+# VALUES (?project_url) { (...) } .
# VALUES (?package_type) { (dk-attr-type:pv16) } .
# VALUES (?case_type) { (dk-attr-type:pv1291) } .
}