この記事は tech.kayac.com Advent Calendar 2014 19日目です。
業務の30 ~ 40% くらいは chef の cookbook を書いている @tkuchiki です。
chef の node や role の定義を json で行うと思います。
cookbook 作成中に、chef-solo や chef-client を走らせてテストしようとしたときに、
json の syntax error で実行に失敗するということありませんか?
そんなとき、json で消耗しないために作ったのが json-checker です。
インストール
以下のコマンドを実行してください。
curl https://raw.githubusercontent.com/tkuchiki/json-checker/master/json-checker -o /usr/local/bin/json-checker && chmod +x /usr/local/bin/json-checker
使い方
使い方は -h で見られます。
オプションの説明をすると、
- -r : ディレクトリを再帰的に探索する
- -L : symlink をたどる
- -q : 標準出力に何も表示せず、ステータスコードのみを返す
$ json-checker -h Usage: json-checker [option] ARG... ARG file and directory Options: -h, --help show this help message and exit -r, --recursive check directories recursively -L follow symlinks -q, --quiet quiet mode
実行例
$ tree example example ├── foo │?? └── bar.json └── test.json 1 directory, 2 files
というディレクトリ構成で、example/test.json が正しい syntax の json、example/foo/bar.json が正しくない syntax の json ファイルです。
このような場合に、
$ json-checker example /private/tmp/example/test.json syntax ok ok: 1 error: 0
と実行すると、example 以下のファイルだけ syntax check します。
-r をつけると、
$ json-checker -r example /private/tmp/example/test.json syntax ok /private/tmp/example/foo/bar.json syntax error Expecting object: line 1 column 1 (char 1) ok: 1 error: 1
再帰的にディレクトリをたどって、syntax check してくれます。
-q をつけると、
$ json-checker -q example $ echo $? 0 $ json-checker -q -r example $ echo $? 1
syntax check に引っかからなければ 0、syntax check に引っかかったら 1 を返します。
$ ln -s /tmp/example/foo example/hoge $ tree example example ├── foo │?? └── bar.json ├── hoge -> /tmp/example/foo └── test.json 2 directories, 2 files
のような構成で、-L をつけないと
$ json-checker -r example /private/tmp/example/test.json syntax ok /private/tmp/example/foo/bar.json syntax error Expecting object: line 1 column 1 (char 1) ok: 1 error: 1
symlink を無視しますが、 -L をつけると、
$ json-checker -r -L example /private/tmp/example/test.json syntax ok /private/tmp/example/foo/bar.json syntax error Expecting object: line 1 column 1 (char 1) /private/tmp/example/hoge/bar.json syntax error Expecting object: line 1 column 1 (char 1) ok: 1 error: 2
symlink をたどって syntax check してくれます。
help にも README にも書いていませんが、拡張子が .json 以外のファイルは無視しますので、
.json 以外の json ファイルは syntax check できないのでご注意ください。
あと、python 2.6 以上の環境でないと動きません(3 系で動くかはわかりません…)。
終わりに
json の syntax check を行うスクリプトの紹介をしました。
使用するケースが限られるかもしれませんが、何かのお役に立てれば光栄です。
明日は
2年ぶりの投稿となる、@ken39arg さんです。
お楽しみに!