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