Skip to main content

Validate and document your YAML config files — so future-you doesn't have to guess.

Project description

ReadTheYAML

ReadTheYAML validates YAML config files against a schema, injects defaults, and returns a validated config object.

Installation

pip install ReadTheYAML

Local development install:

git clone https://github.com/TheRealMarVin/ReadTheYAML.git
cd ReadTheYAML
pip install -e .

What it supports

  • Required and optional fields
  • Default values for optional fields
  • Primitive and composite types
  • Nested sections
  • Conditional fields/sections with when
  • Strict mode (reject unknown keys) and non-strict mode (pass through unknown keys)
  • Schema composition with $ref (local files and HTTP URLs)

Quick start

Schema (schema.yaml):

service_name:
  type: str
  description: service display name

port:
  type: int
  description: service port
  required: false
  default: 8080
  min_value: 1
  max_value: 65535

logging:
  $ref: ./shared/logging.yaml
  required: false

Config (config.yaml):

service_name: api-gateway

Python usage:

from readtheyaml.schema import Schema

schema = Schema.from_yaml("schema.yaml")
built, data_with_default = schema.validate_file("config.yaml", strict=True)

print(built)              # validated/built config
print(data_with_default)  # config with injected defaults

CLI usage

This repository currently exposes a CLI through main.py:

python main.py --schema schema.yaml --config config.yaml

# Generate HTML documentation from a schema
python main.py --schema schema.yaml --generate-doc --output schema-doc.html

The repository also includes a Tkinter-based config editor:

python main_editor.py --schema schema.yaml --config config.yaml --strict true

For editor behavior and UI details, see docs/editor.md.

Type syntax overview

Primitive types:

  • any
  • None
  • bool
  • int
  • float
  • str
  • enum (requires values)

Composite types:

  • list[T]
  • tuple[T1, T2, ...]
  • union[A, B] or A | B
  • object[package.module.ClassName] (or object with _type_ in data)

Common field options:

  • description
  • required
  • default
  • min_value / max_value / value_range
  • min_length / max_length / length_range

Conditions (when)

when exists so one schema can express conditional fields/sections without splitting into multiple schemas. It gates validation and output inclusion based on other config values known at schema-validation time.

Practical example (compile_enabled toggles a compile section):

compile_enabled:
  type: bool
  required: false
  default: false

compile:
  required: false
  when:
    field: compile_enabled
    op: eq
    value: true
  command:
    type: str
    description: Compile command
    required: true

If compile_enabled is false, compile is skipped. If compile_enabled is true, compile.command is validated and required.

Syntax reference:

  • Atomic condition:
    • when: { field: some.path, op: eq, value: 123 }
  • Logical combinators:
    • all: [...] (AND)
    • any: [...] (OR)
    • not: {...} (NOT)

Semantics:

  • Active node (when is true):
    • validated normally
    • included in built
    • included in data_with_default (with defaults applied as needed)
  • Inactive node (when is false):
    • not validated
    • omitted from built
    • removed/omitted from data_with_default
  • If an optional subsection is missing and has no explicit section default, it is omitted (not auto-materialized from child defaults).
  • If a subsection is inactive due to when, payload under that subsection is ignored when evaluating other when conditions.

Limitations / non-goals for this phase:

  • when does not inspect runtime Python objects or object internals.
  • when does not evaluate arbitrary Python expressions from YAML.

Full reference (operators, aliases, combinators): docs/conditions.md

Notes

  • Field names cannot use reserved constructor keywords.
  • Optional fields usually require a valid default.
  • HTTP $ref resolution imports requests at runtime.

Documentation

See docs/index.md for the full reference, including type behavior and the editor guide.

Examples In This Repo

Use matching schema/config pairs from examples/:

  • schema.yaml + config.yaml
  • schema_composed.yaml + config_composed.yaml
  • schema_all_types.yaml + config_all_types.yaml

Running tests

pytest

Status

Run Unit Tests

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

readtheyaml-3.0.0.tar.gz (80.7 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

readtheyaml-3.0.0-py3-none-any.whl (116.2 kB view details)

Uploaded Python 3

File details

Details for the file readtheyaml-3.0.0.tar.gz.

File metadata

  • Download URL: readtheyaml-3.0.0.tar.gz
  • Upload date:
  • Size: 80.7 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for readtheyaml-3.0.0.tar.gz
Algorithm Hash digest
SHA256 b095dd91d40856a62682b8bb9f2ca607841c97fa8e2685b433969c3ef6d516da
MD5 ae984a58694aaaba875a1040c2998834
BLAKE2b-256 b5c884294676ec8a80146d0f4e80b17cd7b92d1d2a90899b3a87e082304df0a3

See more details on using hashes here.

Provenance

The following attestation bundles were made for readtheyaml-3.0.0.tar.gz:

Publisher: python-publish.yml on TheRealMarVin/ReadTheYaml

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file readtheyaml-3.0.0-py3-none-any.whl.

File metadata

  • Download URL: readtheyaml-3.0.0-py3-none-any.whl
  • Upload date:
  • Size: 116.2 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for readtheyaml-3.0.0-py3-none-any.whl
Algorithm Hash digest
SHA256 013e13331a608825b4fd4f7b5230a8b0e6f55395da70e28ac84e231001d6cb87
MD5 1089e7f67519ff39396a740bf53d8ea7
BLAKE2b-256 5d30dc310c731a57e177b019e8a23ef62a087c3b1fe08df7f69af0c28a1ad4b6

See more details on using hashes here.

Provenance

The following attestation bundles were made for readtheyaml-3.0.0-py3-none-any.whl:

Publisher: python-publish.yml on TheRealMarVin/ReadTheYaml

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page