electronics-inventory/electronics_inventory/resistors_boxall.py

86 lines
2.4 KiB
Python

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()