Подтвердить что ты не робот

Проверка документа yaml в python

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

4b9b3361

Ответ 1

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

С сайта Rx:

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

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

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

Ответ 2

Учитывая, что 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 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.

Ответ 3

Да - поддержка валидации жизненно важна для многих важных случаев использования. См. YAML и важность проверки схемы" Stuart Gunter

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

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

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

Ответ 4

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

Ответ 5

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

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

Теги PyYAML:

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

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

Я не могу опубликовать больше ссылок. Пожалуйста, 'google schema для 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:  "[email protected]"
    age:    yy
    birth:  "xx/xx/xxxx"

Спасибо

Ответ 6

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

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

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 и т.д.

Ответ 7

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

Ответ 8

Чудесный выглядит очень многообещающе:

https://pypi.python.org/pypi/voluptuous/

Rx не похож, что у него есть релиз на PyPI. Kwalify теперь доступен для Python, но включает нечетные зависимости (docopt и т.д.), Которые я не хочу получать из библиотеки.

Ответ 9

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

#!/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))