Rubotyが信ずる者の言葉にしか耳を貸さなくなるruboty-trust_meをつくった
簡単な名前による認証を提供します。
つくろうと思った理由
ruboty + twitter-adapter でボットを作っている人っているのかな?万人向けのコマンドと管理者(本人)向けのコマンドとかの区別が必要になりそうだけど、その辺りどうしているか気になる。ベタベタにif文? #ruboty
— tbpgr (@tbpgr) 2014, 11月 3
いい話
RubotyはRuboty自身のことを信じている
Redisのメモリ使用量を表示するruboty-redis-infoつくった
brainを結構つかうようになったのでRedisの使用率が気になった。
わからなかったこと
何MBまで使える、みたいな情報とれないのかな
余談
ruboty-gen g redis-info
すると生成されるgemがダメ。夜気分が乗ったら-
対応しよう。
おまえは今までOpsしたChatをおぼえているのか? ruboty-statsをつくりました
rubotyが反応したアクションを覚えていてくれる。
反応したチャットの文言、発言主などを表示できる。
まとめ
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!!
つかいかた
よ 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なエンドポイントだけたたける。 自分で作るか、ライブラリ使うかでテストのやりかたが違ってきそう。
ハマったところ
まとめ
Yoではつたわらないこともあるよ
なんでも肯定してくれるruboty-yesを公開した
ハマった
- 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にゆるく〆切りを覚えてもらおう。
相対的な時刻表示
今回は日付だけでよかったので1.day
で割ってto_i
することにした。
相対的な時刻表時、JSだとふつうはMoment.js使うけどRubyだと何がいいんだろう。 検索するとtime-lordやelgalu/time_ago_in_wordsやradar/dotiwがひっかかった。 i18n対応gem情報が気になる。
gemによっては相対的な時刻への変換と、相対的に書かれた時刻のパース両方を行うものもある。
あとrails-*
系のgemもいくつか見かけたが、Railsを使っていない場合は選択肢に入らない。
rails-*
でgemをつくるときは、本当にRailsの機能を拡張する、Railsに特化したものだけrails-*
で公開して、内部の実装は外部gemにして切り出して使えるようにしてほしいという印象。
日本語パースするのにtokiyomi
は便利。
他にもよいgemの情報をお持ちの方がいらっしゃれば、教えていただきたいです。
1日1Rubotyのきづき
1日しばりがあると、少しがんばって僕が考えた最強の日本語時刻パースgemをつくろうという気持ちになっても時間が足りない。
chatopsのbotのテスト
このgemは比較的テストを書きやすいgemだと思っている。 rubotyのテストについて一言書いておきたいが書くには時間が遅すぎる。 週末に考えをまとめようと思います。
まとめ
この〆切りはなかったことにしよう