YSpec est un vérificateur simple mortel pour les structures. Il est particulièrement utile pour la validation de différents fichiers YAML / JSON
yspec ./schema.yaml /tmp/data.jsonRemarque: YSpec capable de prendre YAML / JSON pour le schéma et les données
from yspec . checker import check
# Some code that prepares data and rules
check ( data , rules )Le schéma est un dict des règles. Chaque règle fait un contrôle selon le champ «Match». Le schéma doit inclure la règle «racine» qui est appliquée sur l'objet supérieur dans la structure.
Par exemple la structure (en yaml):
---
- ' string1 '
- ' string2 '
sera valable pour le schéma (en yaml):
---
root :
match : list
item : string
string :
match : string my_awesome_string :
match : string my_awesome_bool :
match : bool my_awesome_int :
match : int my_awesome_float :
match : float empty_object :
match : none any_type :
match : anyIl y en a deux: dict et liste. Les deux ont la même logique de récursivité. Au début, nous appliquons quelques vérifications sur l'objet lui-même, puis appliquons une autre règle (ou la même) à des enfants (répertorier des éléments ou des valeurs de dict).
my_list :
match : list
item : some_other_ruleLa liste est un type de réapprovisionnement. Fist qu'il vérifie est l'objet une liste, puis il vérifie chaque élément en fonction de la règle dans «item» att.
my_list :
match : dict
items :
key1 : string_rule
key2 : integer_rule
default_item : some_other_rule
required_items :
- key2C'est une règle qui décrit un dict qui a deux clés (Key1 et Key2). L'une des clés (Key2) est obligatoire. Key1 doit être vérifié selon la règle 'string_rule', tandis que toute autre touche avec tout autre nom (non key1 ou key2) sera vérifiée selon certains_other_rule.
Si nous avons supprimé default_item
my_list :
match : dict
items :
key1 : string_rule
key2 : integer_rule
required_items :
- key2Un dict pourrait être avec deux clés (Key1, Key2)
Schéma:
---
boolean :
match : bool
string :
match : string
integer :
match : int
float :
match : float
list :
match : list
item : string
root :
match : dict
items :
key1 : boolean
key2 : string
key3 : integer
key4 : float
key5 : listDonnées:
---
key1 : true
key2 : " That is a string "
key3 : 1
key4 : 1.0
key5 :
- " One more string "
- " Another string " constraint_list_item :
match : one_of
variants :
- integer_rule
- some_other_ruleUn de même le succès si l'une des règles du succès des "variantes".
Supposons que vous deviez vérifier votre petite liste de fruits:
---
- apple
- plumVous pouvez utiliser Set Match pour cela. Dans la clause de variantes de SET correspond à toutes les valeurs possibles pour ce type:
---
root :
match : list
item : fruits
fruits :
match : set
variants :
- apple
- orange
- plum Parfois, vous devez effectuer des vérifications distinctes pour le dict qui ont une paire de clés / valeur.
Par exemple, vous avez les données suivantes:
---
- type : type1
payload :
- 1
- 1
- type : type2
payload :
- " that is a string "
- " that is a string2 "Dans cet exemple, vous avez un dict qui a une charge utile différente dépend de la clé de type. Cela est possible à décrire avec le schéma suivant:
---
root :
match : list
item : list_item
list_item :
match : dict_key_selection
selector : type
variants :
type1 : dict_with_int
type2 : dict_with_string
dict_with_int :
match : dict
items :
type : string
payload : list_of_int
required_items :
- type
- payload
dict_with_string :
match : dict
items :
type : string
payload : list_of_string
required_items :
- type
- payload
list_of_int :
match : list
item : int
int :
match : int
list_of_string :
match : list
item : string
string :
match : string