hydra 0.10.3 → 0.11.0
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/README.rdoc +1 -1
- data/Rakefile +1 -0
- data/VERSION +1 -1
- data/hydra.gemspec +3 -2
- data/hydra_gray.png +0 -0
- data/lib/hydra/master.rb +41 -2
- data/lib/hydra/tasks.rb +9 -1
- data/test/master_test.rb +12 -0
- data/test/runner_test.rb +1 -0
- metadata +3 -2
data/README.rdoc
CHANGED
data/Rakefile
CHANGED
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
0.11.0
|
data/hydra.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{hydra}
|
8
|
-
s.version = "0.
|
8
|
+
s.version = "0.11.0"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Nick Gauthier"]
|
12
|
-
s.date = %q{2010-02-
|
12
|
+
s.date = %q{2010-02-17}
|
13
13
|
s.description = %q{Spread your tests over multiple machines to test your code faster.}
|
14
14
|
s.email = %q{nick@smartlogicsolutions.com}
|
15
15
|
s.extra_rdoc_files = [
|
@@ -27,6 +27,7 @@ Gem::Specification.new do |s|
|
|
27
27
|
"VERSION",
|
28
28
|
"caliper.yml",
|
29
29
|
"hydra.gemspec",
|
30
|
+
"hydra_gray.png",
|
30
31
|
"lib/hydra.rb",
|
31
32
|
"lib/hydra/hash.rb",
|
32
33
|
"lib/hydra/master.rb",
|
data/hydra_gray.png
ADDED
Binary file
|
data/lib/hydra/master.rb
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
require 'hydra/hash'
|
2
2
|
require 'open3'
|
3
|
+
require 'tmpdir'
|
3
4
|
module Hydra #:nodoc:
|
4
5
|
# Hydra class responsible for delegate work down to workers.
|
5
6
|
#
|
@@ -30,6 +31,8 @@ module Hydra #:nodoc:
|
|
30
31
|
@workers = []
|
31
32
|
@listeners = []
|
32
33
|
@verbose = opts.fetch('verbose') { false }
|
34
|
+
@report = opts.fetch('report') { false }
|
35
|
+
init_report_file
|
33
36
|
@sync = opts.fetch('sync') { nil }
|
34
37
|
|
35
38
|
# default is one worker that is configured to use a pipe with one runner
|
@@ -49,8 +52,11 @@ module Hydra #:nodoc:
|
|
49
52
|
# Send a file down to a worker.
|
50
53
|
def send_file(worker)
|
51
54
|
f = @files.shift
|
52
|
-
|
53
|
-
|
55
|
+
if f
|
56
|
+
trace "Sending #{f.inspect}"
|
57
|
+
report_start_time(f)
|
58
|
+
worker[:io].write(RunFile.new(:file => f))
|
59
|
+
end
|
54
60
|
end
|
55
61
|
|
56
62
|
# Process the results coming back from the worker.
|
@@ -59,6 +65,7 @@ module Hydra #:nodoc:
|
|
59
65
|
# only delete one
|
60
66
|
@incomplete_files.delete_at(@incomplete_files.index(message.file))
|
61
67
|
trace "#{@incomplete_files.size} Files Remaining"
|
68
|
+
report_finish_time(message.file)
|
62
69
|
if @incomplete_files.empty?
|
63
70
|
shutdown_all_workers
|
64
71
|
else
|
@@ -66,6 +73,9 @@ module Hydra #:nodoc:
|
|
66
73
|
end
|
67
74
|
end
|
68
75
|
|
76
|
+
# A text report of the time it took to run each file
|
77
|
+
attr_reader :report_text
|
78
|
+
|
69
79
|
private
|
70
80
|
|
71
81
|
def boot_workers(workers)
|
@@ -171,6 +181,35 @@ module Hydra #:nodoc:
|
|
171
181
|
end
|
172
182
|
|
173
183
|
@listeners.each{|l| l.join}
|
184
|
+
|
185
|
+
generate_report
|
186
|
+
end
|
187
|
+
|
188
|
+
def init_report_file
|
189
|
+
@report_file = File.join(Dir.tmpdir, 'hydra_report.txt')
|
190
|
+
FileUtils.rm_f(@report_file)
|
191
|
+
end
|
192
|
+
|
193
|
+
def report_start_time(file)
|
194
|
+
File.open(@report_file, 'a'){|f| f.write "#{file}|start|#{Time.now.to_f}\n" }
|
195
|
+
end
|
196
|
+
|
197
|
+
def report_finish_time(file)
|
198
|
+
File.open(@report_file, 'a'){|f| f.write "#{file}|finish|#{Time.now.to_f}\n" }
|
174
199
|
end
|
200
|
+
|
201
|
+
def generate_report
|
202
|
+
report = {}
|
203
|
+
lines = nil
|
204
|
+
File.open(@report_file, 'r'){|f| lines = f.read.split("\n")}
|
205
|
+
lines.each{|l| l = l.split('|'); report[l[0]] ||= {}; report[l[0]][l[1]] = l[2]}
|
206
|
+
report.each{|file, times| report[file]['duration'] = times['finish'].to_f - times['start'].to_f}
|
207
|
+
report = report.sort{|a, b| b[1]['duration'] <=> a[1]['duration']}
|
208
|
+
output = [""]
|
209
|
+
report.each{|file, times| output << "%.2f\t#{file}" % times['duration']}
|
210
|
+
output << "Report available @ #{@report_file}"
|
211
|
+
@report_text = output.join("\n")
|
212
|
+
end
|
213
|
+
|
175
214
|
end
|
176
215
|
end
|
data/lib/hydra/tasks.rb
CHANGED
@@ -18,6 +18,10 @@ module Hydra #:nodoc:
|
|
18
18
|
# Path to the hydra config file.
|
19
19
|
# If not set, it will check 'hydra.yml' and 'config/hydra.yml'
|
20
20
|
attr_accessor :config
|
21
|
+
|
22
|
+
# Set to true if you want hydra to generate a report.
|
23
|
+
# Defaults to fals
|
24
|
+
attr_accessor :report
|
21
25
|
#
|
22
26
|
# Search for the hydra config file
|
23
27
|
def find_config_file
|
@@ -45,6 +49,7 @@ module Hydra #:nodoc:
|
|
45
49
|
# t.add_files 'test/functional/**/*_test.rb'
|
46
50
|
# t.add_files 'test/integration/**/*_test.rb'
|
47
51
|
# t.verbose = false # optionally set to true for lots of debug messages
|
52
|
+
# t.report = true # optionally set to true for a final report of test times
|
48
53
|
# end
|
49
54
|
class TestTask < Hydra::Task
|
50
55
|
|
@@ -53,6 +58,7 @@ module Hydra #:nodoc:
|
|
53
58
|
@name = name
|
54
59
|
@files = []
|
55
60
|
@verbose = false
|
61
|
+
@report = false
|
56
62
|
|
57
63
|
yield self if block_given?
|
58
64
|
|
@@ -60,6 +66,7 @@ module Hydra #:nodoc:
|
|
60
66
|
|
61
67
|
@opts = {
|
62
68
|
:verbose => @verbose,
|
69
|
+
:report => @report,
|
63
70
|
:files => @files
|
64
71
|
}
|
65
72
|
if @config
|
@@ -77,7 +84,8 @@ module Hydra #:nodoc:
|
|
77
84
|
desc "Hydra Tests" + (@name == :hydra ? "" : " for #{@name}")
|
78
85
|
task @name do
|
79
86
|
$stdout.write "Hydra Testing #{files.inspect}\n"
|
80
|
-
Hydra::Master.new(@opts)
|
87
|
+
h = Hydra::Master.new(@opts)
|
88
|
+
$stdout.write h.report_text if @report
|
81
89
|
$stdout.write "\nHydra Completed\n"
|
82
90
|
exit(0) #bypass test on_exit output
|
83
91
|
end
|
data/test/master_test.rb
CHANGED
@@ -20,6 +20,18 @@ class MasterTest < Test::Unit::TestCase
|
|
20
20
|
assert_equal "HYDRA", File.read(target_file)
|
21
21
|
end
|
22
22
|
|
23
|
+
should "generate a report" do
|
24
|
+
Hydra::Master.new(
|
25
|
+
:files => [test_file],
|
26
|
+
:report => true
|
27
|
+
)
|
28
|
+
assert File.exists?(target_file)
|
29
|
+
assert_equal "HYDRA", File.read(target_file)
|
30
|
+
report_file = File.join(Dir.tmpdir, 'hydra_report.txt')
|
31
|
+
assert File.exists?(report_file)
|
32
|
+
assert_equal 2, File.read(report_file).split("\n").size
|
33
|
+
end
|
34
|
+
|
23
35
|
should "run a test 6 times on 1 worker with 2 runners" do
|
24
36
|
Hydra::Master.new(
|
25
37
|
:files => [test_file]*6,
|
data/test/runner_test.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: hydra
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.11.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Nick Gauthier
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2010-02-
|
12
|
+
date: 2010-02-17 00:00:00 -05:00
|
13
13
|
default_executable:
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
@@ -42,6 +42,7 @@ files:
|
|
42
42
|
- VERSION
|
43
43
|
- caliper.yml
|
44
44
|
- hydra.gemspec
|
45
|
+
- hydra_gray.png
|
45
46
|
- lib/hydra.rb
|
46
47
|
- lib/hydra/hash.rb
|
47
48
|
- lib/hydra/master.rb
|