ラベル ruby の投稿を表示しています。 すべての投稿を表示
ラベル ruby の投稿を表示しています。 すべての投稿を表示

3/29/2012

やっぱり Mocktra は便利だった!

先月、「Mocktra がやばいやばいやばい」で紹介した Mocktra を最近使っているけど、やっぱり便利だった。

いま僕やってることは、ウェブページのスクレイピングみたいなことをするライブラリの作成で、そのテストの場面で Mocktra が大活躍。

テストフレームワークは RSpec をつかってて、プロジェクトのディレクトリ直下には lib と spec のディレクトリがある感じ。lib ディレクトリの下にライブラリの実装をいれていって、spec ディレクトリの下にテストコードをいれていく。spec ディレクトリには各テストコードに共通の内容が入った spec_helper.rb がある。ここで Mocktra を使ってる。あと、spec ディレクトリの下に data ディレクトリをいれて、ここにスクレイピングする対象の HTML ファイルを配置する。

それで、spec_helper.rb の中で
require 'mocktra'

Mocktra('www.example.com') do
  get '/hoge'
    case param[:fuga]
    when "piyo"
      File.read(File.join("spec", "data", "piyo.html"))
    end
  end
end
て感じのことをしてる。細かいところは間違ってるかもだけど、要は、これだけのコードで、http://www.example.com/hoge?huga=piyo がアクセスされたら spec/data の下にある piyo.html を返すウェブサーバの代わりをしてくれるんだ。すごいよ、ほんと、いいタイミングすばらしいライブラリに出会った。。

通信エラー時のテストをやろうと思って、どうやってやるんだ?ということで Mocktra の中身を見てみたら、WebMock てのをベースにしてるだねー。で、Mocktra の README.md の以下の NOTICE のこともなんとなくわかった。
Mocktra calls WebMock.allow_net_connect! when loading.
で、通信エラーの件は、WebMock だと表現できないのかな、ということで、ライブラリ内で使ってる HTTPClient の HTTPClient#get (だったかな)をテストコードの直前でオーバーライドして、目的の例外、たとえば TimeoutError を raise するようにした。     

ところで、こないだのブログ記事で
記事を RubyFlow に投稿してくれた、jugyo さん、ありがとう!!!
て書いたけど、 実は、jugyo さんは Mocktra の作者じゃん!あらためて、jugyo さん、Mocktra を作ってくださってありがとうございまーす!


2/21/2012

Mocktra がやばいやばいやばい

これは、もう、事件!
 A webmock DSL using sinatra.
ていう、 一行説明文を見るからにやばそうなライブラリである MocktraRubyFlow 経由で知った!記事を RubyFlow に投稿してくれた、jugyo さん、ありがとう!!!
$ sudo gem install mocktra
 でインストール完了!README.md のサンプルをさっそく動かして、Sinatra 大好きっ子の僕はすぐに気に入ったっ。

ちょうど、ウェブをつついてスクレイピングするライブラリを書こうと思ってたから、そのテストコード書くのにもってこい。出会うタイミングもばっちりすぎだー!

1/11/2012

Ruby で16進数文字列をドット区切り10進数文字列に変換する

例えば、0xdeadbeef を表す文字列 "deadbeef" をドット区切りの10進数文字列に変換したい場合、Array#pack と String#unpack を使ってできる。
> ["deadbeef"].pack("H*").unpack("C*").join(".")
=> "222.173.190.239"
数値リテラルの 0xdeadbeef をドット区切りの10進数文字列に変換したい場合は、Fixnum#to_s を使って16進数文字列に変換すれば、上で書いた方法でドット区切りの10進数文字列に変換できる。
> [0xdeadbeef.to_s(16)].pack("H*").unpack("C*").join(".")
=> "222.173.190.239"
手元の Ruby  のバージョンはこちら。もっといい方法あるのかな。に、しても、Array#pack と String#unpack は便利だなー。
$ ruby -v
ruby 1.9.2p290 (2011-07-09 revision 32553)

12/05/2011

Protocol Buffers in Ruby

ちょっとしたサーバ・クライアントのプログラムを書こうかな、と思ったら、Google さんの Protocol Buffers を思い出した。
Protocol buffers are Google's language-neutral, platform-neutral, extensible mechanism for serializing structured data – think XML, but smaller, faster, and simpler.
実際に、Google さんのシステムでいっぱい使われてるらしい(Protocol Buffers の Overview より)。
Protocol buffers are now Google's lingua franca for data – at time of writing, there are 48,162 different message types defined in the Google code tree across 12,183.proto files. They're used both in RPC systems and for persistent storage of data in a variety of storage systems.
でも、Google さんのページにある実装は C++ か、Java か Python 用の Protocol Buffers ライブラリで、僕はどの言語も書けないんだよね。。。と思って、サードパーティの実装 Wiki を見たら、Ruby の実装がある!!
ぱっと見た感じ、beefcake はちょっと機能面でものたりない感じ?ruby-protobufruby-protocol-buffers はどっちもよさげなんだけど、RPC のためのサーバ・クライアントのクラスが定義されてることと、Author(s) の方々が日本人っぽいお名前で勝手に親しみを感じたから ruby-protobuf を使うことにした!

しっかし、みんな自分で実装したものを GitHub に公開していて、すごいなあ。来年の目標は GitHub デビューにしようかな。。