autotestの結果を伺かに喋らすver.α

autotest成功autotest失敗
画像が重くてゴメンナサイ.


SSTPを使う事で,より柔軟に色んな出力を伺かでNotifyする事が出来るようになりました*1
そこで,暫定的ではありますが,autotestの結果を伺かに喋らすスクリプトを公開します.
暇な人は,是非一度試してみてください.

.autotest

これは,#{RAILS_ROOT}/.autotestに書くスクリプトです.別に,gem/ZenTest-*/lib/autotest/の下にukagaka.rbとか作って,.autotestにrequire'autotest/ukagaka'とかでも良い.

require 'ukagaka_io'

# とりあえずlocalhostに接続しておきますよ
UIO = UkagakaIO.open('127.0.0.1', 9801)

class Autotest::Ukagaka
  def self.ukagaka(msg, force = false)
    UIO.write(msg, force)
  end

  Autotest.add_hook :initialize do |at|
    ukagaka "\\h\\s[0]初期化中…\n"
  end

  Autotest.add_hook :run do  |at|
    ukagaka "\\h開始\n"
  end

  Autotest.add_hook :ran_command do |at|
    results = at.results

    failed = results.scan(/^\s*\d+\) (?:Failure|Error):\n(.*?)\((.*?)\)/)
    files_to_test = at.consolidate_failures failed

    if files_to_test.size > 0 then
      ukagaka "\\h\\s[3]通らなかったテスト一覧〜\\n"
      failure = ""
      files_to_test.each do |k, v|
        failure += "  #{k} : #{v.to_s}\\n"
      end
      failure += "\\uということで,#{files_to_test.size}個のテストで失敗." +
        "\\h\\s[4]残念 ."
      ukagaka failure
    else
      results = "\\h\\s[1]" + results
      results.concat("\\u\\s[11]通ったで\\h\\s[5]よかったね")
      ukagaka results
    end
  end

  Autotest.add_hook :interrupt do |at|
    ukagaka "\\hautotestがリセットされました"
  end

  # ところで,autotestはどうすれば普通に終了するんですかね.
  Autotest.add_hook :quit do |at|
    ukagaka "\\hautotestを終了します"
  end
end

なお,サーフェス黒海さんに対応させてますので,お気に入りのゴーストのサーフェスに合わせてください.

追記

http://www2.airnet.ne.jp/~sirataki/ukagaka/bottlable.htmlを見た感じでは,一応サーフェス毎に互換はあるようですね.

ukagaka_io.rb

それから,ukagaka_io.rb*2に少々の修正を加えていますので,修正部分だけ.

require 'socket'
require 'kconv'
require 'thread'

class UkagakaIO < TCPSocket
  def to_sjis(str)
    # Macは,SJISじゃないと文字化けするんです
    # WindowsはUTF-8のままでも問題無し?
    Kconv.tosjis(str)
  end

  HEADERS = {
    'Sender' => 'Ruby UkagakaIO',
    'Script' => '',
    'Charset' => 'Shift_JIS', # Macは,(ry
  }
  BREAK = "\r\n"

  def write(msg, force = false)
    @msg_buffer ||= ''
    @msg_buffer << to_sjis(msg).gsub(/\r?\n/, '\n')
    if force
      headers = HEADERS.clone.update('Script' => @msg_buffer + "\e")
      h = ['SEND SSTP/1.1'] # Sakura Scriptをベタ書きするために,無難に1.1
      h << headers.map{|k,v| "#{k}: #{v}"}
      message = h.join(BREAK).concat(BREAK * 2)
      result = super(message)
      @msg_buffer = ''
      reconnect!
      result
    else
      timer
    end
  end
  
  …以下略
end

*1:see also: id:omochist:20061121:1164121012

*2:see also: g:subtech:id:secondlife:20061107:1162910933