Source code for sr.tools.bom.parts_db
"""Student Robotics parts database access library."""
import csv
import pkg_resources
import six
from sr.tools.bom import farnell, rs, digikey, mouser
[docs]def get_db():
"""Get the parts DB that is embedded with this library."""
file = pkg_resources.resource_stream('sr.tools.bom', 'component_lib.csv')
return Db(six.StringIO(file.read().decode('UTF-8')))
[docs]class Part(dict):
"""
Represents a part.
:param dict d: A part dictionary from the database.
"""
def __init__(self, d):
"""Initialise with a dict from the DB."""
for k in d.keys():
if isinstance(d[k], str):
d[k] = d[k].strip()
for k, v in d.items():
self[k] = v
self.loaded = False
[docs] def stockcheck(self):
"""Return how many of the product are in stock."""
if not self.loaded:
self.__load_data()
return self.stock
[docs] def get_price(self, num):
"""Get the unit price when buying num distributor units."""
if not self.loaded:
self.__load_data()
if self.stock is None:
return None
price = None
for threshold, p in self.prices:
if threshold >= num:
return p
price = p
return price
[docs] def get_dist_units(self):
"""Number of components per distributor unit."""
if not self.loaded:
self.__load_data()
return self.dist_unit
[docs] def get_min_order(self):
"""Get the minimum order."""
if not self.loaded:
self.__load_data()
return self.min_order
[docs] def get_increments(self):
"""Get the increments."""
if not self.loaded:
self.__load_data()
return self.increments
[docs] def get_url(self):
"""Get the URL."""
if self["supplier"] == "farnell":
return "https://xgoat.com/p/farnell/%s" % self["order-number"]
if self["supplier"] == "rs":
return "https://xgoat.com/p/rs/%s" % self["order-number"]
if self["supplier"] == "digikey":
return "https://xgoat.com/p/digikey/%s" % self["order-number"]
if self["supplier"] == "mouser":
return "https://xgoat.com/p/mouser/%s" % self["order-number"]
return None
def __load_data(self):
o = None
if self["supplier"] == "farnell":
o = farnell.Item(self["order-number"])
elif self["supplier"] == "rs":
o = rs.Item(self["order-number"])
elif self["supplier"] == "digikey":
o = digikey.Item(self["order-number"])
elif self["supplier"] == "mouser":
o = mouser.Item(self["order-number"])
else:
self.stock = None
return
self.stock = o.avail
self.min_order = o.min_order
self.dist_unit = o.price_for
self.increments = o.multi
self.prices = o.prices
self.loaded = True
[docs]class Db(dict):
"""
A parts database.
:param file: A file-like object to read the parts DB from.
:type file: file-like
"""
def __init__(self, file):
for line in csv.DictReader(file):
# discard commented out lines
if line["sr-code"].strip()[0] == "#":
continue
part = Part(line)
self[part["sr-code"]] = part