beanstalk-client 0.7.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/History.txt CHANGED
@@ -1,3 +1,10 @@
1
+ == 0.9.0 2008-02-27
2
+
3
+ * Skipping 0.8.x; beanstalkd 0.8 was a botched release.
4
+ * Protocol updates, support for all new commands and changes to existing
5
+ commands.
6
+ * Bugfix: don't add stats values that aren't aggregations already.
7
+
1
8
  == 0.7.0 2008-02-01
2
9
 
3
10
  * Add a close method to connections and pools.
@@ -18,6 +18,7 @@
18
18
  require 'socket'
19
19
  require 'fcntl'
20
20
  require 'yaml'
21
+ require 'set'
21
22
  require 'beanstalk-client/bag'
22
23
  require 'beanstalk-client/errors'
23
24
  require 'beanstalk-client/job'
@@ -91,13 +92,48 @@ module Beanstalk
91
92
  :ok
92
93
  end
93
94
 
95
+ def use(tube)
96
+ @socket.write("use #{tube}\r\n")
97
+ check_resp('USING')[0]
98
+ end
99
+
100
+ def watch(tube)
101
+ @socket.write("watch #{tube}\r\n")
102
+ check_resp('WATCHING')[0]
103
+ end
104
+
105
+ def ignore(tube)
106
+ @socket.write("ignore #{tube}\r\n")
107
+ check_resp('WATCHING')[0]
108
+ end
109
+
94
110
  def stats()
95
111
  @socket.write("stats\r\n")
96
112
  read_yaml('OK')
97
113
  end
98
114
 
99
115
  def job_stats(id)
100
- @socket.write("stats #{id}\r\n")
116
+ @socket.write("stats-job #{id}\r\n")
117
+ read_yaml('OK')
118
+ end
119
+
120
+ def stats_tube(tube)
121
+ @socket.write("stats-tube #{tube}\r\n")
122
+ read_yaml('OK')
123
+ end
124
+
125
+ def list_tubes()
126
+ @socket.write("list-tubes\r\n")
127
+ read_yaml('OK')
128
+ end
129
+
130
+ def list_tube_used()
131
+ @socket.write("list-tube-used\r\n")
132
+ check_resp('USING')[0]
133
+ end
134
+
135
+ def list_tubes_watched()
136
+ @socket.write("list-tubes-watched\r\n")
101
137
  read_yaml('OK')
102
138
  end
103
139
 
@@ -122,10 +158,10 @@ module Beanstalk
122
158
  # Give the user a chance to select on multiple fds.
123
159
  Beanstalk.select.call([@socket]) if Beanstalk.select
124
160
 
125
- id, pri, bytes = check_resp(word).map{|s| s.to_i}
161
+ id, bytes = check_resp(word).map{|s| s.to_i}
126
162
  body = read_bytes(bytes)
127
163
  raise 'bad trailer' if read_bytes(2) != "\r\n"
128
- [id, pri, body]
164
+ [id, body]
129
165
  end
130
166
 
131
167
  def read_yaml(word)
@@ -230,34 +266,64 @@ module Beanstalk
230
266
  @last_conn.addr
231
267
  end
232
268
 
233
- def send_to_conn(sel, *args)
234
- (@last_conn = pick_connection).send(sel, *args)
235
- rescue DrainingError
236
- # Don't reconnect -- we're not interested in this server
237
- retry
238
- rescue EOFError, Errno::ECONNRESET, Errno::EPIPE
239
- connect()
240
- retry
269
+ def send_to_rand_conn(sel, *args)
270
+ wrap(pick_connection, sel, *args)
271
+ end
272
+
273
+ def send_to_all_conns(sel, *args)
274
+ make_hash(@connections.map{|a, c| [a, wrap(c, sel, *args)]})
241
275
  end
242
276
 
243
277
  def put(body, pri=65536, delay=0, ttr=120)
244
- send_to_conn(:put, body, pri, delay, ttr)
278
+ send_to_rand_conn(:put, body, pri, delay, ttr)
245
279
  end
246
280
 
247
281
  def yput(obj, pri=65536, delay=0, ttr=120)
248
- send_to_conn(:yput, obj, pri, delay, ttr)
282
+ send_to_rand_conn(:yput, obj, pri, delay, ttr)
249
283
  end
250
284
 
251
285
  def reserve()
252
- send_to_conn(:reserve)
286
+ send_to_rand_conn(:reserve)
287
+ end
288
+
289
+ def use(tube)
290
+ send_to_all_conns(:use, tube)
291
+ end
292
+
293
+ def watch(tube)
294
+ send_to_all_conns(:watch, tube)
295
+ end
296
+
297
+ def ignore(tube)
298
+ send_to_all_conns(:ignore, tube)
253
299
  end
254
300
 
255
301
  def raw_stats()
256
- Hash[*@connections.map{|a,c| [a, c.stats()]}.inject([]){|a,b|a+b}]
302
+ send_to_all_conns(:stats)
257
303
  end
258
304
 
259
305
  def stats()
260
- raw_stats.values.inject({}){|sums,h| sums.merge(h) {|k,o,n| o + n}}
306
+ sum_hashes(raw_stats.values)
307
+ end
308
+
309
+ def raw_stats_tube(tube)
310
+ send_to_all_conns(:stats_tube, tube)
311
+ end
312
+
313
+ def stats_tube(tube)
314
+ sum_hashes(raw_stats_tube(tube).values)
315
+ end
316
+
317
+ def list_tubes()
318
+ send_to_all_conns(:list_tubes)
319
+ end
320
+
321
+ def list_tube_used()
322
+ send_to_all_conns(:list_tube_used)
323
+ end
324
+
325
+ def list_tubes_watched()
326
+ send_to_all_conns(:list_tubes_watched)
261
327
  end
262
328
 
263
329
  def remove(conn)
@@ -284,5 +350,28 @@ module Beanstalk
284
350
  def pick_connection()
285
351
  open_connections[rand(open_connections.size)] or raise NotConnected
286
352
  end
353
+
354
+ def wrap(conn, sel, *args)
355
+ (@last_conn = conn).send(sel, *args)
356
+ rescue DrainingError
357
+ # Don't reconnect -- we're not interested in this server
358
+ retry
359
+ rescue EOFError, Errno::ECONNRESET, Errno::EPIPE
360
+ connect()
361
+ retry
362
+ end
363
+
364
+ def make_hash(pairs)
365
+ Hash[*pairs.inject([]){|a,b|a+b}]
366
+ end
367
+
368
+ def sum_hashes(hs)
369
+ hs.inject({}){|a,b| a.merge(b) {|k,o,n| combine_stats(k, o, n)}}
370
+ end
371
+
372
+ DONT_ADD = Set['name', 'version', 'pid']
373
+ def combine_stats(k, a, b)
374
+ DONT_ADD.include?(k) ? Set[a] + Set[b] : a + b
375
+ end
287
376
  end
288
377
  end
@@ -18,7 +18,7 @@
18
18
  require 'yaml'
19
19
 
20
20
  class Beanstalk::Job
21
- attr_reader :id, :pri, :body, :conn
21
+ attr_reader :id, :body, :conn
22
22
 
23
23
  # Convenience method for getting ybody elements.
24
24
  def [](name)
@@ -36,10 +36,9 @@ class Beanstalk::Job
36
36
  (@ybody ||= [begin YAML.load(body) rescue nil end])[0]
37
37
  end
38
38
 
39
- def initialize(conn, id, pri, body)
39
+ def initialize(conn, id, body)
40
40
  @conn = conn
41
41
  @id = id
42
- @pri = pri
43
42
  @body = body
44
43
  @deleted = false
45
44
  end
@@ -49,8 +48,8 @@ class Beanstalk::Job
49
48
  @deleted = true
50
49
  end
51
50
 
52
- def put_back(pri=self.pri)
53
- @conn.put(body, pri)
51
+ def put_back(pri=self.pri, delay=0, ttr=self.ttr)
52
+ @conn.put(body, pri, delay, ttr)
54
53
  end
55
54
 
56
55
  def release(newpri=pri, delay=0)
@@ -69,7 +68,9 @@ class Beanstalk::Job
69
68
  def time_left() stats['time-left'] end
70
69
  def age() stats['age'] end
71
70
  def state() stats['state'] end
72
- def delay() stats.fetch('delay', 0) end
71
+ def delay() stats['delay'] end
72
+ def pri() stats['pri'] end
73
+ def ttr() stats['ttr'] end
73
74
 
74
75
  def server()
75
76
  @conn.addr
@@ -88,6 +89,6 @@ class Beanstalk::Job
88
89
  end
89
90
 
90
91
  def inspect
91
- "(job server=#{server} id=#{id} pri=#{pri} size=#{body.size})"
92
+ "(job server=#{server} id=#{id} size=#{body.size})"
92
93
  end
93
94
  end
@@ -1,5 +1,5 @@
1
1
  module Beanstalk #:nodoc:
2
2
  module VERSION #:nodoc:
3
- STRING = '0.7.0'
3
+ STRING = '0.9.0'
4
4
  end
5
5
  end
data/website/index.html CHANGED
@@ -33,7 +33,7 @@
33
33
  <h1>Beanstalk Client</h1>
34
34
  <div id="version" class="clickable" onclick='document.location = "http://rubyforge.org/projects/beanstalk"; return false'>
35
35
  <p>Get Version</p>
36
- <a href="http://rubyforge.org/projects/beanstalk" class="numbers">0.7.0</a>
36
+ <a href="http://rubyforge.org/projects/beanstalk" class="numbers">0.9.0</a>
37
37
  </div>
38
38
  <h1>&#x2192; &#8216;beanstalk-client&#8217;</h1>
39
39
 
metadata CHANGED
@@ -3,8 +3,8 @@ rubygems_version: 0.9.4
3
3
  specification_version: 1
4
4
  name: beanstalk-client
5
5
  version: !ruby/object:Gem::Version
6
- version: 0.7.0
7
- date: 2008-02-01 00:00:00 -08:00
6
+ version: 0.9.0
7
+ date: 2008-02-27 00:00:00 -08:00
8
8
  summary: Ruby client library for the Beanstalk protocol
9
9
  require_paths:
10
10
  - lib