import json import requests import requests_cache import iso8601 import sys reload(sys) sys.setdefaultencoding("utf-8") requests_cache.install_cache(cache_name='http_cache', backend='sqlite', expire_after=180) apikey = '2452f140' base_url = "http://octopart.com/api/v3" def enum(*sequential, **named): enums = dict(zip(sequential, range(len(sequential))), **named) return type('Enum', (), enums) def extract_int(json, key): try: val = json[key] if val is not None: return int(val) return None except KeyError: return None def extract_date(json, key): try: val = json[key] if val is not None: return iso8601.parse_date(val) return None except KeyError: return None class Category(object): def __init__(self, json): self.uid = json['uid'] self.name = json['name'] self.parent_uid = json['parent_uid'] self.children_uids = json['children_uids'] self.ancestor_uids = json['ancestor_uids'] self.ancestor_names = json['ancestor_names'] self.num_parts = json['num_parts'] def map_price(json): print 'price: ' + str(json) return json class Price(object): def __init__(self, currency, quantity, amount): self.currency = currency self.quantity = quantity self.amount = amount def __str__(self): return str(self.quantity) + '=' + str(self.amount) + '@' + self.currency class PartOffer(object): def __init__(self, json): self.sku = json['sku'] self.seller = Seller(json['seller']) self.eligible_region = json['eligible_region'] self.product_url = json['product_url'] self.octopart_rfq_url = json['octopart_rfq_url'] self.prices = {} for currency, breaks in json['prices'].items(): bs = self.prices[currency] = [] for b in breaks: bs.append(Price(currency, b[0], float(b[1]))) self.in_stock_quantity = extract_int(json, 'in_stock_quantity') self.on_order_quantity = extract_int(json, 'on_order_quantity') self.on_eta = extract_date(json, 'on_eta') self.factory_lead_days = extract_int(json, 'factory_lead_days') self.factory_order_multiple = extract_int(json, 'factory_order_multiple') self.order_multiple = extract_int(json, 'order_multiple') self.moq = extract_int(json, 'moq') self.last_updated = extract_date(json, 'last_updated') class Part(object): def __init__(self, json): self.uid = json['uid'] self.mpn = json['mpn'] self.octopart_url = json['octopart_url'] self.offers = map(PartOffer, json['offers']) class SearchResult(object): def __init__(self, json): self.item = Part(json['item']) # Undocumented self.snippet = json['snippet'] pass class SearchResponse(object): def __init__(self, json): self.results = map(SearchResult, json['results']) self.hits = int(json['hits']) def filter_seller(self, seller): for r in self.results: os = filter(lambda o: o.seller.name == seller, r.item.offers) if len(os) > 0: r.item.offers = os else: r.item.offers = [] @staticmethod def empty(): return SearchResponse({'results': [], 'hits': '0'}) def params(p): p['apikey'] = apikey return p def get(path, p = {}): if not path.startswith('http'): url = base_url + path else: url = path # print('path: {}, params: {}'.format(path, p)) print('path: {}'.format(path)) for k, v in p.iteritems(): print(' {0:60} = {1}'.format(k, v)) res = requests.get(url, params=params(p)) # print res.url j = res.json() print(json.dumps(j, indent=2, sort_keys=True)) return j class Seller(object): def __init__(self, json): self.uid = json['uid'] self.id = json['id'] self.name = json['name'] def seller_search_raw(q): p = {'q': q, 'start': 0, 'limit': 10} return get('/sellers/search', p) def seller_search(q): res = seller_search_raw(q) sellers = [] for result in res['results']: item = result['item'] sellers.append(Seller(item)) return sellers def category_search_raw(q): p = {'q': q, 'start': 0, 'limit': 10} return get('/categories/search', p) def category_search(q): res = category_search_raw(q) categories = [] for result in res['results']: item = result['item'] categories.append(Category(item)) return categories