あと味

たくさん情報を食べて、たくさん発信すると、あとになって味わい深い。

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をワンライナーしやすくなりました。

jsonで吐くAPIなども用意しているので、

$ 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

ほなの。