From 650b4ad3774c4cc454a02073808d981f6873036d Mon Sep 17 00:00:00 2001 From: Trygve Laugstøl Date: Thu, 28 Feb 2019 08:26:52 +0100 Subject: o Create a new part when storing result, use Digikey's PN as id. --- src/ee/digikey/search_parts.py | 76 +++++++++++++++++++++++------------------- 1 file changed, 42 insertions(+), 34 deletions(-) (limited to 'src/ee/digikey') diff --git a/src/ee/digikey/search_parts.py b/src/ee/digikey/search_parts.py index cad611b..9c8eb74 100644 --- a/src/ee/digikey/search_parts.py +++ b/src/ee/digikey/search_parts.py @@ -9,17 +9,26 @@ from ee.xml.uris import DIGIKEY_URI, make_digikey_fact_key __all__ = ["search_parts"] -def resolved(di: bomFile.DistributorInfo, part: bomFile.Part, p: DigikeyProduct): - di.stateProp = "resolved" - - # Remove the old list - part.factsProp = bomFile.FactList() +def resolved(p: DigikeyProduct) -> bomFile.Part: + part = bomFile.Part(id=p.part_number, + distributor_info=bomFile.DistributorInfo(), + facts=bomFile.FactList(), + part_numbers=bomFile.PartNumberList()) + part.distributor_infoProp.stateProp = "resolved" + + part_numbers = part.part_numbersProp.part_numberProp + + part_numbers.append(bomFile.PartNumber(value=p.part_number, distributor=DIGIKEY_URI)) + if p.mpn: + part_numbers.append(bomFile.PartNumber(value=p.mpn)) facts: List[bomFile.Fact] = part.factsProp.factProp for a in p.attributes: key = make_digikey_fact_key(a.attribute_type.id) facts.append(bomFile.Fact(key=key, label=a.attribute_type.label, value=a.value)) + return part + def search_parts(in_dir: Path, out_dir: Path, cache_dir: Path, force_refresh: bool): print("in: {}, out: {}".format(in_dir, out_dir)) @@ -47,44 +56,43 @@ def search_parts(in_dir: Path, out_dir: Path, cache_dir: Path, force_refresh: bo print("could not find pn or dpn: part.id={}".format(part.idProp)) continue - di = part.distributor_infoProp # type: bomFile.DistributorInfo + out_id = query + out_part = bomFile.Part(id=out_id, + distributor_info=bomFile.DistributorInfo(), + part_numbers=part.part_numbersProp) + di = out_part.distributor_infoProp - if di is None: - di = bomFile.DistributorInfo() - part.distributor_infoProp = di + text = client.search(query) + response = parser.parse_string(text) - if force_refresh or di.stateProp != "resolved": - text = client.search(query) - response = parser.parse_string(text) + if response.response_type == SearchResponseTypes.SINGLE: + out_part = resolved(response.products[0]) + elif response.response_type == SearchResponseTypes.MANY: - if response.response_type == SearchResponseTypes.SINGLE: - resolved(di, part, response.products[0]) - elif response.response_type == SearchResponseTypes.MANY: + # find those with an exact match. Digikey uses a prefix search so a query for "FOO" will return "FOO" + # and "FOOT". + def get_field(p): + return p.mpn if is_mpn else p.part_number - # find those with an exact match. Digikey uses a prefix search so a query for "FOO" will return "FOO" - # and "FOOT". - def get_field(p): - return p.mpn if is_mpn else p.part_number + filtered_products = [p for p in response.products if get_field(p) == query] - filtered_products = [p for p in response.products if get_field(p) == query] + if len(filtered_products) == 0: + di.stateProp = "not-found" + else: + dpn = sorted(filtered_products, key=lambda p: p.part_number)[0].part_number - if len(filtered_products) == 0: - di.stateProp = "not-found" + response = parser.parse_string(client.search(dpn)) + if response.response_type == SearchResponseTypes.SINGLE: + out_part = resolved(response.products[0]) else: - dpn = sorted(filtered_products, key=lambda p: p.part_number)[0].part_number + di.stateProp = "many" - response = parser.parse_string(client.search(dpn)) - if response.response_type == SearchResponseTypes.SINGLE: - resolved(di, part, response.products[0]) - else: - di.stateProp = "many" - - elif response.response_type == SearchResponseTypes.TOO_MANY: - di.stateProp = "too-many" - elif response.response_type == SearchResponseTypes.NO_MATCHES: - di.stateProp = "not-found" + elif response.response_type == SearchResponseTypes.TOO_MANY: + di.stateProp = "too-many" + elif response.response_type == SearchResponseTypes.NO_MATCHES: + di.stateProp = "not-found" - out_parts.add_entry(part, True) + out_parts.add_entry(out_part, True) print("Saving {} work parts".format(out_parts.size())) save_db(out_dir, out_parts) -- cgit v1.2.3