Можно ли проверять имена ключей и словарные имена файла yaml с помощью Cerberus? - PullRequest
0 голосов
/ 10 июня 2019

Мне нужно проверить файл YAML, используя Python3.7.Я пытаюсь Цербер выполнить проверку контента.Что касается проверки значений, это работает просто отлично, но для имен ключей я не могу найти способ успешно проверить их достоверность в контексте файла YAML.

Имя словаря является адресом электронной почты и должно быть уникальным для каждой записи в файле YAML и должно быть проверено.Несколько имен ключей чувствительны к регистру и должны быть проверены как точные.

Я тоже новичок в Python, поэтому есть большая вероятность, что это просто невежество новичков.Возможно, мне нужно искать что-то еще, кроме Цербера, но я не нашел надежного валидатора YAML.Предложения очень приветствуются.

Я создал schema.py и validationScript.py в соответствии с документацией Cerberus.Я пытался выставить ключи ключей, но на этом уровне, похоже, нет проверки anyof.Кажется, правила ключей применяются ко всем ключам в словаре в моем тестировании.Если я использую правила ключей, я могу проверить один ключ, но другие не получаются.Я пробовал множество правил, я пробовал anyof и anyof_regex, но не смог заставить их успешно просматривать все имена ключей и проверять их.

Я не могу найти способ проверить имя словаря.Я знаю, что могу проверить его, если я жестко закодирую действительное электронное письмо, которое существует в YAML.

#! python
from cerberus import Validator
import yaml

def __val_users():
    with open("yamlfile.yaml", 'r') as stream:
        try:
            return yaml.safe_load(stream)
        except yaml.YAMLError as exception:
            print(exception)

schema = eval(open('C:/path/to/schema.py', 'r').read())
v = Validator(schema)
document = __val_users()
print(v.validate(document, schema))
print(v.errors)

И schema.py выглядит так:

{
    'guest@hotpop.com': {
        'type': 'dict',
    },
        'varOn': {
            'required': True,
            'type': 'string',
                        'regex': '/^\S*$/;'
                },
        'varOff': {
            'required': True,
            'type': 'string',
                        'regex': '/^\S*$/;'
        },
        'access': {
            'required': True,
            'type': 'list',
                        'allowed': ['h1', 'h2', 'h3', 'oper1', 'oper2', 'oper3', 'drive1', 'drive2', 'drive3']
        },
        'hub': {
            'required': True,
            'type': 'list'
        }
}

yaml:

me@mydomain.com:
  varOn: Single
  varOff: Word
  access:
    - h1
    - drive2
    - oper3
  hub:
    - onehub

Я ожидаю, что есть код, который может проверять правила, ноЯ получаю синтаксические ошибки при использовании anyof: Файл "", строка 5 'anyof': ^ SyntaxError: неверный синтаксис

В результате получаю ошибки схемы при использовании keysrules

File "C:\Python37\lib\site-packages\cerberus\schema.py", line 275, in _validate
    raise SchemaError(self.schema_validator.errors)
cerberus.schema.SchemaError: `{'me@mydomain.com': [{'keysrules': ["must be of ['dict', 'string'] type"]}]}`

спроверка всего контента работает, в итоге я получаю имена словарей (адреса электронной почты), возвращая False с указанием {'my@mydomain.com': ['unknown field'], 'stack@exchange.com': ['unknown field']}

...