« [Ruby] flog | トップページ | [Ruby] Vlad »

2009年6月25日 (木)

[Ruby] flay


1.3.0が公開された(ruby-talk:339966)。



Ruby スクリプトのコードが「同じ」かどうかを比較するツール。



文法エラーのあるスクリプトであっても停止せずに処理を継続するようにした他5つの改訂。



試してみた。



$ sudo gem install flay
$ cat sample1.rb
def times5
(1..5).each do |i|
puts i
end
end
times5
$ cat sample2.rb
def output5
puts 1
puts 2
puts 3
puts 4
puts 5
end
output5
$ cat sample3.rb
def puts5
puts 1
puts 2
puts 3
puts 4
puts 5
end
puts5
$ flay sample1.rb sample2.rb
Total score (lower is better) = 0
$ flay sample2.rb sample3.rb
Total score (lower is better) = 38
 
 
1) Similar code found in :defn (mass = 38)
sample2.rb:1
sample3.rb:1
$ flay
Total score (lower is better) = 38
 
 
1) Similar code found in :defn (mass = 38)
sample2.rb:1
sample3.rb:1


おお。なかなか動いているっぽい。
ここで、ちょっと不自然な sample4.rb を追加してみよう。



$ cat sample4.rb
def times5(arg)
(1..arg.values[0]).each do |i|
puts i
end
end
times5(a:5)
$ flay
parse error on value 5 (tINTEGER)
skipping ./sample4.rb
Total score (lower is better) = 38
 
 
1) Similar code found in :defn (mass = 38)
./sample2.rb:1
./sample3.rb:1


1.9系のスクリプトは parse error にはなるものの確かに最後まで動いているっぽい。では、1.8系でも
大丈夫なように変更してみる。



times5({:a => 5})


に変更すると



$ flay
Total score (lower is better) = 38
 
 
1) Similar code found in :defn (mass = 38)
sample2.rb:1
sample3.rb:1


うーん。sample1.rb と sample4.rb は違うと判断するのか。
でも、同じメソッドがあると見つけてくれるみたいだから、リファクタリングのツールとして使えそうである。


|

« [Ruby] flog | トップページ | [Ruby] Vlad »

コメント

この記事へのコメントは終了しました。

トラックバック


この記事へのトラックバック一覧です: [Ruby] flay:

« [Ruby] flog | トップページ | [Ruby] Vlad »