
import re
from cerberus import Validator
# pattern = re.compile('^[a-zA-Z0-9]{1,36}$')                    # 用于匹配至少一个数字
# m = pattern.match('111aaa3213213123123213123a222')
# print(m)
#
# schema = {
#     'name': {'type': 'string', 'required': True},
#     'age': {'type': 'integer', 'required': True, 'min': 18},
#     'email': {'type': 'string', 'required': True, 'regex': r'\w+@\w+\.\w+'}
# }
# v = Validator(schema)
# print(v.validate({ 'name': '11', 'age': 20, 'email': '764784960@qq.com'}))
# aa = str({ 'name': '11', 'age': 20, 'email': '764784960@qq.com'})
# print(isinstance(aa, dict))

# schema = {'name': {'type': 'string'}}
# v = Validator(schema)
# document = {'name1': 'john doe'}
# print(v.validate(document))
# print(v.validate(document, schema))

schema = {
    'request_id': {
        'type': 'string',
        'required': True,
        'empty': False,
        'regex': r'^[a-zA-Z0-9]{1,36}$'
    },
    'command': {
        'type': 'string',
        'required': True,
        'allowed': ['start', 'stop']
    },
    'pull_url': {
        'type': 'string',
        'required': False,
        'nullable': True,
        'maxlength': 255
    },
    'push_url': {
        'type': 'string',
        'required': False,
        'nullable': True,
        'maxlength': 255
    },
    'original_url': {
        'type': 'string',
        'required': False,
        'nullable': True,
        'maxlength': 255
    },
    'original_type': {
        'type': 'string',
        'required': False,
        'nullable': True,
        'maxlength': 255
    },
    'image_urls': {
        'type': 'list',
        'required': False,
        'schema': {
            'type': 'string',
            'empty': False,
            'maxlength': 5000
        }
    },
    'results_base_dir': {
        'type': 'string',
        'required': False,
        'nullable': True,
        'regex': r'^[a-zA-Z0-9]{0,36}$'
    },
    'models': {
        'type': 'list',
        'required': False,
        'schema': {
            'type': 'dict',
            'required': False,
            'schema': {
                'code': {
                    'type': 'string',
                    'required': True,
                    'empty': False,
                    'dependencies': 'categories',
                    'regex': r'^[a-zA-Z0-9]{1,255}$'
                },
                'categories': {
                    'type': 'list',
                    'required': True,
                    'dependencies': 'code',
                    'schema': {
                        'type': 'dict',
                        'required': True,
                        'schema': {
                            'id': {
                                'type': 'string',
                                'required': True,
                                'empty': False,
                                'regex': r'^[a-zA-Z0-9]{0,255}$'},
                            'config': {
                                'type': 'dict',
                                'required': False,
                                'dependencies': 'id',
                            }
                        }
                    }
                }
            }
        }
    }
}

v = Validator(schema, allow_unknown=True)
aa={
    'request_id': "111",
    'command': 'start',
    'pull_url': None,
    'push_url': None,
    'original_url': '',
    'original_type': '',
    'image_urls': ['1','1'],
    'results_base_dir': '111',
    'models': [
    # {
    #     'code': '1',
    #     'categories': [
    #     # {
    #     #     'id': '1',
    #     #     'config': {}
    #     # }
    #     ]
    # }
    ]
}

print(v.validate(aa))
print(v.errors)