prspec 0.2.1 → 0.2.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +15 -0
- data/lib/prspec.rb +40 -32
- metadata +5 -10
checksums.yaml
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
---
|
2
|
+
!binary "U0hBMQ==":
|
3
|
+
metadata.gz: !binary |-
|
4
|
+
YWE4YTYyMjc3YmY1MjM2NWQzM2E0OWFkZGM1YzJlMjY0NzI1NDViYw==
|
5
|
+
data.tar.gz: !binary |-
|
6
|
+
N2Y3ZmRjOTg2OTNjYTJmYmQ4NjA5ZjdkZjZjMmUxMDgzMmI1ZWI4ZQ==
|
7
|
+
SHA512:
|
8
|
+
metadata.gz: !binary |-
|
9
|
+
YTcxOGEyYmM2NWFjMWQwNjdiZmZmOGI4NDFhYTIwODQ3MGM4MzE2MGViM2U2
|
10
|
+
N2EyNGY2NGM4MTRiYzc0ZWMxZmY2NTI0ZWFmNGU0ZmI5M2IwOTA1YjQyYTIz
|
11
|
+
M2U4MDI2ZTEwODhjZTVkZGEzYzBmZWRkZjc5NDQ0MGFmYTQ3Yzg=
|
12
|
+
data.tar.gz: !binary |-
|
13
|
+
MWQ0ZDc0NTgyMzU1YTUzYTQwMWI0ZGJkMmY0NjJjNmI1MWI5MmQ5Zjg0NmQ2
|
14
|
+
Yjc1M2NjMzRkMTUyYjQzZThhNmEyM2U1MGM4NGI0ODBlNjQwMzk1NDljNjM5
|
15
|
+
ZTUyMjFhZjZkZWQ0MWI5ZmIyNmMwODE2MDhjNWQwOTU4NTg3Mjk=
|
data/lib/prspec.rb
CHANGED
@@ -2,7 +2,9 @@ require 'thread'
|
|
2
2
|
require 'optparse'
|
3
3
|
require 'log4r'
|
4
4
|
require 'parallel'
|
5
|
+
require 'yaml'
|
5
6
|
require 'tempfile'
|
7
|
+
require 'fileutils'
|
6
8
|
include Log4r
|
7
9
|
|
8
10
|
$log = Logger.new('prspec')
|
@@ -22,10 +24,15 @@ else
|
|
22
24
|
end
|
23
25
|
|
24
26
|
class PRSpec
|
25
|
-
attr_accessor :num_threads, :processes, :tests
|
27
|
+
attr_accessor :num_threads, :processes, :tests, :output
|
26
28
|
SPEC_FILE_FILTER = '_spec.rb'
|
29
|
+
INFO_FILE = ".prspec"
|
27
30
|
|
28
31
|
def initialize(args)
|
32
|
+
@output = ''
|
33
|
+
# create tracking file
|
34
|
+
yml = { :running_threads => 0 }
|
35
|
+
File.open(INFO_FILE, 'w') { |f| f.write yml.to_yaml }
|
29
36
|
if (!args.nil? && args.length > 0 && !args[0].nil?)
|
30
37
|
opts = parse_args(args)
|
31
38
|
if (!opts[:help])
|
@@ -46,6 +53,8 @@ class PRSpec
|
|
46
53
|
begin_run(@processes, opts)
|
47
54
|
end
|
48
55
|
end
|
56
|
+
ensure
|
57
|
+
FileUtils.remove_file(INFO_FILE, :force => true) if File.exists?(INFO_FILE)
|
49
58
|
end
|
50
59
|
|
51
60
|
def parse_args(args)
|
@@ -53,7 +62,7 @@ class PRSpec
|
|
53
62
|
options = {
|
54
63
|
:dir=>'.',
|
55
64
|
:path=>'spec',
|
56
|
-
:thread_count=>
|
65
|
+
:thread_count=>get_number_of_processors,
|
57
66
|
:test_mode=>false,
|
58
67
|
:help=>false,
|
59
68
|
:excludes=>nil,
|
@@ -127,26 +136,14 @@ class PRSpec
|
|
127
136
|
return options
|
128
137
|
end
|
129
138
|
|
130
|
-
def
|
139
|
+
def get_number_of_processors
|
131
140
|
count = Parallel.processor_count
|
132
141
|
return count
|
133
142
|
end
|
134
143
|
|
135
144
|
def self.get_number_of_running_threads
|
136
|
-
|
137
|
-
|
138
|
-
cmd = "wmic process get commandline"
|
139
|
-
end
|
140
|
-
result = `#{cmd}`
|
141
|
-
count = 0
|
142
|
-
lines = result.split("\n")
|
143
|
-
lines.each do |line|
|
144
|
-
if (line.include?('TEST_ENV_NUMBER='))
|
145
|
-
count += 1
|
146
|
-
end
|
147
|
-
end
|
148
|
-
$log.debug "Found #{count} occurrances of TEST_ENV_NUMBER"
|
149
|
-
return count
|
145
|
+
prspec_info = YAML.load_file(INFO_FILE)
|
146
|
+
return prspec_info[:running_threads].to_i
|
150
147
|
end
|
151
148
|
|
152
149
|
def get_spec_tests(options)
|
@@ -248,6 +245,7 @@ class PRSpec
|
|
248
245
|
def begin_run(processes, options)
|
249
246
|
if (!processes.nil? && processes.length > 0)
|
250
247
|
$log.info "Starting all Child Processes..."
|
248
|
+
update_running_thread_count(processes.length)
|
251
249
|
processes.each do |proc|
|
252
250
|
if (proc.is_a?(PRSpecThread) && options.is_a?(Hash))
|
253
251
|
proc.start unless options[:test_mode]
|
@@ -255,30 +253,38 @@ class PRSpec
|
|
255
253
|
raise "Invalid datatype where PRSpecThread or Hash exepcted. Found: #{proc.class.to_s}, #{options.class.to_s}"
|
256
254
|
end
|
257
255
|
end
|
258
|
-
$log.info "
|
259
|
-
|
260
|
-
while continue
|
261
|
-
continue = false
|
256
|
+
$log.info "All processes started..."
|
257
|
+
while processes.length > 0
|
262
258
|
processes.each do |proc|
|
263
259
|
if (!proc.done?) # confirm threads are running
|
264
|
-
continue = true
|
265
260
|
$log.debug "Thread#{proc.id}: alive..."
|
266
261
|
else
|
267
262
|
$log.debug "Thread#{proc.id}: done."
|
268
|
-
#
|
269
|
-
|
263
|
+
# collect thread output if in quiet mode
|
264
|
+
if (options[:quiet_mode])
|
265
|
+
@output << proc.output
|
266
|
+
end
|
267
|
+
processes.delete(proc) # remove from the array of processes so we don't count it again
|
268
|
+
update_running_thread_count(processes.length)
|
270
269
|
end
|
271
270
|
end
|
272
|
-
|
273
|
-
sleep(5) # wait a bit for processes to run and then re-check their status
|
274
|
-
end
|
271
|
+
sleep 0.5 # wait half a second for processes to run and then re-check their status
|
275
272
|
end
|
276
|
-
$log.info "
|
273
|
+
$log.info "All processes complete."
|
277
274
|
else
|
278
275
|
raise "Invalid input passed to method: 'processes' must be a valid Array of PRSpecThread objects"
|
279
276
|
end
|
280
277
|
end
|
281
278
|
|
279
|
+
def update_running_thread_count(count)
|
280
|
+
(file = File.new(INFO_FILE,'w')).flock(File::LOCK_EX)
|
281
|
+
yml = { :running_threads => count }
|
282
|
+
file.write yml.to_yaml
|
283
|
+
ensure
|
284
|
+
file.flock(File::LOCK_UN)
|
285
|
+
file.close
|
286
|
+
end
|
287
|
+
|
282
288
|
def running?
|
283
289
|
@processes.each do |proc|
|
284
290
|
if (!proc.done?)
|
@@ -308,8 +314,10 @@ class PRSpecThread
|
|
308
314
|
@env = environment
|
309
315
|
@args = args
|
310
316
|
@output = ''
|
311
|
-
@out = "prspec-t-#{@id}.out"
|
312
|
-
@
|
317
|
+
@out = Tempfile.new("prspec-t-#{@id}.out").path
|
318
|
+
$log.debug("Thread#{@id} @out file: #{@out}")
|
319
|
+
@err = Tempfile.new("prspec-t-#{@id}.err").path
|
320
|
+
$log.debug("Thread#{@id} @err file: #{@err}")
|
313
321
|
end
|
314
322
|
|
315
323
|
def start
|
@@ -350,8 +358,8 @@ class PRSpecThread
|
|
350
358
|
@thread.sleep
|
351
359
|
@thread.kill
|
352
360
|
@thread = nil
|
353
|
-
|
354
|
-
|
361
|
+
FileUtils.remove_file(@out, :force => true) unless !File.exist?(@out)
|
362
|
+
FileUtils.remove_file(@err, :force => true) unless !File.exist?(@err)
|
355
363
|
end
|
356
364
|
|
357
365
|
def get_exports
|
metadata
CHANGED
@@ -1,8 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: prspec
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
5
|
-
prerelease:
|
4
|
+
version: 0.2.2
|
6
5
|
platform: ruby
|
7
6
|
authors:
|
8
7
|
- Jason Holt Smith
|
@@ -14,7 +13,6 @@ dependencies:
|
|
14
13
|
- !ruby/object:Gem::Dependency
|
15
14
|
name: log4r
|
16
15
|
requirement: !ruby/object:Gem::Requirement
|
17
|
-
none: false
|
18
16
|
requirements:
|
19
17
|
- - ! '>='
|
20
18
|
- !ruby/object:Gem::Version
|
@@ -22,7 +20,6 @@ dependencies:
|
|
22
20
|
type: :runtime
|
23
21
|
prerelease: false
|
24
22
|
version_requirements: !ruby/object:Gem::Requirement
|
25
|
-
none: false
|
26
23
|
requirements:
|
27
24
|
- - ! '>='
|
28
25
|
- !ruby/object:Gem::Version
|
@@ -30,7 +27,6 @@ dependencies:
|
|
30
27
|
- !ruby/object:Gem::Dependency
|
31
28
|
name: parallel
|
32
29
|
requirement: !ruby/object:Gem::Requirement
|
33
|
-
none: false
|
34
30
|
requirements:
|
35
31
|
- - ! '>='
|
36
32
|
- !ruby/object:Gem::Version
|
@@ -38,7 +34,6 @@ dependencies:
|
|
38
34
|
type: :runtime
|
39
35
|
prerelease: false
|
40
36
|
version_requirements: !ruby/object:Gem::Requirement
|
41
|
-
none: false
|
42
37
|
requirements:
|
43
38
|
- - ! '>='
|
44
39
|
- !ruby/object:Gem::Version
|
@@ -55,26 +50,26 @@ files:
|
|
55
50
|
homepage: https://github.com/bicarbon8/prspec.git
|
56
51
|
licenses:
|
57
52
|
- MIT
|
53
|
+
metadata: {}
|
58
54
|
post_install_message:
|
59
55
|
rdoc_options: []
|
60
56
|
require_paths:
|
61
57
|
- lib
|
62
58
|
required_ruby_version: !ruby/object:Gem::Requirement
|
63
|
-
none: false
|
64
59
|
requirements:
|
65
60
|
- - ! '>='
|
66
61
|
- !ruby/object:Gem::Version
|
67
62
|
version: '0'
|
68
63
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
69
|
-
none: false
|
70
64
|
requirements:
|
71
65
|
- - ! '>='
|
72
66
|
- !ruby/object:Gem::Version
|
73
67
|
version: '0'
|
74
68
|
requirements: []
|
75
69
|
rubyforge_project:
|
76
|
-
rubygems_version:
|
70
|
+
rubygems_version: 2.2.1
|
77
71
|
signing_key:
|
78
|
-
specification_version:
|
72
|
+
specification_version: 4
|
79
73
|
summary: Parallel rspec execution
|
80
74
|
test_files: []
|
75
|
+
has_rdoc:
|