shellspec 0.13.0 リリースしました

今回は、フィルタ関連の機能を強化しました。

**** Ranges / Filters ****

You can select examples range to run by appending the line numbers or id to the filename

  shellspec path/to/a_spec.sh:10:20     # Run the groups or examples that includes lines 10 and 20
  shellspec path/to/a_spec.sh:@1-5:@1-6 # Run the 5th and 6th groups/examples defined in the 1st group

You can filter examples to run with the following options

  --focus                         Run focused groups / examples only
                                    To focus, prepend 'f' to groups / examples in specfiles
                                    e.g. Describe -> fDescribe, It -> fIt
  --pattern PATTERN               Load files matching pattern [default: "*_spec.sh"]
  --example STRING                Run examples whose names include STRING
  --tag TAG[:VALUE]               Run examples with the specified TAG
  --default-path PATH             Set the default path where shellspec looks for examples [defualt: "spec"]

行番号指定の他に新たにIDでの指定が可能になりました。またexample名、tagによる絞り込みとファイルパターンの指定が可能になりました。

IDでの指定のフォーマットはrspecの指定方法とは変えています。

rspec path/to/a_spec.rb[1:5,1:6] # run the 5th and 6th examples/groups defined in the 1st g

rspecの指定方法はIDをカンマ区切りにして [ ] でくくる書き方ですが、この [ ] はzshではメタ文字扱いなのでダブルクォートが必要になるのとパースが面倒だからです。shellspecは前提としてIDの区切り文字を : ではなく - にして、各ID、行番号の区切り記号は : と共通の文字を使い、ID指定の場合は、最初に @ をつけるようにしました。行番号、IDともに : 区切りで扱えばいいのでパースが簡単で、行番号指定とID指定を混ぜることもできます。(あまりやる人はいないでしょうが)

そして --list オプション (旧 --list-specfiles, --list-examples オプション)で表示する、全specfileと全exampleのリストを出力するコードを再実装しました。今まではリスト出力のために独立したコードを書いていたのですが、これだとフィルタ関連の機能を追加したときに、specfile実行で使用する(トランスレータの)フィルタ機能と別にコードを書かなくてはならず対応が難しくなるからです。(今までは行番号指定と --focus だけなので対応できていたのですが)

specfileの実行とリスト出力のコードの共通化はなかなか面白くて、もともとトランスレータはspecfileの解析部分とどのように変換するかを分離していました。なのでロジック部分(難しい箇所)は共通で、specfileの実行では実行のためのコードに変換し、リスト出力ではリスト出力のためのコードに変換しています。結果リスト出力のコードは難しいロジックはなくなり、前の実装よりも短くなりました。(そのかわり実行速度が落ちてるはずですが)

そして全exampleのリスト出力は行番号つきの出力の他にIDつきの出力に対応しました。IDつきでexample一覧を出力し、その出力をそのまま shellspec の引数として使用できるわけです。