YSPEC ist ein tödlicher einfacher Checker für Strukturen. Es ist besonders nützlich für die Validierung verschiedener YAML/JSON -Dateien
yspec ./schema.yaml /tmp/data.jsonHinweis: YSPEC in der Lage, YAML/JSON für Schema und Daten zu nehmen
from yspec . checker import check
# Some code that prepares data and rules
check ( data , rules )Schema ist ein Diktat von Regeln. Jede Regel überprüft nach dem Feld "Übereinstimmung". Das Schema muss eine "Root" -Regel enthalten, die in der Struktur auf Top -Objekt angewendet wird.
Zum Beispiel Struktur (in Yaml):
---
- ' string1 '
- ' string2 '
wird für ein Schema (in YAML) gültig sein:
---
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 : anyEs gibt zwei von ihnen: Diktier und Liste. Beide haben die gleiche Rekursionslogik. Zuerst wenden wir einige Überprüfungen auf das Objekt selbst an und wenden dann eine andere (oder die gleiche) Regel auf Childrens (Listenelemente oder Werte von DICT) an.
my_list :
match : list
item : some_other_ruleDie Liste ist ein wiederkehrender Typ. Faust iT Überprüft ist das Objekt eine Liste, dann überprüft es jedes Element gemäß der Regel in 'Item' Attr.
my_list :
match : dict
items :
key1 : string_rule
key2 : integer_rule
default_item : some_other_rule
required_items :
- key2Dies ist eine Regel, die ein Diktat beschreibt, das zwei Schlüssel (Key1 und Key2) hat. Einer der Schlüssel (Key2) ist obligatorisch. KEY1 sollte gemäß der 'String_Rule' -Regel überprüft werden, während andere Schlüssel mit einem anderen Namen (Non Key1 oder Key2) gemäß SOLE_OTHER_RUE überprüft werden.
Wenn wir default_item entfernen haben
my_list :
match : dict
items :
key1 : string_rule
key2 : integer_rule
required_items :
- key2Ein DICT könnte mit zwei Tasten (Key1, Key2) maximal sein
Schema:
---
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 : listDaten:
---
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_ruleEin erfolgreicher Erfolg, wenn eine der Regeln aus dem Erfolg von "Varianten".
Angenommen, Sie müssen Ihre kleine Liste der Früchte überprüfen:
---
- apple
- plumSie können ein SET -Match dafür verwenden. In der Varianten -Klausel übereinstimmen Sie alle hinteren Werte für diesen Typ:
---
root :
match : list
item : fruits
fruits :
match : set
variants :
- apple
- orange
- plum Manchmal müssen Sie separate Schecks für DICT durchführen, die ein Schlüssel-/Wertpaar aufweisen.
Zum Beispiel haben Sie die folgenden Daten:
---
- type : type1
payload :
- 1
- 1
- type : type2
payload :
- " that is a string "
- " that is a string2 "In diesem Beispiel haben Sie einen Diktat, der eine unterschiedliche Nutzlast hat, abhängig vom Typ Key. Das ist möglich, mit dem folgenden Schema zu beschreiben:
---
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