zerg_support 0.1.5 → 0.1.6
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/CHANGELOG +2 -0
- data/Rakefile +3 -3
- data/lib/zerg_support/protocols/frame_protocol.rb +6 -6
- data/lib/zerg_support/spawn.rb +32 -30
- data/test/test_spawn.rb +30 -31
- data/zerg_support.gemspec +11 -12
- metadata +69 -57
data/CHANGELOG
CHANGED
data/Rakefile
CHANGED
@@ -14,9 +14,9 @@ Echoe.new('zerg_support') do |p|
|
|
14
14
|
p.need_zip = !Gem.win_platform?
|
15
15
|
p.rdoc_pattern = /^(lib|bin|tasks|ext)|^BUILD|^README|^CHANGELOG|^TODO|^LICENSE|^COPYING$/
|
16
16
|
|
17
|
-
p.development_dependencies = [
|
18
|
-
|
19
|
-
|
17
|
+
p.development_dependencies = ['echoe >=3.0.2',
|
18
|
+
'event_machine >=0.12.2',
|
19
|
+
'flexmock >=0.8.3',
|
20
20
|
]
|
21
21
|
end
|
22
22
|
|
@@ -1,6 +1,6 @@
|
|
1
1
|
#:nodoc: namespace
|
2
2
|
module Zerg::Support::Protocols
|
3
|
-
|
3
|
+
|
4
4
|
# Protocol for sending and receiving discrete-sized frames over TCP streams.
|
5
5
|
module FrameProtocol
|
6
6
|
# Called when data is available from the TCP stream.
|
@@ -12,7 +12,7 @@ module FrameProtocol
|
|
12
12
|
loop do
|
13
13
|
while @frame_protocol_buffer.nil? and i < data.length
|
14
14
|
@frame_protocol_varsize << data[i]
|
15
|
-
if (data[i] & 0x80) == 0
|
15
|
+
if (data[i].ord & 0x80) == 0
|
16
16
|
@frame_protocol_bytes_left =
|
17
17
|
FrameProtocol.decode_natural @frame_protocol_varsize
|
18
18
|
@frame_protocol_buffer = ''
|
@@ -32,7 +32,7 @@ module FrameProtocol
|
|
32
32
|
@frame_protocol_buffer << data[i..-1]
|
33
33
|
@frame_protocol_bytes_left -= data.length - i
|
34
34
|
end
|
35
|
-
|
35
|
+
|
36
36
|
# Override to process incoming frames.
|
37
37
|
def received_frame(frame_data); end
|
38
38
|
|
@@ -40,7 +40,7 @@ module FrameProtocol
|
|
40
40
|
def send_frame(frame_data)
|
41
41
|
send_bytes FrameProtocol.encode_frame(frame_data)
|
42
42
|
end
|
43
|
-
|
43
|
+
|
44
44
|
# :nodoc: Encodes frame data into data to be sent across a TCP wire.
|
45
45
|
def self.encode_frame(frame_data)
|
46
46
|
encoded_length = FrameProtocol.encode_natural(frame_data.length)
|
@@ -57,7 +57,7 @@ module FrameProtocol
|
|
57
57
|
end
|
58
58
|
string
|
59
59
|
end
|
60
|
-
|
60
|
+
|
61
61
|
#:nodoc: Decodes a natural (non-negative) integer from a string.
|
62
62
|
def self.decode_natural(string)
|
63
63
|
number = 0
|
@@ -69,7 +69,7 @@ module FrameProtocol
|
|
69
69
|
multiplier *= 0x80
|
70
70
|
end
|
71
71
|
return number
|
72
|
-
end
|
72
|
+
end
|
73
73
|
end
|
74
74
|
|
75
75
|
end # namespace Zerg::Support::Protocols
|
data/lib/zerg_support/spawn.rb
CHANGED
@@ -12,7 +12,7 @@ if RUBY_PLATFORM =~ /win/ and RUBY_PLATFORM !~ /darwin/
|
|
12
12
|
# command line processing
|
13
13
|
command_line = '"' + binary + '" "' +
|
14
14
|
args.map { |a| a.gsub '"', '""' }.join('" "') + '"'
|
15
|
-
|
15
|
+
|
16
16
|
# environment processing
|
17
17
|
environment_string = nil
|
18
18
|
if options[:env]
|
@@ -25,7 +25,7 @@ if RUBY_PLATFORM =~ /win/ and RUBY_PLATFORM !~ /darwin/
|
|
25
25
|
map { |k| "#{k}=#{environment[k]}" }.join "\0"
|
26
26
|
environment_string << "\0"
|
27
27
|
end
|
28
|
-
|
28
|
+
|
29
29
|
# redirection processing
|
30
30
|
startup_info = {}
|
31
31
|
files = {}
|
@@ -47,7 +47,7 @@ if RUBY_PLATFORM =~ /win/ and RUBY_PLATFORM !~ /darwin/
|
|
47
47
|
end
|
48
48
|
end
|
49
49
|
deferred_opens.each { |d| d.call }
|
50
|
-
|
50
|
+
|
51
51
|
# process leader
|
52
52
|
creation_flags = 0
|
53
53
|
if options[:pgroup]
|
@@ -58,18 +58,18 @@ if RUBY_PLATFORM =~ /win/ and RUBY_PLATFORM !~ /darwin/
|
|
58
58
|
creation_flags |= Process::CREATE_NEW_PROCESS_GROUP
|
59
59
|
end
|
60
60
|
end
|
61
|
-
|
61
|
+
|
62
62
|
info = Process.create :command_line => command_line,
|
63
63
|
:cwd => options[:chdir] || Dir.pwd,
|
64
64
|
:environment => environment_string,
|
65
65
|
:creation_flags => creation_flags,
|
66
|
-
:startup_info => startup_info
|
66
|
+
:startup_info => startup_info
|
67
67
|
files.each { |name, io| io.close }
|
68
|
-
|
68
|
+
|
69
69
|
return info[:process_id]
|
70
70
|
end
|
71
71
|
end
|
72
|
-
|
72
|
+
|
73
73
|
else
|
74
74
|
|
75
75
|
#:nodoc:
|
@@ -80,32 +80,34 @@ else
|
|
80
80
|
def self.spawn(binary, args = [], options = {})
|
81
81
|
if Kernel.respond_to? :spawn
|
82
82
|
# ruby1.9+: spawn!
|
83
|
-
|
84
|
-
|
85
|
-
|
83
|
+
if options.has_key? :env
|
84
|
+
options = options.dup
|
85
|
+
env = options.delete(:env)
|
86
|
+
Kernel.spawn(*([env, binary] + args + [options]))
|
87
|
+
else
|
88
|
+
Kernel.spawn(*([binary] + args + [options]))
|
89
|
+
end
|
86
90
|
else
|
87
91
|
# below 1.9: emulate
|
88
|
-
|
92
|
+
|
89
93
|
# chdir option
|
90
94
|
Dir.chdir options[:chdir] if options[:chdir]
|
91
|
-
|
92
|
-
child_pid = fork do
|
95
|
+
|
96
|
+
child_pid = Process.fork do
|
93
97
|
Helpers.do_redirects options
|
94
|
-
Helpers.close_fds options
|
95
|
-
Helpers.set_process_group options
|
98
|
+
Helpers.close_fds options
|
99
|
+
Helpers.set_process_group options
|
96
100
|
Helpers.set_environment options
|
97
101
|
Helpers.set_rlimits options
|
98
|
-
|
102
|
+
|
99
103
|
Kernel.exec(*([binary] + args))
|
100
104
|
end
|
101
105
|
# Get rid of zombies.
|
102
106
|
Process.detach child_pid if options[:pgroup]
|
103
|
-
|
107
|
+
child_pid
|
104
108
|
end
|
105
|
-
|
106
|
-
return child_pid
|
107
109
|
end
|
108
|
-
end
|
110
|
+
end
|
109
111
|
end
|
110
112
|
|
111
113
|
# Helpers for spawning processes.
|
@@ -113,17 +115,17 @@ module Zerg::Support::Process::Helpers
|
|
113
115
|
# Closes all open file descriptors except for stdin/stdout/stderr
|
114
116
|
def self.close_fds(options)
|
115
117
|
return if options[:close_others] == false
|
116
|
-
|
118
|
+
|
117
119
|
ObjectSpace.each_object(IO) do |io|
|
118
120
|
next if [STDIN, STDOUT, STDERR].include? io
|
119
|
-
|
121
|
+
|
120
122
|
begin
|
121
123
|
io.close unless io.closed?
|
122
124
|
rescue Exception
|
123
125
|
end
|
124
126
|
end
|
125
127
|
end
|
126
|
-
|
128
|
+
|
127
129
|
# Sets process limits (rlimits) according to the given options. The options
|
128
130
|
# follow the convention of Kernel.spawn in ruby1.9
|
129
131
|
def self.set_rlimits(options)
|
@@ -135,33 +137,33 @@ module Zerg::Support::Process::Helpers
|
|
135
137
|
Process.setrlimit rconst, v.first, v.last
|
136
138
|
else
|
137
139
|
Process.setrlimit rconst, v
|
138
|
-
end
|
139
|
-
end
|
140
|
+
end
|
141
|
+
end
|
140
142
|
end
|
141
|
-
|
143
|
+
|
142
144
|
# Sets the process' group according to the given options. The options
|
143
145
|
# follow the convention of Kernel.spawn in ruby1.9
|
144
146
|
def self.set_process_group(options)
|
145
147
|
return unless options[:pgroup]
|
146
|
-
|
148
|
+
|
147
149
|
if options[:pgroup].kind_of? Numeric and options[:pgroup] > 0
|
148
150
|
Process.setpgid 0, options[:pgroup]
|
149
151
|
else
|
150
152
|
Process.setsid
|
151
153
|
end
|
152
154
|
end
|
153
|
-
|
155
|
+
|
154
156
|
# Sets the process' environment according to the given options. The options
|
155
157
|
# follow the convention of Kernel.spawn in ruby1.9
|
156
158
|
def self.set_environment(options)
|
157
159
|
return unless options[:env]
|
158
|
-
|
160
|
+
|
159
161
|
ENV.clear if options[:unsetenv_others]
|
160
162
|
options[:env].each do |key, value|
|
161
163
|
ENV[key] = value
|
162
164
|
end
|
163
165
|
end
|
164
|
-
|
166
|
+
|
165
167
|
# Performs IO redirections according to the given options. The options
|
166
168
|
# follow the convention of Kernel.spawn in ruby1.9
|
167
169
|
def self.do_redirects(options)
|
data/test/test_spawn.rb
CHANGED
@@ -12,7 +12,7 @@ class TestSpawn < Test::Unit::TestCase
|
|
12
12
|
File.open(now_cookie, 'w') {}
|
13
13
|
return now_cookie
|
14
14
|
end
|
15
|
-
|
15
|
+
|
16
16
|
def setup
|
17
17
|
super
|
18
18
|
Thread.abort_on_exception = true
|
@@ -25,15 +25,15 @@ class TestSpawn < Test::Unit::TestCase
|
|
25
25
|
File.delete @out_file rescue nil
|
26
26
|
super
|
27
27
|
end
|
28
|
-
|
28
|
+
|
29
29
|
def test_stdout_redirect
|
30
30
|
pid = Zerg::Support::Process.spawn 'ruby', ['-e', 'print "1234\n"'],
|
31
31
|
STDOUT => @out_file
|
32
32
|
Process.waitpid pid
|
33
|
-
|
33
|
+
|
34
34
|
assert_equal "1234\n", File.read(@out_file)
|
35
35
|
end
|
36
|
-
|
36
|
+
|
37
37
|
def test_stdin_redirect
|
38
38
|
File.open(@in_file, 'w') { |f| f.write "1234\n" }
|
39
39
|
|
@@ -47,47 +47,46 @@ class TestSpawn < Test::Unit::TestCase
|
|
47
47
|
pid = Zerg::Support::Process.spawn 'ruby', ['-e', "raise 'zerg_stderr'"],
|
48
48
|
STDERR => @out_file
|
49
49
|
Process.waitpid pid
|
50
|
-
|
50
|
+
assert_match(/zerg_stderr \(RuntimeError\)/m, File.read(@out_file))
|
51
51
|
end
|
52
|
-
|
52
|
+
|
53
53
|
def test_redirect_cascade
|
54
54
|
pid = Zerg::Support::Process.spawn 'ruby',
|
55
55
|
['-e', "print 1; raise 'zerg_stderr'"],
|
56
56
|
STDOUT => @out_file, STDERR => STDOUT
|
57
57
|
Process.waitpid pid
|
58
|
-
|
59
|
-
|
60
|
-
:include?, File.read(@out_file)
|
58
|
+
assert_match(/zerg_stderr \(RuntimeError\)/m, File.read(@out_file))
|
59
|
+
assert_match(/1\n/m, File.read(@out_file))
|
61
60
|
end
|
62
|
-
|
61
|
+
|
63
62
|
def test_redirect_share
|
64
63
|
pid = Zerg::Support::Process.spawn 'ruby',
|
65
64
|
['-e', "print 1; raise 'zerg_stderr'"],
|
66
65
|
STDOUT => @out_file, STDERR => @out_file
|
67
66
|
Process.waitpid pid
|
68
|
-
|
69
|
-
|
70
|
-
|
67
|
+
assert_match(/zerg_stderr \(RuntimeError\)/m, File.read(@out_file))
|
68
|
+
assert_match(/1/, File.read(@out_file))
|
69
|
+
assert_no_match(/1\n/m, File.read(@out_file))
|
71
70
|
end
|
72
|
-
|
71
|
+
|
73
72
|
def test_async
|
74
73
|
t0 = Time.now
|
75
74
|
pid = Zerg::Support::Process.spawn 'ruby', ['-e', 'sleep 0.5']
|
76
75
|
t1 = Time.now
|
77
76
|
Process.waitpid pid
|
78
77
|
t2 = Time.now
|
79
|
-
|
78
|
+
|
80
79
|
assert_operator t1 - t0, :<, 0.2, 'Spawning is not asynchronous'
|
81
80
|
assert_operator t2 - t0, :>, 0.5,
|
82
81
|
'The spawned program did not sleep for 1 second'
|
83
82
|
end
|
84
|
-
|
83
|
+
|
85
84
|
def test_set_environment
|
86
85
|
pid = Zerg::Support::Process.spawn 'ruby', ['-e', 'print ENV[\'XA\']'],
|
87
86
|
STDOUT => @out_file, :env => {'XA' => "1234\n"}
|
88
87
|
Process.waitpid pid
|
89
88
|
assert_equal "1234\n", File.read(@out_file)
|
90
|
-
|
89
|
+
|
91
90
|
pid = Zerg::Support::Process.spawn 'ruby', ['-e', 'print ENV[\'PATH\']'],
|
92
91
|
STDOUT => @in_file, :env => {'XA' => "1234\n"}, :unsetenv_others => true
|
93
92
|
Process.waitpid pid
|
@@ -95,28 +94,28 @@ class TestSpawn < Test::Unit::TestCase
|
|
95
94
|
output = File.read(@in_file)
|
96
95
|
assert output == 'nil' || output == '', 'The environment was not cleared'
|
97
96
|
end
|
98
|
-
|
97
|
+
|
99
98
|
def test_close_fd
|
100
99
|
in_file = File.open(@in_file, 'w')
|
101
100
|
in_file.sync = true
|
102
101
|
in_file.write "1234\n"
|
103
102
|
in_file.close
|
104
|
-
|
103
|
+
|
105
104
|
in_file = File.open(@in_file, 'r')
|
106
|
-
|
105
|
+
|
107
106
|
in_fd = in_file.fileno
|
108
107
|
read_fd_code = "File.open(#{in_fd}).read"
|
109
108
|
assert_equal "1234\n", eval(read_fd_code), 'File reading code is broken'
|
110
|
-
|
109
|
+
|
111
110
|
pid = Zerg::Support::Process.spawn 'ruby', ['-e', "print #{read_fd_code}"],
|
112
111
|
STDOUT => @out_file, STDERR => STDOUT
|
113
112
|
Process.waitpid pid
|
114
113
|
in_file.close
|
115
114
|
|
116
|
-
|
117
|
-
'Spawn does not close file descriptors'
|
115
|
+
assert_match(/^\-e\:1\:/, File.read(@out_file)[0, 5],
|
116
|
+
'Spawn does not close file descriptors')
|
118
117
|
end
|
119
|
-
|
118
|
+
|
120
119
|
def test_rlimit_processing
|
121
120
|
if RUBY_PLATFORM =~ /win/ and RUBY_PLATFORM !~ /darwin/
|
122
121
|
Process.const_set :RLIMIT_CPU, 'rlimit_cpu'
|
@@ -128,11 +127,11 @@ class TestSpawn < Test::Unit::TestCase
|
|
128
127
|
flexmock(Process).should_receive(:setrlimit).
|
129
128
|
with(Process::RLIMIT_RSS, 64 * 1024 * 1024).once.
|
130
129
|
and_return(nil)
|
131
|
-
|
130
|
+
|
132
131
|
Zerg::Support::Process::Helpers.set_rlimits :rlimit_cpu => [1, 5],
|
133
132
|
:rlimit_rss => 64 * 1024 * 1024
|
134
133
|
end
|
135
|
-
|
134
|
+
|
136
135
|
def test_process_group_processing
|
137
136
|
flexmock(Process).should_receive(:setpgid).with(0, 42).once.and_return(nil)
|
138
137
|
flexmock(Process).should_receive(:setsid).with().once.and_return(nil)
|
@@ -140,16 +139,16 @@ class TestSpawn < Test::Unit::TestCase
|
|
140
139
|
Zerg::Support::Process::Helpers.set_process_group :pgroup => 42
|
141
140
|
Zerg::Support::Process::Helpers.set_process_group :pgroup => true
|
142
141
|
end
|
143
|
-
|
142
|
+
|
144
143
|
def test_process_group
|
145
144
|
pid = Zerg::Support::Process.spawn 'ruby', ['-e', "sleep 0.5"],
|
146
145
|
:pgroup => true
|
147
146
|
pinfo = Zerg::Support::Process::process_info pid
|
148
147
|
Process.waitpid pid
|
149
|
-
|
148
|
+
|
150
149
|
assert pinfo[:state].index('s'), 'Failed to become session leader'
|
151
150
|
end
|
152
|
-
|
151
|
+
|
153
152
|
def test_rlimits
|
154
153
|
t0 = Time.now
|
155
154
|
pid = Zerg::Support::Process.spawn 'ruby',
|
@@ -157,8 +156,8 @@ class TestSpawn < Test::Unit::TestCase
|
|
157
156
|
:rlimit_cpu => 1
|
158
157
|
Process.waitpid pid
|
159
158
|
t1 = Time.now
|
160
|
-
|
159
|
+
|
161
160
|
assert_operator t1 - t0, :>=, 0.95, 'Spawning failed'
|
162
161
|
assert_operator t1 - t0, :<=, 2.0, 'Failed to apply rlimit_cpu'
|
163
162
|
end
|
164
|
-
end
|
163
|
+
end
|
data/zerg_support.gemspec
CHANGED
@@ -1,29 +1,28 @@
|
|
1
1
|
# -*- encoding: utf-8 -*-
|
2
2
|
|
3
3
|
Gem::Specification.new do |s|
|
4
|
-
s.name =
|
5
|
-
s.version = "0.1.
|
4
|
+
s.name = "zerg_support"
|
5
|
+
s.version = "0.1.6"
|
6
6
|
|
7
7
|
s.required_rubygems_version = Gem::Requirement.new(">= 1.2") if s.respond_to? :required_rubygems_version=
|
8
8
|
s.authors = ["Victor Costan"]
|
9
|
-
s.date =
|
10
|
-
s.description =
|
11
|
-
s.email =
|
9
|
+
s.date = "2012-12-18"
|
10
|
+
s.description = "Support libraries used by Zergling.Net deployment code."
|
11
|
+
s.email = "victor@zergling.net"
|
12
12
|
s.extra_rdoc_files = ["CHANGELOG", "lib/zerg_support/event_machine/connection_mocks.rb", "lib/zerg_support/event_machine/protocol_adapter.rb", "lib/zerg_support/gems.rb", "lib/zerg_support/open_ssh.rb", "lib/zerg_support/process.rb", "lib/zerg_support/protocols/frame_protocol.rb", "lib/zerg_support/protocols/object_protocol.rb", "lib/zerg_support/socket_factory.rb", "lib/zerg_support/sockets/protocol_adapter.rb", "lib/zerg_support/sockets/socket_mocks.rb", "lib/zerg_support/spawn.rb", "lib/zerg_support.rb", "LICENSE", "README"]
|
13
13
|
s.files = ["CHANGELOG", "lib/zerg_support/event_machine/connection_mocks.rb", "lib/zerg_support/event_machine/protocol_adapter.rb", "lib/zerg_support/gems.rb", "lib/zerg_support/open_ssh.rb", "lib/zerg_support/process.rb", "lib/zerg_support/protocols/frame_protocol.rb", "lib/zerg_support/protocols/object_protocol.rb", "lib/zerg_support/socket_factory.rb", "lib/zerg_support/sockets/protocol_adapter.rb", "lib/zerg_support/sockets/socket_mocks.rb", "lib/zerg_support/spawn.rb", "lib/zerg_support.rb", "LICENSE", "Manifest", "Rakefile", "README", "RUBYFORGE", "test/fork_tree.rb", "test/test_connection_mocks.rb", "test/test_frame_protocol.rb", "test/test_gems.rb", "test/test_object_protocol.rb", "test/test_open_ssh.rb", "test/test_process.rb", "test/test_socket_factory.rb", "test/test_spawn.rb", "zerg_support.gemspec"]
|
14
|
-
s.homepage =
|
14
|
+
s.homepage = "http://github.com/costan/zerg_support"
|
15
15
|
s.rdoc_options = ["--line-numbers", "--inline-source", "--title", "Zerg_support", "--main", "README"]
|
16
16
|
s.require_paths = ["lib"]
|
17
|
-
s.rubyforge_project =
|
18
|
-
s.rubygems_version =
|
19
|
-
s.summary =
|
20
|
-
s.test_files = ["test/
|
17
|
+
s.rubyforge_project = "zerglings"
|
18
|
+
s.rubygems_version = "1.8.24"
|
19
|
+
s.summary = "Support libraries used by Zergling.Net deployment code."
|
20
|
+
s.test_files = ["test/test_open_ssh.rb", "test/test_socket_factory.rb", "test/test_frame_protocol.rb", "test/test_connection_mocks.rb", "test/test_process.rb", "test/test_object_protocol.rb", "test/test_gems.rb", "test/test_spawn.rb"]
|
21
21
|
|
22
22
|
if s.respond_to? :specification_version then
|
23
|
-
current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
|
24
23
|
s.specification_version = 3
|
25
24
|
|
26
|
-
if Gem::Version.new(Gem::
|
25
|
+
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
27
26
|
s.add_development_dependency(%q<echoe>, [">= 3.0.2"])
|
28
27
|
s.add_development_dependency(%q<event_machine>, [">= 0.12.2"])
|
29
28
|
s.add_development_dependency(%q<flexmock>, [">= 0.8.3"])
|
metadata
CHANGED
@@ -1,54 +1,69 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: zerg_support
|
3
|
-
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.6
|
5
|
+
prerelease:
|
5
6
|
platform: ruby
|
6
|
-
authors:
|
7
|
+
authors:
|
7
8
|
- Victor Costan
|
8
9
|
autorequire:
|
9
10
|
bindir: bin
|
10
11
|
cert_chain: []
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
dependencies:
|
15
|
-
- !ruby/object:Gem::Dependency
|
12
|
+
date: 2012-12-18 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
16
15
|
name: echoe
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ! '>='
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: 3.0.2
|
17
22
|
type: :development
|
18
|
-
|
19
|
-
version_requirements: !ruby/object:Gem::Requirement
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ! '>='
|
28
|
+
- !ruby/object:Gem::Version
|
23
29
|
version: 3.0.2
|
24
|
-
|
25
|
-
- !ruby/object:Gem::Dependency
|
30
|
+
- !ruby/object:Gem::Dependency
|
26
31
|
name: event_machine
|
32
|
+
requirement: !ruby/object:Gem::Requirement
|
33
|
+
none: false
|
34
|
+
requirements:
|
35
|
+
- - ! '>='
|
36
|
+
- !ruby/object:Gem::Version
|
37
|
+
version: 0.12.2
|
27
38
|
type: :development
|
28
|
-
|
29
|
-
version_requirements: !ruby/object:Gem::Requirement
|
30
|
-
|
31
|
-
|
32
|
-
|
39
|
+
prerelease: false
|
40
|
+
version_requirements: !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - ! '>='
|
44
|
+
- !ruby/object:Gem::Version
|
33
45
|
version: 0.12.2
|
34
|
-
|
35
|
-
- !ruby/object:Gem::Dependency
|
46
|
+
- !ruby/object:Gem::Dependency
|
36
47
|
name: flexmock
|
48
|
+
requirement: !ruby/object:Gem::Requirement
|
49
|
+
none: false
|
50
|
+
requirements:
|
51
|
+
- - ! '>='
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
version: 0.8.3
|
37
54
|
type: :development
|
38
|
-
|
39
|
-
version_requirements: !ruby/object:Gem::Requirement
|
40
|
-
|
41
|
-
|
42
|
-
|
55
|
+
prerelease: false
|
56
|
+
version_requirements: !ruby/object:Gem::Requirement
|
57
|
+
none: false
|
58
|
+
requirements:
|
59
|
+
- - ! '>='
|
60
|
+
- !ruby/object:Gem::Version
|
43
61
|
version: 0.8.3
|
44
|
-
version:
|
45
62
|
description: Support libraries used by Zergling.Net deployment code.
|
46
63
|
email: victor@zergling.net
|
47
64
|
executables: []
|
48
|
-
|
49
65
|
extensions: []
|
50
|
-
|
51
|
-
extra_rdoc_files:
|
66
|
+
extra_rdoc_files:
|
52
67
|
- CHANGELOG
|
53
68
|
- lib/zerg_support/event_machine/connection_mocks.rb
|
54
69
|
- lib/zerg_support/event_machine/protocol_adapter.rb
|
@@ -64,7 +79,7 @@ extra_rdoc_files:
|
|
64
79
|
- lib/zerg_support.rb
|
65
80
|
- LICENSE
|
66
81
|
- README
|
67
|
-
files:
|
82
|
+
files:
|
68
83
|
- CHANGELOG
|
69
84
|
- lib/zerg_support/event_machine/connection_mocks.rb
|
70
85
|
- lib/zerg_support/event_machine/protocol_adapter.rb
|
@@ -93,45 +108,42 @@ files:
|
|
93
108
|
- test/test_socket_factory.rb
|
94
109
|
- test/test_spawn.rb
|
95
110
|
- zerg_support.gemspec
|
96
|
-
has_rdoc: true
|
97
111
|
homepage: http://github.com/costan/zerg_support
|
98
112
|
licenses: []
|
99
|
-
|
100
113
|
post_install_message:
|
101
|
-
rdoc_options:
|
114
|
+
rdoc_options:
|
102
115
|
- --line-numbers
|
103
116
|
- --inline-source
|
104
117
|
- --title
|
105
118
|
- Zerg_support
|
106
119
|
- --main
|
107
120
|
- README
|
108
|
-
require_paths:
|
121
|
+
require_paths:
|
109
122
|
- lib
|
110
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
required_rubygems_version: !ruby/object:Gem::Requirement
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
123
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
124
|
+
none: false
|
125
|
+
requirements:
|
126
|
+
- - ! '>='
|
127
|
+
- !ruby/object:Gem::Version
|
128
|
+
version: '0'
|
129
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
130
|
+
none: false
|
131
|
+
requirements:
|
132
|
+
- - ! '>='
|
133
|
+
- !ruby/object:Gem::Version
|
134
|
+
version: '1.2'
|
122
135
|
requirements: []
|
123
|
-
|
124
136
|
rubyforge_project: zerglings
|
125
|
-
rubygems_version: 1.
|
137
|
+
rubygems_version: 1.8.24
|
126
138
|
signing_key:
|
127
139
|
specification_version: 3
|
128
140
|
summary: Support libraries used by Zergling.Net deployment code.
|
129
|
-
test_files:
|
130
|
-
- test/test_spawn.rb
|
131
|
-
- test/test_socket_factory.rb
|
132
|
-
- test/test_gems.rb
|
141
|
+
test_files:
|
133
142
|
- test/test_open_ssh.rb
|
134
|
-
- test/
|
143
|
+
- test/test_socket_factory.rb
|
135
144
|
- test/test_frame_protocol.rb
|
136
|
-
- test/test_process.rb
|
137
145
|
- test/test_connection_mocks.rb
|
146
|
+
- test/test_process.rb
|
147
|
+
- test/test_object_protocol.rb
|
148
|
+
- test/test_gems.rb
|
149
|
+
- test/test_spawn.rb
|