生成一个json模式,使用pydantic来验证根列表和映射



我正试图编写一个模式,可用于验证两种不同的需求格式,一个v1,它曾经是一个列表在根级和一个较新的一个是使用映射:

# requirements.yml v1
- {}  # the mapping inside being a RoleModel
...
# requirements.yml v2
roles:
- {}  # the mapping inside being a RoleModel
...
collections:
- {}  # the mapping inside being a CollectionModel
...

我能够为这两个版本中的任何一个生成不同的模式,但我不知道如何将这两个版本组合成一个模式。

由于实际的原因,我不能使用不同的模式,因为文件名是相同的,并且Ansible加载两个,所以在打开文件之前没有办法确定模式。

对于v2格式,我有一个实现在https://github.com/ansible-community/ansible-lint/blob/schemas/src/ansiblelint/schemas/requirements.py

我确实了解到,为了在根级别验证列表,我需要做类似https://github.com/ansible-community/ansible-lint/blob/schemas/src/ansiblelint/schemas/playbook.py#L35:

的事情
top_level_schema = schema([RoleModel], title='Requiremetns v1 Schema')

如何将两者组合在一个模式中,一个模式将涵盖上面列出的两个示例?

对于JSON模式,你想使用一个应用程序,它有一个模式值数组。

根据您给我看的代码,剧本模式实际上并没有生成一个有用的模式(只有定义,没有实际的验证)。

根据pydantic的文档,看起来你想使用Union类型。

https://pydantic-docs.helpmanual.io/usage/schema/json-schema-types

联盟(str, int)
任何
{"anyOf"[{"type"string"},{"type"integer"]}

同样的方法可能适用于您定义的类,但我没有办法测试。

如果没有,我建议你在他们的github repo上提交一个问题。虽然,我已经发现了一个类似的功能请求:https://github.com/samuelcolvin/pydantic/issues/2036