Я ищу способ проверки YAML при использовании специфичных для приложения тегов. Мой код Python:
import yaml
import jsonschema
import sys
class Monster(yaml.YAMLObject):
yaml_tag = u'!Monster'
yaml_loader = yaml.FullLoader
def __init__(self, name, hp, ac, attacks):
self.name = name
self.hp = hp
self.ac = ac
self.attacks = attacks
def __repr__(self):
return "%s(name=%r, hp=%r, ac=%r, attacks=%r)" % (self.__class__.__name__, self.name, self.hp, self.ac, self.attacks)
cave = yaml.load("""
--- !Monster
name: Cave spider
hp: [2,6] # 2d6
ac: 16
attacks: [BITE, HURT]
""", Loader=yaml.FullLoader)
print(yaml.dump(Monster(name='Cave lizard', hp=[3,6], ac=16, attacks=['BITE','HURT'])))
try:
jsonschema.validate(cave, {"$schema": "http://json-schema.org/draft/schema#", "type": "object"})
except jsonschema.exceptions.ValidationError as ve:
sys.stderr.write("Cannot validate block!\n{}".format(str(ve)))
sys.exit(1)
.. он отлично работает. Однако, когда я пытаюсь проверить выражение YAML с помощью jsonschema, я получаю следующую ошибку:
Cannot validate block...
Monster(name='Cave spider', hp=[2, 6], ac=16, attacks=['BITE', 'HURT']) is not of type 'object'
Я объявил Monster
как "объект" jsonschema, но кажется, что "объект" ожидает тип отображения(Python dict
). Есть ли способ сказать jsonschema принимать объекты Monster? Есть ли другие способы проверки YAML с объектно-ориентированными объектами?