diff options
Diffstat (limited to 'src/ee/tools')
-rw-r--r-- | src/ee/tools/digikey_download_facts.py | 66 |
1 files changed, 48 insertions, 18 deletions
diff --git a/src/ee/tools/digikey_download_facts.py b/src/ee/tools/digikey_download_facts.py index 0550c5f..950623f 100644 --- a/src/ee/tools/digikey_download_facts.py +++ b/src/ee/tools/digikey_download_facts.py @@ -1,5 +1,6 @@ import argparse from itertools import * +from functools import total_ordering from colors import color @@ -7,6 +8,22 @@ import ee.digikey as dk from ee.digikey import SearchResponseTypes, DigikeyProduct from ee.tools import mk_parents + +@total_ordering +class Query(object): + def __init__(self, is_mpn, query): + self.is_mpn = is_mpn + self.query = query + + def __eq__(self, other): + return (self.is_mpn, self.query) == (other.is_mpn, other.query) + + def __lt__(self, other): + return (self.is_mpn, self.query) < (other.is_mpn, other.query) + + def __hash__(self): + return hash((self.is_mpn, self.query)) + parser = argparse.ArgumentParser(description="Download facts about parts from Digi-Key") parser.add_argument("--out", @@ -31,7 +48,7 @@ args = parser.parse_args() digikey = dk.Digikey() client = dk.DigikeyClient(digikey, on_download=lambda s: print(color(s, 'grey'))) -repo = dk.DigikeyRepository(args.out) +repo = dk.DigikeyRepository(digikey, args.out) def on_product(product: DigikeyProduct): @@ -41,7 +58,7 @@ def on_product(product: DigikeyProduct): parts = [] if args.part: - parts.append(args.part) + [parts.append(Query(True, p)) for p in args.part] if args.sch: from ee.kicad import read_schematic, to_bom @@ -49,39 +66,52 @@ if args.sch: for c in to_bom(sch): digikey = c.get_field("digikey") if digikey: - parts.append(digikey.value) + parts.append(Query(False, digikey.value)) mpn = c.get_field("mpn") if mpn: - parts.append(mpn.value) + parts.append(Query(True, mpn.value)) -for p in parts: - print(color("Searching for {}".format(p), "white")) +parts = sorted(set(parts)) - if repo.has_product(p) and not args.force: +for q in parts: + p = q.query + if repo.has_product(mpn = p if q.is_mpn else None, dpn = p if not q.is_mpn else None) and not args.force: + print(color("Already have facts for {}".format(p), "white")) continue + print(color("Searching for {}".format(p), "white")) response = client.search(p) + todos = [] + if response.response_type == SearchResponseTypes.SINGLE: p = response.products[0] - print(color("Direct match {}".format(p.mpn), "white")) + print(color("Direct match mpn/dpn: {}/{}".format(p.mpn, p.part_number), "white")) on_product(p) elif response.response_type == SearchResponseTypes.MANY: - hits = list(groupby(sorted(response.products), lambda p: p.mpn)) + hits = [(mpn, list(products)) for mpn, products in groupby(sorted(response.products, key=lambda p: p.mpn), lambda p: p.mpn)] if len(hits) == 1: (mpn, products) = hits[0] - products = list(products) - - if len(products) == 1: - print(color("Got many results, but they all point to the same part: {}".format(mpn), "white")) - on_product(products[0]) - continue - for k, g in hits: - print(color("Got many results with many parts: {}: {}".format(k, list(g)), "white")) - on_product(list(g)[0]) + part_number = products[0].part_number + print(color("Got many results, but they all point to the same part: {}. Will use {} for downloading attributes.".format(mpn, ", ".join([p.part_number for p in products])), "white")) + todos.append(part_number) + else: + for k, g in hits: + print(color("Got many results with many parts: {}: {}".format(k, list(g)), "white")) + on_product(list(g)[0]) elif response.response_type == SearchResponseTypes.TOO_MANY: print(color("Too many results ({}), select a category first".format(response.count), 'red')) elif response.response_type == SearchResponseTypes.NO_MATCHES: print(color("Part not found", "orange")) + + for part_number in todos: + response = client.search(part_number) + + if response.response_type == SearchResponseTypes.SINGLE: + p = response.products[0] + print(color("Downloaded {}".format(p.mpn), "white")) + on_product(p) + else: + print("Got response of type {} when really expecting a single product.".format(response.response_type)) |