diff options
Diffstat (limited to 'trygvis/eda/cli/make_bom.py')
-rwxr-xr-x | trygvis/eda/cli/make_bom.py | 84 |
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) } . } |