yamlファイルのバリデーションをおこなうpykwalifyというPythonのツールを使う機会があったので
使い方をまとめる
環境情報
検証に使用した環境のバージョン情報
-
python3 --version
- Python 3.6.5
-
pip3.6 --version
- pip 9.0.1 from /usr/lib/python3.6/site-packages (python 3.6)
-
インストール
- pip install pykwalify
バリデーションの種類
type | チェック対象 |
---|---|
str | 文字列 |
int | 整数 |
float | 浮動小数点数 |
number | intとfloat |
text | numberとstr |
bool | 真理値 |
seq | シーケンス |
map | マップ |
scalar | スカラー |
date | 日付 |
timestamp | 日付と時刻 |
any | なんでも |
使い方
- 値の形式チェック
チェックするYamlファイル
hoge:
hoge1: 1
hoge2: hoge
スキーマファイル
type: map
mapping:
hoge:
type: map
mapping:
hoge1:
type: int
hoge2:
type: str
- 値の必須チェック
スキーマファイル
type: map
mapping:
hoge:
type: map
mapping:
hoge1:
type: int
required: true
hoge2:
type: str
required: true
required: true を指定する
- 正規表現を使用した文字列形式チェック
スキーマファイル
type: map
mapping:
hoge:
type: map
mapping:
hoge1:
type: int
required: true
hoge2:
type: str
pattern: '[a-zA-z]'
required: true
pattern にチェックする正規表現を定義する
- リスト
チェックするYamlファイル
hoge:
seq
- hoge1
hoge2
スキーマファイル
type: map
mapping:
seq:
type: seq
sequence:
- type: str
required: true
- Mapのリスト
チェックするYamlファイル
hoge:
seq
- hoge1: 1
hoge2: hoge
スキーマファイル
type: map
mapping:
seq:
type: seq
sequence:
- type: map
mapping:
hoge1:
type: int
required: true
hoge2:
type: str
required: true
実行例
- OK
# pykwalify -d hoge.yml -s hoge-schema.yml
INFO - validation.valid
- NG
- type: int 項目に文字列を指定
# pykwalify -d hoge.yml -s hoge-schema.yml
ERROR - validation.invalid
ERROR - --- All found errors ---
ERROR - ["Value 'fuga' is not of type 'int'. Path: '/hoge/hoge1'"]
Traceback (most recent call last):
File "/usr/bin/pykwalify", line 11, in <module>
sys.exit(cli_entrypoint())
File "/usr/lib/python3.6/site-packages/pykwalify/cli.py", line 95, in cli_entrypoint
run(parse_cli())
File "/usr/lib/python3.6/site-packages/pykwalify/cli.py", line 82, in run
c.validate()
File "/usr/lib/python3.6/site-packages/pykwalify/core.py", line 167, in validate
error_msg=u'.\n - '.join(self.validation_errors)))
pykwalify.errors.SchemaError: <SchemaError: error code 2: Schema validation failed:
- Value 'fuga' is not of type 'int'. Path: '/hoge/hoge1'.: Path: '/'>