block_given?

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

Rubotyが信ずる者の言葉にしか耳を貸さなくなるruboty-trust_meをつくった

簡単な名前による認証を提供します。

f:id:block_given:20141104221228p:plain

つくろうと思った理由

いい話

RubotyはRuboty自身のことを信じている

Redisのメモリ使用量を表示するruboty-redis-infoつくった

brainを結構つかうようになったのでRedisの使用率が気になった。

litaからぱくった

f:id:block_given:20141103174857p:plain

わからなかったこと

何MBまで使える、みたいな情報とれないのかな

余談

ruboty-gen g redis-infoすると生成されるgemがダメ。夜気分が乗ったら-対応しよう。

おまえは今までOpsしたChatをおぼえているのか? ruboty-statsをつくりました

rubotyが反応したアクションを覚えていてくれる。

f:id:block_given:20141102153844p:plain

反応したチャットの文言、発言主などを表示できる。

まとめ

Module#prependだいすき

「ちょっとマイクラ鯖の様子みてくる」ruboty-minecraft_statusつくりました

機能的にはblockgiven/minecraft_logged_in_notifierとほぼいっしょ。

> @ruboty minecraft status minecraft.example.com
A Minecraft Server (0/20):
> @ruboty minecraft status minecraft.example.com
A Minecraft Server (1/20): blockgiven

JRubyかくぞ

Minecraftプラグインを書くために環境を整えている。

まとめ

まとめたいことがとくにないひもある

暇なとき、チャットでよおよお! ruboty-yo!!

f:id:block_given:20141101041727p:plain

つかいかた

よ usaboty/yo usabotyとかくとYoが飛ぶよ。

恋の病の人向けの使い方

君のこと好きだよ usabotyでもYoが飛ぶよ。Yoしか伝わらないから安心だよ。

テスト

yo.featureを書いた。

vcrはじめて使ったけどそれなりにべんりだった。use_cassetteのキーの指定の仕方と録音の仕方がキモだと思う。

今回は出来なかったけど

# こういう感じの`shared_context`を定義しておくと便利そう
RSpec.shared_context 'VCR', :vcr do
  around do |example|
    # metadataで指定する、あるいはfull_descriptionを使うとよさそう
    VCR.use_cassette(example.metadata[:cassette]) do
      example.run
    end
  end
end

RSpec.describe 'AKB48', :vcr, cassette: 'akb48' do
  # 〜
end

RSpec.describe 'perfume', :vcr, cassette: 'perfume' do
  # 〜
end

WebAPI

どこでstubするか。シナリオを通して投げるリクエストが決まっているならvcr便利だと思う。 ざっとみた感じ録音したデータには秘密にしておかないとまずいデータも録音されてしまう。 今回は別途Rakefileにタスクを定義して、漏れるとまずそうな部分をマスクしてからコミットした。

APIのクライアントライブラリ

今回はライブラリをつかわず適当に実装した。最低限ひつYoなエンドポイントだけたたける。 自分で作るか、ライブラリ使うかでテストのやりかたが違ってきそう。

ハマったところ

  • api tokenを間違えてなかなかYoできなかった。
  • 無効なapi tokenを送った場合のエラーメッセージから「api tokenが違う」ことが読み取れなかった。

まとめ

Yoではつたわらないこともあるよ

なんでも肯定してくれるruboty-yesを公開した

f:id:block_given:20141031020525p:plain

ハマった

  • RSpecのTurnipを使うRakeタスクの定義
  • Rubotyのreply時のto/fromの扱い
  • Rubotyのテストをどうかくとうまくいくのか考える時間

Turnipのシナリオ

最初シナリオで使う人物名を実在の人物名にしてしまった。 架空の名前を考えてシナリオを書くのは難しい。

Rubotyのテスト

今回は受け入れテストだけ書いてみた。 テスト中で実際にRuboty::Robotを作成し、動かしている。

Ruboty::Adapters::Baseを継承したアダプタを定義すると、最後に定義されたアダプタが使われるようになる。今回はMockアダプタを定義した。Mockアダプタは特に何もしない。

Ruboty::Robotの発言を監視するためRuboty::Robotを拡張するRuboty::Testableモジュールをprependした。今回は、Rubotyの発言の記録を取れればいいので、sayを奪った、それに合わせて最小限のインターフェイスを定義してやった。

saidを直接のぞいてる部分はsaid?で置き換えた方がうまくいきそうだなぁと書き終わってから気づいた。

まとめ

今回は簡単なテキスト処理のようなものなので、受け入れテストのみ書いた。 ハンドラーやアクションの中でもう少し複雑なことをしている場合は、個々のハンドラー/アクションのユニットテストも書いた方がよいかもしれない。

しかし基本的にはRubotyはチャットをインターフェイスにして動いているので、チャットをベースにした受け入れテストをしっかり書くのがいいんじゃないかと思っている。

READMEがそのままテストとして実行できる夢をみた。

ゆるい〆切り管理、ruboty-deadlineを公開しました #ruboty

rubotyにゆるく〆切りを覚えてもらおう。

f:id:block_given:20141030015652p:plain

相対的な時刻表示

今回は日付だけでよかったので1.dayで割ってto_iすることにした。

相対的な時刻表時、JSだとふつうはMoment.js使うけどRubyだと何がいいんだろう。 検索するとtime-lordelgalu/time_ago_in_wordsradar/dotiwがひっかかった。 i18n対応gem情報が気になる。

gemによっては相対的な時刻への変換と、相対的に書かれた時刻のパース両方を行うものもある。 あとrails-*系のgemもいくつか見かけたが、Railsを使っていない場合は選択肢に入らない。 rails-*でgemをつくるときは、本当にRailsの機能を拡張する、Railsに特化したものだけrails-*で公開して、内部の実装は外部gemにして切り出して使えるようにしてほしいという印象。

日本語パースするのにtokiyomiは便利。 他にもよいgemの情報をお持ちの方がいらっしゃれば、教えていただきたいです。

1日1Rubotyのきづき

1日しばりがあると、少しがんばって僕が考えた最強の日本語時刻パースgemをつくろうという気持ちになっても時間が足りない。

chatopsのbotのテスト

このgemは比較的テストを書きやすいgemだと思っている。 rubotyのテストについて一言書いておきたいが書くには時間が遅すぎる。 週末に考えをまとめようと思います。

まとめ

この〆切りはなかったことにしよう