不同但同样有效的 YAML 类型的“或”模式验证

StrictYAML 可以被定向为解析两个不同的元素或 YAML 块。

如果第一个东西没有解析正确,它尝试解析第二个。 如果第二个解析不正确,它会抛出异常。

from strictyaml import Map, Seq, Bool, Int, Str, YAMLValidationError, load
from ensure import Ensure

schema = Str() | Map({"a": Bool() | Int()})

布尔值首选 true

a: yes
Ensure(load(yaml_snippet, schema)).equals({"a": True})

布尔值首选 false

a: no
Ensure(load(yaml_snippet, schema)).equals({"a": False})

Int 次选

a: 5
Ensure(load(yaml_snippet, schema)).equals({"a": 5})

无效 - 不是 bool 或 int

a: A
load(yaml_snippet, schema)
strictyaml.exceptions.YAMLValidationError:
when expecting an integer
found arbitrary text
  in "<unicode string>", line 1, column 1:
    a: A
     ^ (line: 1)

多个映射的无效组合

a: x
load(yaml_snippet, Map({"a": Str()}) | Map({"b": Str()}))
strictyaml.exceptions.InvalidValidatorError:
You tried to Or ('|') together 2 Map validators. Try using revalidation instead.

多个序列的无效组合

- 1
- 2
load(yaml_snippet, Seq(Int()) | Seq(Str()))
strictyaml.exceptions.InvalidValidatorError:
You tried to Or ('|') together 2 Seq validators. Try using revalidation instead.

验证后更改项目

a: yes
yaml = load(yaml_snippet, schema)
yaml['a'] = 5
assert yaml['a'] == 5

可执行规范

文档从 or.story storytests 自动生成。