Class: Spec::Rake::SpecTask
- Defined in:
- lib/spec/rake/spectask.rb
Overview
A Rake task that runs a set of RSpec contexts.
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).
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_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.
-
#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
.
111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 |
# File 'lib/spec/rake/spectask.rb', line 111 def initialize(name=:spec) @name = name @libs = [File.(File.dirname(__FILE__) + '/../../../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.
94 95 96 |
# File 'lib/spec/rake/spectask.rb', line 94 def fail_on_error @fail_on_error end |
#failure_message ⇒ Object
A message to print to stderr when there are failures.
97 98 99 |
# File 'lib/spec/rake/spectask.rb', line 97 def @failure_message 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>‘]
62 63 64 |
# File 'lib/spec/rake/spectask.rb', line 62 def libs @libs end |
#name ⇒ Object
Name of spec task. (default is :spec)
58 59 60 |
# File 'lib/spec/rake/spectask.rb', line 58 def name @name end |
#out ⇒ Object
Where RSpec’s output is written. Defaults to STDOUT. DEPRECATED. Use –format FORMAT:WHERE in spec_opts.
101 102 103 |
# File 'lib/spec/rake/spectask.rb', line 101 def out @out end |
#pattern ⇒ Object
Glob pattern to match spec files. (default is ‘spec/*/_spec.rb’) Setting the SPEC environment variable overrides this.
70 71 72 |
# File 'lib/spec/rake/spectask.rb', line 70 def pattern @pattern end |
#rcov ⇒ Object
Whether or not to use RCov (default is false) See eigenclass.org/hiki.rb?rcov
78 79 80 |
# File 'lib/spec/rake/spectask.rb', line 78 def rcov @rcov end |
#rcov_dir ⇒ Object
Directory where the RCov report is written. Defaults to “coverage” Ignored if rcov=false
87 88 89 |
# File 'lib/spec/rake/spectask.rb', line 87 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.
83 84 85 |
# File 'lib/spec/rake/spectask.rb', line 83 def rcov_opts @rcov_opts end |
#ruby_opts ⇒ Object
Array of commandline options to pass to ruby. Defaults to [].
90 91 92 |
# File 'lib/spec/rake/spectask.rb', line 90 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.
108 109 110 |
# File 'lib/spec/rake/spectask.rb', line 108 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.
74 75 76 |
# File 'lib/spec/rake/spectask.rb', line 74 def spec_opts @spec_opts 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.
66 67 68 |
# File 'lib/spec/rake/spectask.rb', line 66 def warning @warning end |
Class Method Details
.attr_accessor(*names) ⇒ Object
49 50 51 52 53 54 |
# File 'lib/spec/rake/spectask.rb', line 49 def 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:
129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 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 |
# File 'lib/spec/rake/spectask.rb', line 129 def define # :nodoc: spec_script = File.(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 = "ruby " rb_opts = ruby_opts.clone rb_opts << "-I\"#{lib_path}\"" rb_opts << "-S rcov" if rcov rb_opts << "-w" if warning cmd << rb_opts.join(" ") cmd << " " cmd << rcov_option_list cmd << %[ -o "#{rcov_dir}" ] if rcov cmd << %Q|"#{spec_script}"| cmd << " " cmd << "-- " if rcov cmd << spec_file_list.collect { |fn| %["#{fn}"] }.join(' ') cmd << " " cmd << spec_option_list if out cmd << " " cmd << %Q| > "#{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 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:
196 197 198 199 200 201 |
# File 'lib/spec/rake/spectask.rb', line 196 def evaluate(o) # :nodoc: case o when Proc then o.call else o end end |
#rcov_option_list ⇒ Object
:nodoc:
186 187 188 189 |
# File 'lib/spec/rake/spectask.rb', line 186 def rcov_option_list # :nodoc: return "" unless rcov ENV['RCOV_OPTS'] || rcov_opts.join(" ") || "" end |
#spec_file_list ⇒ Object
:nodoc:
203 204 205 206 207 208 209 210 211 212 |
# File 'lib/spec/rake/spectask.rb', line 203 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:
191 192 193 194 |
# File 'lib/spec/rake/spectask.rb', line 191 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 |