A Day in the Life

2010-10-27

SaSS (scss) ですべての css を打ち消す

以前ちょさんが JS でやってたのの SaSS 版。ちょさんの JS コードからコピペです。

これを @import して、scss で

.example {
  @include all-reset;
}

とすれば、いろいろ打ち消してくれる。SaSS 便利〜。しかし標準の utility でこういう全スタイル打ち消す mixin があると思い込んでたんだけど、ぱっと探した感じ無かった。あるならおしえてほしい!

bundler で利用される gem のディレクトリに cd したい

エディタで開きたい場合は

bundle open haml

とかで開けるけど、ただ cd したいとき現在の bundler の cli なインターフェイスだとできない。(単純に path を取得するコマンドがない)

のでワンライナー + zsh function で移動する。

function cdb() {
  cd `ruby -e "require 'rubygems';gem 'bundler';require 'bundler';Bundler.load.specs.each{|s| puts s.full_gem_path if s.name == '${1}'}"`
}

な関数を定義しておくと

cdb haml

とかで cd できる。例外処理は考慮してないので存在しない文字列や bundler 利用してるディレクトリ以下じゃないとふつうにエラーになります。

Rails3 + RSpec2 + vim におけるテスト実行が遅い件

もんだい

  • Rails3 + RSpec2 の単体のテストが Rails 全ロードため遅いよ。8秒ぐらいかかるよ
  • spork で drbd な rspec サーバたてて解決ソリューション
    • spork は Rails3 + RSpec2 じゃ一部挙動がおかしくなる
    • 「一部」おかしくなることがあるので時たまはまる・よくない
  • emacs の人はべつにおそいのなれてるしーという感じ
    • なんで?
    • 普通に非同期で実行できるからだ!
  • vim は非同期なテストができない!!!
    • vim 上で spec 走らせると待ち時間に
    • 解決ソリューションとしては QuickRun + async 等で解決できる
      • vimproc だと現在の QuickRun の仕様で stdout 出力が終わるまで ...F... とか出ない
      • あと手元の環境だとうまく動かないことがときどきある
  • autotest !
    • なつかしの autotest
    • 最近テスト実行は別の仮想端末上で行う事が多い
      • rvm + bundler 使ってると、環境がシェル上じゃないとちゃんとしないとうまく動かなかったりする(これ僕の環境も悪い)
      • シェルから bundle exec autotest でちゃんとした環境で起動できる
    • autotest + it '' :focus => true 相性良いな
    • でもファイル更新されたら自動実行は嫌だ
      • 自分の開発サイクルの外側で行われるとリズムが狂う

解決法

というわけで、autotest を USR2 シグナルによってテスト実行させるようにする。sleep の待ち時間を実行されないぐらい長めにとって、USR2 シグナルで実行されるようにする。

# ~/.autotest
Autotest.add_hook :initialize do |at|
  at.sleep = 100000
  at.instance_eval do
    trap 'USR2' do
      print "\n\033[1;34m%s\033[0m\n" % "catch USR2 signal"
      if find_files_to_test
        get_to_green
        if tainted? and not options[:no_full_after_failed]
          rerun_all_tests
        else
          hook :all_good
        end
      end
    end
  end
end

で、autotest を起動

bundle exec autotest -f -c

あとは screen からでも vim からでも適当に USR2 シグナル投げれば、更新があったファイルだけ実行できる。もはや autotest じゃねーじゃん、という話は置いておきます。

pkill -USR2 -f 'bin/autotest'
nmap  er :silent! exe '!/opt/local/bin/pkill -USR2 -f bin/autotest'

今のところこの方法が一番効率よいかなー…。

ちなみに :focus => true でその spec だけ実行するというのをいままで知りませんでした、便利!

# in spec/spec_helper.rb
RSpec.configure do |c|
  c.filter_run :focus => true
end

# in any spec file
describe "something" do
  it "does something", :focus => true do
    # ....
  end
end