иметь две разные проверки для правила, если поле существует - PullRequest
0 голосов
/ 03 января 2019

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

yaml1:

email: someone@company.com

yaml2:

email: otherguy@home.com
contract_type: external

схема:

schema = {
  'email': {
    'required': True,
    'type': 'string',
    'regex': '^([a-zA-Z0-9_\-\.]+)@company\.com$'
  }

1 Ответ

0 голосов
/ 21 марта 2019

Быстрый ответ (TL; DR)

  • Подход "составной проверки" позволяет использовать правила условной (с учетом контекста) проверки.
  • Пакет python cerberus поддерживает составную проверку "из коробки".

Подробный ответ

Контекст

  • питон 2,7
  • пакет подтверждения Цербера
  • язык запросов jmespath (чтобы сделать правила проверки более компактными и читаемыми)

Проблема

  • Разработчик NamenMalkavCreator хочет применить правила условной проверки.
  • Правила условной проверки активируются на основе наличия или значения других полей в наборе данных.
  • Правила условной проверки должны быть достаточно гибкими, чтобы изменять их «на лету» на основе любых произвольных состояний или отношений в исходных данных.

Решение

  • Этот подход может быть реализован с помощью проверки составных данных.
  • В этом сценарии использования составная проверка просто означает создание последовательного списка правил проверки, например:
    • Каждое отдельное правило работает с составной переменной данных
    • В каждом отдельном правиле указывается «условие срабатывания», когда применяется правило
    • Каждое отдельное правило создает один из трех взаимоисключающих результатов проверки: validation-success, validation-fail или validation-skipped

Пример

  • В следующем примере предполагается наличие нескольких документов YAML
  • Некоторые образцы документов показаны здесь
Образцы документов
aadocuments = []
aadocuments.append(yaml.safe_load('''
    person_fname:         homer
    person_lname:         himpson
    person_age:           33
    prize_caption:        free beer for life
    prize_email:          prizes@abcbooze.com
    prize_category:       alchohol
'''))
aadocuments.append(yaml.safe_load('''
    person_fname:         helen
    person_lname:         himpson
    person_age:           16
    prize_caption:        free ammo for life
    prize_email:          prizes@zzzguns.com
    prize_category:       firearms
  '''))
Образец правила проверки
- rule_caption:     check-underage-minor
  rule_vpath:       '[@]|[? @.person_age < `18`]'
  validation_schema:
    prize_category:
      type: string
      allowed: ['pets','toys','candy']
    prize_email:
      type:     string
      regex:    '[\w]+@.*'
  • Приведенный выше код является форматированным представлением YAML одного правила проверки, взятого из списка правил.
  • На простом английском языке это правило определяет:
    • Если мы встретим запись в наборе данных, где person_age меньше 18, то:
      • утверждает, что поле prize_category существует
      • утверждает, что поле prize_category имеет тип string
      • подтвердите значение prize_category, равное pets или toys или candy
      • утверждать, что поле prize_email существует, типа string
      • подтвердить, что поле prize_email соответствует определенному регулярному выражению

Пример результата

  • Результат для helen himpson в приведенном выше примере будет validation-fail.
    • срабатывает правило проверки check-underage-minor, потому что person_age == 16
    • prize_cateogry имеет значение firearms, что недопустимо, поэтому проверка не проходит

Обоснование

  • Этот подход можно распространить на любой произвольный уровень сложности.
  • Этот подход легко понятен людям (хотя синтаксис jmespath может быть проблемой)
  • Используя этот подход, можно установить любой произвольно сложный набор условий и ограничений.

Ловушки

  • Приведенный выше пример использует синтаксис jmespath для указания rule_vpath, который сообщает системе, что нужно запускать это конкретное правило, если и только если person_age существует и меньше 18. Это добавляет зависимость от jmespath.

Смотри также

...