specistent 0.0.1 → 0.0.2
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/bin/specistent +27 -7
- data/lib/specistent/specistent_client.rb +9 -4
- data/lib/specistent/specistent_server.rb +43 -4
- metadata +4 -4
data/Rakefile
CHANGED
data/bin/specistent
CHANGED
@@ -1,6 +1,11 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
|
3
|
-
require 'specistent'
|
3
|
+
# require 'specistent'
|
4
|
+
|
5
|
+
# development
|
6
|
+
$:.unshift File.join(File.dirname(__FILE__),'..','lib')
|
7
|
+
require File.join(File.dirname(__FILE__), '..', 'lib', 'specistent')
|
8
|
+
|
4
9
|
require 'optparse'
|
5
10
|
require 'yaml'
|
6
11
|
|
@@ -10,7 +15,9 @@ options = {
|
|
10
15
|
:port => 8081,
|
11
16
|
:env => 'test',
|
12
17
|
:remote => 'origin',
|
13
|
-
:yml => 'specistent.yml'
|
18
|
+
:yml => 'specistent.yml',
|
19
|
+
:workers => 1,
|
20
|
+
:migrate => true
|
14
21
|
}
|
15
22
|
|
16
23
|
OptionParser.new do |opts|
|
@@ -28,14 +35,18 @@ OptionParser.new do |opts|
|
|
28
35
|
options[:port] = p.to_i
|
29
36
|
end
|
30
37
|
|
31
|
-
opts.on(
|
32
|
-
options[:
|
38
|
+
opts.on('-w', '--workers [WORKERS]', Numeric, "workers (defaults to 1)") do |w|
|
39
|
+
options[:workers] = w
|
33
40
|
end
|
34
41
|
|
35
42
|
opts.on("-b","--branch BRANCH", "git branch to pull from (defaults to current branch)") do |b|
|
36
43
|
options[:branch] = b
|
37
44
|
end
|
38
45
|
|
46
|
+
opts.on("-m","--no-migrate", "do not migrate the database") do |m|
|
47
|
+
options[:migrate] = false
|
48
|
+
end
|
49
|
+
|
39
50
|
opts.on("-r","--remote REMOTE", "git remote to pull from (default origin)") do |r|
|
40
51
|
options[:remote] = r
|
41
52
|
end
|
@@ -48,14 +59,17 @@ end.parse!
|
|
48
59
|
|
49
60
|
if (SpecistentServer == options[:klass])
|
50
61
|
g = Git.open(Dir.pwd)
|
51
|
-
RENV = options[:env]
|
52
62
|
EventMachine::run {
|
53
|
-
puts "Started server on port #{options[:
|
54
|
-
EventMachine::start_server options[:host], options[:port], SpecistentServer
|
63
|
+
puts "Started server on #{options[:host]}:#{options[:port]} with #{options[:workers]} workers"
|
64
|
+
EventMachine::start_server( options[:host], options[:port], SpecistentServer ) { |s|
|
65
|
+
s.workers = options[:workers]
|
66
|
+
s.migrate = options[:migrate]
|
67
|
+
}
|
55
68
|
}
|
56
69
|
else
|
57
70
|
servers = YAML::load(File.read(options[:yml])).map { |s| s.split(":") << [] }
|
58
71
|
options[:branch] ||= Git.open(Dir.pwd).branch.name
|
72
|
+
@connections = []
|
59
73
|
EM.run {
|
60
74
|
queue = EM::Queue.new
|
61
75
|
processor = proc{ |connection_array|
|
@@ -64,7 +78,9 @@ else
|
|
64
78
|
c.branch = options[:branch]
|
65
79
|
c.remote = options[:remote]
|
66
80
|
c.start_spec
|
81
|
+
@connections << c
|
67
82
|
}
|
83
|
+
|
68
84
|
queue.pop(&processor)
|
69
85
|
}
|
70
86
|
queue.pop(&processor)
|
@@ -75,6 +91,10 @@ else
|
|
75
91
|
servers[server_index][2] << f
|
76
92
|
end
|
77
93
|
|
94
|
+
EventMachine::PeriodicTimer.new(5) do
|
95
|
+
EM.stop if @connections.all? { |c| !c.connected }
|
96
|
+
end
|
97
|
+
|
78
98
|
servers.each do |s|
|
79
99
|
queue.push(s)
|
80
100
|
end
|
@@ -3,9 +3,14 @@ require 'eventmachine'
|
|
3
3
|
require 'logger'
|
4
4
|
require 'git'
|
5
5
|
|
6
|
-
module SpecistentClient
|
6
|
+
module SpecistentClient
|
7
7
|
|
8
8
|
attr_accessor :files, :branch, :remote
|
9
|
+
attr_reader :connected
|
10
|
+
|
11
|
+
def initialize()
|
12
|
+
@connected = true
|
13
|
+
end
|
9
14
|
|
10
15
|
def start_spec
|
11
16
|
return puts "NO files" if files.empty?
|
@@ -13,12 +18,12 @@ module SpecistentClient # < EventMachine::Connection
|
|
13
18
|
end
|
14
19
|
|
15
20
|
def receive_data(data)
|
16
|
-
|
17
|
-
|
21
|
+
print data
|
22
|
+
STDOUT.flush
|
18
23
|
end
|
19
24
|
|
20
25
|
def unbind
|
21
|
-
|
26
|
+
@connected = false
|
22
27
|
end
|
23
28
|
|
24
29
|
end
|
@@ -10,27 +10,41 @@ module SpecProcess
|
|
10
10
|
end
|
11
11
|
|
12
12
|
def receive_data(data)
|
13
|
-
|
13
|
+
print data
|
14
14
|
@socket.send_data(data)
|
15
15
|
end
|
16
16
|
|
17
|
+
def unbind
|
18
|
+
@socket.worker_completed
|
19
|
+
end
|
20
|
+
|
17
21
|
end
|
18
22
|
|
19
23
|
class SpecistentServer < EM::Protocols::LineAndTextProtocol
|
20
24
|
include EM::Protocols::LineText2
|
21
25
|
|
26
|
+
attr_accessor :workers, :migrate
|
27
|
+
|
22
28
|
def initialize
|
23
|
-
@
|
29
|
+
@workers = 1
|
30
|
+
@migrate = true
|
31
|
+
@databuf = []
|
24
32
|
@g = nil
|
25
33
|
@directory = nil
|
34
|
+
@files = []
|
35
|
+
@worker_files = []
|
36
|
+
@running_workers = 0
|
26
37
|
end
|
27
38
|
|
28
39
|
def command(cmd)
|
29
40
|
case cmd
|
41
|
+
when /workers/
|
42
|
+
send_data(@workers)
|
30
43
|
when /run\s(\w*)\/(\w*)\s(.*)/
|
31
44
|
@g = Git.open(Dir.pwd)
|
32
45
|
puts @g.pull($1, "#{$1}/#{$2}", "#{$1} pull")
|
33
|
-
|
46
|
+
@files = $3.split(' ')
|
47
|
+
run_enviroments
|
34
48
|
else
|
35
49
|
send_data("unknown command #{cmd.inspect}\r\n")
|
36
50
|
end
|
@@ -38,12 +52,37 @@ class SpecistentServer < EM::Protocols::LineAndTextProtocol
|
|
38
52
|
|
39
53
|
def receive_data(data)
|
40
54
|
@databuf << data
|
41
|
-
puts data
|
42
55
|
if (/(.*)\;/ =~ @databuf.to_s)
|
43
56
|
command($1)
|
44
57
|
reset_databuf()
|
45
58
|
end
|
46
59
|
end
|
60
|
+
|
61
|
+
def run_enviroments
|
62
|
+
split_files
|
63
|
+
@workers.times do |i|
|
64
|
+
test_env_number = i < 1 ? nil : i
|
65
|
+
puts system("RAILS_ENV=test TEST_ENV_NUMBER=#{test_env_number} rake db:migrate") if @migrate
|
66
|
+
EM.popen("/bin/sh -c 'TEST_ENV_NUMBER=#{test_env_number} spec #{@worker_files[i].join(' ')}'", SpecProcess, self)
|
67
|
+
@running_workers += 1
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
def split_files
|
72
|
+
@workers.times { @worker_files << [] }
|
73
|
+
@files.each_with_index do |f, i|
|
74
|
+
worker_index = (i % @workers)
|
75
|
+
@worker_files[worker_index] << f
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
def worker_completed
|
80
|
+
@running_workers -= 1
|
81
|
+
puts "Working Completed #{@running_workers}"
|
82
|
+
if 0 == @running_workers
|
83
|
+
close_connection(true)
|
84
|
+
end
|
85
|
+
end
|
47
86
|
|
48
87
|
private
|
49
88
|
def reset_databuf
|
metadata
CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
|
|
5
5
|
segments:
|
6
6
|
- 0
|
7
7
|
- 0
|
8
|
-
-
|
9
|
-
version: 0.0.
|
8
|
+
- 2
|
9
|
+
version: 0.0.2
|
10
10
|
platform: ruby
|
11
11
|
authors:
|
12
12
|
- James Pozdena
|
@@ -14,8 +14,8 @@ autorequire: specistent
|
|
14
14
|
bindir: bin
|
15
15
|
cert_chain: []
|
16
16
|
|
17
|
-
date: 2010-04-
|
18
|
-
default_executable:
|
17
|
+
date: 2010-04-02 00:00:00 -07:00
|
18
|
+
default_executable:
|
19
19
|
dependencies: []
|
20
20
|
|
21
21
|
description: ""
|