A Day in the Life

2006-11-02

Test::Base on Rails

routing みたいな単純な UnitTest にはやっぱ Test::Base いいなぁ。Test::Unit::TestCase 継承してるから Rails でも特に何にもせずに使えるよ。あとは Integration Test を楽に記述できるかどうかかなー。それと、今は run_tests の引数で Struct として渡ってくるんだけど、割と不便。値があるかどうかいちいち respond_to? で調べるのめんどい。Hash のほうがいい気がしてきた。選択できるようにすっかなぁ。

routing の test はこんな風にかける。

require File.dirname(__FILE__) + '/../test_base_helper'

class RoutingTest < Test::Base
  filters :path => %w(.strip),
          :type => %w(.strip .to_sym),
          :options => %w(yaml)

  def run_tests(spec)
    case spec.type
    when :recognize
      assert_recognizes spec.options, spec.path
    when :generate
      assert_generates spec.path, spec.options
    when :routing
      assert_routing spec.path, spec.options
    else
      raise "No Routing Type:#{spec.type}"
    end
  end
end

__END__
===
--- type: recognize
--- path: /secondlife/
--- options
:controller: home
:showuser: secondlife
:action: list

===
--- type: generate
--- path: /secondlife/
--- options
:controller: home
:showuser: secondlife

===
--- type: routing
--- path: /secondlife/2005/11/9/foobar
--- options
:controller: home
:action: show
:showuser: secondlife
:year: "2005"
:month: "11"
:day: "9"
:name: foobar

===
--- type: routing
--- path: /secondlife/comment/2005/11/09/foobar
--- options
:controller: home
:action: comment
:showuser: secondlife
:year: "2005"
:month: "11"
:day: "09"
:name: foobar

===
--- type: routing
--- path: /secondlife/edit/2005/11/9/foobar
--- options
:controller: home
:action: edit
:showuser: secondlife
:year: "2005"
:month: "11"
:day: "9"
:name: foobar

Shell.export

http://search.cpan.org/dist/Shell/Shell.pm

ruby の Shell クラスだと perl の Shell モジュールの export みたいなのができないので書いてみた。こんなの。

require 'shell'

class Shell
  def self.export(*names)
    names.flatten.each do |name|
      Kernel.__send__(:define_method, name) {|*args|
        `#{name} #{args.join(' ')}`
      }
    end
  end
end

これで

Shell.export %w(df uname)

puts df
puts uname('-a')

で↓とか。

Filesystem           1K-ブロック    使用   使用可 使用% マウント位置
/dev/cobd0            10485436   4748896   5736540  46% /
tmpfs                   258104        28    258076   1% /dev/shm
/dev/cobd2             3145628   2954896    190732  94% /home
cofs0:/               54023728  26656336  27367392  50% /mnt/c
Linux paprika 2.6.17-co-0.8.0 #6 PREEMPT Tue Oct 3 14:50:35 CEST 2006 i686 GNU/Linux

親クラスの inherited を呼び出す inherited 定義方法

ActiveSupport 使ってて書いていてはまった。。。class#inherited 定義しちゃうと親クラスの inherited 呼び出されなくなって(そりゃそうだ)へんなところでエラった。

それを回避するには別名でまずは inherited を定義してやって、alias で元の inherited を別名にして、自分で定義した inherited に alias をはる。んで自分で定義した inherited の中では元の inherited の別名を調べて、あったらそいつを呼び出す、みたいな。

言葉だけだとわかりにくいんでコード

class Foo
  class << self
    private
    def inherited(subclass)
      puts "inherited Foo's subclass: #{subclass}"
    end
  end
end

class Bar < Foo
  class << self
    private
    def inherited_with_bar(subclass)
      inherited_without_bar(subclass) if respond_to?(:inherited_without_bar, true)
      puts "inherited Bar's subclass: #{subclass}"
    end
    alias inherited_without_bar inherited
    alias inherited inherited_with_bar
  end
end

class Baz < Bar
end

実行すると

inherited Foo's subclass: Bar
inherited Foo's subclass: Baz
inherited Bar's subclass: Baz

となる。

追記

ActiveSupport だと aliath_method_chain で簡略化できるらしい。へー。

rails の breakpointer

ruby 1.8.5 じゃそのまんまじゃうごかないのか。

http://eigenclass.org/hiki.rb?call_stack

入れないとダメと。今 rails 1.2.0_pre つかってるんだけど各所で warning が出るのは良いな。

かうんと

http://d.hatena.ne.jp/babie/20061102/1162405547

んー。ふつうにARの condition に time オブジェクト渡せばいいと思った。あと sort_by 使うべきだと思った(速度的にも)。あとこの場合find(id)じゃなくて in でつっこむべきじゃないかなぁとおもった。

というかなんで order_by と limit つかわないんだろう。

カップラーメンの熱湯を

てにこぼしたあちいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいい

とりあえず Test::Base コミット

http://rubyforge.org/cgi-bin/viewvc.cgi/?root=test-base

svn co svn://rubyforge.org/var/svn/test-base

で co できる。viewvc みにくいお。。。つかいろいろ改善とリファクタリングしねーとな。。

記事の一覧 >