Strict, typed YAML parser
StrictYAML is a type-safe YAML parser that parses and validates a restricted subset of the YAML specification.
Priorities:
Simple example:
# All about the character
name: Ford Prefect
age: 42
possessions:
- Towel
from strictyaml import load, Map, Str, Int, Seq, YAMLError
Default parse result:
>>> load(yaml_snippet)
YAML({'name': 'Ford Prefect', 'age': '42', 'possessions': ['Towel']})
All data is string, list or OrderedDict:
>>> load(yaml_snippet).data
{'name': 'Ford Prefect', 'age': '42', 'possessions': ['Towel']}
Quickstart with schema:
from strictyaml import load, Map, Str, Int, Seq, YAMLError
schema = Map({"name": Str(), "age": Int(), "possessions": Seq(Str())})
42 is now parsed as an integer:
>>> person = load(yaml_snippet, schema)
>>> person.data
{'name': 'Ford Prefect', 'age': 42, 'possessions': ['Towel']}
A YAMLError will be raised if there are syntactic problems, violations of your schema or use of disallowed YAML features:
# All about the character
name: Ford Prefect
age: 42
For example, a schema violation:
try:
person = load(yaml_snippet, schema)
except YAMLError as error:
print(error)
while parsing a mapping
in "<unicode string>", line 1, column 1:
# All about the character
^ (line: 1)
required key(s) 'possessions' not found
in "<unicode string>", line 3, column 1:
age: '42'
^ (line: 3)
If parsed correctly:
from strictyaml import load, Map, Str, Int, Seq, YAMLError, as_document
schema = Map({"name": Str(), "age": Int(), "possessions": Seq(Str())})
You can modify values and write out the YAML with comments preserved:
person = load(yaml_snippet, schema)
person['age'] = 43
print(person.as_yaml())
# All about the character
name: Ford Prefect
age: 43
possessions:
- Towel
As well as look up line numbers:
>>> person = load(yaml_snippet, schema)
>>> person['possessions'][0].start_line
5
And construct YAML documents from dicts or lists:
print(as_document({"x": 1}).as_yaml())
x: 1
$ pip install strictyaml
There are a number of formats and approaches that can achieve more or less the same purpose as StrictYAML. I've tried to make it the best one. Below is a series of documented justifications:
How to:
Compound validators:
Scalar validators:
Restrictions:
There are some design decisions in StrictYAML which are controversial and/or not obvious. Those are documented here:
StrictYAML also includes code from ruamel.yaml, Copyright Anthon van der Neut.