Config Module¶
nanocli.config.option ¶
Dataclass field wrapper with help text for CLI.
Use this instead of field() to add help text that appears in CLI help.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
default
|
Any
|
Default value for the field. |
MISSING
|
help
|
str
|
Help text shown in CLI. |
''
|
**kwargs
|
Any
|
Additional arguments passed to |
{}
|
Returns:
| Type | Description |
|---|---|
Any
|
A dataclass field with metadata. |
Examples:
>>> from dataclasses import dataclass
>>> @dataclass
... class Config:
... epochs: int = option(100, help="Number of epochs")
... lr: float = option(0.001, help="Learning rate")
>>> cfg = Config()
>>> cfg.epochs
100
Source code in src/nanocli/config.py
nanocli.config.compile_config ¶
compile_config(
base: DictConfig | None = None,
overrides: list[str] | None = None,
schema: type[T] | None = None,
) -> DictConfig | T
Compile a config from base + overrides.
This is the core function: pure tree rewrite. Priority: schema defaults < base < overrides
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
base
|
DictConfig | None
|
Base config tree (from YAML). |
None
|
overrides
|
list[str] | None
|
List of override strings ( |
None
|
schema
|
type[T] | None
|
Optional dataclass for type validation. |
None
|
Returns:
| Type | Description |
|---|---|
DictConfig | T
|
Compiled config. Typed if schema provided, else DictConfig. |
Examples:
>>> from dataclasses import dataclass
>>> @dataclass
... class Config:
... name: str = "default"
... count: int = 1
>>> cfg = compile_config(schema=Config)
>>> cfg.name
'default'
>>> cfg = compile_config(schema=Config, overrides=["name=custom"])
>>> cfg.name
'custom'
Source code in src/nanocli/config.py
nanocli.config.load_yaml ¶
Load a YAML file into a DictConfig.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
path
|
str | Path
|
Path to the YAML file. |
required |
Returns:
| Type | Description |
|---|---|
DictConfig
|
DictConfig containing the parsed YAML. |
Raises:
| Type | Description |
|---|---|
ConfigError
|
If the file does not exist. |
Examples:
>>> import tempfile
>>> from pathlib import Path
>>> with tempfile.NamedTemporaryFile(suffix=".yml", delete=False, mode="w") as f:
... _ = f.write("name: test\ncount: 42")
... path = f.name
>>> cfg = load_yaml(path)
>>> cfg.name
'test'
>>> Path(path).unlink()
Source code in src/nanocli/config.py
nanocli.config.to_yaml ¶
Convert config to YAML string.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
config
|
Any
|
Config object (dataclass, dict, or DictConfig). |
required |
Returns:
| Type | Description |
|---|---|
str
|
YAML string representation. |
Examples:
>>> from dataclasses import dataclass
>>> @dataclass
... class Config:
... name: str = "test"
>>> yaml_str = to_yaml(Config())
>>> "name: test" in yaml_str
True
Source code in src/nanocli/config.py
nanocli.config.save_yaml ¶
Save config to YAML file.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
config
|
Any
|
Config object to save. |
required |
path
|
str | Path
|
Path to write the YAML file. |
required |
Examples:
>>> import tempfile
>>> from dataclasses import dataclass
>>> @dataclass
... class Config:
... name: str = "test"
>>> with tempfile.NamedTemporaryFile(suffix=".yml", delete=False) as f:
... save_yaml(Config(), f.name)
... content = open(f.name).read()
>>> "name: test" in content
True
Source code in src/nanocli/config.py
nanocli.config.parse_overrides ¶
Parse CLI overrides into a config tree.
Supports three types of overrides:
- key=value - Scalar override
- key.path=value - Nested override
- key=@file.yml - Subtree replacement from file
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
overrides
|
list[str]
|
List of override strings. |
required |
Returns:
| Type | Description |
|---|---|
DictConfig
|
DictConfig with parsed overrides. |
Raises:
| Type | Description |
|---|---|
ConfigError
|
If an override doesn't contain '='. |
Examples:
>>> cfg = parse_overrides(["name=test", "count=42"])
>>> cfg.name
'test'
>>> cfg.count
42
>>> cfg = parse_overrides(["model.layers=24"])
>>> cfg.model.layers
24