em-jack 0.0.4 → 0.0.5

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/lib/em-jack.rb CHANGED
@@ -5,8 +5,12 @@ require 'em-jack/errors'
5
5
  require 'em-jack/beanstalk_connection'
6
6
  require 'em-jack/connection'
7
7
 
8
+ Dir["#{File.dirname(__FILE__)}/em-jack/handlers/*.rb"].each do |file|
9
+ require file
10
+ end
11
+
8
12
  module EMJack
9
13
  module VERSION
10
- STRING = '0.0.4'
14
+ STRING = '0.0.5'
11
15
  end
12
16
  end
@@ -4,8 +4,19 @@ require 'yaml'
4
4
  module EMJack
5
5
  class Connection
6
6
  RETRY_COUNT = 5
7
-
7
+
8
+ @@handlers = []
9
+
8
10
  attr_accessor :host, :port
11
+
12
+ def self.register_handler(handler)
13
+ @@handlers ||= []
14
+ @@handlers << handler
15
+ end
16
+
17
+ def self.handlers
18
+ @@handlers
19
+ end
9
20
 
10
21
  def initialize(opts = {})
11
22
  @host = opts[:host] || 'localhost'
@@ -62,18 +73,6 @@ module EMJack
62
73
  add_deferrable(&blk)
63
74
  end
64
75
 
65
- def each_job(&blk)
66
- work = Proc.new do
67
- r = reserve
68
- r.callback do |job|
69
- blk.call(job)
70
-
71
- EM.next_tick { work.call }
72
- end
73
- end
74
- work.call
75
- end
76
-
77
76
  def stats(type = nil, val = nil, &blk)
78
77
  case(type)
79
78
  when nil then @conn.send(:stats)
@@ -99,10 +98,14 @@ module EMJack
99
98
  @conn.send(:delete, job.jobid)
100
99
  add_deferrable(&blk)
101
100
  end
102
-
103
- def release(job, &blk)
101
+
102
+ def release(job, opts = {}, &blk)
104
103
  return if job.nil?
105
- @conn.send(:release, job.jobid, 0, 0)
104
+
105
+ pri = (opts[:priority] || 65536).to_i
106
+ delay = (opts[:delay] || 0).to_i
107
+
108
+ @conn.send(:release, job.jobid, pri, delay)
106
109
  add_deferrable(&blk)
107
110
  end
108
111
 
@@ -123,14 +126,25 @@ module EMJack
123
126
  @conn.send_with_data(:put, m, pri, delay, ttr, m.length)
124
127
  add_deferrable(&blk)
125
128
  end
126
-
129
+
130
+ def each_job(timeout = nil, &blk)
131
+ work = Proc.new do
132
+ r = reserve(timeout)
133
+ r.callback do |job|
134
+ blk.call(job)
135
+
136
+ EM.next_tick { work.call }
137
+ end
138
+ end
139
+ work.call
140
+ end
141
+
127
142
  def connected
128
143
  @retries = 0
129
144
  end
130
145
 
131
146
  def disconnected
132
- # XXX I think I need to run out the deferrables as failed here
133
- # since the connection was dropped
147
+ @deferrables.each { |df| df.fail(:disconnected) }
134
148
 
135
149
  raise EMJack::Disconnected if @retries >= RETRY_COUNT
136
150
  @retries += 1
@@ -156,7 +170,7 @@ module EMJack
156
170
  def on_error(&blk)
157
171
  @error_callback = blk
158
172
  end
159
-
173
+
160
174
  def received(data)
161
175
  @data << data
162
176
 
@@ -166,75 +180,30 @@ module EMJack
166
180
 
167
181
  first = @data[0..(idx + 1)]
168
182
 
169
- handled = false
170
- %w(OUT_OF_MEMORY INTERNAL_ERROR DRAINING BAD_FORMAT
171
- UNKNOWN_COMMAND EXPECTED_CRLF JOB_TOO_BIG DEADLINE_SOON
172
- TIMED_OUT NOT_FOUND).each do |cmd|
173
- next unless first =~ /^#{cmd}\r\n/i
174
- df = @deferrables.shift
175
- df.fail(cmd.downcase.to_sym)
176
-
177
- @data = @data[(cmd.length + 2)..-1]
178
- handled = true
179
- break
180
- end
181
- next if handled
182
-
183
- case (first)
184
- when /^DELETED\r\n/ then
185
- df = @deferrables.shift
186
- df.succeed
183
+ df = @deferrables.shift
184
+ handled, skip = false, false
185
+ EMJack::Connection.handlers.each do |h|
186
+ handles, bytes = h.handles?(first)
187
187
 
188
- when /^INSERTED\s+(\d+)\r\n/ then
189
- df = @deferrables.shift
190
- df.succeed($1.to_i)
188
+ next unless handles
189
+ bytes = bytes.to_i
191
190
 
192
- when /^RELEASED\r\n/ then
193
- df = @deferrables.shift
194
- df.succeed
191
+ # if this handler requires us to receive a body make sure we can get
192
+ # the full length of body. If not, we'll go around and wait for more
193
+ # data to be received
194
+ body, @data = extract_body(bytes, @data) unless bytes <= 0
195
+ break if body.nil? && bytes > 0
195
196
 
196
- when /^BURIED\s+(\d+)\r\n/ then
197
- df = @deferrables.shift
198
- df.fail(:buried, $1.to_i)
199
-
200
- when /^USING\s+(.*)\r\n/ then
201
- df = @deferrables.shift
202
- df.succeed($1)
203
-
204
- when /^WATCHING\s+(\d+)\r\n/ then
205
- df = @deferrables.shift
206
- df.succeed($1.to_i)
207
-
208
- when /^NOT_IGNORED\r\n/ then
209
- df = @deferrables.shift
210
- df.fail("Can't ignore only watched tube")
211
-
212
- when /^OK\s+(\d+)\r\n/ then
213
- bytes = $1.to_i
214
-
215
- body, @data = extract_body(bytes, @data)
216
- break if body.nil?
217
-
218
- df = @deferrables.shift
219
- df.succeed(YAML.load(body))
220
- next
221
-
222
- when /^RESERVED\s+(\d+)\s+(\d+)\r\n/ then
223
- id = $1.to_i
224
- bytes = $2.to_i
225
-
226
- body, @data = extract_body(bytes, @data)
227
- break if body.nil?
228
-
229
- df = @deferrables.shift
230
- job = EMJack::Job.new(self, id, body)
231
- df.succeed(job)
232
- next
233
-
234
- else
235
- break
197
+ handled = h.handle(df, first, body)
198
+ break if handled
236
199
  end
237
200
 
201
+ @deferrables.unshift(df) unless handled
202
+
203
+ # not handled means there wasn't enough data to process a complete response
204
+ break unless handled
205
+ next unless @data.index(/\r\n/)
206
+
238
207
  @data = @data[(@data.index(/\r\n/) + 2)..-1]
239
208
  @data = "" if @data.nil?
240
209
  end
@@ -0,0 +1,20 @@
1
+ module EMJack
2
+ module Handler
3
+ class Buried
4
+ RESPONSE = /^BURIED\s+(\d+)\r\n/
5
+
6
+ def self.handles?(response)
7
+ response =~ RESPONSE
8
+ end
9
+
10
+ def self.handle(deferrable, response, body)
11
+ return false unless response =~ RESPONSE
12
+
13
+ deferrable.fail(:buried, $1.to_i)
14
+ true
15
+ end
16
+
17
+ EMJack::Connection.register_handler(EMJack::Handler::Buried)
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,20 @@
1
+ module EMJack
2
+ module Handler
3
+ class Deleted
4
+ RESPONSE = /^DELETED\r\n/
5
+
6
+ def self.handles?(response)
7
+ response =~ RESPONSE
8
+ end
9
+
10
+ def self.handle(deferrable, response, body)
11
+ return false unless response =~ RESPONSE
12
+
13
+ deferrable.succeed
14
+ true
15
+ end
16
+
17
+ EMJack::Connection.register_handler(EMJack::Handler::Deleted)
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,19 @@
1
+ module EMJack
2
+ module Handler
3
+ class Errors
4
+ RESPONSE = /^(OUT_OF_MEMORY|INTERNAL_ERROR|DRAINING|BAD_FORMAT|UNKNOWN_COMMAND|EXPECTED_CRLF|JOB_TOO_BIG|DEADLINE_SOON|TIMED_OUT|NOT_FOUND)\r\n/i
5
+
6
+ def self.handles?(response)
7
+ response =~ RESPONSE
8
+ end
9
+
10
+ def self.handle(deferrable, response, body)
11
+ return false unless response =~ RESPONSE
12
+ deferrable.fail($1.downcase.to_sym)
13
+ true
14
+ end
15
+
16
+ EMJack::Connection.register_handler(EMJack::Handler::Errors)
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,20 @@
1
+ module EMJack
2
+ module Handler
3
+ class Inserted
4
+ RESPONSE = /^INSERTED\s+(\d+)\r\n/
5
+
6
+ def self.handles?(response)
7
+ response =~ RESPONSE
8
+ end
9
+
10
+ def self.handle(deferrable, response, body)
11
+ return false unless response =~ RESPONSE
12
+
13
+ deferrable.succeed($1.to_i)
14
+ true
15
+ end
16
+
17
+ EMJack::Connection.register_handler(EMJack::Handler::Inserted)
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,20 @@
1
+ module EMJack
2
+ module Handler
3
+ class NotIgnored
4
+ RESPONSE = /^NOT_IGNORED\r\n/
5
+
6
+ def self.handles?(response)
7
+ response =~ RESPONSE
8
+ end
9
+
10
+ def self.handle(deferrable, response, body)
11
+ return false unless response =~ RESPONSE
12
+
13
+ deferrable.fail("Can't ignore only watched tube")
14
+ true
15
+ end
16
+
17
+ EMJack::Connection.register_handler(EMJack::Handler::NotIgnored)
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,25 @@
1
+ module EMJack
2
+ module Handler
3
+ class Ok
4
+ RESPONSE = /^OK\s+(\d+)\r\n/
5
+
6
+ def self.handles?(response)
7
+ if response =~ RESPONSE
8
+ [true, $1.to_i]
9
+ else
10
+ false
11
+ end
12
+ end
13
+
14
+ def self.handle(deferrable, response, body)
15
+ return false unless response =~ RESPONSE
16
+ bytes = $1.to_i
17
+
18
+ deferrable.succeed(YAML.load(body))
19
+ true
20
+ end
21
+
22
+ EMJack::Connection.register_handler(EMJack::Handler::Ok)
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,20 @@
1
+ module EMJack
2
+ module Handler
3
+ class Released
4
+ RESPONSE = /^RELEASED\r\n/
5
+
6
+ def self.handles?(response)
7
+ response =~ RESPONSE
8
+ end
9
+
10
+ def self.handle(deferrable, response, body)
11
+ return false unless response =~ RESPONSE
12
+
13
+ deferrable.succeed
14
+ true
15
+ end
16
+
17
+ EMJack::Connection.register_handler(EMJack::Handler::Released)
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,28 @@
1
+ module EMJack
2
+ module Handler
3
+ class Reserved
4
+ RESPONSE = /^RESERVED\s+(\d+)\s+(\d+)\r\n/
5
+
6
+ def self.handles?(response)
7
+ if response =~ RESPONSE
8
+ [true, $2.to_i]
9
+ else
10
+ false
11
+ end
12
+ end
13
+
14
+ def self.handle(deferrable, response, body)
15
+ return false unless response =~ RESPONSE
16
+ id = $1.to_i
17
+ bytes = $2.to_i
18
+
19
+ job = EMJack::Job.new(self, id, body)
20
+ deferrable.succeed(job)
21
+
22
+ true
23
+ end
24
+
25
+ EMJack::Connection.register_handler(EMJack::Handler::Reserved)
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,20 @@
1
+ module EMJack
2
+ module Handler
3
+ class Using
4
+ RESPONSE = /^USING\s+(.*)\r\n/
5
+
6
+ def self.handles?(response)
7
+ response =~ RESPONSE
8
+ end
9
+
10
+ def self.handle(deferrable, response, body)
11
+ return false unless response =~ RESPONSE
12
+
13
+ deferrable.succeed($1)
14
+ true
15
+ end
16
+
17
+ EMJack::Connection.register_handler(EMJack::Handler::Using)
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,20 @@
1
+ module EMJack
2
+ module Handler
3
+ class Watching
4
+ RESPONSE = /^WATCHING\s+(\d+)\r\n/
5
+
6
+ def self.handles?(response)
7
+ response =~ RESPONSE
8
+ end
9
+
10
+ def self.handle(deferrable, response, body)
11
+ return false unless response =~ RESPONSE
12
+
13
+ deferrable.succeed($1.to_i)
14
+ true
15
+ end
16
+
17
+ EMJack::Connection.register_handler(EMJack::Handler::Watching)
18
+ end
19
+ end
20
+ end
metadata CHANGED
@@ -1,7 +1,12 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: em-jack
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.4
4
+ prerelease: false
5
+ segments:
6
+ - 0
7
+ - 0
8
+ - 5
9
+ version: 0.0.5
5
10
  platform: ruby
6
11
  authors:
7
12
  - dan sinclair
@@ -9,19 +14,21 @@ autorequire:
9
14
  bindir: bin
10
15
  cert_chain: []
11
16
 
12
- date: 2009-11-17 00:00:00 -05:00
17
+ date: 2010-03-02 00:00:00 -05:00
13
18
  default_executable:
14
19
  dependencies:
15
20
  - !ruby/object:Gem::Dependency
16
21
  name: eventmachine
17
- type: :runtime
18
- version_requirement:
19
- version_requirements: !ruby/object:Gem::Requirement
22
+ prerelease: false
23
+ requirement: &id001 !ruby/object:Gem::Requirement
20
24
  requirements:
21
25
  - - ">="
22
26
  - !ruby/object:Gem::Version
27
+ segments:
28
+ - 0
23
29
  version: "0"
24
- version:
30
+ type: :runtime
31
+ version_requirements: *id001
25
32
  description: An evented Beanstalk client.
26
33
  email: dj2@everburning.com
27
34
  executables: []
@@ -38,6 +45,16 @@ files:
38
45
  - lib/em-jack/connection.rb
39
46
  - lib/em-jack/errors.rb
40
47
  - lib/em-jack/job.rb
48
+ - lib/em-jack/handlers/buried.rb
49
+ - lib/em-jack/handlers/inserted.rb
50
+ - lib/em-jack/handlers/not_ignored.rb
51
+ - lib/em-jack/handlers/ok.rb
52
+ - lib/em-jack/handlers/released.rb
53
+ - lib/em-jack/handlers/reserved.rb
54
+ - lib/em-jack/handlers/using.rb
55
+ - lib/em-jack/handlers/watching.rb
56
+ - lib/em-jack/handlers/deleted.rb
57
+ - lib/em-jack/handlers/errors.rb
41
58
  has_rdoc: true
42
59
  homepage: http://github.com/dj2/em-jack/
43
60
  licenses: []
@@ -55,18 +72,20 @@ required_ruby_version: !ruby/object:Gem::Requirement
55
72
  requirements:
56
73
  - - ">="
57
74
  - !ruby/object:Gem::Version
75
+ segments:
76
+ - 0
58
77
  version: "0"
59
- version:
60
78
  required_rubygems_version: !ruby/object:Gem::Requirement
61
79
  requirements:
62
80
  - - ">="
63
81
  - !ruby/object:Gem::Version
82
+ segments:
83
+ - 0
64
84
  version: "0"
65
- version:
66
85
  requirements: []
67
86
 
68
87
  rubyforge_project:
69
- rubygems_version: 1.3.5
88
+ rubygems_version: 1.3.6
70
89
  signing_key:
71
90
  specification_version: 3
72
91
  summary: An evented Beanstalk client.