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作者の方に絶望されそうです。
こんなのありますよ>公開svnリポジトリ<br>http://coderepos.org/share
Mercurialに鞍替えするとか。CGI経由でリポジトリを公開できるよ。<br>gitとかも似たようなことができるかな。
trotrさん:<br>情報ありがとうございます。<br>coderepos楽しそうですよねえ。登録してみようかな…。<br>ohaiさん:<br>最近本気でMercurialを検討してます。プロジェクト毎にsvnとsvkのリポジトリ作るのもなんだかなあという感じなんで。