parallelized_specs 0.1.7 → 0.1.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/Rakefile +1 -1
- data/VERSION +1 -1
- data/lib/parallelized_specs/tasks.rb +6 -10
- data/lib/parallelized_specs.rb +25 -18
- data/parallelized_specs.gemspec +2 -2
- metadata +4 -4
data/Rakefile
CHANGED
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.1.
|
1
|
+
0.1.8
|
@@ -2,18 +2,15 @@ $LOAD_PATH << File.expand_path(File.join(File.dirname(__FILE__), '..'))
|
|
2
2
|
require "parallelized_specs"
|
3
3
|
|
4
4
|
namespace :parallel do
|
5
|
-
def run_db_in_parallel(cmd, options={})
|
6
|
-
ParallelizedSpecs.execute_parallel_db(cmd, options)
|
7
|
-
end
|
8
5
|
|
9
6
|
desc "create test databases via db:create --> parallel:create[num_cpus]"
|
10
7
|
task :create, :count do |t, args|
|
11
|
-
|
8
|
+
ParallelizedSpecs.execute_parallel_db('rake db:create RAILS_ENV=test', args)
|
12
9
|
end
|
13
10
|
|
14
11
|
desc "drop test databases via db:drop --> parallel:drop[num_cpus]"
|
15
12
|
task :drop, :count do |t, args|
|
16
|
-
|
13
|
+
ParallelizedSpecs.execute_parallel_db('rake db:drop RAILS_ENV=test', args)
|
17
14
|
end
|
18
15
|
|
19
16
|
desc "update test databases by dumping and loading --> parallel:prepare[num_cpus]"
|
@@ -25,27 +22,26 @@ namespace :parallel do
|
|
25
22
|
else
|
26
23
|
# there is no separate dump / load for schema_format :sql -> do it safe and slow
|
27
24
|
args = args.to_hash.merge(:non_parallel => true) # normal merge returns nil
|
28
|
-
|
25
|
+
ParallelizedSpecs.execute_parallel_db('rake db:test:prepare --trace', args)
|
29
26
|
end
|
30
27
|
end
|
31
28
|
|
32
29
|
# when dumping/resetting takes too long
|
33
30
|
desc "update test databases via db:migrate --> parallel:migrate[num_cpus]"
|
34
31
|
task :migrate, :count do |t, args|
|
35
|
-
|
32
|
+
ParallelizedSpecs.execute_parallel_db('rake db:migrate RAILS_ENV=test', args)
|
36
33
|
end
|
37
34
|
|
38
35
|
# just load the schema (good for integration server <-> no development db)
|
39
36
|
desc "load dumped schema for test databases via db:schema:load --> parallel:load_schema[num_cpus]"
|
40
37
|
task :load_schema, :count do |t, args|
|
41
|
-
|
38
|
+
ParallelizedSpecs.execute_parallel_db('rake db:test:load', args)
|
42
39
|
end
|
43
40
|
|
44
41
|
desc "run spec in parallel with parallel:spec[num_cpus]"
|
45
42
|
task 'spec', :count, :pattern, :options, :arguments do |t, args|
|
46
43
|
count, pattern, options = ParallelizedSpecs.parse_rake_args(args)
|
47
|
-
|
48
|
-
opts = [:count => count, :pattern => pattern, :options => options, :root => Rails.root, :files => args[:arguments]]
|
44
|
+
opts = {:count => count, :pattern => pattern, :root => Rails.root, :files => args[:arguments]}
|
49
45
|
ParallelizedSpecs.execute_parallel_specs(opts)
|
50
46
|
end
|
51
47
|
end
|
data/lib/parallelized_specs.rb
CHANGED
@@ -53,7 +53,7 @@ class ParallelizedSpecs
|
|
53
53
|
end
|
54
54
|
|
55
55
|
def self.execute_parallel_db(cmd, options={})
|
56
|
-
count = options[:count].to_i
|
56
|
+
count = options[:count].to_i || Parallel.processor_count
|
57
57
|
count = Parallel.processor_count if count == 0
|
58
58
|
runs = (0...count).to_a
|
59
59
|
results = if options[:non_parallel]
|
@@ -69,19 +69,26 @@ class ParallelizedSpecs
|
|
69
69
|
end
|
70
70
|
|
71
71
|
def self.execute_parallel_specs(options)
|
72
|
+
if options[:files].to_s.empty?
|
73
|
+
tests = find_tests(Rails.root, options)
|
74
|
+
run_specs(tests, options)
|
75
|
+
else
|
76
|
+
run_specs(options[:files], options)
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
def self.run_specs(tests, options)
|
72
81
|
num_processes = options[:count] || Parallel.processor_count
|
73
|
-
|
74
|
-
'spec' => %w(specs spec spec),
|
75
|
-
}[options[:type]||'spec']
|
82
|
+
name = 'spec'
|
76
83
|
|
77
84
|
start = Time.now
|
78
85
|
|
79
|
-
tests_folder =
|
86
|
+
tests_folder = 'spec'
|
80
87
|
tests_folder = File.join(options[:root], tests_folder) unless options[:root].to_s.empty?
|
81
|
-
if
|
82
|
-
groups = tests_in_groups(
|
88
|
+
if tests.is_a?(Array)
|
89
|
+
groups = tests_in_groups(tests || tests_folder, num_processes, options)
|
83
90
|
else
|
84
|
-
files_array =
|
91
|
+
files_array = tests.split(/ /)
|
85
92
|
groups = tests_in_groups(files_array || tests_folder, num_processes, options)
|
86
93
|
end
|
87
94
|
num_processes = groups.size
|
@@ -110,7 +117,7 @@ class ParallelizedSpecs
|
|
110
117
|
abort "#{name.capitalize}s Failed" if failed
|
111
118
|
end
|
112
119
|
|
113
|
-
|
120
|
+
# parallel:spec[:count, :pattern, :options]
|
114
121
|
def self.parse_rake_args(args)
|
115
122
|
# order as given by user
|
116
123
|
args = [args[:count], args[:pattern], args[:options]]
|
@@ -129,9 +136,8 @@ class ParallelizedSpecs
|
|
129
136
|
[num_processes.to_i, pattern.to_s, options.to_s]
|
130
137
|
end
|
131
138
|
|
132
|
-
|
133
|
-
def self.tests_in_groups(
|
134
|
-
tests = find_tests(root, options)
|
139
|
+
# finds all tests and partitions them into groups
|
140
|
+
def self.tests_in_groups(tests, num_groups, options)
|
135
141
|
if options[:no_sort]
|
136
142
|
Grouper.in_groups(tests, num_groups)
|
137
143
|
else
|
@@ -176,7 +182,7 @@ class ParallelizedSpecs
|
|
176
182
|
|
177
183
|
protected
|
178
184
|
|
179
|
-
|
185
|
+
# read output of the process and print in in chucks
|
180
186
|
def self.fetch_output(process, options)
|
181
187
|
all = ''
|
182
188
|
buffer = ''
|
@@ -205,7 +211,7 @@ class ParallelizedSpecs
|
|
205
211
|
all
|
206
212
|
end
|
207
213
|
|
208
|
-
|
214
|
+
# copied from http://github.com/carlhuda/bundler Bundler::SharedHelpers#find_gemfile
|
209
215
|
def self.bundler_enabled?
|
210
216
|
return true if Object.const_defined?(:Bundler)
|
211
217
|
|
@@ -243,16 +249,17 @@ class ParallelizedSpecs
|
|
243
249
|
end
|
244
250
|
end
|
245
251
|
|
246
|
-
def self.find_tests(root, options)
|
252
|
+
def self.find_tests(root, options={})
|
247
253
|
if root.is_a?(Array)
|
248
254
|
root
|
249
255
|
else
|
250
256
|
# follow one symlink and direct children
|
251
257
|
# http://stackoverflow.com/questions/357754/can-i-traverse-symlinked-directories-in-ruby-with-a-glob
|
252
|
-
files = Dir["#{
|
258
|
+
files = Dir["#{root}/**{,/*/**}/*#{test_suffix}"].uniq
|
253
259
|
files = files.map { |f| f.sub(root+'/', '') }
|
254
|
-
files = files.grep(/#{options[
|
255
|
-
files.map { |f| "
|
260
|
+
files = files.grep(/#{options[:pattern]}/)
|
261
|
+
files.map { |f| "/#{f}" }
|
256
262
|
end
|
257
263
|
end
|
264
|
+
|
258
265
|
end
|
data/parallelized_specs.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = "parallelized_specs"
|
8
|
-
s.version = "0.1.
|
8
|
+
s.version = "0.1.8"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Jake Sorce, Bryan Madsen"]
|
12
|
-
s.date = "2012-05-
|
12
|
+
s.date = "2012-05-03"
|
13
13
|
s.email = "jake@instructure.com"
|
14
14
|
s.files = [
|
15
15
|
"Gemfile",
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: parallelized_specs
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 11
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 1
|
9
|
-
-
|
10
|
-
version: 0.1.
|
9
|
+
- 8
|
10
|
+
version: 0.1.8
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Jake Sorce, Bryan Madsen
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2012-05-
|
18
|
+
date: 2012-05-03 00:00:00 Z
|
19
19
|
dependencies:
|
20
20
|
- !ruby/object:Gem::Dependency
|
21
21
|
name: parallel
|