Class: Spec::Rake::SpecTask
- Defined in:
- lib/spec/rake/spectask.rb
Overview
A Rake task that runs a set of specs.
Example:
Spec::Rake::SpecTask.new do |t|
t.warning = true
t.rcov = true
end
This will create a task that can be run with:
rake spec
If rake is invoked with a “SPEC=filename” command line option, then the list of spec files will be overridden to include only the filename specified on the command line. This provides an easy way to run just one spec.
If rake is invoked with a “SPEC_OPTS=options” command line option, then the given options will override the value of the spec_opts
attribute.
If rake is invoked with a “RCOV_OPTS=options” command line option, then the given options will override the value of the rcov_opts
attribute.
Examples:
rake spec # run specs normally
rake spec SPEC=just_one_file.rb # run just one spec file.
rake spec SPEC_OPTS="--diff" # enable diffing
rake spec RCOV_OPTS="--aggregate myfile.txt" # see rcov --help for details
Each attribute of this task may be a proc. This allows for lazy evaluation, which is sometimes handy if you want to defer the evaluation of an attribute value until the task is run (as opposed to when it is defined).
This task can also be used to run existing Test::Unit tests and get RSpec output, for example like this:
require 'spec/rake/spectask'
Spec::Rake::SpecTask.new do |t|
t.ruby_opts = ['-rtest/unit']
t.spec_files = FileList['test/**/*_test.rb']
end
Instance Attribute Summary collapse
-
#fail_on_error ⇒ Object
Whether or not to fail Rake when an error occurs (typically when specs fail).
-
#failure_message ⇒ Object
A message to print to stderr when there are failures.
-
#libs ⇒ Object
Array of directories to be added to $LOAD_PATH before running the specs.
-
#name ⇒ Object
Name of spec task.
-
#out ⇒ Object
Where RSpec’s output is written.
-
#pattern ⇒ Object
Glob pattern to match spec files.
-
#rcov ⇒ Object
Whether or not to use RCov (default is false) See eigenclass.org/hiki.rb?rcov.
-
#rcov_dir ⇒ Object
Directory where the RCov report is written.
-
#rcov_opts ⇒ Object
Array of commandline options to pass to RCov.
-
#ruby_cmd ⇒ Object
Explicitly define the path to the ruby binary, or its proxy (e.g. multiruby).
-
#ruby_opts ⇒ Object
Array of commandline options to pass to ruby.
-
#spec_files ⇒ Object
Explicitly define the list of spec files to be included in a spec.
-
#spec_opts ⇒ Object
Array of commandline options to pass to RSpec.
-
#verbose ⇒ Object
Use verbose output.
-
#warning ⇒ Object
If true, requests that the specs be run with the warning flag set.
Class Method Summary collapse
Instance Method Summary collapse
-
#define ⇒ Object
:nodoc:.
-
#evaluate(o) ⇒ Object
:nodoc:.
-
#initialize(name = :spec) {|_self| ... } ⇒ SpecTask
constructor
Defines a new task, using the name
name
. -
#rcov_option_list ⇒ Object
:nodoc:.
-
#spec_file_list ⇒ Object
:nodoc:.
-
#spec_option_list ⇒ Object
:nodoc:.
Constructor Details
#initialize(name = :spec) {|_self| ... } ⇒ SpecTask
Defines a new task, using the name name
.
126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 |
# File 'lib/spec/rake/spectask.rb', line 126 def initialize(name=:spec) @name = name @libs = ['lib'] @pattern = nil @spec_files = nil @spec_opts = [] @warning = false @ruby_opts = [] @fail_on_error = true @rcov = false @rcov_opts = ['--exclude', 'lib\/spec,bin\/spec,config\/boot.rb'] @rcov_dir = "coverage" yield self if block_given? @pattern = 'spec/**/*_spec.rb' if pattern.nil? && spec_files.nil? define end |
Instance Attribute Details
#fail_on_error ⇒ Object
Whether or not to fail Rake when an error occurs (typically when specs fail). Defaults to true.
102 103 104 |
# File 'lib/spec/rake/spectask.rb', line 102 def fail_on_error @fail_on_error end |
#failure_message ⇒ Object
A message to print to stderr when there are failures.
105 106 107 |
# File 'lib/spec/rake/spectask.rb', line 105 def end |
#libs ⇒ Object
Array of directories to be added to $LOAD_PATH before running the specs. Defaults to [‘<the absolute path to RSpec’s lib directory>‘]
70 71 72 |
# File 'lib/spec/rake/spectask.rb', line 70 def libs @libs end |
#name ⇒ Object
Name of spec task. (default is :spec)
66 67 68 |
# File 'lib/spec/rake/spectask.rb', line 66 def name @name end |
#out ⇒ Object
Where RSpec’s output is written. Defaults to $stdout. DEPRECATED. Use –format FORMAT:WHERE in spec_opts.
109 110 111 |
# File 'lib/spec/rake/spectask.rb', line 109 def out @out end |
#pattern ⇒ Object
Glob pattern to match spec files. (default is ‘spec/*/_spec.rb’) Setting the SPEC environment variable overrides this.
78 79 80 |
# File 'lib/spec/rake/spectask.rb', line 78 def pattern @pattern end |
#rcov ⇒ Object
Whether or not to use RCov (default is false) See eigenclass.org/hiki.rb?rcov
86 87 88 |
# File 'lib/spec/rake/spectask.rb', line 86 def rcov @rcov end |
#rcov_dir ⇒ Object
Directory where the RCov report is written. Defaults to “coverage” Ignored if rcov=false
95 96 97 |
# File 'lib/spec/rake/spectask.rb', line 95 def rcov_dir @rcov_dir end |
#rcov_opts ⇒ Object
Array of commandline options to pass to RCov. Defaults to [‘–exclude’, ‘lib/spec,bin/spec’]. Ignored if rcov=false Setting the RCOV_OPTS environment variable overrides this.
91 92 93 |
# File 'lib/spec/rake/spectask.rb', line 91 def rcov_opts @rcov_opts end |
#ruby_cmd ⇒ Object
Explicitly define the path to the ruby binary, or its proxy (e.g. multiruby)
123 124 125 |
# File 'lib/spec/rake/spectask.rb', line 123 def ruby_cmd @ruby_cmd end |
#ruby_opts ⇒ Object
Array of commandline options to pass to ruby. Defaults to [].
98 99 100 |
# File 'lib/spec/rake/spectask.rb', line 98 def ruby_opts @ruby_opts end |
#spec_files ⇒ Object
Explicitly define the list of spec files to be included in a spec. spec_files
is expected to be an array of file names (a FileList is acceptable). If both pattern
and spec_files
are used, then the list of spec files is the union of the two. Setting the SPEC environment variable overrides this.
116 117 118 |
# File 'lib/spec/rake/spectask.rb', line 116 def spec_files @spec_files end |
#spec_opts ⇒ Object
Array of commandline options to pass to RSpec. Defaults to []. Setting the SPEC_OPTS environment variable overrides this.
82 83 84 |
# File 'lib/spec/rake/spectask.rb', line 82 def spec_opts @spec_opts end |
#verbose ⇒ Object
Use verbose output. If this is set to true, the task will print the executed spec command to stdout. Defaults to false.
120 121 122 |
# File 'lib/spec/rake/spectask.rb', line 120 def verbose @verbose end |
#warning ⇒ Object
If true, requests that the specs be run with the warning flag set. E.g. warning=true implies “ruby -w” used to run the specs. Defaults to false.
74 75 76 |
# File 'lib/spec/rake/spectask.rb', line 74 def warning @warning end |
Class Method Details
.attr_accessor(*names) ⇒ Object
58 59 60 61 62 63 |
# File 'lib/spec/rake/spectask.rb', line 58 def self.attr_accessor(*names) super(*names) names.each do |name| module_eval "def #{name}() evaluate(@#{name}) end" # Allows use of procs end end |
Instance Method Details
#define ⇒ Object
:nodoc:
144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 |
# File 'lib/spec/rake/spectask.rb', line 144 def define # :nodoc: spec_script = File.(File.join(File.dirname(__FILE__),"..","..","..","bin","spec")) lib_path = libs.join(File::PATH_SEPARATOR) actual_name = Hash === name ? name.keys.first : name unless ::Rake.application.last_comment desc "Run specs" + (rcov ? " using RCov" : "") end task name do RakeFileUtils.verbose(verbose) do unless spec_file_list.empty? # ruby [ruby_opts] -Ilib -S rcov [rcov_opts] bin/spec -- examples [spec_opts] # or # ruby [ruby_opts] -Ilib bin/spec examples [spec_opts] cmd_parts = [ruby_cmd || RUBY] cmd_parts += ruby_opts cmd_parts << %[-I"#{lib_path}"] cmd_parts << "-S rcov" if rcov cmd_parts << "-w" if warning cmd_parts << rcov_option_list cmd_parts << %[-o "#{rcov_dir}"] if rcov cmd_parts << %["#{spec_script}"] cmd_parts << "--" if rcov cmd_parts += spec_file_list.collect { |fn| %["#{fn}"] } cmd_parts << spec_option_list if out cmd_parts << %[> "#{out}"] STDERR.puts "The Spec::Rake::SpecTask#out attribute is DEPRECATED and will be removed in a future version. Use --format FORMAT:WHERE instead." end cmd = cmd_parts.join(" ") puts cmd if verbose unless system(cmd) STDERR.puts if raise("Command #{cmd} failed") if fail_on_error end end end end if rcov desc "Remove rcov products for #{actual_name}" task paste("clobber_", actual_name) do rm_r rcov_dir rescue nil end clobber_task = paste("clobber_", actual_name) task :clobber => [clobber_task] task actual_name => clobber_task end self end |
#evaluate(o) ⇒ Object
:nodoc:
210 211 212 213 214 215 |
# File 'lib/spec/rake/spectask.rb', line 210 def evaluate(o) # :nodoc: case o when Proc then o.call else o end end |
#rcov_option_list ⇒ Object
:nodoc:
197 198 199 200 201 202 203 |
# File 'lib/spec/rake/spectask.rb', line 197 def rcov_option_list # :nodoc: if rcov ENV['RCOV_OPTS'] || rcov_opts.join(" ") || "" else "" end end |
#spec_file_list ⇒ Object
:nodoc:
217 218 219 220 221 222 223 224 225 226 |
# File 'lib/spec/rake/spectask.rb', line 217 def spec_file_list # :nodoc: if ENV['SPEC'] FileList[ ENV['SPEC'] ] else result = [] result += spec_files.to_a if spec_files result += FileList[ pattern ].to_a if pattern FileList[result] end end |
#spec_option_list ⇒ Object
:nodoc:
205 206 207 208 |
# File 'lib/spec/rake/spectask.rb', line 205 def spec_option_list # :nodoc: STDERR.puts "RSPECOPTS is DEPRECATED and will be removed in a future version. Use SPEC_OPTS instead." if ENV['RSPECOPTS'] ENV['SPEC_OPTS'] || ENV['RSPECOPTS'] || spec_opts.join(" ") || "" end |