from octopart import enum import octopart def part_search(q, start = 0, limit = False, fields={}, includes=[]): p = {'q': q, 'start': 0} if limit: p['limit'] = limit for field, data in fields.iteritems(): if data is not None and data['q']: p['filter[fields][' + field + '][]'] = data['q'] # key = 'filter[fields][' + field + '][]' # if not key in p: # p[key] = arr = [] # else: # arr = p[key] # arr.append(data['q']) pass if len(includes) > 0: p['include[]'] = includes # p['spec_drilldown[include]'] = 'true' json = octopart.get('/parts/search', p) return octopart.SearchResponse(json) PackageType = enum('through_hole', 'smd') class ResistorSearch(): def __init__(self): self.params = {} self.fields = ['package_type', 'case', 'resistance', 'tolerance', 'seller', 'power_rating'] def has_value(self, field): self.assert_has_field(field) try: return self.params[field] is not None except KeyError: return False def has_field(self, field): try: self.fields.index(field) return True except ValueError: return False def assert_has_field(self, field): if not self.has_field(field): raise Exception('Missing parameter for search: ' + field) def __setitem__(self, field, item): self.assert_has_field(field) if field is not None: self.params[field] = item def __getitem__(self, field): self.assert_has_field(field) return self.params[field] # lifecycle_status # specs.resistance_tolerance.value def resistor_search(search): q = '' categories = octopart.category_search('Resistors') categories = filter(lambda c: c.name == 'Resistors', categories) if len(categories) == 0: raise Exception("Could not find category for resistors") category = categories[0] fields = {} # 'specs.case_package.value': {'q': '1206'}, fields['category_uids'] = {'q': category.uid} fields['specs.resistance.value'] = {'q': search['resistance']} # case_package is broken (always returns 0 hits), but it is usually in the description if search.has_value('case'): q += ' ' + search['case'] if search.has_value('power_rating'): fields['specs.power_rating.value'] = {'q': '[' + str(search['power_rating']) + ' TO 2500]'} # if package_type == PackageType.smd: # fields['specs.case_package.value'] = {'q': '1210'} resolved_seller = None if search.has_value('seller'): seller = search['seller'] sellers = octopart.seller_search(seller) if len(sellers) == 0: raise Exception('Could not find seller: ' + seller) resolved_seller = sellers[0].name fields['offers.seller.name'] = {'q': resolved_seller} includes = [] # includes.append('specs') res = octopart.part_search(q, limit=100, fields=fields, includes=includes) if resolved_seller: res.filter_seller(resolved_seller) return res