import collections from dataclasses import dataclass from jinja2 import Environment, FileSystemLoader import math import os from typing import List, Tuple from jinja2 import Template from pkg_resources import resource_string from . import si from .spaceventory import Inventory from .components import Component RESISTORS_BOXALL = "28f37f99-45b1-4e85-940e-06273f786e59" TEMPLATE = Template(resource_string(__name__, "resistors_boxall.html.jinja2").decode()) def fetch_container(inventory: Inventory, uuid) -> Tuple[str, Component]: """fetch boxall resistors from inventory""" l = [] for c in inventory.get_children(uuid): try: item = Component.from_item(c) except Exception: logging.exception(f"parsing component {c} failed") continue l.append((item, c.props["compartment"])) return sorted(l, key=lambda r: r[0].resistance) @dataclass class ResistorCompartment: compartment: str resistance: str package: str tolerance: str def fetch_resistors(inventory: Inventory) -> List[ResistorCompartment]: rs = fetch_container(inventory, RESISTORS_BOXALL) compartments = [] for resistor, compartment in rs: value, prefix = si.prefix_tuple(resistor.value.value) # unit = resistor.value.unit.u.utf resistance = f"{value:.2f} {prefix}" if resistor.tolerance != "unknown": tolerance = resistor.tolerance else: tolerance = "" compartments.append( ResistorCompartment( compartment=compartment, resistance=resistance, package=resistor.package, tolerance=tolerance, ) ) return compartments def render(compartments: List[ResistorCompartment], column_count: int = 3) -> str: # divide resistor list into columns rows_count = math.ceil(len(compartments) / column_count) columns = [ compartments[i : i + rows_count] for i in range(0, len(compartments), rows_count) ] return TEMPLATE.render(columns=columns) def print_resistors(): import getpass token = os.environ.get("INVENTORY_TOKEN", getpass.getpass("Inventory token: ")) compartments = fetch_resistors(Inventory(token=token)) for cp in compartments: print( f"{cp.compartment:>4s} {cp.resistance:>8s} {cp.package:>4s} {cp.tolerance:>4s}" ) if __name__ == "__main__": print_resistors()