MT::Object をワンライナーしやすくする拡張書いた
コマンドラインで、MT::Objectを取得して、加工して、出力してみたいなことすることが結構あるんですけど、MT::Objectは大変ワンライナーしにくい印象でした。
MTのシステム管理者のIDとパスワードがわからない時、コマンドで強制的に作ることがあるんですけど、MT::Objectがワンライナーしにくいので、下記のようなファイルを用意してから、実行するというまどろっこしさです。
試しにワンライナーしてみると下記のような感じでしょう。
$ perl -I{lib,extlib} -MMT -e 'my $taiju = MT->instance->model("author")->get_by_key({name=>"taiju"});$taiju->nickname("taiju");$taiju->email("higashi@taiju.info");$taiju->auth_type("MT");$taiju->status(1);$taiju->set_password("password");$taiju->is_superuser(1);$taiju->save or $taiju->errstr;printf "You can use taiju (id=%d) (password=password)! taiju is suupppeeeer user!!\n", $taiju->id;'
...セミコロン......
これがワンライナーと言えるなら、minifyされた jQueryですらワンライナーになってしまいますね。
MT::Object::Chaining
ということで作ったのが下記になります。
MT::Object::Chaining - Methods chaining for MT::Object
MT::Object::Chainingを使うと、下記のように書けます。
perlコマンドのように、Iオプションや、Mオプション指定して、インスタンス取得するのすらダルいので、tools/chainというスクリプトでその辺をカバーしてます。
mオプションでモデルを指定して、eオプションでeval文字列を指定します。
$ cd /path/to/mt && tools/chain -m author -e '$model->get_by_key({ name => "taiju" })->nickname("taiju")->email("higashi\@taiju.info")->auth_type("MT")->status(1)->set_password("password")->is_superuser(1)->save->tap(sub { printf "You can use taiju (id=%d) (password=password)! taiju is suupppeeeer user!!\n", shift->id })'
こんな感じでメソッドチェーンで書けるようにする機能を提供するような感じですね。
まとめ
これでMT::Objectをワンライナーしやすくなりました。
$ tools/chain -m author -e '$model->load->json' | jq '.[] | {name, email}'
みたいな感じでjqに渡したりなど、捗るかもしれません。
また、mapメソッドで一括置換して保存とか、reduceで加工した結果を出力するとか、普段使いに個人的に便利だと思う機能も入れました。
まだ、v0.1なのと、統一感に欠ける気もしているので、インターフェイスの変更するかもしれません。
詳しい使い方は、README.pod を参照下さい。
https://github.com/taiju/MT-Object-Chaining/blob/master/README.pod
ほなの。