stalker 0.8.0 → 0.9.0

Sign up to get free protection for your applications and to get access to all the features.
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 turn
102
+ $ gem install contest mocha
103
103
 
104
- Run the tests:
104
+ Make sure you have a beanstalkd running, then run the tests:
105
105
 
106
- $ turn
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](http://github.com/orionz/minion) by Orion Henry
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
- http://github.com/adamwiggins/stalker
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 = "http://github.com/adamwiggins/stalker"
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.8.0
1
+ 0.9.0
@@ -1,11 +1,11 @@
1
1
  job 'send.email' do |args|
2
- log "Sending email to #{args['email']}"
2
+ log "Sending email to #{args['email']}"
3
3
  end
4
4
 
5
5
  job 'transform.image' do |args|
6
- log "Image transform"
6
+ log "Image transform"
7
7
  end
8
8
 
9
9
  job 'cleanup.strays' do |args|
10
- log "Cleaning up"
10
+ log "Cleaning up"
11
11
  end
@@ -4,98 +4,98 @@ require 'uri'
4
4
  require 'timeout'
5
5
 
6
6
  module Stalker
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 = opts[:delay] || 0
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')
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
- 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_host_and_port ])
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_host_and_port
154
- uri = URI.parse(beanstalk_url)
155
- raise(BadURL, beanstalk_url) if uri.scheme != 'beanstalk'
156
- return "#{uri.host}:#{uri.port || 11300}"
157
- end
158
-
159
- def exception_message(e)
160
- msg = [ "Exception #{e.class} -> #{e.message}" ]
161
-
162
- base = File.expand_path(Dir.pwd) + '/'
163
- e.backtrace.each do |t|
164
- msg << " #{File.expand_path(t).gsub(/#{base}/, '')}"
165
- end
166
-
167
- msg.join("\n")
168
- end
169
-
170
- def all_jobs
171
- @@handlers.keys
172
- end
173
-
174
- def error_handler
175
- @@error_handler
176
- end
177
-
178
- def clear!
179
- @@handlers = nil
180
- @@before_handlers = nil
181
- @@error_handler = nil
182
- end
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
@@ -3,109 +3,122 @@ require 'contest'
3
3
  require 'mocha'
4
4
 
5
5
  module Stalker
6
- def log(msg); end
7
- def log_error(msg); end
6
+ def log(msg); end
7
+ def log_error(msg); end
8
8
  end
9
9
 
10
10
  class StalkerTest < Test::Unit::TestCase
11
- setup do
12
- Stalker.clear!
13
- $result = -1
14
- $handled = false
15
- end
11
+ setup do
12
+ Stalker.clear!
13
+ $result = -1
14
+ $handled = false
15
+ end
16
16
 
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
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
- 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
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
- 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
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
- 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
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
- 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
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
- 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
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
- 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
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
- 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
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
- 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
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
- 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
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
- version: 0.8.0
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-03-11 00:00:00 -08:00
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
- has_rdoc: true
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.5.0
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.