最近の Ruby 活動

Ruby 1.9.0-3 がリリースされました。せっかくなので最近の僕の Ruby 活動を書きます。

「目指せ make test-all 0F0E」活動中

0F0E とは 0 failures, 0 errors のことで、要するにテストを全部パスさせようという個人的な野望です。RubyKaigi が終わってから一月くらい、ぼちぼちやってます。
rubygems にパッチ書いて直してもらって (ruby-core:17353 とか) 、openssl のテストを直して、rdoc を直してもらって (ruby-core:17822 とか) 、その他細かい問題を自分で直したり、「直せー」と騒いで直してもらったりしました。その結果、ぼくの Debian/etch i686-linux で 3F1E にまで減りました。一ヶ月前の RubyKaigi の頃が 21F16E だったことを思うと、だいぶ改善したはず。

4992 tests, 1665793 assertions, 3 failures, 1 errors

全然関係ないところがバグの原因になってて驚くことが多かったです。rdoc の実装が openssl のテストを失敗させるとか。rdoc の実装が io のテストを失敗させるとか。rubygems とか rdoc とかは便利だけど、中を見ちゃダメですよね。よく動いてるもんだと不安になります。

ちなみに Debian/etch i686-linux 以外は手元に環境がないので検証できてません *1 。ノート PC 一台じゃちょっと厳しい。ケチだから買えないけど。

とりあえずの目標は、今年末の 1.9.1 リリースのタイミングで 0F0E にすること。運の要素が大きいですけどね。

カバレッジ測定機構の導入

RubyKaigi で少し話したことですがが、カバレッジ測定のためのプリミティブな機能を実装してコミットしました。make test-all での標準ライブラリのカバレッジ測定が目的なので、ツールはかなりいい加減ですが、こんな感じ。

$ cat foo.rb
require "foo/bar"

s = 0
10.times do |x|
 s += x
end

if s == 45
 p :ok
else
 p :ng
end

$ cat foo/bar.rb
p 1
p 2
p 3

このコードたちを -rsample/coverage 付きで実行する。

$ ./ruby -rsample/coverage foo.rb
1
2
3
:ok

普通に実行されたあと、*.cov ができている。それを見ると各行の実行回数がわかる。

$ cat foo.rb.cov
        1:    1:require "foo/bar"
        -:    2:
        1:    3:s = 0
        1:    4:10.times do |x|
       10:    5: s += x
        -:    6:end
        -:    7:
        1:    8:if s == 45
        1:    9: p :ok
        -:   10:else
    #####:   11: p :ng
        -:   12:end

$ cat foo/bar.rb.cov
        1:    1:p 1
        1:    2:p 2
        1:    3:p 3

ただし、今後も内部仕様・外部仕様ともに変わる可能性はありまくります。


ツールのインターフェイスをどうするか決められなくて悩み中。

  • lib/coverage.rb を作って、-rcoverage 付きで実行する → カバレッジの出力方法などのオプションを環境変数でしかできない。
  • bin/ruby-with-coverage を新設する → 普通の ruby と互換性を保てるか怪しい。問題があったら絶対メンテしないといけなくて逃げ道がない。

という感じ。うーん。

*1:windows はあるけどスルー。VMware 上の Solaris もあるけどスルー。64 ビット環境とかコアが複数ある環境とかが手元に欲しいところ。