stalker 0.8.0 → 0.9.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.md +8 -8
- data/Rakefile +1 -1
- data/VERSION +1 -1
- data/examples/jobs.rb +3 -3
- data/lib/stalker.rb +174 -169
- data/test/stalker_test.rb +104 -91
- metadata +21 -6
data/README.md
CHANGED
@@ -90,7 +90,7 @@ Tidbits
|
|
90
90
|
|
91
91
|
* Jobs are serialized as JSON, so you should stick to strings, integers, arrays, and hashes as arguments to jobs. e.g. don't pass full Ruby objects - use something like an ActiveRecord/MongoMapper/CouchRest id instead.
|
92
92
|
* Because there are no class definitions associated with jobs, you can queue jobs from anywhere without needing to include your full app's environment.
|
93
|
-
* If you need to change the location of your Beanstalk from the default (localhost:11300), set BEANSTALK_URL in your environment, e.g. export BEANSTALK_URL=beanstalk://example.com:11300/
|
93
|
+
* If you need to change the location of your Beanstalk from the default (localhost:11300), set BEANSTALK_URL in your environment, e.g. export BEANSTALK_URL=beanstalk://example.com:11300/. You can specify multiple beanstalk servers, separated by whitespace or comma, e.g. export BEANSTALK_URL="beanstalk://b1.example.com:11300/, beanstalk://b2.example.com:11300/"
|
94
94
|
* The stalk binary is just for convenience, you can also run a worker with a straight Ruby command:
|
95
95
|
$ ruby -r jobs -e Stalker.work
|
96
96
|
|
@@ -99,22 +99,22 @@ Running the tests
|
|
99
99
|
|
100
100
|
If you wish to hack on Stalker, install these extra gems:
|
101
101
|
|
102
|
-
$ gem install contest mocha
|
102
|
+
$ gem install contest mocha
|
103
103
|
|
104
|
-
|
104
|
+
Make sure you have a beanstalkd running, then run the tests:
|
105
105
|
|
106
|
-
$
|
106
|
+
$ ruby test/stalker_test.rb
|
107
107
|
|
108
108
|
Meta
|
109
109
|
----
|
110
110
|
|
111
|
-
Created by Adam Wiggins
|
111
|
+
Created by [Adam Wiggins](https://github.com/adamwiggins)
|
112
112
|
|
113
|
-
Patches from Jamie Cobbett, Scott Water, Keith Rarick, Mark McGranaghan, Sean Walberg, Adam Pohorecki
|
113
|
+
Patches from Jamie Cobbett, Scott Water, Keith Rarick, Mark McGranaghan, Sean Walberg, Adam Pohorecki, Han Kessels
|
114
114
|
|
115
|
-
Heavily inspired by [Minion](
|
115
|
+
Heavily inspired by [Minion](https://github.com/orionz/minion) by Orion Henry
|
116
116
|
|
117
117
|
Released under the MIT License: http://www.opensource.org/licenses/mit-license.php
|
118
118
|
|
119
|
-
|
119
|
+
https://github.com/han/stalker
|
120
120
|
|
data/Rakefile
CHANGED
@@ -6,7 +6,7 @@ Jeweler::Tasks.new do |s|
|
|
6
6
|
s.description = "A job queueing and background workers system using Beanstalkd. Inspired by the Minion gem."
|
7
7
|
s.author = "Adam Wiggins"
|
8
8
|
s.email = "adam@heroku.com"
|
9
|
-
s.homepage = "
|
9
|
+
s.homepage = "https://github.com/han/stalker"
|
10
10
|
s.executables = [ "stalk" ]
|
11
11
|
s.rubyforge_project = "stalker"
|
12
12
|
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
0.9.0
|
data/examples/jobs.rb
CHANGED
@@ -1,11 +1,11 @@
|
|
1
1
|
job 'send.email' do |args|
|
2
|
-
|
2
|
+
log "Sending email to #{args['email']}"
|
3
3
|
end
|
4
4
|
|
5
5
|
job 'transform.image' do |args|
|
6
|
-
|
6
|
+
log "Image transform"
|
7
7
|
end
|
8
8
|
|
9
9
|
job 'cleanup.strays' do |args|
|
10
|
-
|
10
|
+
log "Cleaning up"
|
11
11
|
end
|
data/lib/stalker.rb
CHANGED
@@ -4,98 +4,98 @@ require 'uri'
|
|
4
4
|
require 'timeout'
|
5
5
|
|
6
6
|
module Stalker
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
log_job_end(name, 'failed')
|
7
|
+
extend self
|
8
|
+
|
9
|
+
def connect(url)
|
10
|
+
@@url = url
|
11
|
+
beanstalk
|
12
|
+
end
|
13
|
+
|
14
|
+
def enqueue(job, args={}, opts={})
|
15
|
+
pri = opts[:pri] || 65536
|
16
|
+
delay = [0, opts[:delay].to_i].max
|
17
|
+
ttr = opts[:ttr] || 120
|
18
|
+
beanstalk.use job
|
19
|
+
beanstalk.put [ job, args ].to_json, pri, delay, ttr
|
20
|
+
rescue Beanstalk::NotConnected => e
|
21
|
+
failed_connection(e)
|
22
|
+
end
|
23
|
+
|
24
|
+
def job(j, &block)
|
25
|
+
@@handlers ||= {}
|
26
|
+
@@handlers[j] = block
|
27
|
+
end
|
28
|
+
|
29
|
+
def before(&block)
|
30
|
+
@@before_handlers ||= []
|
31
|
+
@@before_handlers << block
|
32
|
+
end
|
33
|
+
|
34
|
+
def error(&blk)
|
35
|
+
@@error_handler = blk
|
36
|
+
end
|
37
|
+
|
38
|
+
class NoJobsDefined < RuntimeError; end
|
39
|
+
class NoSuchJob < RuntimeError; end
|
40
|
+
|
41
|
+
def prep(jobs=nil)
|
42
|
+
raise NoJobsDefined unless defined?(@@handlers)
|
43
|
+
@@error_handler = nil unless defined?(@@error_handler)
|
44
|
+
|
45
|
+
jobs ||= all_jobs
|
46
|
+
|
47
|
+
jobs.each do |job|
|
48
|
+
raise(NoSuchJob, job) unless @@handlers[job]
|
49
|
+
end
|
50
|
+
|
51
|
+
log "Working #{jobs.size} jobs: [ #{jobs.join(' ')} ]"
|
52
|
+
|
53
|
+
jobs.each { |job| beanstalk.watch(job) }
|
54
|
+
|
55
|
+
beanstalk.list_tubes_watched.each do |server, tubes|
|
56
|
+
tubes.each { |tube| beanstalk.ignore(tube) unless jobs.include?(tube) }
|
57
|
+
end
|
58
|
+
rescue Beanstalk::NotConnected => e
|
59
|
+
failed_connection(e)
|
60
|
+
end
|
61
|
+
|
62
|
+
def work(jobs=nil)
|
63
|
+
prep(jobs)
|
64
|
+
loop { work_one_job }
|
65
|
+
end
|
66
|
+
|
67
|
+
class JobTimeout < RuntimeError; end
|
68
|
+
|
69
|
+
def work_one_job
|
70
|
+
job = beanstalk.reserve
|
71
|
+
name, args = JSON.parse job.body
|
72
|
+
log_job_begin(name, args)
|
73
|
+
handler = @@handlers[name]
|
74
|
+
raise(NoSuchJob, name) unless handler
|
75
|
+
|
76
|
+
begin
|
77
|
+
Timeout::timeout(job.ttr - 1) do
|
78
|
+
if defined? @@before_handlers and @@before_handlers.respond_to? :each
|
79
|
+
@@before_handlers.each do |block|
|
80
|
+
block.call(name)
|
81
|
+
end
|
82
|
+
end
|
83
|
+
handler.call(args)
|
84
|
+
end
|
85
|
+
rescue Timeout::Error
|
86
|
+
raise JobTimeout, "#{name} hit #{job.ttr-1}s timeout"
|
87
|
+
end
|
88
|
+
|
89
|
+
job.delete
|
90
|
+
log_job_end(name)
|
91
|
+
rescue Beanstalk::NotConnected => e
|
92
|
+
failed_connection(e)
|
93
|
+
rescue SystemExit
|
94
|
+
raise
|
95
|
+
rescue => e
|
96
|
+
log_error exception_message(e)
|
97
|
+
job.bury rescue nil
|
98
|
+
log_job_end(name, 'failed') if @job_begun
|
99
99
|
if error_handler
|
100
100
|
if error_handler.arity == 1
|
101
101
|
error_handler.call(e)
|
@@ -103,81 +103,86 @@ module Stalker
|
|
103
103
|
error_handler.call(e, name, args)
|
104
104
|
end
|
105
105
|
end
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
|
106
|
+
end
|
107
|
+
|
108
|
+
def failed_connection(e)
|
109
|
+
log_error exception_message(e)
|
110
|
+
log_error "*** Failed connection to #{beanstalk_url}"
|
111
|
+
log_error "*** Check that beanstalkd is running (or set a different BEANSTALK_URL)"
|
112
|
+
exit 1
|
113
|
+
end
|
114
|
+
|
115
|
+
def log_job_begin(name, args)
|
116
|
+
args_flat = unless args.empty?
|
117
|
+
'(' + args.inject([]) do |accum, (key,value)|
|
118
|
+
accum << "#{key}=#{value}"
|
119
|
+
end.join(' ') + ')'
|
120
|
+
else
|
121
|
+
''
|
122
|
+
end
|
123
|
+
|
124
|
+
log [ "Working", name, args_flat ].join(' ')
|
125
|
+
@job_begun = Time.now
|
126
|
+
end
|
127
|
+
|
128
|
+
def log_job_end(name, failed=false)
|
129
|
+
ellapsed = Time.now - @job_begun
|
130
|
+
ms = (ellapsed.to_f * 1000).to_i
|
131
|
+
log "Finished #{name} in #{ms}ms #{failed ? ' (failed)' : ''}"
|
132
|
+
end
|
133
|
+
|
134
|
+
def log(msg)
|
135
|
+
puts msg
|
136
|
+
end
|
137
|
+
|
138
|
+
def log_error(msg)
|
139
|
+
STDERR.puts msg
|
140
|
+
end
|
141
|
+
|
142
|
+
def beanstalk
|
143
|
+
@@beanstalk ||= Beanstalk::Pool.new(beanstalk_addresses)
|
144
|
+
end
|
145
|
+
|
146
|
+
def beanstalk_url
|
147
|
+
return @@url if defined?(@@url) and @@url
|
148
|
+
ENV['BEANSTALK_URL'] || 'beanstalk://localhost/'
|
149
|
+
end
|
150
|
+
|
151
|
+
class BadURL < RuntimeError; end
|
152
|
+
|
153
|
+
def beanstalk_addresses
|
154
|
+
uris = beanstalk_url.split(/[\s,]+/)
|
155
|
+
uris.map {|uri| beanstalk_host_and_port(uri)}
|
156
|
+
end
|
157
|
+
|
158
|
+
def beanstalk_host_and_port(uri_string)
|
159
|
+
uri = URI.parse(uri_string)
|
160
|
+
raise(BadURL, uri_string) if uri.scheme != 'beanstalk'
|
161
|
+
"#{uri.host}:#{uri.port || 11300}"
|
162
|
+
end
|
163
|
+
|
164
|
+
def exception_message(e)
|
165
|
+
msg = [ "Exception #{e.class} -> #{e.message}" ]
|
166
|
+
|
167
|
+
base = File.expand_path(Dir.pwd) + '/'
|
168
|
+
e.backtrace.each do |t|
|
169
|
+
msg << " #{File.expand_path(t).gsub(/#{base}/, '')}"
|
170
|
+
end
|
171
|
+
|
172
|
+
msg.join("\n")
|
173
|
+
end
|
174
|
+
|
175
|
+
def all_jobs
|
176
|
+
@@handlers.keys
|
177
|
+
end
|
178
|
+
|
179
|
+
def error_handler
|
180
|
+
@@error_handler
|
181
|
+
end
|
182
|
+
|
183
|
+
def clear!
|
184
|
+
@@handlers = nil
|
185
|
+
@@before_handlers = nil
|
186
|
+
@@error_handler = nil
|
187
|
+
end
|
183
188
|
end
|
data/test/stalker_test.rb
CHANGED
@@ -3,109 +3,122 @@ require 'contest'
|
|
3
3
|
require 'mocha'
|
4
4
|
|
5
5
|
module Stalker
|
6
|
-
|
7
|
-
|
6
|
+
def log(msg); end
|
7
|
+
def log_error(msg); end
|
8
8
|
end
|
9
9
|
|
10
10
|
class StalkerTest < Test::Unit::TestCase
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
11
|
+
setup do
|
12
|
+
Stalker.clear!
|
13
|
+
$result = -1
|
14
|
+
$handled = false
|
15
|
+
end
|
16
16
|
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
17
|
+
def with_an_error_handler
|
18
|
+
Stalker.error do |e, job_name, args|
|
19
|
+
$handled = e.class
|
20
|
+
$job_name = job_name
|
21
|
+
$job_args = args
|
22
|
+
end
|
23
|
+
end
|
24
24
|
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
25
|
+
test "enqueue and work a job" do
|
26
|
+
val = rand(999999)
|
27
|
+
Stalker.job('my.job') { |args| $result = args['val'] }
|
28
|
+
Stalker.enqueue('my.job', :val => val)
|
29
|
+
Stalker.prep
|
30
|
+
Stalker.work_one_job
|
31
|
+
assert_equal val, $result
|
32
|
+
end
|
33
33
|
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
34
|
+
test "invoke error handler when defined" do
|
35
|
+
with_an_error_handler
|
36
|
+
Stalker.job('my.job') { |args| fail }
|
37
|
+
Stalker.enqueue('my.job', :foo => 123)
|
38
|
+
Stalker.prep
|
39
|
+
Stalker.work_one_job
|
40
|
+
assert $handled
|
41
|
+
assert_equal 'my.job', $job_name
|
42
|
+
assert_equal({'foo' => 123}, $job_args)
|
43
|
+
end
|
44
44
|
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
45
|
+
test "should be compatible with legacy error handlers" do
|
46
|
+
exception = StandardError.new("Oh my, the job has failed!")
|
47
|
+
Stalker.error { |e| $handled = e }
|
48
|
+
Stalker.job('my.job') { |args| raise exception }
|
49
|
+
Stalker.enqueue('my.job', :foo => 123)
|
50
|
+
Stalker.prep
|
51
|
+
Stalker.work_one_job
|
52
|
+
assert_equal exception, $handled
|
53
|
+
end
|
54
54
|
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
55
|
+
test "continue working when error handler not defined" do
|
56
|
+
Stalker.job('my.job') { fail }
|
57
|
+
Stalker.enqueue('my.job')
|
58
|
+
Stalker.prep
|
59
|
+
Stalker.work_one_job
|
60
|
+
assert_equal false, $handled
|
61
|
+
end
|
62
62
|
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
63
|
+
test "exception raised one second before beanstalk ttr reached" do
|
64
|
+
with_an_error_handler
|
65
|
+
Stalker.job('my.job') { sleep(3); $handled = "didn't time out" }
|
66
|
+
Stalker.enqueue('my.job', {}, :ttr => 2)
|
67
|
+
Stalker.prep
|
68
|
+
Stalker.work_one_job
|
69
|
+
assert_equal Stalker::JobTimeout, $handled
|
70
|
+
end
|
71
71
|
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
72
|
+
test "before filter gets run first" do
|
73
|
+
Stalker.before { |name| $flag = "i_was_here" }
|
74
|
+
Stalker.job('my.job') { |args| $handled = ($flag == 'i_was_here') }
|
75
|
+
Stalker.enqueue('my.job')
|
76
|
+
Stalker.prep
|
77
|
+
Stalker.work_one_job
|
78
|
+
assert_equal true, $handled
|
79
|
+
end
|
80
80
|
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
81
|
+
test "before filter passes the name of the job" do
|
82
|
+
Stalker.before { |name| $jobname = name }
|
83
|
+
Stalker.job('my.job') { true }
|
84
|
+
Stalker.enqueue('my.job')
|
85
|
+
Stalker.prep
|
86
|
+
Stalker.work_one_job
|
87
|
+
assert_equal 'my.job', $jobname
|
88
|
+
end
|
89
89
|
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
90
|
+
test "before filter can pass an instance var" do
|
91
|
+
Stalker.before { |name| @foo = "hello" }
|
92
|
+
Stalker.job('my.job') { |args| $handled = (@foo == "hello") }
|
93
|
+
Stalker.enqueue('my.job')
|
94
|
+
Stalker.prep
|
95
|
+
Stalker.work_one_job
|
96
|
+
assert_equal true, $handled
|
97
|
+
end
|
98
98
|
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
99
|
+
test "before filter invokes error handler when defined" do
|
100
|
+
with_an_error_handler
|
101
|
+
Stalker.before { |name| fail }
|
102
|
+
Stalker.job('my.job') { }
|
103
|
+
Stalker.enqueue('my.job', :foo => 123)
|
104
|
+
Stalker.prep
|
105
|
+
Stalker.work_one_job
|
106
|
+
assert $handled
|
107
|
+
assert_equal 'my.job', $job_name
|
108
|
+
assert_equal({'foo' => 123}, $job_args)
|
109
|
+
end
|
110
|
+
|
111
|
+
test "parse BEANSTALK_URL" do
|
112
|
+
ENV['BEANSTALK_URL'] = "beanstalk://localhost:12300"
|
113
|
+
assert_equal Stalker.beanstalk_addresses, ["localhost:12300"]
|
114
|
+
ENV['BEANSTALK_URL'] = "beanstalk://localhost:12300/, beanstalk://localhost:12301/"
|
115
|
+
assert_equal Stalker.beanstalk_addresses, ["localhost:12300","localhost:12301"]
|
116
|
+
ENV['BEANSTALK_URL'] = "beanstalk://localhost:12300 beanstalk://localhost:12301"
|
117
|
+
assert_equal Stalker.beanstalk_addresses, ["localhost:12300","localhost:12301"]
|
118
|
+
ENV['BEANSTALK_URL'] = "beanstalk://localhost:12300, http://localhost:12301"
|
119
|
+
assert_raise Stalker::BadURL do
|
120
|
+
Stalker.beanstalk_addresses
|
121
|
+
end
|
122
|
+
end
|
110
123
|
|
111
124
|
end
|
metadata
CHANGED
@@ -1,8 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: stalker
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
+
hash: 59
|
4
5
|
prerelease:
|
5
|
-
|
6
|
+
segments:
|
7
|
+
- 0
|
8
|
+
- 9
|
9
|
+
- 0
|
10
|
+
version: 0.9.0
|
6
11
|
platform: ruby
|
7
12
|
authors:
|
8
13
|
- Adam Wiggins
|
@@ -10,8 +15,7 @@ autorequire:
|
|
10
15
|
bindir: bin
|
11
16
|
cert_chain: []
|
12
17
|
|
13
|
-
date: 2011-
|
14
|
-
default_executable: stalk
|
18
|
+
date: 2011-04-12 00:00:00 Z
|
15
19
|
dependencies:
|
16
20
|
- !ruby/object:Gem::Dependency
|
17
21
|
name: beanstalk-client
|
@@ -21,6 +25,9 @@ dependencies:
|
|
21
25
|
requirements:
|
22
26
|
- - ">="
|
23
27
|
- !ruby/object:Gem::Version
|
28
|
+
hash: 3
|
29
|
+
segments:
|
30
|
+
- 0
|
24
31
|
version: "0"
|
25
32
|
type: :runtime
|
26
33
|
version_requirements: *id001
|
@@ -32,6 +39,9 @@ dependencies:
|
|
32
39
|
requirements:
|
33
40
|
- - ">="
|
34
41
|
- !ruby/object:Gem::Version
|
42
|
+
hash: 3
|
43
|
+
segments:
|
44
|
+
- 0
|
35
45
|
version: "0"
|
36
46
|
type: :runtime
|
37
47
|
version_requirements: *id002
|
@@ -52,8 +62,7 @@ files:
|
|
52
62
|
- examples/enqueue.rb
|
53
63
|
- examples/jobs.rb
|
54
64
|
- test/stalker_test.rb
|
55
|
-
|
56
|
-
homepage: http://github.com/adamwiggins/stalker
|
65
|
+
homepage: https://github.com/han/stalker
|
57
66
|
licenses: []
|
58
67
|
|
59
68
|
post_install_message:
|
@@ -66,17 +75,23 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
66
75
|
requirements:
|
67
76
|
- - ">="
|
68
77
|
- !ruby/object:Gem::Version
|
78
|
+
hash: 3
|
79
|
+
segments:
|
80
|
+
- 0
|
69
81
|
version: "0"
|
70
82
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
71
83
|
none: false
|
72
84
|
requirements:
|
73
85
|
- - ">="
|
74
86
|
- !ruby/object:Gem::Version
|
87
|
+
hash: 3
|
88
|
+
segments:
|
89
|
+
- 0
|
75
90
|
version: "0"
|
76
91
|
requirements: []
|
77
92
|
|
78
93
|
rubyforge_project: stalker
|
79
|
-
rubygems_version: 1.
|
94
|
+
rubygems_version: 1.7.2
|
80
95
|
signing_key:
|
81
96
|
specification_version: 3
|
82
97
|
summary: A job queueing and background workers system using Beanstalkd.
|