merged cont.
[opensuse:yast-rest-service.git] / webservice / vendor / plugins / rails_rcov / tasks / rails_rcov.rake
1 # Source: rcov plugin
2 # This File Uses Magic
3 # ====================
4 # Here's an example of how this file works. As an example, let's say you typed
5 # this into your terminal:
6
7 #   $ rake --tasks
8
9 # The rake executable goes through all the various places .rake files can be,
10 # accumulates them all, and then runs them. When this file is loaded by Rake,
11 # it iterates through all the tasks, and for each task named 'test:blah' adds
12 # test:blah:rcov and test:blah:rcov_clobber.
13
14 # So you've seen all the tasks, and you type this into your terminal:
15
16 #   $ rake test:units:rcov
17
18 # Rake does the same thing as above, but it runs the test:units:rcov task, which
19 # pretty much just does this:
20
21 #   $ ruby [this file] [the test you want to run] [some options]
22
23 # Now this file is run via the Ruby interpreter, and after glomming up the
24 # options, it acts just like the Rake executable, with a slight difference: it
25 # passes all the arguments to rcov, not ruby, so all your unit tests get some
26 # rcov sweet loving.
27
28 if ARGV.grep(/--run-rake-task=/).empty?
29   # Define all our Rake tasks
30
31   require 'rake/clean'
32   require 'rcov/rcovtask'
33
34   def to_rcov_task_sym(s)
35     s = s.gsub(/(test:)/,'')
36     s.empty? ? nil : s.intern
37   end
38   
39   def to_rcov_task_name(s)
40     s = s.gsub(/(test:)/,'')
41     s =~ /s$/i ? s[0..-2] : s
42   end
43   
44   def new_rcov_task(test_name)
45     output_dir = "./coverage/#{test_name.gsub('test:','')}"
46     CLOBBER.include(output_dir)
47   
48     # Add a task to run the rcov process
49     desc "Run all #{to_rcov_task_name(test_name)} tests with Rcov to measure coverage"
50     task :rcov => [:clobber_rcov] do |t|
51       run_code = '"' << File.expand_path(__FILE__) << '"'
52       run_code << " --run-rake-task=#{test_name}"
53       
54       params = String.new
55       if ENV['RCOV_PARAMS']
56         params << ENV['RCOV_PARAMS']
57       end
58       
59       # rake test:units:rcov SHOW_ONLY=models,controllers,lib,helpers
60       # rake test:units:rcov SHOW_ONLY=m,c,l,h
61       if ENV['SHOW_ONLY']
62         show_only = ENV['SHOW_ONLY'].to_s.split(',').map{|x|x.strip}
63         if show_only.any?
64           reg_exp = []
65           for show_type in show_only
66             reg_exp << case show_type
67               when 'm', 'models' : 'app\/models'
68               when 'c', 'controllers' : 'app\/controllers'
69               when 'h', 'helpers' : 'app\/helpers'
70               when 'l', 'lib' : 'lib'
71               else
72                 show_type
73             end
74           end
75           reg_exp.map!{ |m| "(#{m})" }
76           params << " -x \\\"^(?!#{reg_exp.join('|')})\\\""
77         end
78       end
79       
80       unless params.empty?
81         run_code << " --rcov-params=\"#{params}\""
82       end
83
84       ruby run_code
85     end
86     
87     # Add a task to clean up after ourselves
88     desc "Remove Rcov reports for #{to_rcov_task_name(test_name)} tests"
89     task :clobber_rcov do |t|
90       rm_r output_dir, :force => true
91     end
92     
93     # Link our clobber task to the main one
94     task :clobber => [:clobber_rcov]
95   end
96   
97   test_tasks = Rake::Task.tasks.select{ |t| t.comment && t.name =~ /^test/ }
98   for test_task in test_tasks
99     namespace :test do
100       if sym = to_rcov_task_sym(test_task.name)
101         namespace sym do
102           new_rcov_task(test_task.name)
103         end
104       end
105     end
106   end
107 else
108   # Load rake tasks, hijack ruby, and redirect the task through rcov
109   require 'rubygems'
110   require 'rake'
111   
112   module RcovTestSettings
113     class << self
114       attr_accessor :output_dir, :options
115       def to_params
116         "-o \"#{@output_dir}\" -T -x \"rubygems/*,rcov*\" --rails #{@options}"
117       end
118     end
119     
120     # load options and arguments from command line
121     unless (cmd_line = ARGV.grep(/--rcov-params=/)).empty?
122       @options = cmd_line.first.gsub(/--rcov-params=/, '')
123     end
124   end
125   
126   def is_windows?
127     processor, platform, *rest = RUBY_PLATFORM.split("-")
128     platform == 'mswin32'
129   end
130
131   # intercept what Rake *would* be doing with Ruby, and send it through Rcov instead
132   module RakeFileUtils
133     alias :ruby_without_rcov :ruby
134     def ruby(*args, &block)
135       cmd = (is_windows? ? 'rcov.cmd' : 'rcov') << " #{RcovTestSettings.to_params} #{args}"
136       status = sh(cmd, {}, &block)
137       puts "View the full results at <file://#{RcovTestSettings.output_dir}/index.html>"
138       return status
139     end
140   end
141   
142   # read the test name and execute it (through Rcov)
143   unless (cmd_line = ARGV.grep(/--run-rake-task=/)).empty?
144     test_name = cmd_line.first.gsub(/--run-rake-task=/,'')
145     ARGV.clear; ARGV << test_name
146     RcovTestSettings.output_dir = File.expand_path("./coverage/#{test_name.gsub('test:','')}")
147     Rake.application.run
148   else
149     raise "No test to execute!"
150   end
151 end