block_given?

ジャングル ブロック ナイ アルノハ jump ダケ。CC-BY-SA 3.0

Rubotyのハンドラーのgemをつくるためのruboty-genを公開した。

以前、Hubotスクリプトのhubot-sushiyukiをruboty-yasyとして移植した記事のまとめで「rubotyプラグインの作成の障壁を下げたい」と書いた。

$ ruboty-gen gem yo

するとrubotyのプラグインを作るテンプレみたいなものが出来る。

  ∩ ∩  ∠ i’m at ~/src/github.com/blockgiven
( ╹x╹) ruboty-gen gem yo
      create  ruboty-yo/Gemfile
      create  ruboty-yo/Rakefile
      create  ruboty-yo/LICENSE.txt
      create  ruboty-yo/README.md
      create  ruboty-yo/.gitignore
      create  ruboty-yo/ruboty-yo.gemspec
      create  ruboty-yo/lib/ruboty/yo.rb
      create  ruboty-yo/lib/ruboty/yo/version.rb
Initializing git repo in /Users/block_given/src/github.com/blockgiven/ruboty-yo
      create  ruboty-yo/lib/ruboty/handlers/yo.rb
      create  ruboty-yo/lib/ruboty/yo/actions/yo.rb
  ∩ ∩  ∠ i’m at ~/src/github.com/blockgiven
( ╹x╹) cd ruboty-yo
  ∩ ∩  ∠ i’m at ~/src/github.com/blockgiven/ruboty-yo [master] ✗
( ╹x╹) tree
.
├── Gemfile
├── LICENSE.txt
├── README.md
├── Rakefile
├── lib
│   └── ruboty
│       ├── handlers
│       │   └── yo.rb
│       ├── yo
│       │   ├── actions
│       │   │   └── yo.rb
│       │   └── version.rb
│       └── yo.rb
└── ruboty-yo.gemspec

5 directories, 9 files

ハマったところ

rubotyにはサブコマンドやオプションをサードパーティが実装するためのAPIがない。 「ないならつくろう」と思い書いてみたが、rubotyが内部で使っているSlopの出来損ないラッパーみたいなものしか作れなかった。 なので専用のコマンドを実装して解決することにした。

くふうしたところ

BundlerのCLIをそのまま使っているので同じ操作感である。gemを作成する処理もbundlerのものをそのまま使っているが、gemのテンプレートだけは独自のテンプレートで置き換えた。

やりたかったこと

ほんとはruboty-genだけで済ましたかったけどコマンド周りで何度かyakyakしてしまったのでサブコマンドで満足した。 あとgem以外もひきついでるのでruboty-gen installするとbundle installと同じ処理が動く。

bundlerのAPIbundle gem後のhookなどが用意されてるかどうか調べたい。

まとめ

拡張可能なCLIを作るのは以外と面倒くさそう。拡張可能なCLIを提供するためのoptparseとかslopとかがあると便利な気がする。知らないだけであるのかもしれない。またかこ。