YSPEC - это смертельно простая проверка для структур. Это особенно полезно для проверки различных файлов YAML/JSON
yspec ./schema.yaml /tmp/data.jsonПримечание: YSPEC может взять YAML/JSON для схемы и для данных
from yspec . checker import check
# Some code that prepares data and rules
check ( data , rules )Схема - это dict правил. Каждое правило делает проверку в соответствии с полем «совпадать». Схема должна включать правило «корня», которое применяется на верхнем объекте в структуре.
Например, структура (в YAML):
---
- ' string1 '
- ' string2 '
будет действительным для схемы (в 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 : anyИх два: дикта и список. Оба имеют одинаковую логику рекурсии. Сначала мы применяем некоторые проверки на самом объекте, а затем применяем другое (или то же) правило к детям (элементы списка или значения DICT).
my_list :
match : list
item : some_other_ruleСписок - это тип повторяющегося. FIST IT проверяет, это список A, затем он проверяет каждый элемент в соответствии с правилом в «Item».
my_list :
match : dict
items :
key1 : string_rule
key2 : integer_rule
default_item : some_other_rule
required_items :
- key2Это правило, которое описывает дикт, который имеет два ключа (Key1 и Key2). Один из ключей (Key2) является обязательным. Key1 должен быть проверен в соответствии с правилом 'string_rule', в то время как любые другие ключи с любым другим (не Key1 или Key2) именем будут проверяться в соответствии с некоторым_отером_rule.
Если у нас есть удаление default_item
my_list :
match : dict
items :
key1 : string_rule
key2 : integer_rule
required_items :
- key2Дикт может быть с двумя клавишами (Key1, Key2) максимум
Схема:
---
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 : listДанные:
---
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_ruleОдин из успешных матч, если какое -либо из правил из «вариантов» успеха.
Предположим, вам нужно проверить свой маленький список фруктов:
---
- apple
- plumВы можете использовать Set Match для него. В пункте вариантов Set Match вы перечислите все позитивные значения для этого типа:
---
root :
match : list
item : fruits
fruits :
match : set
variants :
- apple
- orange
- plum Иногда вам нужно провести отдельные чеки на DICT, которые имеют некоторую пару ключей/значения.
Например, у вас есть следующие данные:
---
- type : type1
payload :
- 1
- 1
- type : type2
payload :
- " that is a string "
- " that is a string2 "В этом примере у вас есть диктат, который имеет различную полезную нагрузку, зависит от ключа типа. Это возможно описать с помощью схемы:
---
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