62 lines
2.1 KiB
Python
62 lines
2.1 KiB
Python
from typing import Iterable
|
|
from pathlib import Path
|
|
from dataclasses import dataclass
|
|
from .common import LcrConnException, from_human_readable_value
|
|
|
|
|
|
@dataclass(frozen=True)
|
|
class DataSubset:
|
|
"""A list holding available device gauge values for resistor, capacitor or inductor"""
|
|
|
|
gauges: tuple[float, ...]
|
|
"""A list of available device gauge values"""
|
|
|
|
@staticmethod
|
|
def from_iterable(str_gauges: Iterable[str]) -> "DataSubset":
|
|
# Remove redundant parts
|
|
gauges_set: set[float] = set()
|
|
for str_gauge in str_gauges:
|
|
numeric_gauge = from_human_readable_value(str_gauge)
|
|
if numeric_gauge in gauges_set:
|
|
raise LcrConnException(f"Duplicate gauge value found: {str_gauge}")
|
|
else:
|
|
gauges_set.add(numeric_gauge)
|
|
# Return value
|
|
return DataSubset(tuple(gauges_set))
|
|
|
|
@staticmethod
|
|
def from_file(filename: Path) -> "DataSubset":
|
|
with open(filename, "r", encoding="utf-8") as f:
|
|
legal_lines = filter(lambda line: line != "", (line.strip() for line in f))
|
|
return DataSubset.from_iterable(legal_lines)
|
|
|
|
|
|
@dataclass(frozen=True)
|
|
class DataSet:
|
|
"""The dataset include 3 lists of available device gauge values for resistor, capacitor and inductor"""
|
|
|
|
resistor: DataSubset
|
|
"""A list of available device gauge values for resistor"""
|
|
capacitor: DataSubset
|
|
"""A list of available device gauge values for capacitor"""
|
|
inductor: DataSubset
|
|
"""A list of available device gauge values for inductor"""
|
|
|
|
@staticmethod
|
|
def from_iterable(
|
|
resistor: Iterable[str], capacitor: Iterable[str], inductor: Iterable[str]
|
|
) -> "DataSet":
|
|
return DataSet(
|
|
DataSubset.from_iterable(resistor),
|
|
DataSubset.from_iterable(capacitor),
|
|
DataSubset.from_iterable(inductor),
|
|
)
|
|
|
|
@staticmethod
|
|
def from_file(resistor: Path, capacitor: Path, inductor: Path) -> "DataSet":
|
|
return DataSet(
|
|
DataSubset.from_file(resistor),
|
|
DataSubset.from_file(capacitor),
|
|
DataSubset.from_file(inductor),
|
|
)
|