beaneater 0.3.3 → 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +6 -1
- data/README.md +37 -19
- data/examples/demo.rb +1 -2
- data/lib/beaneater.rb +56 -3
- data/lib/beaneater/configuration.rb +3 -1
- data/lib/beaneater/connection.rb +123 -26
- data/lib/beaneater/errors.rb +1 -1
- data/lib/beaneater/job/collection.rb +57 -36
- data/lib/beaneater/job/record.rb +27 -27
- data/lib/beaneater/stats.rb +28 -5
- data/lib/beaneater/stats/fast_struct.rb +1 -1
- data/lib/beaneater/stats/stat_struct.rb +8 -2
- data/lib/beaneater/tube/collection.rb +67 -26
- data/lib/beaneater/tube/record.rb +38 -24
- data/lib/beaneater/version.rb +3 -3
- data/test/beaneater_test.rb +1 -7
- data/test/connection_test.rb +37 -1
- data/test/job_test.rb +3 -7
- data/test/jobs_test.rb +12 -40
- data/test/prompt_regexp_test.rb +4 -3
- data/test/stat_struct_test.rb +10 -0
- data/test/stats_test.rb +7 -7
- data/test/test_helper.rb +30 -6
- data/test/tube_test.rb +9 -20
- data/test/tubes_test.rb +59 -54
- metadata +2 -8
- data/lib/beaneater/pool.rb +0 -166
- data/lib/beaneater/pool_command.rb +0 -79
- data/test/pool_command_test.rb +0 -90
- data/test/pool_test.rb +0 -185
data/lib/beaneater/errors.rb
CHANGED
@@ -1,14 +1,18 @@
|
|
1
|
-
|
1
|
+
class Beaneater
|
2
2
|
# Exception to stop processing jobs during a `process!` loop.
|
3
3
|
# Simply `raise AbortProcessingError` in any job process handler to stop the processing loop.
|
4
4
|
class AbortProcessingError < RuntimeError; end
|
5
5
|
|
6
6
|
# Represents collection of job-related commands.
|
7
|
-
class Jobs
|
7
|
+
class Jobs
|
8
8
|
|
9
9
|
# @!attribute processors
|
10
10
|
# @return [Array<Proc>] returns Collection of proc to handle beanstalkd jobs
|
11
|
-
|
11
|
+
# @!attribute client
|
12
|
+
# @return [Beaneater] returns the client instance
|
13
|
+
# @!attribute current_job
|
14
|
+
# @return [Beaneater] returns the currently processing job in the process loop
|
15
|
+
attr_reader :processors, :client, :current_job
|
12
16
|
|
13
17
|
# Number of retries to process a job.
|
14
18
|
MAX_RETRIES = 3
|
@@ -19,39 +23,41 @@ module Beaneater
|
|
19
23
|
# Number of seconds to wait for a job before checking a different server.
|
20
24
|
RESERVE_TIMEOUT = nil
|
21
25
|
|
22
|
-
#
|
26
|
+
# Creates new jobs instance.
|
23
27
|
#
|
24
|
-
# @param [
|
25
|
-
# @return [Beaneater::Job] Job matching given id
|
28
|
+
# @param [Beaneater] client The beaneater client instance.
|
26
29
|
# @example
|
27
|
-
#
|
28
|
-
# @beaneater_pool.jobs.find(123) # => <Beaneater::Job>
|
29
|
-
# @beaneater_pool.jobs.peek(123) # => <Beaneater::Job>
|
30
|
+
# Beaneater::Jobs.new(@client)
|
30
31
|
#
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
32
|
+
def initialize(client)
|
33
|
+
@client = client
|
34
|
+
end
|
35
|
+
|
36
|
+
# Delegates transmit to the connection object.
|
37
|
+
#
|
38
|
+
# @see Beaneater::Connection#transmit
|
39
|
+
def transmit(command, options={})
|
40
|
+
client.connection.transmit(command, options)
|
37
41
|
end
|
38
|
-
alias_method :peek, :find
|
39
|
-
alias_method :[], :find
|
40
42
|
|
41
|
-
#
|
43
|
+
# Peek (or find) job by id from beanstalkd.
|
42
44
|
#
|
43
45
|
# @param [Integer] id Job id to find
|
44
|
-
# @return [
|
46
|
+
# @return [Beaneater::Job] Job matching given id
|
45
47
|
# @example
|
46
|
-
# @
|
48
|
+
# @beaneater.jobs[123] # => <Beaneater::Job>
|
49
|
+
# @beaneater.jobs.find(123) # => <Beaneater::Job>
|
50
|
+
# @beaneater.jobs.peek(123) # => <Beaneater::Job>
|
47
51
|
#
|
48
52
|
# @api public
|
49
|
-
def
|
50
|
-
res =
|
51
|
-
|
52
|
-
rescue Beaneater::NotFoundError
|
53
|
-
|
53
|
+
def find(id)
|
54
|
+
res = transmit("peek #{id}")
|
55
|
+
Job.new(client, res)
|
56
|
+
rescue Beaneater::NotFoundError
|
57
|
+
nil
|
54
58
|
end
|
59
|
+
alias_method :peek, :find
|
60
|
+
alias_method :[], :find
|
55
61
|
|
56
62
|
# Register a processor to handle beanstalkd job on particular tube.
|
57
63
|
#
|
@@ -78,6 +84,18 @@ module Beaneater
|
|
78
84
|
@processors[tube_name.to_s] = { :block => block, :retry_on => retry_on, :max_retries => max_retries }
|
79
85
|
end
|
80
86
|
|
87
|
+
# Sets flag to indicate that process loop should stop after current job
|
88
|
+
def stop!
|
89
|
+
@stop = true
|
90
|
+
end
|
91
|
+
|
92
|
+
# Returns whether the process loop should stop
|
93
|
+
#
|
94
|
+
# @return [Boolean] if true the loop should stop after current processing
|
95
|
+
def stop?
|
96
|
+
!!@stop
|
97
|
+
end
|
98
|
+
|
81
99
|
# Watch, reserve, process and delete or bury or release jobs.
|
82
100
|
#
|
83
101
|
# @param [Hash{String => Integer}] options Settings for processing
|
@@ -88,27 +106,30 @@ module Beaneater
|
|
88
106
|
def process!(options={})
|
89
107
|
release_delay = options.delete(:release_delay) || RELEASE_DELAY
|
90
108
|
reserve_timeout = options.delete(:reserve_timeout) || RESERVE_TIMEOUT
|
91
|
-
tubes.watch!(*processors.keys)
|
92
|
-
|
109
|
+
client.tubes.watch!(*processors.keys)
|
110
|
+
while !stop? do
|
93
111
|
begin
|
94
|
-
|
95
|
-
processor = processors[
|
112
|
+
@current_job = client.tubes.reserve(reserve_timeout)
|
113
|
+
processor = processors[@current_job.tube]
|
96
114
|
begin
|
97
|
-
processor[:block].call(
|
98
|
-
|
115
|
+
processor[:block].call(@current_job)
|
116
|
+
@current_job.delete
|
99
117
|
rescue *processor[:retry_on]
|
100
|
-
|
118
|
+
if @current_job.stats.releases < processor[:max_retries]
|
119
|
+
@current_job.release(:delay => release_delay)
|
120
|
+
end
|
101
121
|
end
|
102
122
|
rescue AbortProcessingError
|
103
123
|
break
|
104
124
|
rescue Beaneater::JobNotReserved, Beaneater::NotFoundError, Beaneater::TimedOutError
|
105
125
|
retry
|
106
|
-
rescue StandardError
|
107
|
-
|
126
|
+
rescue StandardError # handles unspecified errors
|
127
|
+
@current_job.bury if @current_job
|
108
128
|
ensure # bury if still reserved
|
109
|
-
|
129
|
+
@current_job.bury if @current_job && @current_job.exists? && @current_job.reserved?
|
130
|
+
@current_job = nil
|
110
131
|
end
|
111
132
|
end
|
112
133
|
end # process!
|
113
134
|
end # Jobs
|
114
|
-
end # Beaneater
|
135
|
+
end # Beaneater
|
data/lib/beaneater/job/record.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
|
1
|
+
class Beaneater
|
2
2
|
# Represents job related commands.
|
3
3
|
class Job
|
4
4
|
|
@@ -6,21 +6,21 @@ module Beaneater
|
|
6
6
|
# @return [Integer] id for the job.
|
7
7
|
# @!attribute body
|
8
8
|
# @return [String] the job's body.
|
9
|
-
# @!attribute connection
|
10
|
-
# @return [Beaneater::Connection] connection which has retrieved job.
|
11
9
|
# @!attribute reserved
|
12
10
|
# @return [Boolean] whether the job has been reserved.
|
13
|
-
|
11
|
+
# @!attribute client
|
12
|
+
# @return [Beaneater] returns the client instance
|
13
|
+
attr_reader :id, :body, :reserved, :client
|
14
14
|
|
15
15
|
|
16
16
|
# Initializes a new job object.
|
17
17
|
#
|
18
18
|
# @param [Hash{Symbol => String,Number}] res Result from beanstalkd response
|
19
19
|
#
|
20
|
-
def initialize(res)
|
20
|
+
def initialize(client, res)
|
21
|
+
@client = client
|
21
22
|
@id = res[:id]
|
22
23
|
@body = res[:body]
|
23
|
-
@connection = res[:connection]
|
24
24
|
@reserved = res[:status] == 'RESERVED'
|
25
25
|
end
|
26
26
|
|
@@ -31,8 +31,8 @@ module Beaneater
|
|
31
31
|
# @return [Hash{Symbol => String,Number}] Beanstalkd response for the command.
|
32
32
|
#
|
33
33
|
# @example
|
34
|
-
# @
|
35
|
-
# # => {:status=>"BURIED", :body=>nil
|
34
|
+
# @job.bury({:pri => 100})
|
35
|
+
# # => {:status=>"BURIED", :body=>nil}
|
36
36
|
#
|
37
37
|
# @api public
|
38
38
|
def bury(options={})
|
@@ -49,8 +49,8 @@ module Beaneater
|
|
49
49
|
# @option options [Integer] delay Assign new delay to job
|
50
50
|
# @return [Hash{Symbol => String,Number}] Beanstalkd response for the command.
|
51
51
|
# @example
|
52
|
-
# @
|
53
|
-
# # => {:status=>"RELEASED", :body=>nil
|
52
|
+
# @beaneater.jobs.find(123).release(:pri => 10, :delay => 5)
|
53
|
+
# # => {:status=>"RELEASED", :body=>nil}
|
54
54
|
#
|
55
55
|
# @api public
|
56
56
|
def release(options={})
|
@@ -64,8 +64,8 @@ module Beaneater
|
|
64
64
|
#
|
65
65
|
# @return [Hash{Symbol => String,Number}] Beanstalkd response for the command.
|
66
66
|
# @example
|
67
|
-
# @
|
68
|
-
# # => {:status=>"TOUCHED", :body=>nil
|
67
|
+
# @beaneater.jobs.find(123).touch
|
68
|
+
# # => {:status=>"TOUCHED", :body=>nil}
|
69
69
|
#
|
70
70
|
# @api public
|
71
71
|
def touch
|
@@ -76,8 +76,8 @@ module Beaneater
|
|
76
76
|
#
|
77
77
|
# @return [Hash{Symbol => String,Number}] Beanstalkd response for the command.
|
78
78
|
# @example
|
79
|
-
# @
|
80
|
-
# # => {:status=>"DELETED", :body=>nil
|
79
|
+
# @beaneater.jobs.find(123).delete
|
80
|
+
# # => {:status=>"DELETED", :body=>nil}
|
81
81
|
#
|
82
82
|
# @api public
|
83
83
|
def delete
|
@@ -88,8 +88,8 @@ module Beaneater
|
|
88
88
|
#
|
89
89
|
# @return [Hash{Symbol => String,Number}] Beanstalkd response for the command.
|
90
90
|
# @example
|
91
|
-
# @
|
92
|
-
# # => {:status=>"KICKED", :body=>nil
|
91
|
+
# @beaneater.jobs.find(123).kick
|
92
|
+
# # => {:status=>"KICKED", :body=>nil}
|
93
93
|
#
|
94
94
|
# @api public
|
95
95
|
def kick
|
@@ -100,7 +100,7 @@ module Beaneater
|
|
100
100
|
#
|
101
101
|
# @return [Beaneater::StatStruct] struct filled with relevant job stats
|
102
102
|
# @example
|
103
|
-
# @
|
103
|
+
# @beaneater.jobs.find(123).stats
|
104
104
|
# @job.stats.tube # => "some-tube"
|
105
105
|
#
|
106
106
|
# @api public
|
@@ -113,7 +113,7 @@ module Beaneater
|
|
113
113
|
#
|
114
114
|
# @return [Boolean] Returns true if the job is in a reserved state
|
115
115
|
# @example
|
116
|
-
# @
|
116
|
+
# @beaneater.jobs.find(123).reserved?
|
117
117
|
#
|
118
118
|
# @api public
|
119
119
|
def reserved?
|
@@ -124,7 +124,7 @@ module Beaneater
|
|
124
124
|
#
|
125
125
|
# @return [Boolean] Returns true if the job still exists
|
126
126
|
# @example
|
127
|
-
# @
|
127
|
+
# @beaneater.jobs.find(123).exists?
|
128
128
|
#
|
129
129
|
# @api public
|
130
130
|
def exists?
|
@@ -137,7 +137,7 @@ module Beaneater
|
|
137
137
|
#
|
138
138
|
# @return [String] The name of the tube for this job
|
139
139
|
# @example
|
140
|
-
# @
|
140
|
+
# @beaneater.jobs.find(123).tube
|
141
141
|
# # => "some-tube"
|
142
142
|
#
|
143
143
|
# @api public
|
@@ -149,7 +149,7 @@ module Beaneater
|
|
149
149
|
#
|
150
150
|
# @return [Integer] The ttr of this job
|
151
151
|
# @example
|
152
|
-
# @
|
152
|
+
# @beaneater.jobs.find(123).ttr
|
153
153
|
# # => 123
|
154
154
|
#
|
155
155
|
# @api public
|
@@ -161,7 +161,7 @@ module Beaneater
|
|
161
161
|
#
|
162
162
|
# @return [Integer] The pri of this job
|
163
163
|
# @example
|
164
|
-
# @
|
164
|
+
# @beaneater.jobs.find(123).pri
|
165
165
|
# # => 1
|
166
166
|
#
|
167
167
|
def pri
|
@@ -172,7 +172,7 @@ module Beaneater
|
|
172
172
|
#
|
173
173
|
# @return [Integer] The delay of this job
|
174
174
|
# @example
|
175
|
-
# @
|
175
|
+
# @beaneater.jobs.find(123).delay
|
176
176
|
# # => 5
|
177
177
|
#
|
178
178
|
def delay
|
@@ -183,8 +183,8 @@ module Beaneater
|
|
183
183
|
#
|
184
184
|
# @return [String] string representation
|
185
185
|
# @example
|
186
|
-
# @
|
187
|
-
# @
|
186
|
+
# @beaneater.jobs.find(123).to_s
|
187
|
+
# @beaneater.jobs.find(123).inspect
|
188
188
|
#
|
189
189
|
def to_s
|
190
190
|
"#<Beaneater::Job id=#{id} body=#{body.inspect}>"
|
@@ -193,7 +193,7 @@ module Beaneater
|
|
193
193
|
|
194
194
|
protected
|
195
195
|
|
196
|
-
# Transmit command to beanstalkd
|
196
|
+
# Transmit command to beanstalkd instance and fetch response.
|
197
197
|
#
|
198
198
|
# @param [String] cmd Beanstalkd command to send.
|
199
199
|
# @return [Hash{Symbol => String,Number}] Beanstalkd response for the command.
|
@@ -202,7 +202,7 @@ module Beaneater
|
|
202
202
|
# transmit('stats') { 'success' }
|
203
203
|
#
|
204
204
|
def transmit(cmd, &block)
|
205
|
-
res = connection.transmit(cmd)
|
205
|
+
res = client.connection.transmit(cmd)
|
206
206
|
yield if block_given?
|
207
207
|
res
|
208
208
|
end
|
data/lib/beaneater/stats.rb
CHANGED
@@ -1,9 +1,24 @@
|
|
1
1
|
require 'beaneater/stats/fast_struct'
|
2
2
|
require 'beaneater/stats/stat_struct'
|
3
3
|
|
4
|
-
|
4
|
+
class Beaneater
|
5
5
|
# Represents stats related to the beanstalkd pool.
|
6
|
-
class Stats
|
6
|
+
class Stats
|
7
|
+
|
8
|
+
# @!attribute client
|
9
|
+
# @return [Beaneater] returns the client instance
|
10
|
+
attr_reader :client
|
11
|
+
|
12
|
+
# Creates new stats instance.
|
13
|
+
#
|
14
|
+
# @param [Beaneater] client The beaneater client instance.
|
15
|
+
# @example
|
16
|
+
# Beaneater::Stats.new(@client)
|
17
|
+
#
|
18
|
+
def initialize(client)
|
19
|
+
@client = client
|
20
|
+
end
|
21
|
+
|
7
22
|
# Returns keys for stats data
|
8
23
|
#
|
9
24
|
# @return [Array<String>] Set of keys for stats.
|
@@ -26,6 +41,14 @@ module Beaneater
|
|
26
41
|
data[key]
|
27
42
|
end
|
28
43
|
|
44
|
+
# Delegates inspection to the real data structure
|
45
|
+
#
|
46
|
+
# @return [String] returns a string containing a detailed stats summary
|
47
|
+
def inspect
|
48
|
+
data.to_s
|
49
|
+
end
|
50
|
+
alias :to_s :inspect
|
51
|
+
|
29
52
|
# Defines a cached method for looking up data for specified key
|
30
53
|
# Protects against infinite loops by checking stacktrace
|
31
54
|
# @api public
|
@@ -42,15 +65,15 @@ module Beaneater
|
|
42
65
|
|
43
66
|
protected
|
44
67
|
|
45
|
-
# Returns struct based on stats data
|
68
|
+
# Returns struct based on stats data from response.
|
46
69
|
#
|
47
|
-
# @return [Beaneater::StatStruct] the
|
70
|
+
# @return [Beaneater::StatStruct] the stats
|
48
71
|
# @example
|
49
72
|
# self.data # => { 'version' : 1.7, 'total_connections' : 23 }
|
50
73
|
# self.data.total_connections # => 23
|
51
74
|
#
|
52
75
|
def data
|
53
|
-
StatStruct.from_hash(
|
76
|
+
StatStruct.from_hash(client.connection.transmit('stats')[:body])
|
54
77
|
end
|
55
78
|
end # Stats
|
56
79
|
end # Beaneater
|
@@ -1,4 +1,4 @@
|
|
1
|
-
|
1
|
+
class Beaneater
|
2
2
|
# Represents a stats hash with proper underscored keys
|
3
3
|
class StatStruct < FasterOpenStruct
|
4
4
|
# Convert a stats hash into a struct.
|
@@ -35,5 +35,11 @@ module Beaneater
|
|
35
35
|
def keys
|
36
36
|
@hash.keys.map { |k| k.to_s }
|
37
37
|
end
|
38
|
+
|
39
|
+
# Returns the initialization hash
|
40
|
+
#
|
41
|
+
def to_h
|
42
|
+
@hash
|
43
|
+
end
|
38
44
|
end # StatStruct
|
39
|
-
end # Beaneater
|
45
|
+
end # Beaneater
|
@@ -1,16 +1,36 @@
|
|
1
|
-
|
1
|
+
class Beaneater
|
2
2
|
# Represents collection of tube related commands.
|
3
|
-
|
3
|
+
|
4
|
+
class Tubes
|
5
|
+
include Enumerable
|
6
|
+
|
7
|
+
# @!attribute client
|
8
|
+
# @return [Beaneater] returns the client instance
|
9
|
+
attr_reader :client
|
4
10
|
|
5
11
|
# Creates new tubes instance.
|
6
12
|
#
|
7
|
-
# @param [Beaneater
|
13
|
+
# @param [Beaneater] client The beaneater client instance.
|
8
14
|
# @example
|
9
|
-
# Beaneater::Tubes.new(@
|
15
|
+
# Beaneater::Tubes.new(@client)
|
16
|
+
#
|
17
|
+
def initialize(client)
|
18
|
+
@client = client
|
19
|
+
end
|
20
|
+
|
21
|
+
def last_used
|
22
|
+
client.connection.tube_used
|
23
|
+
end
|
24
|
+
|
25
|
+
def last_used=(tube_name)
|
26
|
+
client.connection.tube_used = tube_name
|
27
|
+
end
|
28
|
+
|
29
|
+
# Delegates transmit to the connection object.
|
10
30
|
#
|
11
|
-
|
12
|
-
|
13
|
-
|
31
|
+
# @see Beaneater::Connection#transmit
|
32
|
+
def transmit(command, options={})
|
33
|
+
client.connection.transmit(command, options)
|
14
34
|
end
|
15
35
|
|
16
36
|
# Finds the specified beanstalk tube.
|
@@ -24,7 +44,7 @@ module Beaneater
|
|
24
44
|
#
|
25
45
|
# @api public
|
26
46
|
def find(tube_name)
|
27
|
-
Tube.new(
|
47
|
+
Tube.new(client, tube_name)
|
28
48
|
end
|
29
49
|
alias_method :[], :find
|
30
50
|
|
@@ -35,13 +55,14 @@ module Beaneater
|
|
35
55
|
# @yield [job] Reserved beaneater job.
|
36
56
|
# @return [Beaneater::Job] Reserved beaneater job.
|
37
57
|
# @example
|
38
|
-
# @
|
58
|
+
# @client.tubes.reserve { |job| process(job) }
|
39
59
|
# # => <Beaneater::Job id=5 body="foo">
|
40
60
|
#
|
41
61
|
# @api public
|
42
62
|
def reserve(timeout=nil, &block)
|
43
|
-
res =
|
44
|
-
|
63
|
+
res = transmit(
|
64
|
+
timeout ? "reserve-with-timeout #{timeout}" : 'reserve')
|
65
|
+
job = Job.new(client, res)
|
45
66
|
block.call(job) if block_given?
|
46
67
|
job
|
47
68
|
end
|
@@ -50,36 +71,54 @@ module Beaneater
|
|
50
71
|
#
|
51
72
|
# @return [Array<Beaneater::Tube>] List of all beanstalk tubes.
|
52
73
|
# @example
|
53
|
-
# @
|
74
|
+
# @client.tubes.all
|
54
75
|
# # => [<Beaneater::Tube name="tube2">, <Beaneater::Tube name="tube3">]
|
55
76
|
#
|
56
77
|
# @api public
|
57
78
|
def all
|
58
|
-
|
79
|
+
transmit('list-tubes')[:body].map do |tube_name|
|
80
|
+
Tube.new(client, tube_name)
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
# Calls the given block once for each known beanstalk tube, passing that element as a parameter.
|
85
|
+
#
|
86
|
+
# @return An Enumerator is returned if no block is given.
|
87
|
+
# @example
|
88
|
+
# @pool.tubes.each {|t| puts t.name}
|
89
|
+
#
|
90
|
+
# @api public
|
91
|
+
def each
|
92
|
+
block_given? ? all.each(&Proc.new) : all.each
|
59
93
|
end
|
60
94
|
|
61
95
|
# List of watched beanstalk tubes.
|
62
96
|
#
|
63
97
|
# @return [Array<Beaneater::Tube>] List of watched beanstalk tubes.
|
64
98
|
# @example
|
65
|
-
# @
|
99
|
+
# @client.tubes.watched
|
66
100
|
# # => [<Beaneater::Tube name="tube2">, <Beaneater::Tube name="tube3">]
|
67
101
|
#
|
68
102
|
# @api public
|
69
103
|
def watched
|
70
|
-
|
104
|
+
last_watched = transmit('list-tubes-watched')[:body]
|
105
|
+
client.connection.tubes_watched = last_watched.dup
|
106
|
+
last_watched.map do |tube_name|
|
107
|
+
Tube.new(client, tube_name)
|
108
|
+
end
|
71
109
|
end
|
72
110
|
|
73
111
|
# Currently used beanstalk tube.
|
74
112
|
#
|
75
113
|
# @return [Beaneater::Tube] Currently used beanstalk tube.
|
76
114
|
# @example
|
77
|
-
# @
|
115
|
+
# @client.tubes.used
|
78
116
|
# # => <Beaneater::Tube name="tube2">
|
79
117
|
#
|
80
118
|
# @api public
|
81
119
|
def used
|
82
|
-
|
120
|
+
last_used = transmit('list-tube-used')[:id]
|
121
|
+
Tube.new(client, last_used)
|
83
122
|
end
|
84
123
|
|
85
124
|
# Add specified beanstalkd tubes as watched.
|
@@ -87,12 +126,13 @@ module Beaneater
|
|
87
126
|
# @param [*String] names Name of tubes to watch
|
88
127
|
# @raise [Beaneater::InvalidTubeName] Tube to watch was invalid.
|
89
128
|
# @example
|
90
|
-
# @
|
129
|
+
# @client.tubes.watch('foo', 'bar')
|
91
130
|
#
|
92
131
|
# @api public
|
93
132
|
def watch(*names)
|
94
133
|
names.each do |t|
|
95
|
-
|
134
|
+
transmit "watch #{t}"
|
135
|
+
client.connection.add_to_watched(t)
|
96
136
|
end
|
97
137
|
rescue BadFormatError => ex
|
98
138
|
raise InvalidTubeName, "Tube in '#{ex.cmd}' is invalid!"
|
@@ -103,7 +143,7 @@ module Beaneater
|
|
103
143
|
# @param [*String] names Name of tubes to watch
|
104
144
|
# @raise [Beaneater::InvalidTubeName] Tube to watch was invalid.
|
105
145
|
# @example
|
106
|
-
# @
|
146
|
+
# @client.tubes.watch!('foo', 'bar')
|
107
147
|
#
|
108
148
|
# @api public
|
109
149
|
def watch!(*names)
|
@@ -116,12 +156,13 @@ module Beaneater
|
|
116
156
|
#
|
117
157
|
# @param [*String] names Name of tubes to ignore
|
118
158
|
# @example
|
119
|
-
# @
|
159
|
+
# @client.tubes.ignore('foo', 'bar')
|
120
160
|
#
|
121
161
|
# @api public
|
122
162
|
def ignore(*names)
|
123
163
|
names.each do |w|
|
124
|
-
|
164
|
+
transmit "ignore #{w}"
|
165
|
+
client.connection.remove_from_watched(w)
|
125
166
|
end
|
126
167
|
end
|
127
168
|
|
@@ -132,11 +173,11 @@ module Beaneater
|
|
132
173
|
# @conn.tubes.use("some-tube")
|
133
174
|
#
|
134
175
|
def use(tube)
|
135
|
-
return tube if
|
136
|
-
|
137
|
-
|
176
|
+
return tube if last_used == tube
|
177
|
+
transmit("use #{tube}")
|
178
|
+
last_used = tube
|
138
179
|
rescue BadFormatError
|
139
180
|
raise InvalidTubeName, "Tube cannot be named '#{tube}'"
|
140
181
|
end
|
141
182
|
end # Tubes
|
142
|
-
end # Beaneater
|
183
|
+
end # Beaneater
|