spool 0.1.1 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 0548f5c405ead7e5fa0f5b61fe9d715b289385c3
4
- data.tar.gz: ae94274bf5d724f65ba0128d9e1ecbe68e306de9
3
+ metadata.gz: 4cd28f69dbcc9fa880576478edc6c7da20bfe41c
4
+ data.tar.gz: fbd79a844212f9e8d3c77e2f9ea6da765ecfd339
5
5
  SHA512:
6
- metadata.gz: 1c7b0bec7c5d9aa71f97a3026819df40d0e7bb809c903388bc1d3ccca9361f25b86b48fdf3955590eb0b755d27fd73adeaae5771511af223c64c9b7c5b70712e
7
- data.tar.gz: 2c4f1770e103ae67b8e2ad504d1a573054937f7310e58fce96834bd2cc769f37ba4853fa735ef79373e8e5f4767f84d3c8f41a6fb3bf00528004e16b658f6f30
6
+ metadata.gz: ffbdf6dbf85151a900a0e916a63c939cd545e7b9a3be53375de57b66ef4d0dd9967abc0019e368104bc7e83b91c7ea1ff57a52c902bd78ede03528d2a4fc5d4d
7
+ data.tar.gz: 3f5cdd7df01709e49ad1de4d79c2be498d48df165c0a6b20f8b3ab2e7f4530519bbed0202bec5fc4b4e9eba16b14a0773b13d626f12bbab9ab08e51091261092
data/.ruby-version CHANGED
@@ -1 +1 @@
1
- ruby 2.0
1
+ ruby 2.1
data/.travis.yml CHANGED
@@ -3,4 +3,13 @@ rvm:
3
3
  - 1.9.3
4
4
  - 2.0
5
5
  - 2.1
6
- - 2.2
6
+ - 2.2
7
+ - 2.3.0
8
+ - 2.4.0
9
+ - 2.5.0
10
+ - ruby-head
11
+
12
+ matrix:
13
+ fast_finish: true
14
+ allow_failures:
15
+ - rvm: ruby-head
data/README.md CHANGED
@@ -1,10 +1,10 @@
1
1
  # Spool
2
2
 
3
- [![Gem Version](https://badge.fury.io/rb/spool.png)](https://rubygems.org/gems/spool)
4
- [![Build Status](https://travis-ci.org/gabynaiman/spool.png?branch=master)](https://travis-ci.org/gabynaiman/spool)
5
- [![Coverage Status](https://coveralls.io/repos/gabynaiman/spool/badge.png?branch=master)](https://coveralls.io/r/gabynaiman/spool?branch=master)
6
- [![Code Climate](https://codeclimate.com/github/gabynaiman/spool.png)](https://codeclimate.com/github/gabynaiman/spool)
7
- [![Dependency Status](https://gemnasium.com/gabynaiman/spool.png)](https://gemnasium.com/gabynaiman/spool)
3
+ [![Gem Version](https://badge.fury.io/rb/spool.svg)](https://rubygems.org/gems/spool)
4
+ [![Build Status](https://travis-ci.org/gabynaiman/spool.svg?branch=master)](https://travis-ci.org/gabynaiman/spool)
5
+ [![Coverage Status](https://coveralls.io/repos/gabynaiman/spool/badge.svg?branch=master)](https://coveralls.io/r/gabynaiman/spool?branch=master)
6
+ [![Code Climate](https://codeclimate.com/github/gabynaiman/spool.svg)](https://codeclimate.com/github/gabynaiman/spool)
7
+ [![Dependency Status](https://gemnasium.com/gabynaiman/spool.svg)](https://gemnasium.com/gabynaiman/spool)
8
8
 
9
9
  Manage and keep alive pool of processes
10
10
 
data/Rakefile CHANGED
@@ -3,8 +3,15 @@ require 'rake/testtask'
3
3
 
4
4
  Rake::TestTask.new(:spec) do |t|
5
5
  t.libs << 'spec'
6
- t.pattern = 'spec/**/*_spec.rb'
6
+ t.libs << 'lib'
7
+ t.pattern = ENV['DIR'] ? File.join(ENV['DIR'], '**', '*_spec.rb') : 'spec/**/*_spec.rb'
7
8
  t.verbose = false
9
+ t.warning = false
10
+ t.loader = nil if ENV['TEST']
11
+ ENV['TEST'], ENV['LINE'] = ENV['TEST'].split(':') if ENV['TEST'] && !ENV['LINE']
12
+ t.options = ''
13
+ t.options << "--name=/#{ENV['NAME']}/ " if ENV['NAME']
14
+ t.options << "-l #{ENV['LINE']} " if ENV['LINE'] && ENV['TEST']
8
15
  end
9
16
 
10
17
  desc 'Console'
data/lib/spool/pool.rb CHANGED
@@ -1,6 +1,8 @@
1
1
  module Spool
2
2
  class Pool
3
3
 
4
+ CHECK_TIMEOUT = 0.01
5
+
4
6
  SIGNALS = {
5
7
  INT: :stop!,
6
8
  TERM: :stop!,
@@ -11,24 +13,32 @@ module Spool
11
13
  TTOU: :decr
12
14
  }
13
15
 
14
- attr_reader :configuration, :runner, :processes
16
+ attr_reader :configuration, :processes
15
17
 
16
18
  def initialize(configuration=nil, &block)
17
19
  @configuration = configuration || DSL.configure(&block)
18
20
  @processes = []
19
- @started = false
21
+ @running = false
22
+ @actions_queue = []
20
23
  end
21
24
 
22
- def started?
23
- @started
25
+ def running?
26
+ @running
24
27
  end
25
28
 
26
29
  def stopped?
27
- !started?
30
+ !running?
31
+ end
32
+
33
+ [:incr, :decr, :reload, :restart, :stop, :stop!].each do |method|
34
+ define_method method do |*args|
35
+ actions_queue.push(name: "_#{method}".to_sym, args: args)
36
+ nil
37
+ end
28
38
  end
29
39
 
30
40
  def start
31
- @started = true
41
+ @running = true
32
42
 
33
43
  handle_signals
34
44
 
@@ -37,65 +47,45 @@ module Spool
37
47
  configuration.processes.times.map do
38
48
  processes << Spawner.spawn(configuration)
39
49
  end
40
- logger.info(self.class) { "SPOOL START childrens: #{processes.map(&:pid)}" }
41
-
42
- while @started
43
- check_status
44
- sleep 0.05
45
- end
46
- end
47
-
48
- def stop(timeout=0)
49
- logger.info(self.class) { "SPOOL STOP" }
50
- stop_processes processes
51
- Timeout.timeout(timeout) { wait_for_stopped processes }
52
- rescue Timeout::Error
53
- logger.error(self.class) { "ERROR IN SPOOL STOP. Timeout error" }
54
- ensure
55
- stop!
56
- end
57
-
58
- def stop!
59
- @started = false
60
- logger.info(self.class) { "SPOOL STOP! kill this children (#{processes.map(&:pid)})" }
61
- processes.each { |p| p.send_signal configuration.kill_signal}
62
- wait_for_stopped processes
63
- processes.clear
64
- File.delete configuration.pid_file if File.exists? configuration.pid_file
65
- end
66
50
 
67
- def incr(count=1)
68
- configuration.processes += count
69
- end
51
+ logger.info(self.class) { "SPOOL START childrens: #{processes.map(&:pid)}" }
70
52
 
71
- def decr(count=1)
72
- configuration.processes -= count
73
- end
53
+ while running?
54
+ action = actions_queue.pop
55
+
56
+ if action
57
+ logger.info(self.class) { "Starting action #{action[:name]} with params: [#{action[:args].join(', ')}]" }
58
+ send action[:name], *action[:args]
59
+ end
74
60
 
75
- def reload
76
- @configuration = DSL.configure configuration.source_file if configuration.source_file
77
- end
61
+ if running?
62
+ check_status
63
+ sleep CHECK_TIMEOUT
64
+ end
65
+ end
78
66
 
79
- def restart
80
- logger.info(self.class) { "RESTART" }
81
- stop_processes processes
67
+ logger.info(self.class) { "Spool finished successfully!" }
82
68
  end
83
69
 
84
70
  private
85
71
 
72
+ attr_reader :actions_queue
73
+
86
74
  def handle_signals
87
75
  SIGNALS.each do |signal, event|
88
- Signal.trap(signal) { send event }
76
+ Signal.trap(signal) do
77
+ logger.info(self.class) { "Signal #{signal} received. Current state of actions queue is:\n#{format_actions_queue}" }
78
+ send event
79
+ end
89
80
  end
90
81
  end
91
82
 
92
- def check_status
93
- return if stopped?
94
-
95
- stop_processes processes.select(&configuration.restart_condition)
83
+ def check_status
96
84
  processes.delete_if { |p| !p.alive? }
85
+
86
+ to_restart = processes.select(&configuration.restart_condition)
87
+ stop_processes to_restart
97
88
 
98
- return if stopped?
99
89
  if configuration.processes > processes.count
100
90
  logger.info(self.class) { "Initialize new children: #{processes.map(&:pid)}" }
101
91
 
@@ -103,8 +93,7 @@ module Spool
103
93
  processes << Spawner.spawn(configuration)
104
94
  end
105
95
 
106
- logger.info(self.class) { "new children: #{processes.map(&:pid)}" }
107
-
96
+ logger.info(self.class) { "New children: #{processes.map(&:pid)}" }
108
97
  elsif configuration.processes < processes.count
109
98
  logger.info(self.class) { "Kill childrens: #{processes.map(&:pid)}" }
110
99
 
@@ -116,12 +105,72 @@ module Spool
116
105
  logger.info(self.class) { "After kill childrens: #{processes.map(&:pid)}" }
117
106
  end
118
107
 
119
- rescue
120
- retry
108
+ rescue Exception => e
109
+ log_error e
110
+ end
111
+
112
+
113
+ def _incr(count=1)
114
+ configuration.processes += count
115
+ end
116
+
117
+ def _decr(count=1)
118
+ configuration.processes -= count
119
+ configuration.processes = 0 if configuration.processes < 0
120
+ end
121
+
122
+ def _reload
123
+ @configuration = DSL.configure configuration.source_file if configuration.source_file
124
+ end
125
+
126
+ def _restart
127
+ logger.info(self.class) { "RESTART" }
128
+ stop_processes processes
129
+ end
130
+
131
+ def _stop(timeout=0)
132
+ logger.info(self.class) { "SPOOL STOP" }
133
+
134
+ stop_processes processes
135
+ Timeout.timeout(timeout) { wait_for_stopped processes }
136
+ rescue Timeout::Error
137
+ logger.error(self.class) { "ERROR IN SPOOL STOP. Timeout error" }
138
+ ensure
139
+ _stop!
140
+ @running = false
141
+ end
142
+
143
+ def _stop!
144
+ logger.info(self.class) { "SPOOL STOP! kill this children (#{processes.map(&:pid)})" }
145
+
146
+ processes.each do |p|
147
+ begin
148
+ p.send_signal(configuration.kill_signal) if p.alive?
149
+ rescue Datacenter::Shell::CommandError => e
150
+ if p.alive?
151
+ log_error e
152
+ else
153
+ logger.info(self.class) { "Signal KILL was sent to #{p.pid} but process was already dead" }
154
+ end
155
+ end
156
+ end
157
+
158
+ wait_for_stopped processes
159
+
160
+ processes.clear
161
+
162
+ File.delete configuration.pid_file if File.exist? configuration.pid_file
163
+ @running = false
121
164
  end
122
165
 
123
166
  def stop_processes(processes_list)
124
- processes_list.each { |p| p.send_signal configuration.stop_signal }
167
+ processes_list.each do |p|
168
+ begin
169
+ p.send_signal configuration.stop_signal
170
+ rescue Exception => e
171
+ log_error e
172
+ end
173
+ end
125
174
  end
126
175
 
127
176
  def wait_for_stopped(processes)
@@ -134,6 +183,18 @@ module Spool
134
183
  configuration.logger
135
184
  end
136
185
 
186
+ def log_error(error)
187
+ logger.error(self.class) { "#{error.message}\n#{error.backtrace.join("\n")}" }
188
+ end
189
+
190
+ def format_actions_queue
191
+ return "EMPTY" if actions_queue.empty?
192
+
193
+ actions_queue.map.with_index do |action, index|
194
+ "#{index+1} => #{a[:name]}"
195
+ end.join("\n")
196
+ end
197
+
137
198
  end
138
199
 
139
200
  end
data/lib/spool/spawner.rb CHANGED
@@ -9,48 +9,28 @@ module Spool
9
9
 
10
10
  def spawn
11
11
  base_file = File.join Dir.tmpdir, SecureRandom.uuid
12
- pid_file = "#{base_file}.pid"
13
12
  out_file = "#{base_file}.out"
14
- script_file = "#{base_file}.sh"
13
+ command = configuration.command.strip
15
14
 
16
- File.write script_file, %Q{
17
- #!/usr/bin/env bash
18
- #{configuration.command.strip} &
19
- echo $! > #{pid_file}
20
- }
15
+ pid = Process.spawn configuration.env,
16
+ "exec #{command}",
17
+ chdir: configuration.dir,
18
+ out: out_file,
19
+ err: out_file
21
20
 
22
- ::Process.spawn configuration.env,
23
- "sh #{script_file}",
24
- chdir: configuration.dir,
25
- out: out_file,
26
- err: out_file
27
-
28
- pid = wait_for_pid pid_file
21
+ Process.detach pid
29
22
 
30
23
  Datacenter::Process.new(pid).tap do |process|
31
- raise "Invalid command: #{configuration.command}\n#{IO.read(out_file)}" unless process.alive?
24
+ raise "Invalid command: #{command}\n#{IO.read(out_file)}" unless process.alive?
32
25
  end
33
26
 
34
27
  ensure
35
- [script_file, out_file, pid_file].each do |filename|
36
- File.delete filename if File.exists? filename
37
- end
28
+ File.delete out_file if File.exist? out_file
38
29
  end
39
30
 
40
31
  def self.spawn(configuration)
41
32
  new(configuration).spawn
42
33
  end
43
34
 
44
- private
45
-
46
- def wait_for_pid(pid_file)
47
- Timeout.timeout(60) do
48
- until File.exists?(pid_file); end
49
- IO.read(pid_file).to_i
50
- end
51
- rescue Timeout::Error
52
- nil
53
- end
54
-
55
35
  end
56
36
  end
data/lib/spool/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Spool
2
- VERSION = '0.1.1'
3
- end
2
+ VERSION = '1.0.0'
3
+ end
@@ -1,8 +1,5 @@
1
1
  require 'simplecov'
2
2
  require 'coveralls'
3
3
 
4
- SimpleCov.formatter = SimpleCov::Formatter::MultiFormatter[
5
- SimpleCov::Formatter::HTMLFormatter,
6
- Coveralls::SimpleCov::Formatter
7
- ]
4
+ SimpleCov.formatter = SimpleCov::Formatter::MultiFormatter.new [SimpleCov::Formatter::HTMLFormatter, Coveralls::SimpleCov::Formatter]
8
5
  SimpleCov.start
data/spec/dsl_spec.rb CHANGED
@@ -21,7 +21,7 @@ describe Spool::DSL do
21
21
  end
22
22
 
23
23
  assert_configuration config
24
- config.source_file.must_equal nil
24
+ config.source_file.must_be_nil
25
25
  end
26
26
 
27
27
  it 'Configure from file' do
@@ -1,12 +1,6 @@
1
1
  require 'coverage_helper'
2
2
  require 'minitest/autorun'
3
- require 'turn'
3
+ require 'minitest/colorin'
4
4
  require 'spool'
5
5
  require 'pry-nav'
6
- require 'benchmark'
7
-
8
- Turn.config do |c|
9
- c.format = :pretty
10
- c.natural = true
11
- c.ansi = true
12
- end
6
+ require 'benchmark'
data/spec/pool_spec.rb CHANGED
@@ -2,10 +2,16 @@ require 'minitest_helper'
2
2
 
3
3
  describe Spool::Pool do
4
4
 
5
+ SLEEP_TIME = 0.01
6
+
5
7
  after do
6
8
  @pool.stop! if @pool
7
9
  machine = Datacenter::Machine.new
8
- machine.processes('ruby -e').each {|p| p.send_signal :KILL}
10
+ begin
11
+ machine.processes('ruby -e').each {|p| p.send_signal :KILL}
12
+ rescue
13
+ # All processes dead. I hope
14
+ end
9
15
  end
10
16
 
11
17
  def start_pool(&block)
@@ -13,6 +19,7 @@ describe Spool::Pool do
13
19
  t = Thread.new { pool.start }
14
20
  t.abort_on_exception = true
15
21
  while pool.processes.count < pool.configuration.processes
22
+ sleep 0.01
16
23
  end
17
24
  end
18
25
  end
@@ -32,14 +39,17 @@ describe Spool::Pool do
32
39
  stop_signal :TERM
33
40
  end
34
41
 
35
- pool.must_be :started?
42
+ pool.must_be :running?
36
43
  pool.processes.count.must_equal 1
37
44
  pool.processes[0].must_be :alive?
38
45
 
39
46
  process = pool.processes[0]
40
-
41
47
  pool.stop
42
48
 
49
+ while pool.running?
50
+ sleep SLEEP_TIME
51
+ end
52
+
43
53
  pool.must_be :stopped?
44
54
  pool.processes.must_be_empty
45
55
  process.wont_be :alive?
@@ -51,7 +61,7 @@ describe Spool::Pool do
51
61
  command 'ruby -e "loop do; sleep 1; end"'
52
62
  end
53
63
 
54
- pool.must_be :started?
64
+ pool.must_be :running?
55
65
  pool.processes.count.must_equal 1
56
66
  pool.processes[0].must_be :alive?
57
67
 
@@ -59,6 +69,10 @@ describe Spool::Pool do
59
69
 
60
70
  pool.stop!
61
71
 
72
+ while pool.running?
73
+ sleep SLEEP_TIME
74
+ end
75
+
62
76
  pool.must_be :stopped?
63
77
  pool.processes.must_be_empty
64
78
  process.wont_be :alive?
@@ -73,10 +87,13 @@ describe Spool::Pool do
73
87
  original_process = pool.processes[0]
74
88
  original_process.send_signal :KILL
75
89
 
90
+ begin
91
+ sleep SLEEP_TIME
92
+ new_pid = pool.processes.any? ? pool.processes[0].pid : original_process.pid
93
+ end while original_process.pid == new_pid
94
+
76
95
  original_process.wont_be :alive?
77
96
 
78
- until pool.processes[0] && pool.processes[0].pid != original_process.pid; end
79
-
80
97
  pool.processes.count.must_equal 1
81
98
  pool.processes[0].must_be :alive?
82
99
  end
@@ -93,10 +110,12 @@ describe Spool::Pool do
93
110
  original_pids = pool.processes.map(&:pid)
94
111
 
95
112
  pool.restart
113
+
114
+ begin
115
+ sleep SLEEP_TIME
116
+ new_pids = (pool.processes.count == 2) ? pool.processes.map(&:pid) : original_pids
117
+ end until (original_pids & new_pids).empty?
96
118
 
97
- until pool.processes.count == 2 && pool.processes[0].pid != original_pids[0] && pool.processes[1].pid != original_pids[1]; end
98
-
99
- pool.processes.count.must_equal 2
100
119
  pool.processes.each { |p| p.must_be :alive?}
101
120
  end
102
121
 
@@ -109,7 +128,12 @@ describe Spool::Pool do
109
128
 
110
129
  process = pool.processes[0]
111
130
 
112
- Benchmark.realtime { pool.stop 0.1 }.must_be :<, 1
131
+ Benchmark.realtime do
132
+ pool.stop 0.1
133
+ while pool.running?
134
+ sleep SLEEP_TIME
135
+ end
136
+ end.must_be :<, 1
113
137
 
114
138
  pool.must_be :stopped?
115
139
  pool.processes.must_be_empty
@@ -145,7 +169,16 @@ describe Spool::Pool do
145
169
 
146
170
  it 'Change process when satisfied stop condition' do
147
171
  file_name = File.expand_path 'used_memory.log'
148
- ruby_command = "require 'datacenter'; Signal.trap(:TERM) { File.write('#{file_name}', Datacenter::Process.new(Process.pid).memory); exit 0 }; a = 50_000_000.times.to_a; loop do; end"
172
+ ruby_command = %Q{
173
+ require 'datacenter'
174
+ Signal.trap(:TERM) do
175
+ File.write('#{file_name}', 'Finished')
176
+ exit 0
177
+ end
178
+ a = 50_000_000.times.to_a
179
+ loop do
180
+ end
181
+ }
149
182
 
150
183
  pool = start_pool do
151
184
  processes 1
@@ -154,18 +187,18 @@ describe Spool::Pool do
154
187
  stop_signal :TERM
155
188
  end
156
189
 
157
- memory = 0
158
- process = pool.processes[0]
159
- while !File.exists?(file_name)
160
- sleep 0.5
161
- end
190
+ original_process = pool.processes[0]
191
+
192
+ begin
193
+ sleep SLEEP_TIME
194
+ new_pid = pool.processes.any? ? pool.processes[0].pid : original_process.pid
195
+ end while original_process.pid == new_pid
162
196
 
163
- memory = File.read(file_name).to_i
197
+ text_file = File.read(file_name)
164
198
  File.delete(file_name)
165
199
 
166
- memory.must_be :>=, 300
200
+ text_file.must_equal 'Finished'
167
201
  pool.processes.count.must_equal 1
168
- pool.processes[0].pid.wont_equal process.pid
169
202
  end
170
203
 
171
204
  it 'Reload config' do
data/spool.gemspec CHANGED
@@ -18,13 +18,15 @@ Gem::Specification.new do |spec|
18
18
  spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
19
  spec.require_paths = ['lib']
20
20
 
21
- spec.add_dependency 'datacenter', '~> 0.2.0'
21
+ spec.add_dependency 'datacenter', '~> 0.4', '>= 0.4.4'
22
22
  spec.add_dependency 'mono_logger'
23
23
 
24
- spec.add_development_dependency 'bundler', '~> 1.5'
25
- spec.add_development_dependency 'rake'
26
- spec.add_development_dependency 'minitest', '~> 4.7'
27
- spec.add_development_dependency 'turn', '~> 0.9'
28
- spec.add_development_dependency 'simplecov'
29
- spec.add_development_dependency 'pry-nav'
24
+ spec.add_development_dependency 'bundler', '~> 1.12'
25
+ spec.add_development_dependency 'rake', '~> 11.0'
26
+ spec.add_development_dependency 'minitest', '~> 5.0', '< 5.11'
27
+ spec.add_development_dependency 'minitest-colorin', '~> 0.1'
28
+ spec.add_development_dependency 'minitest-line', '~> 0.6'
29
+ spec.add_development_dependency 'simplecov', '~> 0.12'
30
+ spec.add_development_dependency 'coveralls', '~> 0.8'
31
+ spec.add_development_dependency 'pry-nav', '~> 0.2'
30
32
  end
metadata CHANGED
@@ -1,127 +1,167 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: spool
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: 1.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Gabriel Naiman
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-09-15 00:00:00.000000000 Z
11
+ date: 2018-10-18 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: datacenter
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - ~>
17
+ - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: 0.2.0
19
+ version: '0.4'
20
+ - - ">="
21
+ - !ruby/object:Gem::Version
22
+ version: 0.4.4
20
23
  type: :runtime
21
24
  prerelease: false
22
25
  version_requirements: !ruby/object:Gem::Requirement
23
26
  requirements:
24
- - - ~>
27
+ - - "~>"
28
+ - !ruby/object:Gem::Version
29
+ version: '0.4'
30
+ - - ">="
25
31
  - !ruby/object:Gem::Version
26
- version: 0.2.0
32
+ version: 0.4.4
27
33
  - !ruby/object:Gem::Dependency
28
34
  name: mono_logger
29
35
  requirement: !ruby/object:Gem::Requirement
30
36
  requirements:
31
- - - '>='
37
+ - - ">="
32
38
  - !ruby/object:Gem::Version
33
39
  version: '0'
34
40
  type: :runtime
35
41
  prerelease: false
36
42
  version_requirements: !ruby/object:Gem::Requirement
37
43
  requirements:
38
- - - '>='
44
+ - - ">="
39
45
  - !ruby/object:Gem::Version
40
46
  version: '0'
41
47
  - !ruby/object:Gem::Dependency
42
48
  name: bundler
43
49
  requirement: !ruby/object:Gem::Requirement
44
50
  requirements:
45
- - - ~>
51
+ - - "~>"
46
52
  - !ruby/object:Gem::Version
47
- version: '1.5'
53
+ version: '1.12'
48
54
  type: :development
49
55
  prerelease: false
50
56
  version_requirements: !ruby/object:Gem::Requirement
51
57
  requirements:
52
- - - ~>
58
+ - - "~>"
53
59
  - !ruby/object:Gem::Version
54
- version: '1.5'
60
+ version: '1.12'
55
61
  - !ruby/object:Gem::Dependency
56
62
  name: rake
57
63
  requirement: !ruby/object:Gem::Requirement
58
64
  requirements:
59
- - - '>='
65
+ - - "~>"
60
66
  - !ruby/object:Gem::Version
61
- version: '0'
67
+ version: '11.0'
62
68
  type: :development
63
69
  prerelease: false
64
70
  version_requirements: !ruby/object:Gem::Requirement
65
71
  requirements:
66
- - - '>='
72
+ - - "~>"
67
73
  - !ruby/object:Gem::Version
68
- version: '0'
74
+ version: '11.0'
69
75
  - !ruby/object:Gem::Dependency
70
76
  name: minitest
71
77
  requirement: !ruby/object:Gem::Requirement
72
78
  requirements:
73
- - - ~>
79
+ - - "~>"
80
+ - !ruby/object:Gem::Version
81
+ version: '5.0'
82
+ - - "<"
83
+ - !ruby/object:Gem::Version
84
+ version: '5.11'
85
+ type: :development
86
+ prerelease: false
87
+ version_requirements: !ruby/object:Gem::Requirement
88
+ requirements:
89
+ - - "~>"
90
+ - !ruby/object:Gem::Version
91
+ version: '5.0'
92
+ - - "<"
93
+ - !ruby/object:Gem::Version
94
+ version: '5.11'
95
+ - !ruby/object:Gem::Dependency
96
+ name: minitest-colorin
97
+ requirement: !ruby/object:Gem::Requirement
98
+ requirements:
99
+ - - "~>"
74
100
  - !ruby/object:Gem::Version
75
- version: '4.7'
101
+ version: '0.1'
76
102
  type: :development
77
103
  prerelease: false
78
104
  version_requirements: !ruby/object:Gem::Requirement
79
105
  requirements:
80
- - - ~>
106
+ - - "~>"
81
107
  - !ruby/object:Gem::Version
82
- version: '4.7'
108
+ version: '0.1'
83
109
  - !ruby/object:Gem::Dependency
84
- name: turn
110
+ name: minitest-line
85
111
  requirement: !ruby/object:Gem::Requirement
86
112
  requirements:
87
- - - ~>
113
+ - - "~>"
88
114
  - !ruby/object:Gem::Version
89
- version: '0.9'
115
+ version: '0.6'
90
116
  type: :development
91
117
  prerelease: false
92
118
  version_requirements: !ruby/object:Gem::Requirement
93
119
  requirements:
94
- - - ~>
120
+ - - "~>"
95
121
  - !ruby/object:Gem::Version
96
- version: '0.9'
122
+ version: '0.6'
97
123
  - !ruby/object:Gem::Dependency
98
124
  name: simplecov
99
125
  requirement: !ruby/object:Gem::Requirement
100
126
  requirements:
101
- - - '>='
127
+ - - "~>"
102
128
  - !ruby/object:Gem::Version
103
- version: '0'
129
+ version: '0.12'
104
130
  type: :development
105
131
  prerelease: false
106
132
  version_requirements: !ruby/object:Gem::Requirement
107
133
  requirements:
108
- - - '>='
134
+ - - "~>"
109
135
  - !ruby/object:Gem::Version
110
- version: '0'
136
+ version: '0.12'
137
+ - !ruby/object:Gem::Dependency
138
+ name: coveralls
139
+ requirement: !ruby/object:Gem::Requirement
140
+ requirements:
141
+ - - "~>"
142
+ - !ruby/object:Gem::Version
143
+ version: '0.8'
144
+ type: :development
145
+ prerelease: false
146
+ version_requirements: !ruby/object:Gem::Requirement
147
+ requirements:
148
+ - - "~>"
149
+ - !ruby/object:Gem::Version
150
+ version: '0.8'
111
151
  - !ruby/object:Gem::Dependency
112
152
  name: pry-nav
113
153
  requirement: !ruby/object:Gem::Requirement
114
154
  requirements:
115
- - - '>='
155
+ - - "~>"
116
156
  - !ruby/object:Gem::Version
117
- version: '0'
157
+ version: '0.2'
118
158
  type: :development
119
159
  prerelease: false
120
160
  version_requirements: !ruby/object:Gem::Requirement
121
161
  requirements:
122
- - - '>='
162
+ - - "~>"
123
163
  - !ruby/object:Gem::Version
124
- version: '0'
164
+ version: '0.2'
125
165
  description: ''
126
166
  email:
127
167
  - gnaiman@keepcon.com
@@ -130,11 +170,11 @@ executables:
130
170
  extensions: []
131
171
  extra_rdoc_files: []
132
172
  files:
133
- - .coveralls.yml
134
- - .gitignore
135
- - .ruby-gemset
136
- - .ruby-version
137
- - .travis.yml
173
+ - ".coveralls.yml"
174
+ - ".gitignore"
175
+ - ".ruby-gemset"
176
+ - ".ruby-version"
177
+ - ".travis.yml"
138
178
  - Gemfile
139
179
  - LICENSE.txt
140
180
  - README.md
@@ -164,17 +204,17 @@ require_paths:
164
204
  - lib
165
205
  required_ruby_version: !ruby/object:Gem::Requirement
166
206
  requirements:
167
- - - '>='
207
+ - - ">="
168
208
  - !ruby/object:Gem::Version
169
209
  version: '0'
170
210
  required_rubygems_version: !ruby/object:Gem::Requirement
171
211
  requirements:
172
- - - '>='
212
+ - - ">="
173
213
  - !ruby/object:Gem::Version
174
214
  version: '0'
175
215
  requirements: []
176
216
  rubyforge_project:
177
- rubygems_version: 2.2.2
217
+ rubygems_version: 2.6.14
178
218
  signing_key:
179
219
  specification_version: 4
180
220
  summary: Manage and keep alive pool of processes