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