Mappings with defined keys (Map)

Mappings of one value to another are represented by : in YAML and parsed as python dicts.

Using StrictYAML’s ‘Map’ you can validate that a mapping contains the right keys and the right type of values.

Note: for mappings where you don’t know the exact names of the keys in advance but you do know the type, use MapPattern.

Example yaml_snippet:

â: 1
b: 2
c: 3
from collections import OrderedDict
from strictyaml import Map, Int, load, as_document
from collections import OrderedDict
from ensure import Ensure

schema = Map({"a": Int(), "b": Int(), "c": Int()})

schema_2 = Map({u"â": Int(), "b": Int(), "c": Int()})

one key mapping:

x: 1
Ensure(load(yaml_snippet, Map({"x": Int()})).data).equals(OrderedDict([('x', 1)]))

key value:

Ensure(load(yaml_snippet, schema_2)[u'â']).equals(1)

get item key not found:

load(yaml_snippet, schema_2)['keynotfound']
:
'keynotfound'

cannot use .text:

load(yaml_snippet, schema_2).text
builtins.TypeError:YAML(OrderedDict([('â', 1), ('b', 2), ('c', 3)])) is a mapping, has no text value.:

parse snippet where key is not found in schema:

a: 1
b: 2
â: 3 
load(yaml_snippet, schema)
strictyaml.exceptions.YAMLValidationError:
while parsing a mapping
unexpected key not in schema 'â'
  in "<unicode string>", line 3, column 1:
    "\xE2": '3'
    ^ (line: 3)

sequence not expected when parsing:

- 1
- 2
- 3 
load(yaml_snippet, schema)
strictyaml.exceptions.YAMLValidationError:
when expecting a mapping
  in "<unicode string>", line 1, column 1:
    - '1'
     ^ (line: 1)
found a sequence
  in "<unicode string>", line 3, column 1:
    - '3'
    ^ (line: 3)

List not expected when serializing:

as_document([1, 2, 3], schema)
strictyaml.exceptions.YAMLSerializationError:
Expected a dict, found '[1, 2, 3]'

Empty dict not valid when serializing:

as_document({}, schema)
strictyaml.exceptions.YAMLSerializationError:
Expected a non-empty dict, found an empty dict.
Use EmptyDict validator to serialize empty dicts.

Unexpected key:

a: 1
b: 2
c: 3
d: 4
load(yaml_snippet, schema)
strictyaml.exceptions.YAMLValidationError:
while parsing a mapping
unexpected key not in schema 'd'
  in "<unicode string>", line 4, column 1:
    d: '4'
    ^ (line: 4)

required key not found:

a: 1
load(yaml_snippet, schema)
strictyaml.exceptions.YAMLValidationError:
while parsing a mapping
required key(s) 'b', 'c' not found
  in "<unicode string>", line 1, column 1:
    a: '1'
     ^ (line: 1)

iterator:

a: 1
b: 2
c: 3
assert [item for item in load(yaml_snippet, schema)] == ["a", "b", "c"]

serialize:

assert as_document(OrderedDict([(u"â", 1), ("b", 2), ("c", 3)]), schema_2).as_yaml() == yaml_snippet

Executable specification

Page automatically generated from map.story.