YAMLに手を出す

Excelでちまちまドキュメント作るのがかったるいから,なんか適当な構造化テキストで記述して,あとでガーっとExcelに貼付けてみては?と思いYAMLに手を出す。


Groovy(Java)で使えるYAMLパーザはJYamlJvYAMLのどっちか。JYamlはGroovyのYAML解説ページに取り上げられるくらいだから,こっちが有名どころかと思いきや,パーザの出来が悪い。
くわしくはこちら。→openbooth: JavaのYAMLライブラリって


今回の用途はドキュメント指向なんで,YAMLブロックスタイル使えないと困るんで,JvYAMLがあって良かった。
ただ,このJvYAML,JYamlとくらべるとドキュメントが全然足りない(Javadocすらない)。まあ,使うAPIは1つくらいだし,テストコードもあったからソース見りゃいいんだけどさ。:-(


あーそうそう,具体的になに企んでいるかって言うと「テスト仕様書」ね。様式はExcelってことになってるんだけど,編集のしやすさとか重視されてないんで,こんな事考えてみてるワケよ。


試しに作ってみたYAML文書はこんなやつ。

- title: なんとかのテストをする
  node:
  - title: ほげほげ
    node:
    - title: なんとかがなんとかでなんとかする
      cond: これこれ,こうゆう条件だ。
      expect: こうなってくれ。
    - title: あれがこれでこうなる
      cond: こうゆう条件だ。
      expect: こうなるに違いない

  - title: Foo Bar Boo
    node:
    - title: なんとかがなんとかでなんとかする
      cond: これこれ,こうゆう条件だ。
      expect: こうなってくれ。

- title: これもテストしないと

それを処理するGroovyスクリプトの試作版はこれ。

import org.jvyaml.YAML

// どうゆうワケか,File.newReader()だとYAMLがパースに失敗する
YAML.load(new File("data.yaml").text).eachWithIndex {
  it, index ->
  println "$index : $it.title"
  it.node.eachWithIndex { n1, idx1 ->
    println "$index-$idx1 : $n1.title"
    n1.node.eachWithIndex { n2, idx2 ->
      println "$index-$idx1-$idx2 : $n2.title"
      println "$n2.cond"
      println "$n2.expect"
      println "----"
    }
  }
}

処理結果はこう。

0 : なんとかのテストをする
0-0 : ほげほげ
0-0-0 : なんとかがなんとかでなんとかする
これこれ,こうゆう条件だ。
こうなってくれ。
----
0-0-1 : あれがこれでこうなる
こうゆう条件だ。
こうなるに違いない
----
0-1 : Foo Bar Boo
0-1-0 : なんとかがなんとかでなんとかする
これこれ,こうゆう条件だ。
こうなってくれ。
----
1 : これもテストしないと

こんだけできれば上等。ブロック構文使えば,こんな記述もできるしね。

    - title: |
          なんとかがなんとかでなんとかする
      cond: |
          これこれ,こうゆう条件だ。
          ・条件1
          ・条件2
      expect: |
          こうなってくれ。
          ・期待値a
          ・期待値b