Skip Behaviors#
Skipping Sources with Parse Errors#
skip_if_broken=True silently skips a source whose file exists but fails to parse (invalid syntax, config error).
from dataclasses import dataclass
import dature
@dataclass
class Config:
host: str
port: int
debug: bool = False
config = dature.load(
dature.Yaml12Source(file=SHARED_DIR / "common_defaults.yaml"),
dature.Yaml12Source(
file=SOURCES_DIR / "broken_config.yaml",
),
schema=Config,
skip_if_broken=True,
)
assert config.host == "localhost"
assert config.port == 3000
assert config.debug is False
Skipping Missing Sources#
skip_if_missing=True silently skips a source whose file does not exist.
from dataclasses import dataclass
import dature
@dataclass
class Config:
host: str
port: int
debug: bool = False
config = dature.load(
dature.Yaml12Source(file=SHARED_DIR / "common_defaults.yaml"),
dature.Yaml12Source(
file=SOURCES_DIR
/ "local_overrides.yaml", # optional local file, may not exist
),
schema=Config,
skip_if_missing=True,
)
assert config.host == "localhost"
assert config.port == 3000
assert config.debug is False
Per-source Skip Overrides#
Both skip_if_broken and skip_if_missing can be set directly on a Source instance, which takes priority over the global load() flag:
from dataclasses import dataclass
import dature
@dataclass
class Config:
host: str
port: int
debug: bool = False
config = dature.load(
dature.Yaml12Source(
file=SHARED_DIR / "common_defaults.yaml",
),
dature.Yaml12Source(
file=SOURCES_DIR
/ "broken_config.yaml", # per-source: skip parse errors
skip_if_broken=True,
),
dature.Yaml12Source(
file=SOURCES_DIR
/ "local_overrides.yaml", # per-source: skip if file absent
skip_if_missing=True,
),
schema=Config,
)
assert config.host == "localhost"
assert config.port == 3000
assert config.debug is False
If all sources fail to load, a ValueError is raised.
Skipping Invalid Fields#
Drop fields with invalid values and let other sources or defaults fill them in:
from dataclasses import dataclass
import dature
@dataclass
class Config:
host: str
port: int = 3000
config = dature.load(
dature.Yaml12Source(
file=SOURCES_DIR / "merging_skip_invalid_defaults.yaml",
skip_field_if_invalid=True,
),
schema=Config,
)
assert config.host == "localhost"
assert config.port == 3000 # filled with default value
Restrict skipping to specific fields:
from dataclasses import dataclass
import dature
@dataclass
class Config:
host: str
port: int
timeout: int
config = dature.load(
dature.Yaml12Source(
file=SOURCES_DIR / "merging_skip_invalid_per_field_defaults.yaml",
),
dature.Yaml12Source(
file=SOURCES_DIR / "merging_skip_invalid_per_field_overrides.yaml",
skip_field_if_invalid=(dature.F[Config].port, dature.F[Config].timeout),
),
schema=Config,
)
assert config.host == "production.example.com"
assert config.port == 3000
assert config.timeout == 30
Only port and timeout will be skipped if invalid; other fields still raise errors.
If a required field is invalid in all sources and has no default:
from dataclasses import dataclass
import dature
@dataclass
class Config:
host: str
port: int
timeout: int
dature.load(
dature.Yaml12Source(
file=SOURCES_DIR / "merging_skip_invalid_required_defaults.yaml",
skip_field_if_invalid=(dature.F[Config].port,),
),
dature.Yaml12Source(
file=SOURCES_DIR / "merging_skip_invalid_required_overrides.yaml",
skip_field_if_invalid=(dature.F[Config].port,),
),
schema=Config,
)
| dature.errors.exceptions.DatureConfigError: Config loading errors (1)
+-+---------------- 1 ----------------
| dature.errors.exceptions.FieldLoadError: [port] Missing required field (invalid in: yaml1.2 '{SOURCES_DIR}merging_skip_invalid_required_defaults.yaml', yaml1.2 '{SOURCES_DIR}merging_skip_invalid_required_overrides.yaml')
| ├── port: "not_a_number"
| │ ^^^^^^^^^^^^^^
| ├── FILE '{SOURCES_DIR}merging_skip_invalid_required_defaults.yaml', line 2
| ├── port: "not_a_number_too"
| │ ^^^^^^^^^^^^^^^^^^
| └── FILE '{SOURCES_DIR}merging_skip_invalid_required_overrides.yaml', line 2
+------------------------------------