forked from instructure/canvas-lms
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathrspec.rake
206 lines (183 loc) · 7.89 KB
/
rspec.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
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
196
197
198
199
200
201
202
203
204
205
206
# Don't load rspec if running "rake gems:*"
unless Rails.env.production? || ARGV.any? { |a| a =~ /\Agems/ }
begin
if CANVAS_RAILS2
require 'spec/rake/spectask'
else
require 'rspec/core/rake_task'
end
rescue MissingSourceFile, LoadError
module Spec
module Rake
class SpecTask
include ::Rake::DSL
def initialize(name)
task name do
# if rspec-rails is a configured gem, this will output helpful material and exit ...
require File.expand_path(File.dirname(__FILE__) + "/../../config/environment")
# ... otherwise, do this:
raise <<-MSG
#{"*" * 80}
* You are trying to run an rspec rake task defined in
* #{__FILE__},
* but rspec can not be found in vendor/gems, vendor/plugins or system gems.
#{"*" * 80}
MSG
end
end
end
end
end
end
Rake.application.instance_variable_get('@tasks').delete('default')
task :default => :spec
task :stats => "spec:statsetup"
if CANVAS_RAILS2
spec_files_attr = :spec_files=
klass = Spec::Rake::SpecTask
else
spec_files_attr = :pattern=
klass = RSpec::Core::RakeTask
end
desc "Run all specs in spec directory (excluding plugin specs)"
klass.new(:spec) do |t|
# you can also do SPEC_OPTS='-e "test name"' but this is a little easier I
# suppose.
if ENV['SINGLE_TEST']
t.spec_opts += ['-e', %{"#{ENV['SINGLE_TEST']}"}]
end
spec_files = FileList['vendor/plugins/*/spec_canvas/**/*_spec.rb'].exclude('vendor/plugins/*/spec_canvas/selenium/*_spec.rb') + FileList['spec/**/*_spec.rb'].exclude('spec/selenium/**/*_spec.rb')
Gem.loaded_specs.values.each do |spec|
path = spec.full_gem_path
spec_canvas_path = File.expand_path(path+"/spec_canvas")
next unless File.directory?(spec_canvas_path)
spec_files << spec_canvas_path
end
if ENV['IN_MEMORY_DB']
N_PROCESSES = [ENV['IN_MEMORY_DB'].to_i, 1].max
spec_files = spec_files.map { |x| Dir[x + "/[^selenium]**/*_spec.rb"] }.flatten.sort.in_groups_of(N_PROCESSES)
processes = []
Signal.trap "SIGINT", (lambda { Process.kill "-KILL", Process.getpgid(0) })
child = false
N_PROCESSES.times do |j|
pid = Process.fork
unless pid
child = true
t.send(spec_files_attr, spec_files.map { |x| x[j] }.compact)
break
end
processes << pid
end
exit Process.waitall.map(&:last).map(&:exitstatus).count { |x| x != 0 } unless child
else
t.send(spec_files_attr, spec_files)
end
end
namespace :spec do
desc "Run all specs in spec directory, wiping the database first"
task :wipedb do
ENV["RAILS_ENV"] ||= "test"
Rake::Task["db:test:prepare"].execute
Rake::Task["spec"].execute
end
desc "Run non-selenium files in a single thread"
klass.new(:single) do |t|
require File.expand_path(File.dirname(__FILE__) + '/parallel_exclude')
t.send(spec_files_attr, ParallelExclude::AVAILABLE_FILES)
end
desc "Print Specdoc for all specs (excluding plugin specs)"
klass.new(:doc) do |t|
t.spec_opts = ["--format", "specdoc", "--dry-run"]
t.send(spec_files_attr, FileList['spec/**/*/*_spec.rb'])
end
desc "Print Specdoc for all plugin examples"
klass.new(:plugin_doc) do |t|
t.spec_opts = ["--format", "specdoc", "--dry-run"]
t.send(spec_files_attr, FileList['vendor/plugins/**/spec/**/*/*_spec.rb'].exclude('vendor/plugins/rspec/*'))
end
[:models, :services, :controllers, :views, :helpers, :lib, :selenium].each do |sub|
desc "Run the code examples in spec/#{sub}"
klass.new(sub) do |t|
t.spec_opts = ['--options', "\"#{Rails.root}/spec/spec.opts\""]
t.send(spec_files_attr, FileList["spec/#{sub}/**/*_spec.rb"])
end
end
desc "Run the code examples in vendor/plugins (except RSpec's own)"
klass.new(:coverage) do |t|
t.spec_opts = ['--options', "\"#{Rails.root}/spec/spec.opts\""]
t.send(spec_files_attr, FileList['vendor/plugins/*/spec_canvas/**/*_spec.rb'].exclude('vendor/plugins/*/spec_canvas/selenium/*_spec.rb') + FileList['spec/**/*_spec.rb'].exclude('spec/selenium/**/*_spec.rb'))
end
namespace :plugins do
desc "Runs the examples for rspec_on_rails"
klass.new(:rspec_on_rails) do |t|
t.spec_opts = ['--options', "\"#{Rails.root}/spec/spec.opts\""]
t.send(spec_files_attr, FileList['vendor/plugins/rspec-rails/spec/**/*/*_spec.rb'])
end
end
# Setup specs for stats
task :statsetup do
require 'code_statistics'
::STATS_DIRECTORIES << %w(Model\ specs spec/models) if File.exist?('spec/models')
::STATS_DIRECTORIES << %w(Service\ specs spec/services) if File.exist?('spec/services')
::STATS_DIRECTORIES << %w(View\ specs spec/views) if File.exist?('spec/views')
::STATS_DIRECTORIES << %w(Controller\ specs spec/controllers) if File.exist?('spec/controllers')
::STATS_DIRECTORIES << %w(Helper\ specs spec/helpers) if File.exist?('spec/helpers')
::STATS_DIRECTORIES << %w(Library\ specs spec/lib) if File.exist?('spec/lib')
::STATS_DIRECTORIES << %w(Routing\ specs spec/lib) if File.exist?('spec/routing')
::CodeStatistics::TEST_TYPES << "Model specs" if File.exist?('spec/models')
::CodeStatistics::TEST_TYPES << "Service specs" if File.exist?('spec/services')
::CodeStatistics::TEST_TYPES << "View specs" if File.exist?('spec/views')
::CodeStatistics::TEST_TYPES << "Controller specs" if File.exist?('spec/controllers')
::CodeStatistics::TEST_TYPES << "Helper specs" if File.exist?('spec/helpers')
::CodeStatistics::TEST_TYPES << "Library specs" if File.exist?('spec/lib')
::CodeStatistics::TEST_TYPES << "Routing specs" if File.exist?('spec/routing')
end
namespace :db do
namespace :fixtures do
desc "Load fixtures (from spec/fixtures) into the current environment's database. Load specific fixtures using FIXTURES=x,y. Load from subdirectory in test/fixtures using FIXTURES_DIR=z."
task :load => :environment do
ActiveRecord::Base.establish_connection(Rails.env)
base_dir = File.join(Rails.root, 'spec', 'fixtures')
fixtures_dir = ENV['FIXTURES_DIR'] ? File.join(base_dir, ENV['FIXTURES_DIR']) : base_dir
require 'active_record/fixtures'
(ENV['FIXTURES'] ? ENV['FIXTURES'].split(/,/).map { |f| File.join(fixtures_dir, f) } : Dir.glob(File.join(fixtures_dir, '*.{yml,csv}'))).each do |fixture_file|
Fixtures.create_fixtures(File.dirname(fixture_file), File.basename(fixture_file, '.*'))
end
end
end
end
namespace :server do
daemonized_server_pid = File.expand_path("#{Rails.root}/tmp/pids/spec_server.pid")
desc "start spec_server."
task :start do
if File.exist?(daemonized_server_pid)
$stderr.puts "spec_server is already running."
else
$stderr.puts %Q{Starting up spec_server ...}
FileUtils.mkdir_p('tmp/pids') unless test ?d, 'tmp/pids'
system("ruby", "script/spec_server", "--daemon", "--pid", daemonized_server_pid)
end
end
desc "stop spec_server."
task :stop do
unless File.exist?(daemonized_server_pid)
$stderr.puts "No server running."
else
$stderr.puts "Shutting down spec_server ..."
system("kill", "-s", "TERM", File.read(daemonized_server_pid).strip) &&
File.delete(daemonized_server_pid)
end
end
desc "restart spec_server."
task :restart => [:stop, :start]
desc "check if spec server is running"
task :status do
if File.exist?(daemonized_server_pid)
$stderr.puts %Q{spec_server is running (PID: #{File.read(daemonized_server_pid).gsub("\n", "")})}
else
$stderr.puts "No server running."
end
end
end
end
end