83's

Top > Tags > Rake

Rake

タイトル一覧を表示 | 本文を表示

rake spec:uncommitted August 23, 2007 02:43

なさそうなのでtest:uncommittedを移植してみた。 test:uncommittedを使った試しがないのでこれも使わない可能性大w

rspec_base = File.expand_path(File.dirname(__FILE__) + '/../../vendor/plugins/rspec/lib')
$LOAD_PATH.unshift(rspec_base) if File.exist?(rspec_base)
require 'spec/rake/spectask'
require 'spec/translator'

desc "Run specs changed since last checkin (only Subversion)"
Spec::Rake::SpecTask.new("spec:uncommitted" => "db:test:prepare") do |t|
  changed_since_checkin = silence_stderr { `svn status` }.map {|path| path.chomp[7 .. -1] }

  specs = changed_since_checkin.select {|path| path =~ %r{spec/.*_spec\.rb} }
  specs += changed_since_checkin.select {|path| path =~ %r{(app/(models|controllers)|lib)/.*\.rb} } \
            .map {|path| 'spec/' + path.sub(/\Aapp\//, '').sub(/(?=\.rb)/, '_spec') } \
            .select {|path| File.exist?(path) }

  t.spec_files = specs.uniq
  t.spec_opts = ['--options', "\"#{RAILS_ROOT}/spec/spec.opts\""]
end

これをrspec_uncommitted.rakeみたいな名前にしてlib/tasksに放りこむ。

ちなみにrake spec:recentはRSpec on Rails rake task for Recent Specs にある。 spec:uncommittedの頭のrequireを追加しないと動かないと思うんだけど……。 あとspec/spec.optsを読むようにt.spec_optsのところを変更すると ほかのタスクと同じになっていい感じ。

さて、特定のdescribeitvimから実行するのは確かに便利なんだけど、 その間vimが使えなくて困る。10秒くらい何もできないのが辛い……。

spec:recentがあればscreenの別のwindowで走らせてすかさずvimに戻れるなーと。 rake spec SPEC=spec/controllers/foo_controller_spec.rbなんて いちいち打つのは鬱で仕方ないですよね(ノ∀`)アチャー

あー、どうでもいいけどこのブログのオレオレ記法パーサがヘタレすぎる。 プログラム貼ると記法の記号とかぶってパースエラーになりやすいので 今までエラーになる箇所をいちいちエスケープしてたけど、 もうめんどいからHTML直接書いた。それでもあやしい。

大体なんでpreの中でタグ使うこと想定してんだろう、このオレオレ記法は。 YukiWikiの記法を拡張してるんだけど''なんか空文字列とモロかぶるし、 なまじエスケープなんかができるもんだから予期せぬところでエスケープされておかしなことに。 時々バックスラッシュの数とかおかしい場合があるかもしれないけどそのせいです。

指定したnamespace以下のタスクを全部実行 May 20, 2007 17:58

ほのぼのRake。

namespace :a do
  desc "a:b"
  task :b do
    puts "a:b"
  end

  desc "a:c"
  task :c do
    puts "a:c"
  end

  namespace :d do
    desc "a:d:e"
    task :e do
      puts "a:d:e"
    end

    desc "a:d:f"
    task :f do
      puts "a:d:f"
    end
  end
end

task :a => [ "a:b", "a:c", "a:d:e", "a:d:f" ]
task "a:d" => [ "a:d:e", "a:d:f" ]

新しいtask書くたびに最後のタスクまとめてるやつに追加していくのが めんどくさくなってきたのでnamespace指定して一括実行。

# 以下を追記

def invoke_all(*namespace)
  task_name = namespace.map {|n| n.to_s }.join(':')
  desc "invoke all #{task_name}"
  task task_name => Rake::Task.tasks.select {|t| t.scope[0, namespace.size] == namespace }.map {|t| t.name }
end

invoke_all :a
invoke_all :a, :d  # ネストしてるやつはこう書く
yazu@flora % rake -T
(in /home/yazu)
rake a      # invoke all a
rake a:b    # a:b
rake a:c    # a:c
rake a:d    # invoke all a:d
rake a:d:e  # a:d:e
rake a:d:f  # a:d:f
yazu@flora % rake a
(in /home/yazu)
a:b
a:c
a:d:e
a:d:f
yazu@flora % rake a:d
(in /home/yazu)
a:d:e
a:d:f

(゚д゚)ウマー