Ya no busques más por todo internet porque has llegado al espacio correcto, contamos con la respuesta que necesitas encontrar sin liarte.
Solución:
Dado que JSON y YAML son bestias bastante similares, podría utilizar JSON-Schema para validar un subconjunto considerable de YAML. Aquí hay un fragmento de código (necesitará PyYAML y jsonschema instalados):
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'
Un problema con esto es que si su esquema abarca varios archivos y usa "$ref"
para hacer referencia a los otros archivos, creo que esos otros archivos deberán ser JSON. Pero probablemente hay maneras de evitar eso. En mi propio proyecto, estoy jugando especificando el esquema usando archivos JSON mientras que las instancias son YAML.
Pruebe Rx, tiene una implementación de Python. Funciona en JSON y YAML.
Desde el sitio de Rx:
“Al agregar una API a su servicio web, debe elegir cómo codificar los datos que envía a través de la línea. XML es una opción común para esto, pero puede volverse arcano y engorroso con bastante rapidez. Muchos autores de servicios web quieren evitar pensando en XML y, en su lugar, elija formatos que proporcionen algunos tipos de datos simples que correspondan a las estructuras de datos comunes en los lenguajes de programación modernos, en otras palabras, JSON y YAML.
Desafortunadamente, si bien estos formatos facilitan el paso de estructuras de datos complejas, carecen de un sistema de validación. XML tiene esquemas XML y RELAX NG, pero estos son estándares complicados y, a veces, confusos. No son muy portátiles para el tipo de estructura de datos proporcionado por JSON, y si desea evitar XML como codificación de datos, escribir más XML para validar el primer XML probablemente sea aún menos atractivo.
Rx está destinado a proporcionar un sistema para la validación de datos que coincida con las estructuras de datos de estilo JSON y sea tan fácil de trabajar como el propio JSON”.
Considero que Cerberus es muy confiable con excelente documentación y fácil de usar.
Aquí hay un ejemplo básico de implementación:
my_yaml.yaml
:
name: 'my_name'
date: 2017-10-01
metrics:
percentage:
value: 87
trend: stable
Definición del esquema de validación en 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': up)$'
Usar PyYaml para cargar un yaml
documento:
import yaml
def load_doc():
with open('./my_yaml.yaml', 'r') as stream:
try:
return yaml.load(stream)
except yaml.YAMLError as exception:
raise exception
## Now, validating the yaml file is straightforward:
from cerberus import Validator
schema = eval(open('./schema.py', 'r').read())
v = Validator(schema)
doc = load_doc()
print(v.validate(doc, schema))
print(v.errors)
Tenga en cuenta que Cerberus es una herramienta de validación de datos agnóstica, lo que significa que puede admitir formatos distintos de YAML, como JSON, XML, etc.