Проверка документа yaml в python - PullRequest
46 голосов
/ 16 июля 2010

Одним из преимуществ XML является возможность проверки документа на соответствие XSD.YAML не имеет этой функции, так как я могу проверить, что открываемый мной документ YAML имеет формат, ожидаемый моим приложением?

Ответы [ 10 ]

29 голосов
/ 06 марта 2014

Учитывая, что JSON и YAML - довольно похожие звери, вы можете использовать JSON-Schema для проверки значительного подмножества YAML.Вот фрагмент кода (вам понадобятся PyYAML и jsonschema ):

from jsonschema import validate
import yaml

schema = """
type: object
properties:
  testing:
    type: array
    items:
      enum:
        - this
        - is
        - a
        - test
"""

good_instance = """
testing: ['this', 'is', 'a', 'test']
"""

validate(yaml.load(good_instance), yaml.load(schema)) # passes

# Now let's try a bad instance...

bad_instance = """
testing: ['this', 'is', 'a', 'bad', 'test']
"""

validate(yaml.load(bad_instance), yaml.load(schema))

# Fails with:
# ValidationError: 'bad' is not one of ['this', 'is', 'a', 'test']
#
# Failed validating 'enum' in schema['properties']['testing']['items']:
#     {'enum': ['this', 'is', 'a', 'test']}
#
# On instance['testing'][3]:
#     'bad'

Одна из проблем заключается в том, что если ваша схема охватывает несколько файлов,используйте "$ref" для ссылки на другие файлы, тогда эти другие файлы должны быть в формате JSON, я думаю.Но, вероятно, есть способы обойти это.В моем собственном проекте я играю с указанием схемы с использованием файлов JSON, а экземплярами являются YAML.

11 голосов
/ 16 июля 2010

Попробуйте Rx , он имеет реализацию Python. Работает на JSON и YAML.

С сайта Rx:

«При добавлении API к вашему веб-сервису вы должны выбрать способ кодирования данных, которые вы отправляете через линию. XML является одним из распространенных вариантов для этого, но он может вырасти загадочным и громоздким довольно быстро. Многие авторы веб-сервисов хотят избежать думать о XML и вместо этого выбирать форматы, которые предоставляют несколько простых типов данных, которые соответствуют общим структурам данных в современных языках программирования. Другими словами, JSON и YAML.

К сожалению, хотя эти форматы позволяют легко обойти сложные структуры данных, им не хватает системы для проверки. XML имеет XML-схемы и RELAX NG, но это сложные и иногда запутанные стандарты. Они не очень переносимы в отношении структуры данных, предоставляемой JSON, и если вы хотите избежать использования XML в качестве кодировки данных, написание большего количества XML для проверки первого XML, возможно, еще менее привлекательно.

Rx предназначен для обеспечения системы проверки данных, которая соответствует структурам данных в стиле JSON и с которой так же легко работать, как и с самим JSON. "

9 голосов
/ 23 марта 2012

Да - поддержка валидации жизненно важна для многих важных случаев использования.См., Например, YAML и важность проверки схемы «Стюарт Гюнтер

Как уже упоминалось, существует Rx , доступный для различных языков, и Kwalify для Ruby и Java.

См. также обсуждение PyYAML: YAMLSchemaDiscussion .

Сопутствующее усилие - Схема JSON , в котором даже был некоторый IETFдеятельность по стандартизации ( draft-zyp-json-schema-03 - Тип носителя JSON для описания структуры и значения документов JSON )

5 голосов
/ 30 августа 2012

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

4 голосов
/ 08 октября 2017

Я считаю Цербер очень надежным, с отличной документацией и простым в использовании.

Вот базовый пример реализации:

my_yaml.yaml:

name: 'my_name'
date: 2017-10-01
metrics:
  percentage:
    value: 87
    trend: stable

Определение схемы проверки в schema.py:

{
    'name': {
        'required': True,
        'type': 'string'
    },
    'date': {
        'required': True,
        'type': 'date'
    },
    'metrics': {
        'required': True,
        'type': 'dict',
        'schema': {
            'percentage': {
                'required': True,
                'type': 'dict',
                'schema': {
                    'value': {
                        'required': True,
                        'type': 'number',
                        'min': 0,
                        'max': 100
                    }
                    'trend': {
                        'type': 'string',
                        'nullable': True,
                        'regex': '^(?i)(down|equal|up)$'
                    }
                }
            }
        }
    }
}

Использование PyYaml для загрузки документа yaml:

def __load_doc():
        with open(__yaml_path, 'r') as stream:
            try:
                return yaml.load(stream)
            except yaml.YAMLError as exception:
                raise exception

Оценить файл yaml очень просто:

schema = eval(open('PATH_TO/schema.py', 'r').read())
        v = Validator(schema)
        doc = __load_doc()
        print v.validate(doc, schema)
        print v.errors

Имейте в виду, что Cerberus - это инструмент для независимой проверки данных, что означает, что он может поддерживать форматы, отличные от YAML, такие как JSON, XML и т. Д.

3 голосов
/ 18 августа 2016

Я в такой же ситуации.Мне нужно проверить элементы YAML.

Сначала я подумал, что теги PyYAML - лучший и простой способ.Но позже было решено использовать PyKwalify, который фактически определяет схему для YAML.

Теги PyYAML:

В файле YAML есть поддержка тегов, в которой мы можем применять эти базовые проверки с префиксом данныхтип.(например, для целого числа - !! int "123"

Подробнее о PyYAML: http://pyyaml.org/wiki/PyYAMLDocumentation#Tags Это хорошо, но если вы собираетесь показать это конечному пользователю, то это может вызвать путаницу,Я провел некоторое исследование, чтобы определить схему YAML.Идея в том, что мы можем проверить YAML с соответствующей схемой для проверки базового типа данных.Кроме того, даже наши пользовательские проверки, такие как IP-адрес, случайные строки могут быть добавлены в этом.так что мы можем иметь нашу схему отдельно, оставляя YAML простым и читабельным.

Я не могу опубликовать больше ссылок.Пожалуйста, просмотрите google-схему для YAM'L, чтобы просмотреть обсуждения схемы.

PyKwalify:

Существует пакет PyKwalify, который предназначен для этой цели: https://pypi.python.org/pypi/pykwalify

Этот пакетлучше всего соответствует моим требованиям.Я попробовал это с небольшим примером в моей локальной установке, и работает.Вот пример файла схемы.

#sample schema

type: map
mapping:
    Emp:
        type:    map
        mapping:
            name:
                type:      str
                required:  yes
            email:
                type:      str
            age:
                type:      int
            birth:
                type:     str

Допустимый файл YAML для этой схемы

---
Emp:
    name:   "abc"
    email:  "xyz@gmail.com"
    age:    yy
    birth:  "xx/xx/xxxx"

Спасибо

1 голос
/ 19 сентября 2018

Вы можете загрузить документ YAML как dict и использовать библиотеку схема , чтобы проверить его:

from schema import Schema, And, Use, Optional, SchemaError
import yaml

schema = Schema(
        {
            'created': And(datetime.datetime),
            'author': And(str),
            'email': And(str),
            'description': And(str),
            Optional('tags'): And(str, lambda s: len(s) >= 0),
            'setup': And(list),
            'steps': And(list, lambda steps: all('=>' in s for s in steps), error='Steps should be array of string '
                                                                                  'and contain "=>" to separate'
                                                                                  'actions and expectations'),
            'teardown': And(list)
        }
    )

with open(filepath) as f:
   data = yaml.load(f)
   try:
       schema.validate(data)
   except SchemaError as e:
       print(e)
0 голосов
/ 26 мая 2018

Я упаковал несколько существующих библиотек Python, связанных с json , чтобы иметь возможность использовать их также с yaml .

Полученная библиотека Python в основном переносит ...

  • jsonschema - средство проверки для файлов json против файлов json-schema, упакованное для поддержки проверки yaml файлов против json-schema файлов в формате yaml.

  • jsonpath-ng - реализация JSONPath для python, упакованная для поддержки выбора JSONPathнепосредственно в yaml файлах.

... и доступен на github:

https://github.com/yaccob/ytools

Может быть установлен с помощью pip:

pip install ytools

Пример проверки (из https://github.com/yaccob/ytools#validation):

import ytools
ytools.validate("test/sampleschema.yaml", ["test/sampledata.yaml"])

То, что вы еще не получили из коробки, проверяется по внешним схемамтакже в формате yaml.

ytools не предоставляет ничего, чего раньше не было - просто делает применение некоторых существующих решений более гибким и удобным.

0 голосов
/ 17 мая 2017

Вы можете использовать Python yaml lib для отображения сообщения / символа / строки / файла вашего загруженного файла.

#!/usr/bin/env python

import yaml

with open("example.yaml", 'r') as stream:
    try:
        print(yaml.load(stream))
    except yaml.YAMLError as exc:
        print(exc)

Доступ к сообщению об ошибке можно получить через exc.problem

Доступ exc.problem_mark, чтобы получить <yaml.error.Mark> объект.

Этот объект позволяет получить доступ к атрибутам

  • имя
  • столбец
  • строка

Следовательно, вы можете создатьВаш собственный указатель на проблему:

pm = exc.problem_mark
print("Your file {} has an issue on line {} at position {}".format(pm.name, pm.line, pm.column))
0 голосов
/ 16 июля 2010

Я не знаю о решении Python.Но для YAML существует валидатор схемы ruby, который называется kwalify .Вы должны иметь возможность получить к нему доступ с помощью подпроцесса, если не сталкивались с библиотекой Python.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...