hoodini.config

 1from importlib.resources import files
 2
 3import tomli
 4
 5from hoodini.config.settings import RuntimeConfig, build_runtime_config
 6
 7
 8def load_default_config() -> dict:
 9    defaults_path = files("hoodini.config").joinpath("defaults.toml")
10    with open(defaults_path, "rb") as f:
11        grouped = tomli.load(f)
12
13    flat = {}
14    for section, values in grouped.items():
15        if isinstance(values, dict):
16            flat.update(values)
17        else:
18            flat[section] = values
19    return flat
20
21
22__all__ = ["RuntimeConfig", "build_runtime_config", "load_default_config"]
@dataclass(slots=True)
class RuntimeConfig:
35@dataclass(slots=True)
36class RuntimeConfig:
37    input_path: str | None = None
38    inputsheet: str | None = None
39    output: str | None = None
40
41    max_concurrent_downloads: int | None = None
42    apikey: str | None = None
43    num_threads: int | None = None
44    assembly_folder: str | None = None
45
46    prot_links: bool = False
47    nt_links: bool = False
48
49    ani_mode: str | None = None
50    nt_aln_mode: str | None = None
51    blast: str | None = None
52    cand_mode: str | None = None
53    clust_method: str | None = None
54    mod: str | None = None
55    wn: int | None = None
56    minwin: int | None = None
57    minwin_type: str | None = None
58
59    tree_mode: str | None = None
60    tree_file: str | None = None
61    aai_mode: str | None = None
62    aai_subset_mode: str | None = None
63    nj_algorithm: str | None = None
64    remote_evalue: float | None = None
65    remote_max_targets: int | None = None
66
67    padloc: bool = False
68    deffinder: bool = False
69    ncrna: bool = False
70    cctyper: bool = False
71    genomad: bool = False
72    sorfs: bool = False
73    domains: list[str] | None = field(default=None)
74    emapper: bool = False
75    min_pident: float = 30.0
76
77    keep: bool = False
78    force: bool = False
79
80    def replace(self, **kwargs: Any) -> RuntimeConfig:
81        """Return a copy with provided fields updated."""
82        return replace(self, **kwargs)
RuntimeConfig( input_path: str | None = None, inputsheet: str | None = None, output: str | None = None, max_concurrent_downloads: int | None = None, apikey: str | None = None, num_threads: int | None = None, assembly_folder: str | None = None, prot_links: bool = False, nt_links: bool = False, ani_mode: str | None = None, nt_aln_mode: str | None = None, blast: str | None = None, cand_mode: str | None = None, clust_method: str | None = None, mod: str | None = None, wn: int | None = None, minwin: int | None = None, minwin_type: str | None = None, tree_mode: str | None = None, tree_file: str | None = None, aai_mode: str | None = None, aai_subset_mode: str | None = None, nj_algorithm: str | None = None, remote_evalue: float | None = None, remote_max_targets: int | None = None, padloc: bool = False, deffinder: bool = False, ncrna: bool = False, cctyper: bool = False, genomad: bool = False, sorfs: bool = False, domains: list[str] | None = None, emapper: bool = False, min_pident: float = 30.0, keep: bool = False, force: bool = False)
input_path: str | None
inputsheet: str | None
output: str | None
max_concurrent_downloads: int | None
apikey: str | None
num_threads: int | None
assembly_folder: str | None
ani_mode: str | None
nt_aln_mode: str | None
blast: str | None
cand_mode: str | None
clust_method: str | None
mod: str | None
wn: int | None
minwin: int | None
minwin_type: str | None
tree_mode: str | None
tree_file: str | None
aai_mode: str | None
aai_subset_mode: str | None
nj_algorithm: str | None
remote_evalue: float | None
remote_max_targets: int | None
padloc: bool
deffinder: bool
ncrna: bool
cctyper: bool
genomad: bool
sorfs: bool
domains: list[str] | None
emapper: bool
min_pident: float
keep: bool
force: bool
def replace(self, **kwargs: Any) -> RuntimeConfig:
80    def replace(self, **kwargs: Any) -> RuntimeConfig:
81        """Return a copy with provided fields updated."""
82        return replace(self, **kwargs)

Return a copy with provided fields updated.

def build_runtime_config( *, defaults: Mapping[str, typing.Any], file_overrides: Mapping[str, typing.Any] | None = None, cli_overrides: Mapping[str, typing.Any] | None = None) -> RuntimeConfig:
 85def build_runtime_config(
 86    *,
 87    defaults: Mapping[str, Any],
 88    file_overrides: Mapping[str, Any] | None = None,
 89    cli_overrides: Mapping[str, Any] | None = None,
 90) -> RuntimeConfig:
 91    """Merge defaults + file + CLI into a RuntimeConfig.
 92
 93    Later sources override earlier ones. Unknown keys are ignored to keep the
 94    dataclass strict.
 95    """
 96
 97    merged: dict[str, Any] = {}
 98    for source in (defaults, file_overrides or {}, cli_overrides or {}):
 99        merged.update(_flatten_config(source))
100
101    if "aai-subset-mode" in merged and "aai_subset_mode" not in merged:
102        merged["aai_subset_mode"] = merged["aai-subset-mode"]
103    if "aai_subset_mode" in merged and "aai-subset-mode" not in merged:
104        merged["aai-subset-mode"] = merged["aai_subset_mode"]
105
106    allowed_fields: set[str] = {field.name for field in RuntimeConfig.__dataclass_fields__.values()}  # type: ignore[attr-defined]
107    filtered: dict[str, Any] = {k: v for k, v in merged.items() if k in allowed_fields}
108
109    config = RuntimeConfig(**filtered)
110    if config.input_path is None:
111        config.input_path = None
112    if config.inputsheet is None:
113        config.inputsheet = None
114    return config

Merge defaults + file + CLI into a RuntimeConfig.

Later sources override earlier ones. Unknown keys are ignored to keep the dataclass strict.

def load_default_config() -> dict:
 9def load_default_config() -> dict:
10    defaults_path = files("hoodini.config").joinpath("defaults.toml")
11    with open(defaults_path, "rb") as f:
12        grouped = tomli.load(f)
13
14    flat = {}
15    for section, values in grouped.items():
16        if isinstance(values, dict):
17            flat.update(values)
18        else:
19            flat[section] = values
20    return flat