resque-pool-dynamic 0.1.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/.gitignore +6 -0
- data/Gemfile +4 -0
- data/README.md +242 -0
- data/Rakefile +42 -0
- data/doc/Resque/Pool/Dynamic/Logfile.html +722 -0
- data/doc/Resque/Pool/Dynamic/Shell.html +636 -0
- data/doc/Resque/Pool/Dynamic.html +2187 -0
- data/doc/Resque/Pool.html +125 -0
- data/doc/Resque.html +110 -0
- data/doc/_index.html +166 -0
- data/doc/class_list.html +47 -0
- data/doc/css/common.css +1 -0
- data/doc/css/full_list.css +55 -0
- data/doc/css/style.css +322 -0
- data/doc/file.README.html +316 -0
- data/doc/file_list.html +49 -0
- data/doc/frames.html +13 -0
- data/doc/index.html +316 -0
- data/doc/js/app.js +205 -0
- data/doc/js/full_list.js +173 -0
- data/doc/js/jquery.js +16 -0
- data/doc/method_list.html +318 -0
- data/doc/top-level-namespace.html +105 -0
- data/help.yml +140 -0
- data/lib/resque/pool/dynamic/logfile.rb +97 -0
- data/lib/resque/pool/dynamic/shell.rb +106 -0
- data/lib/resque/pool/dynamic/tasks.rb +29 -0
- data/lib/resque/pool/dynamic/version.rb +7 -0
- data/lib/resque/pool/dynamic.rb +217 -0
- data/lib/resque/pool/help.json +1 -0
- data/resque-pool-dynamic.gemspec +29 -0
- metadata +127 -0
@@ -0,0 +1,106 @@
|
|
1
|
+
require 'pathname'
|
2
|
+
require 'json'
|
3
|
+
|
4
|
+
require 'ripl'
|
5
|
+
|
6
|
+
require 'resque/pool/dynamic'
|
7
|
+
|
8
|
+
module Resque
|
9
|
+
class Pool
|
10
|
+
# Add-on to resque-pool to allow manually controlled, dynamic sessions
|
11
|
+
class Dynamic
|
12
|
+
# Run a dynamic resque pool session.
|
13
|
+
# @param [Hash] options Options passed to the Shell instance
|
14
|
+
# @option opts [String] :no_start Don't start resque-pool automatically
|
15
|
+
def self.shell(options={})
|
16
|
+
myself = self.new
|
17
|
+
myself.start unless options[:no_start]
|
18
|
+
myself.status
|
19
|
+
Shell.run(myself, options)
|
20
|
+
puts "\nBye!"
|
21
|
+
ensure
|
22
|
+
myself.stop if myself
|
23
|
+
end
|
24
|
+
|
25
|
+
# Ripl shell subclassed for nicer CLI experience
|
26
|
+
class Shell < Ripl::Shell
|
27
|
+
# When printing error, cut backtrace at (ripl)
|
28
|
+
def print_eval_error(e)
|
29
|
+
i = e.backtrace.index { |ln| ln =~ /\(ripl\):\d+:in `run'/ }
|
30
|
+
if not i
|
31
|
+
bt = e.backtrace
|
32
|
+
elsif i > 0
|
33
|
+
bt = e.backtrace[0..i-1]
|
34
|
+
else
|
35
|
+
bt = []
|
36
|
+
end
|
37
|
+
bt = bt.map { |ln| " " << ln }.join("\n")
|
38
|
+
puts "ERROR: #{e.to_s}\n#{bt}"
|
39
|
+
end
|
40
|
+
|
41
|
+
# Don't print nil return values
|
42
|
+
def print_result(result)
|
43
|
+
super if @error_raised or !result.nil?
|
44
|
+
end
|
45
|
+
|
46
|
+
# Show help
|
47
|
+
# @param [String] subject Topic to display
|
48
|
+
def help(subject=nil)
|
49
|
+
@help ||= File.open(
|
50
|
+
Pathname.new(__FILE__).dirname.join('help.json')
|
51
|
+
) { |f| JSON::load(f.read) }
|
52
|
+
if subject
|
53
|
+
if @help.has_key?(subject)
|
54
|
+
puts @help[subject]['full']
|
55
|
+
return
|
56
|
+
end
|
57
|
+
puts "I don't know anything about #{subject}."
|
58
|
+
end
|
59
|
+
puts "Known commands:"
|
60
|
+
@help.keys.sort.each do |cmd|
|
61
|
+
puts " #{cmd} - #{@help[cmd]['summary']}"
|
62
|
+
end
|
63
|
+
puts "For details, type: help command"
|
64
|
+
end
|
65
|
+
|
66
|
+
# Handle help as special command
|
67
|
+
# @param [String] input Input string
|
68
|
+
def eval_input(input)
|
69
|
+
splut = input.split(/\s+/,2)
|
70
|
+
if splut.first == 'help'
|
71
|
+
help(splut[1])
|
72
|
+
else
|
73
|
+
super
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
# Run the Ripl shell in context of specified instance
|
78
|
+
# @param [Object] instance Instance to get bindings from
|
79
|
+
# @param [Hash] opts Options passed to Ripl::Shell
|
80
|
+
def self.run(instance, opts={})
|
81
|
+
options = {
|
82
|
+
:readline => true,
|
83
|
+
:riplrc => ENV['RIPL_RC'] || '~/.riplrc',
|
84
|
+
:completion => {},
|
85
|
+
:binding => instance.instance_eval { binding }
|
86
|
+
}
|
87
|
+
options.update(opts)
|
88
|
+
Ripl::Runner::load_rc(options[:riplrc]) if options[:riplrc]!=''
|
89
|
+
create(options).loop
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
93
|
+
### Utility functions
|
94
|
+
|
95
|
+
# Loop, providing index to the block
|
96
|
+
# @yield [i] Ever increasing index
|
97
|
+
def loop_with_index
|
98
|
+
index = 0
|
99
|
+
loop do
|
100
|
+
yield(index)
|
101
|
+
index += 1
|
102
|
+
end
|
103
|
+
end
|
104
|
+
end
|
105
|
+
end
|
106
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
|
2
|
+
desc <<EOF
|
3
|
+
Starts a dynamic pool of Resque worker processes.
|
4
|
+
|
5
|
+
Variables:
|
6
|
+
WORKERS=worker spec - specify initial numbers of workers
|
7
|
+
(look below for format description)
|
8
|
+
NO_START=1 - don't start resque-pool master automatically
|
9
|
+
(default is to start)
|
10
|
+
|
11
|
+
Workers spec format:
|
12
|
+
queue_name=process_number[:queue_name=process_number[:...]]
|
13
|
+
|
14
|
+
queue_name can be whatever resque:work will accept as QUEUE=
|
15
|
+
parameter.
|
16
|
+
|
17
|
+
Example:
|
18
|
+
$ rake resque:pool:dynamic WORKERS=foo=1:bar=1:baz,quux,xyzzy=5:*=2
|
19
|
+
will start:
|
20
|
+
- one worker for queue 'foo'
|
21
|
+
- one worker for queue 'bar'
|
22
|
+
- five workers for queues baz,quux,xyzzy
|
23
|
+
- two workers for all queues
|
24
|
+
EOF
|
25
|
+
task "resque:pool:dynamic" do
|
26
|
+
require 'resque/pool/dynamic/shell'
|
27
|
+
|
28
|
+
Resque::Pool::Dynamic.shell(:no_start => ENV['NO_START'])
|
29
|
+
end
|
@@ -0,0 +1,217 @@
|
|
1
|
+
require 'tempfile'
|
2
|
+
require 'yaml'
|
3
|
+
|
4
|
+
require "resque/pool/dynamic/version"
|
5
|
+
require "resque/pool/dynamic/logfile"
|
6
|
+
|
7
|
+
module Resque
|
8
|
+
class Pool
|
9
|
+
class Dynamic
|
10
|
+
# PID of the resque-pool process, or nil if it's not running
|
11
|
+
# @return [Integer, NilClass]
|
12
|
+
# @api cli
|
13
|
+
attr_reader :pid
|
14
|
+
|
15
|
+
def initialize
|
16
|
+
# Make myself a project group leader
|
17
|
+
Process.setpgid(0, 0)
|
18
|
+
end
|
19
|
+
|
20
|
+
# Tempfile instance for configuration file
|
21
|
+
# @return [Tempfile]
|
22
|
+
def config_tempfile
|
23
|
+
@config_tempfile ||= Tempfile.new(%w(resque-pool-dynamic .yaml))
|
24
|
+
end
|
25
|
+
|
26
|
+
# Path to the temporary config file
|
27
|
+
# @return [String]
|
28
|
+
# @api cli
|
29
|
+
def config_path
|
30
|
+
config_tempfile.path
|
31
|
+
end
|
32
|
+
|
33
|
+
# Parse workers configuration
|
34
|
+
# @param [String] spec Workers specification string
|
35
|
+
# Format: queue2=number:queue2=number2:queue3,queue5=number4:*=number5
|
36
|
+
# @return [Hash] Configuration dictionary
|
37
|
+
# @example
|
38
|
+
# parse_config_string('foo=1:bar=2:baz,quux=4')
|
39
|
+
# #=> {"baz,quux"=>4, "foo"=>1, "bar"=>2}
|
40
|
+
def parse_config_string(spec)
|
41
|
+
return {} unless spec
|
42
|
+
Hash[
|
43
|
+
spec.split(':').map { |w|
|
44
|
+
k, v = w.split('=') ; [ k, v.to_i ] }
|
45
|
+
]
|
46
|
+
end
|
47
|
+
|
48
|
+
# @overload config
|
49
|
+
# Show current workers configuration
|
50
|
+
# @return [Hash]
|
51
|
+
# @overload config(opts)
|
52
|
+
# Update workers configuration.
|
53
|
+
# If configuration has change and resque-pool is running, it is reloaded.
|
54
|
+
# @param [Hash] opts Dictionary of worker process counts to update
|
55
|
+
# (pass 0 or nil as value to delete all workers for a queue from pool)
|
56
|
+
# @return [Hash] Updated config
|
57
|
+
# @note Default configuration is taken from environment variable
|
58
|
+
# "WORKERS", as interpreted by the #parse_config_string method.
|
59
|
+
# @example config
|
60
|
+
# #=> {"foo"=>1, "bar"=>2}
|
61
|
+
# config :foo => 2, :baz => 7
|
62
|
+
# #=> {"foo"=>2, "baz"=>7, "bar"=>2}
|
63
|
+
# config :bar => 0
|
64
|
+
# #=> {"foo"=>2, "baz"=>7}
|
65
|
+
# @api cli
|
66
|
+
def config(args=nil)
|
67
|
+
@config ||= parse_config_string(ENV['WORKERS'])
|
68
|
+
|
69
|
+
if args
|
70
|
+
oldconfig = config.clone
|
71
|
+
|
72
|
+
args.each do |w, n|
|
73
|
+
w = w.to_s
|
74
|
+
if n.nil? || n==0
|
75
|
+
@config.delete w
|
76
|
+
else
|
77
|
+
@config[w] = n
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
if pid && @config != oldconfig
|
82
|
+
write_config
|
83
|
+
reload
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
@config
|
88
|
+
end
|
89
|
+
|
90
|
+
# Write temporary configuration file
|
91
|
+
# @api cli
|
92
|
+
def write_config
|
93
|
+
File.open(config_path, 'w') do |cf|
|
94
|
+
cf.write(YAML::dump(config))
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
98
|
+
# Start resque-pool master
|
99
|
+
# This is executed in a forked child process.
|
100
|
+
def run_pool
|
101
|
+
@pid = $$
|
102
|
+
ENV["RESQUE_POOL_CONFIG"] = config_path
|
103
|
+
|
104
|
+
$stdin.reopen '/dev/null'
|
105
|
+
log = File.new(log_path, "a")
|
106
|
+
$stdout.reopen log
|
107
|
+
$stderr.reopen log
|
108
|
+
$stdout.sync = $stderr.sync = true
|
109
|
+
|
110
|
+
require 'rake'
|
111
|
+
Rake::Task['resque:pool'].invoke
|
112
|
+
end
|
113
|
+
|
114
|
+
# Fork a child process for resque-pool master
|
115
|
+
# @return [Integer] PID of the child process
|
116
|
+
# @api cli
|
117
|
+
def start!
|
118
|
+
raise "Already running: #{pid}" if pid
|
119
|
+
write_config
|
120
|
+
@pid = fork { self.run_pool }
|
121
|
+
Process.setpgid(pid, 0) # don't broadcast ^C to child
|
122
|
+
|
123
|
+
if 30.times { |i| sleep 1 ; break if File.exist? log_path }
|
124
|
+
# Loop will return nil if broken. If value is returned, file does not exist.
|
125
|
+
raise "Log file #{log_path} still not present after #{i} seconds, giving up"
|
126
|
+
stop!
|
127
|
+
end
|
128
|
+
|
129
|
+
pid
|
130
|
+
end
|
131
|
+
|
132
|
+
# Start resque-pool, showing startup logs
|
133
|
+
# @api cli
|
134
|
+
def start
|
135
|
+
unless pid
|
136
|
+
start!
|
137
|
+
log.rewind
|
138
|
+
log.tail_until /started manager/
|
139
|
+
else
|
140
|
+
warn "Already started as #{pid}"
|
141
|
+
end
|
142
|
+
end
|
143
|
+
|
144
|
+
# Return pid of running resque-pool or raise an exception
|
145
|
+
# @return [Integer]
|
146
|
+
# @raise [RuntimeError]
|
147
|
+
def pid!
|
148
|
+
pid or raise "Not started!"
|
149
|
+
end
|
150
|
+
|
151
|
+
# Send signal to a running resque-pool
|
152
|
+
# @param [String, Integer] sig Signal name or number
|
153
|
+
# @api cli
|
154
|
+
def kill!(sig)
|
155
|
+
Process.kill(sig, pid!)
|
156
|
+
end
|
157
|
+
|
158
|
+
# Stop running resque-pool
|
159
|
+
# @api cli
|
160
|
+
def stop!
|
161
|
+
if pid
|
162
|
+
kill! "INT"
|
163
|
+
wpid, status = Process.wait2(pid)
|
164
|
+
@pid = nil
|
165
|
+
status
|
166
|
+
end
|
167
|
+
end
|
168
|
+
|
169
|
+
# Stop running resque-pool, show shutdown logs
|
170
|
+
# @api cli
|
171
|
+
def stop
|
172
|
+
puts "Shutting down resque-pool-master #{pid}"
|
173
|
+
log.ff if has_log?
|
174
|
+
status = stop!
|
175
|
+
log.tail if has_log?
|
176
|
+
return status
|
177
|
+
end
|
178
|
+
|
179
|
+
# Reload resque-pool configuration
|
180
|
+
# @api cli
|
181
|
+
def reload
|
182
|
+
puts "Reloading resque-pool-master #{pid!} configuration"
|
183
|
+
write_config
|
184
|
+
kill!('HUP')
|
185
|
+
end
|
186
|
+
|
187
|
+
# Show child process tree by calling `pstree` system command
|
188
|
+
# @api cli
|
189
|
+
def pstree
|
190
|
+
system case RUBY_PLATFORM
|
191
|
+
when /darwin/
|
192
|
+
"pstree -w #{pid!}"
|
193
|
+
when /linux/
|
194
|
+
"pstree -l -a -p #{pid!}"
|
195
|
+
else
|
196
|
+
"pstree #{pid!}"
|
197
|
+
end
|
198
|
+
nil
|
199
|
+
end
|
200
|
+
|
201
|
+
# Show current status
|
202
|
+
# @api cli
|
203
|
+
def status
|
204
|
+
puts( '',
|
205
|
+
"Status: " << ( pid ? "running, pid: #{pid}" : "not running" ),
|
206
|
+
"Configuration:",
|
207
|
+
YAML::dump(config).grep(/^(?!---\s*$)/).map { |v| " " << v }
|
208
|
+
)
|
209
|
+
if pid
|
210
|
+
puts "Process tree:"
|
211
|
+
pstree
|
212
|
+
end
|
213
|
+
puts
|
214
|
+
end
|
215
|
+
end
|
216
|
+
end
|
217
|
+
end
|
@@ -0,0 +1 @@
|
|
1
|
+
{"pid":{"summary":"PID of the resque-pool process, or nil if it's not running.","full":"----------------------------------- Method: #pid (Resque::Pool::Dynamic)\n (Defined in: lib/resque/pool/dynamic.rb)\n dynamic.pid -> (Integer, NilClass) (readonly)\n------------------------------------------------------------------------\n PID of the resque-pool process, or nil if it's not running \nReturns:\n--------\n (Integer, NilClass) - \n"},"config_path":{"summary":"Path to the temporary config file.","full":"--------------------------- Method: #config_path (Resque::Pool::Dynamic)\n (Defined in: lib/resque/pool/dynamic.rb)\n dynamic.config_path -> String \n------------------------------------------------------------------------\n Path to the temporary config file \nReturns:\n--------\n (String) - \n"},"config":{"summary":"","full":"-------------------------------- Method: #config (Resque::Pool::Dynamic)\n (Defined in: lib/resque/pool/dynamic.rb)\n dynamic.config -> Hash \n dynamic.config(opts) -> Hash \n------------------------------------------------------------------------\n Note: Default configuration is taken from environment variable\n \"WORKERS\", as interpreted by the #parse_config_string method.\nExamples:\n---------\n # config\n #=> {\"foo\"=>1, \"bar\"=>2}\n config :foo => 2, :baz => 7\n #=> {\"foo\"=>2, \"baz\"=>7, \"bar\"=>2}\n config :bar => 0\n #=> {\"foo\"=>2, \"baz\"=>7}\nOverloads:\n----------\n------------------------------------------------------------------------\n dynamic.config -> Hash \n------------------------------------------------------------------------\n Show current workers configuration \n Returns:\n --------\n (Hash) - \n------------------------------------------------------------------------\n dynamic.config(opts) -> Hash \n------------------------------------------------------------------------\n Update workers configuration. If configuration has change and\n resque-pool is running, it is reloaded. \n Parameters:\n -----------\n (Hash) opts - Dictionary of worker process counts to update\n (pass 0 or nil as value to delete all workers for a queue from pool)\n Returns:\n --------\n (Hash) - Updated config\n"},"write_config":{"summary":"Write temporary configuration file.","full":"-------------------------- Method: #write_config (Resque::Pool::Dynamic)\n (Defined in: lib/resque/pool/dynamic.rb)\n dynamic.write_config \n------------------------------------------------------------------------\n Write temporary configuration file \n"},"start!":{"summary":"Fork a child process for resque-pool master.","full":"-------------------------------- Method: #start! (Resque::Pool::Dynamic)\n (Defined in: lib/resque/pool/dynamic.rb)\n dynamic.start! -> Integer \n------------------------------------------------------------------------\n Fork a child process for resque-pool master \nReturns:\n--------\n (Integer) - PID of the child process\n"},"start":{"summary":"Start resque-pool, showing startup logs.","full":"--------------------------------- Method: #start (Resque::Pool::Dynamic)\n (Defined in: lib/resque/pool/dynamic.rb)\n dynamic.start \n------------------------------------------------------------------------\n Start resque-pool, showing startup logs \n"},"kill!":{"summary":"Send signal to a running resque-pool.","full":"--------------------------------- Method: #kill! (Resque::Pool::Dynamic)\n (Defined in: lib/resque/pool/dynamic.rb)\n dynamic.kill!(sig) \n------------------------------------------------------------------------\n Send signal to a running resque-pool \nParameters:\n-----------\n (String, Integer) sig - Signal name or number\n"},"stop!":{"summary":"Stop running resque-pool.","full":"--------------------------------- Method: #stop! (Resque::Pool::Dynamic)\n (Defined in: lib/resque/pool/dynamic.rb)\n dynamic.stop! \n------------------------------------------------------------------------\n Stop running resque-pool \n"},"stop":{"summary":"Stop running resque-pool, show shutdown logs.","full":"---------------------------------- Method: #stop (Resque::Pool::Dynamic)\n (Defined in: lib/resque/pool/dynamic.rb)\n dynamic.stop \n------------------------------------------------------------------------\n Stop running resque-pool, show shutdown logs \n"},"reload":{"summary":"Reload resque-pool configuration.","full":"-------------------------------- Method: #reload (Resque::Pool::Dynamic)\n (Defined in: lib/resque/pool/dynamic.rb)\n dynamic.reload \n------------------------------------------------------------------------\n Reload resque-pool configuration \n"},"pstree":{"summary":"Show child process tree by calling `pstree` system command.","full":"-------------------------------- Method: #pstree (Resque::Pool::Dynamic)\n (Defined in: lib/resque/pool/dynamic.rb)\n dynamic.pstree \n------------------------------------------------------------------------\n Show child process tree by calling `pstree` system command \n"},"status":{"summary":"Show current status.","full":"-------------------------------- Method: #status (Resque::Pool::Dynamic)\n (Defined in: lib/resque/pool/dynamic.rb)\n dynamic.status \n------------------------------------------------------------------------\n Show current status \n"},"log_path":{"summary":"Logfile path.","full":"------------------------------ Method: #log_path (Resque::Pool::Dynamic)\n (Defined in: lib/resque/pool/dynamic/logfile.rb)\n dynamic.log_path -> String \n------------------------------------------------------------------------\n Logfile path \nReturns:\n--------\n (String) - Path to the log file\n"},"log":{"summary":"Open log of resque-pool process.","full":"----------------------------------- Method: #log (Resque::Pool::Dynamic)\n (Defined in: lib/resque/pool/dynamic/logfile.rb)\n dynamic.log -> Logfile \n------------------------------------------------------------------------\n Open log of resque-pool process \nReturns:\n--------\n (Logfile) - Logfile instance\n"},"has_log?":{"summary":"True if we have an open log file.","full":"------------------------------ Method: #has_log? (Resque::Pool::Dynamic)\n (Defined in: lib/resque/pool/dynamic/logfile.rb)\n dynamic.has_log? -> Boolean \n------------------------------------------------------------------------\n True if we have an open log file \nReturns:\n--------\n (Boolean) - \n"},"log.tail":{"summary":"Show last n lines of the file, or follow the file.","full":"------------------------- Method: #tail (Resque::Pool::Dynamic::Logfile)\n (Defined in: lib/resque/pool/dynamic/logfile.rb)\n logfile.tail(n = nil) {|ln| ... } \n------------------------------------------------------------------------\n Show last n lines of the file, or follow the file \nParameters:\n-----------\n (Integer, NilClass) n - Number of lines or nil\nYields:\n-------\n (ln) - Called for every line of file\nYield Parameters:\n-----------------\n (String) ln - Input line\n"},"log.tail_until":{"summary":"Follow the file until a line matches regexp.","full":"------------------- Method: #tail_until (Resque::Pool::Dynamic::Logfile)\n (Defined in: lib/resque/pool/dynamic/logfile.rb)\n logfile.tail_until(rx) \n------------------------------------------------------------------------\n Follow the file until a line matches regexp \n"},"log.tail_to_eof":{"summary":"Print contents of the file until current end of file.","full":"------------------ Method: #tail_to_eof (Resque::Pool::Dynamic::Logfile)\n (Defined in: lib/resque/pool/dynamic/logfile.rb)\n logfile.tail_to_eof \n------------------------------------------------------------------------\n Print contents of the file until current end of file \n"},"log.ff":{"summary":"Fast forward until end of file (see IO::Tail#backward).","full":"--------------------------- Method: #ff (Resque::Pool::Dynamic::Logfile)\n (Defined in: lib/resque/pool/dynamic/logfile.rb)\n logfile.ff \n------------------------------------------------------------------------\n Fast forward until end of file (see IO::Tail#backward) \n"},"log.rew":{"summary":"Rewind until beginning of file (see IO::Tail#forward).","full":"-------------------------- Method: #rew (Resque::Pool::Dynamic::Logfile)\n (Defined in: lib/resque/pool/dynamic/logfile.rb)\n logfile.rew \n------------------------------------------------------------------------\n Rewind until beginning of file (see IO::Tail#forward) \n"},"log.rewind":{"summary":"Rewind until beginning of file (see IO::Tail#forward).","full":"----------------------- Method: #rewind (Resque::Pool::Dynamic::Logfile)\n (Defined in: lib/resque/pool/dynamic/logfile.rb)\n logfile.rewind \n------------------------------------------------------------------------\n Rewind until beginning of file (see IO::Tail#forward) \n"},"exit":{"summary":"Finish work","full":"Finish work (AKA quit)"}}
|
@@ -0,0 +1,29 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
$:.push File.expand_path("../lib", __FILE__)
|
3
|
+
require "resque/pool/dynamic/version"
|
4
|
+
|
5
|
+
Gem::Specification.new do |s|
|
6
|
+
s.name = "resque-pool-dynamic"
|
7
|
+
s.version = Resque::Pool::Dynamic::VERSION
|
8
|
+
s.authors = ["Maciej Pasternacki"]
|
9
|
+
s.email = ["maciej@pasternacki.net"]
|
10
|
+
s.homepage = "https://github.com/mpasternacki/resque-pool-dynamic"
|
11
|
+
s.summary = "A dynamic manager for resque pool"
|
12
|
+
s.description = <<EOF
|
13
|
+
A class to dynamically manage number of processes and status in the
|
14
|
+
resque pool with a command-line user interface to interacively manage
|
15
|
+
and supervise the worker pool.
|
16
|
+
EOF
|
17
|
+
|
18
|
+
s.rubyforge_project = "resque-pool-dynamic"
|
19
|
+
|
20
|
+
s.files = `git ls-files`.split("\n")
|
21
|
+
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
22
|
+
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
23
|
+
s.require_paths = ["lib"]
|
24
|
+
|
25
|
+
s.add_development_dependency "yard"
|
26
|
+
s.add_runtime_dependency "io-tail"
|
27
|
+
s.add_runtime_dependency "rake"
|
28
|
+
s.add_runtime_dependency "ripl"
|
29
|
+
end
|
metadata
ADDED
@@ -0,0 +1,127 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: resque-pool-dynamic
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Maciej Pasternacki
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2012-04-25 00:00:00.000000000Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: yard
|
16
|
+
requirement: &70134237409700 !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ! '>='
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: '0'
|
22
|
+
type: :development
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: *70134237409700
|
25
|
+
- !ruby/object:Gem::Dependency
|
26
|
+
name: io-tail
|
27
|
+
requirement: &70134237409220 !ruby/object:Gem::Requirement
|
28
|
+
none: false
|
29
|
+
requirements:
|
30
|
+
- - ! '>='
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: '0'
|
33
|
+
type: :runtime
|
34
|
+
prerelease: false
|
35
|
+
version_requirements: *70134237409220
|
36
|
+
- !ruby/object:Gem::Dependency
|
37
|
+
name: rake
|
38
|
+
requirement: &70134237408800 !ruby/object:Gem::Requirement
|
39
|
+
none: false
|
40
|
+
requirements:
|
41
|
+
- - ! '>='
|
42
|
+
- !ruby/object:Gem::Version
|
43
|
+
version: '0'
|
44
|
+
type: :runtime
|
45
|
+
prerelease: false
|
46
|
+
version_requirements: *70134237408800
|
47
|
+
- !ruby/object:Gem::Dependency
|
48
|
+
name: ripl
|
49
|
+
requirement: &70134237408380 !ruby/object:Gem::Requirement
|
50
|
+
none: false
|
51
|
+
requirements:
|
52
|
+
- - ! '>='
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
|
+
type: :runtime
|
56
|
+
prerelease: false
|
57
|
+
version_requirements: *70134237408380
|
58
|
+
description: ! 'A class to dynamically manage number of processes and status in the
|
59
|
+
|
60
|
+
resque pool with a command-line user interface to interacively manage
|
61
|
+
|
62
|
+
and supervise the worker pool.
|
63
|
+
|
64
|
+
'
|
65
|
+
email:
|
66
|
+
- maciej@pasternacki.net
|
67
|
+
executables: []
|
68
|
+
extensions: []
|
69
|
+
extra_rdoc_files: []
|
70
|
+
files:
|
71
|
+
- .gitignore
|
72
|
+
- Gemfile
|
73
|
+
- README.md
|
74
|
+
- Rakefile
|
75
|
+
- doc/Resque.html
|
76
|
+
- doc/Resque/Pool.html
|
77
|
+
- doc/Resque/Pool/Dynamic.html
|
78
|
+
- doc/Resque/Pool/Dynamic/Logfile.html
|
79
|
+
- doc/Resque/Pool/Dynamic/Shell.html
|
80
|
+
- doc/_index.html
|
81
|
+
- doc/class_list.html
|
82
|
+
- doc/css/common.css
|
83
|
+
- doc/css/full_list.css
|
84
|
+
- doc/css/style.css
|
85
|
+
- doc/file.README.html
|
86
|
+
- doc/file_list.html
|
87
|
+
- doc/frames.html
|
88
|
+
- doc/index.html
|
89
|
+
- doc/js/app.js
|
90
|
+
- doc/js/full_list.js
|
91
|
+
- doc/js/jquery.js
|
92
|
+
- doc/method_list.html
|
93
|
+
- doc/top-level-namespace.html
|
94
|
+
- help.yml
|
95
|
+
- lib/resque/pool/dynamic.rb
|
96
|
+
- lib/resque/pool/dynamic/logfile.rb
|
97
|
+
- lib/resque/pool/dynamic/shell.rb
|
98
|
+
- lib/resque/pool/dynamic/tasks.rb
|
99
|
+
- lib/resque/pool/dynamic/version.rb
|
100
|
+
- lib/resque/pool/help.json
|
101
|
+
- resque-pool-dynamic.gemspec
|
102
|
+
homepage: https://github.com/mpasternacki/resque-pool-dynamic
|
103
|
+
licenses: []
|
104
|
+
post_install_message:
|
105
|
+
rdoc_options: []
|
106
|
+
require_paths:
|
107
|
+
- lib
|
108
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
109
|
+
none: false
|
110
|
+
requirements:
|
111
|
+
- - ! '>='
|
112
|
+
- !ruby/object:Gem::Version
|
113
|
+
version: '0'
|
114
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
115
|
+
none: false
|
116
|
+
requirements:
|
117
|
+
- - ! '>='
|
118
|
+
- !ruby/object:Gem::Version
|
119
|
+
version: '0'
|
120
|
+
requirements: []
|
121
|
+
rubyforge_project: resque-pool-dynamic
|
122
|
+
rubygems_version: 1.8.10
|
123
|
+
signing_key:
|
124
|
+
specification_version: 3
|
125
|
+
summary: A dynamic manager for resque pool
|
126
|
+
test_files: []
|
127
|
+
has_rdoc:
|