aboutsummaryrefslogtreecommitdiff
path: root/src/ee/digikey/search_parts.py
diff options
context:
space:
mode:
Diffstat (limited to 'src/ee/digikey/search_parts.py')
-rw-r--r--src/ee/digikey/search_parts.py23
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)