今回は、フィルタ関連の機能を強化しました。
**** 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 の引数として使用できるわけです。