Skip to content

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
host: "localhost"
port: 3000
tags:
  - "default"

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
host: "localhost"
port: 3000
tags:
  - "default"

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
host: "localhost"
port: 3000
tags:
  - "default"

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
host: "localhost"
port: "not_a_number"

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
host: "localhost"
port: 3000
timeout: 30
host: "production.example.com"
port: "not_a_number"
timeout: "invalid"

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,
)
host: "localhost"
port: "not_a_number"
timeout: 30
host: "production.example.com"
port: "not_a_number_too"
timeout: 60
  | 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
    +------------------------------------