diff options
Diffstat (limited to 'src/ee/digikey/search_parts.py')
-rw-r--r-- | src/ee/digikey/search_parts.py | 23 |
1 files changed, 18 insertions, 5 deletions
diff --git a/src/ee/digikey/search_parts.py b/src/ee/digikey/search_parts.py index eace4e3..1f1184a 100644 --- a/src/ee/digikey/search_parts.py +++ b/src/ee/digikey/search_parts.py @@ -1,11 +1,11 @@ import functools from pathlib import Path -from typing import List, MutableSet, Mapping +from typing import List, MutableSet, Mapping, Set from ee import EeException from ee.db import ObjDb from ee.digikey import Digikey, DigikeyParser, DigikeyClient, SearchResponseTypes, DigikeyProduct, DigikeyStore -from ee.part import PartDb, load_db, save_db, Part +from ee.part import PartDb, load_db, save_db, Part, Category from ee.tools import mk_parents from ee.xml import types, uris from ee.xml.uris import make_digikey_fact_key @@ -71,6 +71,7 @@ class QueryEngine(object): out_parts.add_index("spn", lambda p: [pn.value for pn in p.get_spns()], multiple=True) self.out_parts = out_parts + self.categories: Set[Category] = set() def pn_search(self, pn): return self.pn_spn_search(pn, False) @@ -78,6 +79,9 @@ class QueryEngine(object): def spn_search(self, pn): return self.pn_spn_search(pn, True) + def _collect_categories(self, product: DigikeyProduct): + [self.categories.add(c) for c in product.categories] + def pn_spn_search(self, pn, is_spn): s = "Searching for '{}'".format(pn) print(s, file=self.log) @@ -92,7 +96,9 @@ class QueryEngine(object): if response.response_type == SearchResponseTypes.EXCEPTION: result = "exception" elif response.response_type == SearchResponseTypes.SINGLE: - out_part = resolved(self.store.url, response.products[0]) + product = response.products[0] + out_part = resolved(self.store.url, product) + self._collect_categories(product) out_pn = out_part.get_exactly_one_spn() if is_spn else out_part.get_exactly_one_mpn() out_pn = out_pn.valueProp @@ -129,7 +135,9 @@ class QueryEngine(object): page = self.client.get_for_product_url(part.url, part.part_number) response = self.parser.parse_string(self.client.baseurl, page) if response.response_type == SearchResponseTypes.SINGLE: - out_part = resolved(self.store.url, response.products[0]) + product = response.products[0] + out_part = resolved(self.store.url, product) + self._collect_categories(product) result = "found" else: print("Unable to narrow down the part, got {} new products. Giving up.".format( @@ -153,9 +161,10 @@ class QueryEngine(object): def resolved(supplier, p: DigikeyProduct) -> Part: # TODO: fix uri - xml = types.Part(uri="https://digikey.com/pn#{}".format(p.part_number), + xml = types.Part(uri=p.uri, supplier=supplier, description=p.description, + category=types.CategoryList(), links=types.LinkList(), facts=types.FactList(), references=types.ReferenceList()) @@ -164,6 +173,9 @@ def resolved(supplier, p: DigikeyProduct) -> Part: if p.url: part.get_links().append(types.Link(url=p.url, relation="canonical", media_type="text/html")) + if len(p.categories): + xml.set_category(p.categories[-1].uri) + for d in p.documents: title = "{}: {}".format(d.section, d.title) relations = ["http://purl.org/ee/link-relation#documentation"] @@ -277,4 +289,5 @@ def run_search_parts(in_path: Path, out_path: Path, log, cache_dir: Path, store_ part_db = PartDb() for part in engine.out_parts: part_db.add_entry(part, True) + part_db.categories = engine.categories save_db(out_path, part_db, sort=True) |