From: Masatoshi SEKI Date: 2010-01-30T21:39:07+09:00 Subject: [ruby-dev:40262] Re: ERB#src (was Re: Re: [Feature #2366] private constant 咳といいます。 On 2010/01/30, at 20:02, Yusuke ENDOH wrote: > 遠藤です。 > > 2010年1月30日7:20 Masatoshi SEKI : >>>>> 普通に見えるものは何でも spec にされてしまう例として、以下のような spec >>>>> があります。(private constant には関係ないですが……) >>>>> >>>>> http://github.com/rubyspec/rubyspec/blob/master/library/erb/src_spec.rb >>>>> >>>>> つまり、ERB#src の返り値を固定文字列で spec にしているという。1.9 で失敗 >>>>> してるんですが、どう対処したものでしょう。 >> >> いや、使ってほしいAPIだしテストしてくださってかまわないのですが、 > > 純粋に公開 API なんですね。想定用途は、コンパイル結果のキャッシュ? > だとしたら Proc とか返した方がよかった気もします (ERB 開発当時の > Ruby の状況を知らないですが) 。 なぜ現在のRubyの状況ではProcの方がよいのですか? 私は1.9.xでそう変更すべきでしょうか? ERBはeRubyのスクリプトからRubyのスクリプトへの変換を担当します。 ERB#srcこそが本来やりたかったものです。 bin/erbやERB#run, resultはどちらかと言えばサンプルコードです。 変換結果をファイルを書く人もいるようですが、Procを作るなり 好きに使えばよいと思います。 もしも作者の意図をくんでくれるなら、メソッド定義の手助けに使って ほしいのですが、ユーザがそんな意図に関係なく好きに使えるのが かなしくておもしろいところですよね。 太古の資料でよければこんなのがありました。 http://www.druby.org/ilikeruby/erbway.html > > いずれにせよ公開 API なら、spec に書くのがよさそうです。それなら、 > > >> 単純に文字列比較で検査するから問題なんですよね。たぶん。 > > そういう問題だと思います。ERB#src は「こういう条件下でこういう > 文字列を返す関数」という仕様ではない、ということで、 > > >> こういうテストにした方がいいよ、っていうのを教えてあげたら >> よいのかな。 > > それがいいと思います。正確には「ERB#src はどういう仕様か」を教えて > あげるといいと思います。 > > 推察するに、「実行可能な Ruby コードの文字列を返す」というのが仕様 > でしょうか。だとすれば、文字列の中身を見るのではなく、ripper で > パースが通ることをみるとか、実際に eval してみるのが正しい spec の > テストと言えそうです。 いえ、実行可能なRubyコードかどうかは、元の文字列によるので わからないと思います。 実際にevalをするresultを呼ぶのが簡単でしょうけど、 それが気に入らないなら、明示的にevalするのがいいと 思います。 あー、でもrubyspecって本当はなにをテストしたいんだろう。 テストじゃないんでしたね。仕様か。 仕様っていうのはいつもテストコードに書けるんですかねえ。 というかテストコードにあるケースだけをパスするのが仕様なのかなあ。 # すみません、脱線しました はたして、本当にあのときとバージョンとこのときのバージョンが 返す文字列が違うにも関わらず、そういうことを記述しなくても よいのでしょうか。 その文字列の変化によって、おかしなユーザのコードが奇妙な 挙動を示すこともあると思いますが、そういうのを調べる手がかり なりそうに思うんだけどなあ。 そういうセンサーではないなら、ま、いっか。 時間と元気があるときに、evalするようなテストケースを提案してみます。 英語で意図を説明するのは私には無理なので、コード送ります。たぶん。 多くの方にご迷惑おかけして申し訳ありませんでした。