トップ «前の日記(2007-09-19) 最新 次の日記(2007-09-23)» 編集

Route 477



2007-09-22

[event] 開発合宿

なんか2つ重なったのでいま合宿生活4日目です。4日間全くゲームやってないとか俺にしてはあり得ない真面目さなんだが そろそろ風邪でもひくんじゃなかろうか。

LDRとメールは見てる。nicovideoはBGMのために開いてたけど岐阜に来てから禁止されました(><)

[prog] 公開svnリポジトリ

がほしい。

なんでかっていうとやる気がなくてリリースしなかったプロジェクトも中途半端なのがダウンロードできるようになるじゃん?という 至極消極的な理由だったりしますが。中途半端でも公開しないより良いと思うんだよな。

[ruby] autotestが落ちる

/home/yhara/gems/local/lib/site_ruby/1.8/rubygems.rb:278:in `latest_partials': undefined method `[]' for nil:NilClass (NoMethodError)
       from /home/yhara/gems/local/lib/site_ruby/1.8/rubygems.rb:275:in `each'
       from /home/yhara/gems/local/lib/site_ruby/1.8/rubygems.rb:275:in `latest_partials'
       from /home/yhara/gems/local/lib/site_ruby/1.8/rubygems.rb:245:in `latest_load_paths'
       from /home/yhara/gems/local/lib/site_ruby/1.8/rubygems.rb:244:in `each'
       from /home/yhara/gems/local/lib/site_ruby/1.8/rubygems.rb:244:in `latest_load_paths'
       from /home/yhara/gems/repos/gems/ZenTest-3.6.1/lib/autotest.rb:109:in `autodiscover'
       from /home/yhara/gems/repos/gems/ZenTest-3.6.1/bin/autotest:36
       from /home/yhara/gems/repos/bin/autotest:18:in `load'
       from /home/yhara/gems/repos/bin/autotest:18

というエラーが出ていたのだが、どうもgem置き場に変なフォルダがあったかららしい。

yhara@meteor:~/ % ls ~/rubygems/ -1
ParseTree-1.7.1/
(中略)
uuidtools-1.0.1/
web_spec/          ←これ
wirble-0.1.2/

rubygems.rbを修正することで回避。

yhara@meteor:~/rubygems/ZenTest-3.6.1/lib/autotest % diff -c ~/tmp/orig ~/gems/local/lib/site_ruby/1.8/rubygems.rb
*** /home/yhara/tmp/orig        2007-09-22 17:40:26.000000000 +0900
--- /home/yhara/gems/local/lib/site_ruby/1.8/rubygems.rb        2007-09-22 17:32:14.000000000 +0900
***************
*** 275,280 ****
--- 275,281 ----
        all_partials(gemdir).each do |gp|
          base = File.basename(gp)
          matches = /(.*)-((\d+\.)*\d+)/.match(base)
+         next if matches.nil? #こんなんでいいのかな
          name, version = [matches[1], matches[2]]
          ver = Gem::Version.new(version)
          if latest[name].nil? || ver > latest[name][0]

[ruby] RSpec + autotest

名づけてautospec。

検索してもRails環境でのやり方しか出てこないので調べてみた。

前提知識

RSpec
テストツール。Test::Unitを人間に読みやすくしたような感じ
autotest
ファイルをセーブした瞬間に自動でテストを走らせてくれるツール。ZenTestというツール群に同梱。デフォルトでは、Ruby標準添付のTest::Unitを使う

autotestを使う場合、

./bin/hoge
./lib/hoge.rb
./lib/Hoge/*.rb
./spec/*.rb

みたいな構成にしなければならない。

インストール

gem install rspec
gem install ZenTest

設定

最近のRSpecにはautotest用の設定が内蔵されている…のだが、RSpecをgemで入れると specコマンドをうまく見つけられず

/home/yhara/gems/repos/gems/rspec-1.0.8/lib/autotest/rspec.rb:80:in `spec_command': No spec command could be found! (RspecCommandError)

というエラーになるというバグがある(RSpec 1.0.8現在)。

解決策

  • ./bin/spec を rspec-1.0.8/bin/spec へのsymlinkにする
  • rspec-1.0.8/lib/autotest/rspec.rb に一行足す

など。

  def spec_commands
    [
      File.join('bin', 'spec'),
      File.join(Config::CONFIG['bindir'], 'spec'),                             #←ここに「,」を足して
      File.expand_path(File.join(File.dirname(__FILE__), "/../../bin/spec")),  #←ここに一行足す
    ]
  end

end

まとめ

とまあほんのちょっとだけ面倒なんですけど、入れた分のメリットは十分あると思うのでRSpec使ってる人は是非。

おまけ

./spec/spec.opts に -c って書いておくと出力に色が付くよ。 (←他の方法はないのかな…)

[ruby][screen] Autotest::Screenを導入してみた

autotestついでに、テスト結果がGNU Screenの右下に出る設定を導入してみた。

わるいとき

画像の説明

いいとき

画像の説明

設定は角谷さんのをほぼそのままお借りしました。ありがとうございます。

変更点:

  • screenのパスを設定した
  • returnをnextに変更した(ブロック内でreturnってできないですよね?)
require 'autotest/screen'

Autotest::HOOKS.delete(:interrupt) #これがないと、autotestが^Cで止まらなくなります(なりました)
Autotest::Screen.statusline = "kmc | %w | %0` %u %= %m/%d %D %c"
Autotest::Screen.screen_cmd = '/home/yhara/bin/screen/bin/screen'

class Autotest::Screen
  SCREEN_COLOR[:green] = 'gw'
  SCREEN_COLOR[:yellow] = 'yk'

  Autotest.add_hook :run_command do |at|
    message 'Running' if execute?
  end

  Autotest.add_hook :quit do |at|
    clear if execute?
  end

  Autotest.add_hook :ran_command do |at|
    next unless execute?
    results = [at.results].flatten.join("\n")
    output = results.slice(/(\d+)\sexamples?,\s*(\d+)\s.*failures?(?:,\s*(\d+)\s.*pendings?)?/)
    if output
      ex,fail,pend = $~.captures.map {|e| e.to_i}
      if 0 < fail
        message "FAIL #{ex}ex, F:#{fail} ", :red
      elsif 0 < pend
        message "Pend #{ex}ex, F:#{fail} P:#{pend}", :yellow
      else
        message "All Green #{ex}ex", :green
      end
    end
  end
end
# vim:set ft=ruby:

[ruby][rspec] Specファイルの正しい書き方は?

ナマケログ - RSpecを日本語の仕様っぽくするには がすごく面白かったです。

'Teacher when introduce himself should tell his own name'
   ↓
'Teacher 先生が自己紹介をするケース 自分の名前を言う'
   ↓
'Teacher 先生が自己紹介をするという状況では 先生は自分の名前を言うんだ'
   ↓
'Teacher が自己紹介をするとき は、自分の名前を言うこと'

こういうのを文芸的プログラミングと呼ぶのでしょうか(多分違います)

さて、僕はといえば、「メソッドごとにテストケース作るならこれでよくね?」という結論に達しました。

describe "CharMap" do
  it ".new" do
    ...
  end
  it "#[]" do
    ...
  end
  it "#each_char" do
    ...
  end
end

…RSpec作者の方に絶望されそうです。

本日のツッコミ(全3件) [ツッコミを入れる]
trotr (2007-09-24 19:30)

こんなのありますよ>公開svnリポジトリ<br>http://coderepos.org/share

ohai (2007-09-27 00:59)

Mercurialに鞍替えするとか。CGI経由でリポジトリを公開できるよ。<br>gitとかも似たようなことができるかな。

yhara (2007-09-27 16:35)

trotrさん:<br>情報ありがとうございます。<br>coderepos楽しそうですよねえ。登録してみようかな…。<br>ohaiさん:<br>最近本気でMercurialを検討してます。プロジェクト毎にsvnとsvkのリポジトリ作るのもなんだかなあという感じなんで。