86 lines
2.4 KiB
Python
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()
|