トップ «前の日記(2005-09-14) 最新 次の日記(2005-09-18)» 編集

3 日坊主日記


2005-09-15 [長年日記]

_ [Rails] HTML::Document

「a タグを探したい moriq さんはこう書きました。間違いをふたつ挙げよ」

 tag = find_tag(:tag=>"a")
 p tag

先生! p tag がいつまで経っても止まりません!

「はい正解。こうしときましょう」

 p tag.closing
 p tag.attributes
 p tag.name
 p tag.children.size

先生! "a" が "head" にマッチします!

「はい正解」

 tag = find_tag(:tag=>/\Aa\z/)

この辺:

     # Match the given value to the given condition.
     def match_condition(value, condition)
       case condition
         when String
           value && value.index(condition)

orz

_ [Rails] call graph (Graphviz)

dot でコールグラフを書いてみた。 ここでは test の assert_response を使う。

 class CustomerControllerTest < Test::Unit::TestCase

   @@action_table = {}

   def self.action_dump
     @@action_table.each { |cur, actions|
       puts "=#{cur}"
       actions.each { |action|
         puts action.join("\t")
       }
     }
   end

   def record_action
     cur = @controller.controller_name+"/"+@controller.action_name
     unless @@action_table[cur]
       @@action_table[cur] = []
     end
     find_all_tag(:tag=>/\Aa\z/).each { |tag|
       @@action_table[cur].push [tag.name, tag.attributes["href"]]
     }
     find_all_tag(:tag=>/\Aform\z/).each { |tag|
       @@action_table[cur].push [tag.name, tag.attributes["action"]]
     }
   end

   def assert_response_with_record_action(type, message = nil)
     assert_response_without_record_action(type, message)
     record_action
   end

   alias_method :assert_response_without_record_action, :assert_response
   alias_method :assert_response, :assert_response_with_record_action

 end

 at_exit do
   unless $! || Test::Unit.run?
     exitcode = Test::Unit::AutoRunner.run($0 != "-e" && $0)
   end
   CustomerControllerTest.action_dump
   exit exitcode
 end

こんなふうに仕掛けてやると

 =customer/update
 a	http://test.host/customer/show/1
 a	http://test.host/customer/show/2
 a	http://test.host/customer/show/1
 a	http://test.host/customer/show/1
 =customer/set_zip
 =customer/new
 a	/customer/find
 a	/customer/find
 form	/customer/update
 =customer/edit
 a	/customer/find
 a	/customer/show/1
 a	/customer/find
 a	/customer/show/1
 form	/customer/update

こんなふうに出てくるので

 controller_name, action_name = []
 action_list = {}
 puts "digraph G {"
 while line = gets
   case line
   when %r[^=(\w+)/(\w+)]
     if action_name && action_list.empty?
       puts "#{action_name};"
     end
     controller_name, action_name = $1, $2
     action_list.clear
   else
     next unless action_name
     case line
     when %r[^a\thttp://test.host/([\w/]+)]
       # redirect_to
       controller, action, id = $1.split("/")
       action ||= "index"
       if !action_list[action]
         action_list[action] = true
         puts "#{action_name} -> #{action} [color=red];"
       end
     when %r[^(a|form)\t/([\w/]+)]
       # anchor in render html
       tag_name = $1
       controller, action, id = $2.split("/")
       if !action_list[action]
         action_list[action] = true
         if tag_name == "a"
           if id
             # with param
             puts "#{action_name} -> #{action};"
           else
             # without param
             puts "#{action_name} -> #{action} [style=dotted];"
           end
         else
           puts "#{action_name} -> #{action} [color=green];"
         end
       end
     end
   end
 end
 puts "}"

こんなふうに変換してやるとこうなる。 rec.dot

あとは dot にかける。 rec.gif

redirect_to
form action
黒実線
a href で id あり
黒破線
a href で id なし (menu を想定)

test を書けてないとこが一目瞭然! ^^;

_ [Ruby] $LOADED_FEATURES

あれ? English.rb 使わんでも $LOADED_FEATURES は使えるのか。 手元のマニュアルが古かった。 ruby-dev:23299

_ [Rails] test_helper.rb: require では File.expand_path しないとまずい

なんか test で同じライブラリが何回も呼ばれる気がしてたんだけど、$" ($LOADED_FEATURES) を確認したらわかった。

  • trunk/railties/helpers/test_helper.rb r.1435:
 - require File.dirname(__FILE__) + "/../config/environment"
 -
 + # Expand the path to environment so that Ruby does not load it multiple times
 + # File.expand_path can be removed if Ruby 1.9 is in use.
 + require File.expand_path(File.dirname(__FILE__) + "/../config/environment")

2005-06-16 てことは 0.11.1 の前か…

[]