bmabey (owner)

Forks

Revisions

gist: 27281 Download_button fork
public
Description:
cc.rb task for rspec, cucumber, rcov (for both examples and featrues), metric_fu, kablame, and a niffty dev task to go along with it
Public Clone URL: git://gist.github.com/27281.git
Embed All Files: show embed
cruise.rake #
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
# This assumes you have the metric_fu and kablame plugins installed.
# For kablame I like to modify it to include your stories or features dir as well as the specs.
 
# Set the artifacts dir for development
ENV['CC_BUILD_ARTIFACTS'] ||= File.expand_path("#{RAILS_ROOT}/metrics")
 
rspec_base = File.expand_path("#{RAILS_ROOT}/vendor/plugins/rspec/lib")
$LOAD_PATH.unshift(rspec_base) if File.exist?(rspec_base)
require 'spec/rake/spectask'
require 'spec/rake/verify_rcov'
 
 
CRUISE_TASKS = %w( cruise:setup_test_env db:drop db:create db:migrate metrics:flog metrics:cyclomatic_complexity metrics:stats cruise:coverage features:cruise cruise:verify_rcov cruise:kablame )
RCOV_THRESHOLD = 90
 
task :default => :cruise
 
desc "Task for cruise Control"
task :cruise do
  CRUISE_TASKS.each do |t|
    CruiseControl::invoke_rake_task t
  end
end
 
namespace :cruise do
  desc "Run specs and rcov"
  Spec::Rake::SpecTask.new(:coverage) do |t|
    t.spec_opts = ["--format html:#{ENV['CC_BUILD_ARTIFACTS']}/rspec_code_examples.html --format profile:#{ENV['CC_BUILD_ARTIFACTS']}/examples_profile.log --format failing_examples:#{ENV['CC_BUILD_ARTIFACTS']}/failing_examples.txt"]
    t.spec_files = FileList['spec/**/*_spec.rb']
    t.rcov = true
    t.rcov_dir = ENV['CC_BUILD_ARTIFACTS']+"/specs_rcov"
    t.rcov_opts = lambda do
      IO.readlines("#{RAILS_ROOT}/spec/rcov.opts").map {|l| l.chomp.split " "}.flatten
    end
  end
  
  RCov::VerifyTask.new(:verify_rcov) do |t|
    t.threshold = RCOV_THRESHOLD
    t.index_html = ENV['CC_BUILD_ARTIFACTS']+"/specs_rcov/index.html" if ENV['CC_BUILD_ARTIFACTS']
    t.require_exact_threshold = false
  end
    
  task :setup_test_env do
    RAILS_ENV = ENV['RAILS_ENV'] = 'test' # Without this, it will drop your production (or development) database.
  end
  
  desc "Run all cruise tasks"
  task :dev do
    FileUtils.mkdir_p("#{ENV['CC_BUILD_ARTIFACTS']}")
    
    CRUISE_TASKS.each do |t|
      begin
        Rake::Task[t].invoke
      rescue
      end
    end
    
    good_to_go = true
    
    File.open("#{ENV['CC_BUILD_ARTIFACTS']}/index.html", 'w') do |file|
      file.puts <<-HTML
<html>
<head>
<title>Cruise Output</title>
<style>
* {font-family: Arial;}
.passed {background-color:green;}
.failed {background-color:red;}
</style>
</head>
<body>
HTML
      
      puts "\n\n"
      
      # Specs
      specs_output = File.read("#{ENV['CC_BUILD_ARTIFACTS']}/specs_profile.log")
      if specs_output.match(/(?:\d+) examples, (\d+) failures(?:, (?:\d+) pending)?$/)
        num_failures = $1.to_i
      else
        num_failures = 1
      end
      
      if num_failures != 0
        good_to_go = false
        css_class = 'failed'
      else
        css_class = 'passed'
      end
      puts "Specs: #{css_class}"
      file.puts %Q{<div class="#{css_class}"><a href="specs.html">Specs</a></div>}
      
      # Features
      # 12 steps passed
      # 2 steps failed
      # 5 steps skipped
      # 1 steps pending
      
      if File.read("#{ENV['CC_BUILD_ARTIFACTS']}/features.txt") =~ /steps failed/
        good_to_go = false
        css_class = 'failed'
      else
        css_class = 'passed'
      end
      
      puts "Features: #{css_class}"
      file.puts %Q{<div class="#{css_class}"><a href="features.html">Features</a></div>}
      file.puts %Q{<div class="passed"><a href="features_rcov/index.html">Features Coverage</a></div>}
      
      # Coverage
      rcov_output = File.read("#{ENV['CC_BUILD_ARTIFACTS']}/specs_rcov/index.html")
      if rcov_output.match(%r{<tt class='coverage_code'>([\d\.]+)%</tt>})
        percentage = $1.to_f
      else
        percentage = 0.0
      end
      
      if percentage <= RCOV_THRESHOLD
        good_to_go = false
        css_class = 'failed'
      else
        css_class = 'passed'
      end
      puts "Specs Coverage: #{css_class}"
      file.puts %Q{<div class="#{css_class}"><a href="specs_rcov/index.html">Specs Coverage</a></div>}
      
      
      # Flog & Complexity, etc
      file.puts %Q{<div class=""><a href="flog/index.html">Flog Stats</a></div>}
      file.puts %Q{<div class=""><a href="cyclomatic_complexity/index.html">Cyclomatic Complexity</a></div>}
      file.puts %Q{<div class=""><a href="hall_of_shame.txt">Hall of Shame</a></div>}
      
      # End
      file.puts "</body></html>"
    end
    
    sh "open #{ENV['CC_BUILD_ARTIFACTS']}/index.html" unless good_to_go
  end
  
  desc "Cruise Kablame"
  task :kablame do
    sh "rake kablame:git:specs > #{ENV['CC_BUILD_ARTIFACTS']}/hall_of_shame.txt"
  end
end
 
cucumber.rake #
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
desc "Run all features"
task :features => "features:all"
task :features => 'db:test:prepare'
 
namespace :features do
  Cucumber::Rake::Task.new(:all) do |t|
    t.cucumber_opts = "--format pretty"
  end
  
  Cucumber::Rake::Task.new(:cruise) do |t|
    t.cucumber_opts = "--format pretty --out=#{ENV['CC_BUILD_ARTIFACTS']}/features.txt --format html --out=#{ENV['CC_BUILD_ARTIFACTS']}/features.html"
    t.rcov = true
    t.rcov_opts = %w{--rails --exclude osx\/objc,gems\/,spec\/}
    t.rcov_opts << %[-o "#{ENV['CC_BUILD_ARTIFACTS']}/features_rcov"]
  end
  
  Cucumber::Rake::Task.new(:rcov) do |t|
    t.rcov = true
    t.rcov_opts = %w{--rails --exclude osx\/objc,gems\/,spec\/}
    t.rcov_opts << %[-o "features_rcov"]
  end
end