Проверка пользовательского типа в Cerberus

Мне очень нравится Cerberus, но я не могу найти простой случай в документации. Я хочу иметь тип fudge, который представляет собой строку с добавлением ~. Я просто не могу понять, как это сделать..

fudge_type = cerberus.TypeDefinition('fudge_type', (str,), ())

class MyValidator(cerberus.Validator):
    types_mapping = cerberus.Validator.types_mapping.copy()
    types_mapping['fudge'] = fudge_type

    def __init__(self, *args, **kwargs):
        if 'additional_context' in kwargs:
            self.additional_context = kwargs['additional_context']
        super(MyValidator, self).__init__(*args, **kwargs)

    @property
    def additional_context(self):
        self._error(field, "INVALID!")
        return self._config.get('additional_context', 'bar')

    def _validate_type_fudge(self, field, value):
        self._error(field, "INVALID!")
        make_use_of(self.additional_context)

validator = MyValidator()
validator.validate({'name': 'yada'}, {'name': {'type': 'fudge'}})  # => True

Это кажется простым случаем ... поэтому кажется, что я делаю что-то совершенно неправильное.


person Pithikos    schedule 09.05.2018    source источник


Ответы (1)


В Cerberus 1.2 вы можете добиться этого, как показано ниже:

import cerberus

SCHEMA = {
    'fudge': {
        'type': 'mytype'
    }
}

class MyValidator(cerberus.Validator):
    def _validate_type_mytype(self, value):
        if value.startswith('~'):
            return True

validator = MyValidator()
validator.validate({'fudge': 'yada'}, SCHEMA)

Так что не нужно возиться с TypeDefinition.

person Pithikos    schedule 10.05.2018
comment
Итак, вы в 1.2 должны пройти SCEMA во время вызова валидации? Потому что я пытаюсь создать собственный тип для значений tuple. но это дает ошибку времени выполнения при доступе к методу _validate_type_tuple, которого нет (даже если я добавлю это в свой собственный класс. - person Sadan A.; 03.07.2019