たごもりすメモ

コードとかその他の話とか。

手元のコードをruby1.9対応した

仕事で書いているRubyのコード、1.8.7で書いてたのを1.9.2p0に持っていったので、やった変更内容のメモ。
なお書いてるのはO/R Mapper(とそのテスト)なので、Web系のあれこれとかセキュリティ回りとかのことは知りません。環境はMac OSX 10.6.4 (Snow Leopard)。

インストールなど

readlineruby本体を、ググれば出てくる通りにダウンロード -> configure -> make -> sudo make install。なおconfigureのときに --program-suffix=19 を指定した(ので、後で出てくる実行コマンドは全部 ruby19 とか)。

続けてgemsのインストール。当面必要だったものふたつのみ。

 $ gem19 install rspec
 $ gem19 install ruby-mysql

インストールした rspec にパスを通すため、以下の行を .bashrc に加えて source ~/.bashrc しておく。

 rspec='/usr/local/bin/rspec -c'

コードの改修

requireの変更

これまでは '.' (カレントディレクトリ) が $LOAD_PATH に含まれていたのが、1.9から含まれなくなったらしい。
で、代わりに require_relative が加えられているのでこれを使う。自作ライブラリ内なんかで require していたものを、相対パスをつかって全部置き換え。
テストコード内のものも忘れずに確認すること。

文字コード関連の変更

M18N対応のおかげで変なことをせずに済むようになったので、修正して回る。文字コード変換があちこちにあるとここが一番面倒かも。

  • nkfとjcodeのrequireを削る
  • コード内のnkfをすべて String#encode に変更する
  • コード内の String#jlength をすべて String#length に変更する
  • ロジックの整理

ほぼ機械的にやっていい気がするが、自分の場合は置き換えにともなってロジックを整理できる場所があったので、それも一緒に。もしかしたら世の中でそういうケースは多いかもしれない。

自分の場合はこの時点でかなりの数のテストがパスするようになった。

Deprecatedなメソッドの置き換え

コード中で Hash#index を使っていると警告が出るようになった(deprecated)ので Hash#key に置き換え。他にはなかった。

メソッドのリストをがシンボルを返すようになった

テスト中で Module#public_instance_methods をチェックしてる部分があったが、ここが軒並み fail。見てみたらこれまでメソッド名の文字列表現のリストを返していたのが、シンボルのリストを返すようになったようだ。
ということで以下のような変更。ついでに引数をちゃんと渡すようにしておいた。

-    Test12.public_instance_methods.should include('efef')
-    Test12.public_instance_methods.should include('efef?')
-    Test12.public_instance_methods.should include('efef=')
+    Test12.public_instance_methods(true).should include(:efef)
+    Test12.public_instance_methods(true).should include(:efef?)
+    Test12.public_instance_methods(true).should include(:efef=)
これだけ!

これで全テストが成功するように。意外にラクでした。早い段階で移行を決めたからだろうなあ。