import argparse from itertools import * from colors import color import ee.digikey as dk from ee.digikey import SearchResponseTypes, DigikeyProduct from ee.tools import mk_parents parser = argparse.ArgumentParser(description="Download facts about parts from Digi-Key") parser.add_argument("--out", required=True, metavar="OUTPUT_DIRECTORY", dest="out", action="store", help="A directory to store fact files") parser.add_argument("--part", nargs="+", help="the parts to download fact for") parser.add_argument("--sch") parser.add_argument("--force", dest="force", action="store", help="Always download fact even if there is a local file") args = parser.parse_args() digikey = dk.Digikey() client = dk.DigikeyClient(digikey, on_download=lambda s: print(color(s, 'grey'))) repo = dk.DigikeyRepository(args.out) def on_product(product: DigikeyProduct): repo.save(product) parts = [] if args.part: parts.append(args.part) if args.sch: from ee.kicad import read_schematic, to_bom sch = read_schematic(args.sch) for c in to_bom(sch): digikey = c.get_field("digikey") if digikey: parts.append(digikey.value) mpn = c.get_field("mpn") if mpn: parts.append(mpn.value) for p in parts: print(color("Searching for {}".format(p), "white")) if repo.has_product(p) and not args.force: continue response = client.search(p) if response.response_type == SearchResponseTypes.SINGLE: p = response.products[0] print(color("Direct match {}".format(p.mpn), "white")) on_product(p) elif response.response_type == SearchResponseTypes.MANY: hits = list(groupby(sorted(response.products), 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]) 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"))