Как расширить валидатор jsonschema?

#python-jsonschema

Вопрос:

Для моего проекта мне нужно новое свойство для схем json. Я назвал это «isPropertyOf», и в основном я хочу, чтобы, если у меня есть это:

 fruits = {
    "banana": "yellow fruit",
    "apple": "round fruit"
}

schema = {
    "type": "object",
    "properties": {
        "fav_fruit": {
            "type": "string",
            "isPropertyOf": fruits
        }
    }
}
 

Тогда схема будет проверять только такие объекты , как {"fav_fruit":"banana"} или {"fav_fruit":"apple"} , но не {"fav_fruit":"salami"}
(Я знаю, что для этого самого примера использование перечисления имело бы больше смысла, но предположим, что «фрукты» также используются для других вещей, и я бы предпочел избежать избыточности)

Я прочитал документы об этом и понял, что мне нужно использовать jsonschema.validators.extend . Я пробовал что-то в этом роде:

 def is_property_of_callable(validator_instance, property_value, instance, schema):
    keys = [k for k in property_value]
    return instance in keys

mapping = {"isPropertyOf": is_property_of_callable}
my_validator = jsonschema.validators.extend(jsonschema.Draft7Validator, mapping)
instance = {"fav_fruit": "tobacco"}
my_validator(schema).is_valid(instance)
 

Я был готов увидеть, что что-то пойдет не так, но, по-видимому, валидатор не видел никаких проблем. Я попытался использовать явно неправильный экземпляр, который не принял бы даже стандартный валидатор jsonschema

 my_validator(schema).is_valid({"fav_fruit": 0})
 

Но, по-видимому, это выглядело нормально.
Я подумал, что, возможно, то, как я добавил это свойство, было настолько нарушено, что заставляло валидатора принимать что угодно, поэтому я попробовал минимальный случай расширения валидатора:

 minimal_validator = jsonschema.validators.extend(jsonschema.Draft7Validator, {})
minimal_validator(schema).is_valid(instance)
 

И этот тоже доволен тем, что 0 — мой любимый фрукт.

Что я здесь делаю не так? Как я могу заставить это работать?