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 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.