Skip to content

tobbez/strictyaml

 
 

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

StrictYAML

StrictYAML is a type-safe YAML parser that parses a restricted subset of the YAML specificaton.

Priorities:

  • Readability of YAML.
  • Ease of use of API.
  • Secure by default.
  • Strict validation of markup and straightforward type casting.
  • Clear, human readable exceptions with line numbers.
  • Acting as a near-drop in replacement for pyyaml, ruamel.yaml or poyo.
  • Roundtripping - reading in (commented) YAML and writing it out with comments.
  • Letting you worry about more interesting things than parsing or writing config files.

Simple example:

# All about the character
name: Ford Prefect
age: 42
possessions:
  - Towel

Default parse result:

>>> strictyaml.load(yaml)
YAML({'possessions': ['Towel'], 'age': '42', 'name': 'Ford Prefect'})

>>> strictyaml.load(yaml).data
{"name": "Ford Prefect", "age": "42", "possessions": ["Towel", ]}   # All data is str, list or dict

Using a schema:

>>> from strictyaml import load, Map, Str, Int, Seq
>>> person = load(yaml, Map({"name": Str(), "age": Int(), "possessions": Seq(Str())})) \
>>> person.data == {"name": "Ford Prefect", "age": 42, "possessions": ["Towel", ]}     # 42 is now an int

Once parsed you can change values and roundtrip the whole YAML, with comments preserved:

>>> person['age'] = load('43')
>>> print(person.as_yaml())
# All about the character
name: Ford Prefect
age: 43
possessions:
  - Towel

As well as look up line numbers:

>>> person['possessions'][0].start_line
5

See more example driven documentation.

Install It

$ pip install strictyaml

FAQ

From learning programmers:

If you're looking at this and thinking "why not do/use X instead?" that's a healthy response, and you deserve answers. These are probably the questions you're asking:

Breaking changes

0.5: Data is now parsed by default as a YAML object instead of directly to dict/list. To get dict/list and ordinary values as before, get yaml_object.data.

0.7: Roundtripping now requires that you only assign YAML objects to index: e.g. yaml_object['x'] = another_yaml_obj

Contributors

  • @gvx
  • @AlexandreDecan
  • @lots0logs

Packages

No packages published

Languages

  • Python 100.0%