asir_beanstalk 1.2.5 → 1.2.6

Sign up to get free protection for your applications and to get access to all the features.
data/Changelog CHANGED
@@ -1,3 +1,8 @@
1
+ 2012-03-13 Kurt A. Stephens <ks.github@kurtstephens.com>
2
+
3
+ * v1.2.6: New Version: Added #status, #stats, #stats_job, #stats_tube.
4
+ * Improved tests.
5
+
1
6
  2012-03-12 Kurt A. Stephens <ks.github@kurtstephens.com>
2
7
 
3
8
  * v1.2.5: New Version: Test fixes.
@@ -18,7 +18,7 @@ Gem::Specification.new do |gem|
18
18
  gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
19
19
  gem.require_paths = ["lib"]
20
20
 
21
- gem.add_dependency "asir", "~> 1.2.3"
21
+ gem.add_dependency "asir", "~> 1.2.6"
22
22
 
23
23
  gem.add_development_dependency 'rake', '>= 0.9.0'
24
24
  gem.add_development_dependency 'rspec', '~> 2.12.0'
@@ -1,4 +1,5 @@
1
1
  require 'asir/transport/tcp_socket'
2
+ require 'yaml'
2
3
 
3
4
  module ASIR
4
5
  class Transport
@@ -130,6 +131,51 @@ module ASIR
130
131
  # !SLIDE
131
132
  # Beanstalk protocol support
132
133
 
134
+ def status
135
+ {
136
+ :beanstalkd => {
137
+ :stats => stats,
138
+ :stats_tube => tube && stats_tube,
139
+ }
140
+ }
141
+ end
142
+
143
+ def stats
144
+ _beanstalk_stats_yaml! "stats\r\n"
145
+ end
146
+
147
+ def stats_job job_id
148
+ _beanstalk_stats_yaml! "stats-job #{job_id}\r\n"
149
+ end
150
+
151
+ def stats_tube tube = nil
152
+ tube ||= self.tube
153
+ _beanstalk_stats_yaml! "stats-tube #{tube}\r\n"
154
+ end
155
+
156
+ def _beanstalk_stats_yaml! message, expect = nil
157
+ expect ||= /\AOK (\d+)\r\n\Z/
158
+ x = _beanstalk_return_data message, expect
159
+ x && ::YAML.load(x)
160
+ rescue ASIR::Transport::PayloadIO::UnexpectedResponse => exc
161
+ return :NOT_FOUND if exc.received == NOT_FOUND
162
+ raise exc
163
+ end
164
+ NOT_FOUND = "NOT_FOUND\r\n".freeze
165
+
166
+ def _beanstalk_return_data message, expect, data_size_field = nil, payload = nil
167
+ (@server || stream).with_stream! do | stream |
168
+ if match = _beanstalk(stream, message, expect, payload)
169
+ size = match[data_size_field ||= 1].to_i
170
+ data = stream.read(size)
171
+ _read_line_and_expect! stream, /\A\r\n\Z/
172
+ data
173
+ else
174
+ raise "unexpected result"
175
+ end
176
+ end
177
+ end
178
+
133
179
  # Send "something ...\r\n".
134
180
  # Expect /\ASOMETHING (\d+)...\r\n".
135
181
  def _beanstalk stream, message, expect, payload = nil
@@ -1,3 +1,3 @@
1
1
  module AsirBeanstalk
2
- VERSION = "1.2.5"
2
+ VERSION = "1.2.6"
3
3
  end
@@ -1,7 +1,26 @@
1
1
  require 'spec_helper'
2
+ require 'asir/coder/marshal'
3
+ require 'timeout'
4
+ #require 'pp'
2
5
 
3
6
  describe "ASIR::Transport::Beanstalk" do
4
- attr_accessor :t
7
+ let :t do
8
+ t =
9
+ ASIR::Transport::Beanstalk.new({
10
+ :encoder => ASIR::Coder::Marshal.new,
11
+ :uri => "beanstalk://localhost:31033/spec",
12
+ :conduit_options => {
13
+ :pid_file => "/tmp/asir-beanstalk-test.pid",
14
+ },
15
+ :verbose => 9,
16
+ :_logger => $stderr,
17
+ })
18
+ end
19
+
20
+ context "for uninitialized instance" do
21
+ let :t do
22
+ ASIR::Transport::Beanstalk.new
23
+ end
5
24
 
6
25
  it "should default to localhost:11300" do
7
26
  t.host.should == '127.0.0.1'
@@ -29,8 +48,103 @@ describe "ASIR::Transport::Beanstalk" do
29
48
  t.tube = 'tube'
30
49
  t.uri.should == "beanstalk://host:12345/tube"
31
50
  end
51
+ end
52
+
53
+ context "with started beanstalk server" do
54
+ before :all do
55
+ $transport ||= t
56
+ t.start_conduit!
57
+ sleep 1
58
+ end
59
+ after :all do
60
+ $transport.stop_conduit!
61
+ end
62
+
63
+ context "with connected transport" do
64
+ let :connected_transport do
65
+ t.stream
66
+ # pp t
67
+ t
68
+ end
69
+
70
+ it "should be able to get stats" do
71
+ s = t.stats
72
+ s['pid'].should_not == nil
73
+ s['version'].should_not == nil
74
+ end
75
+
76
+ it "should be able to get stats_tube" do
77
+ s = t.stats_tube
78
+ t.tube.should == 'spec'
79
+ s['name'].should == t.tube
80
+ s['current-using'].should_not == nil
81
+ end
82
+
83
+ it "should not get stats_tube on an unknown tube" do
84
+ s = t.stats_tube "UNKNOWN"
85
+ s.should == :NOT_FOUND
86
+ end
87
+
88
+ it "should be able to get status" do
89
+ s = t.status
90
+ s = s[:beanstalkd]
91
+ s.should_not == nil
92
+ s[:stats].class.should == Hash
93
+ s[:stats_tube].class.should == Hash
94
+ end
95
+
96
+ context "with a sent message" do
97
+ let :m do
98
+ ASIR::Message.new(ASIR, :name, [ ], nil, nil)
99
+ end
100
+
101
+ let :sent_message do
102
+ t.send_message(m)
103
+ # pp m
104
+ m
105
+ end
106
+
107
+ it "should have at least one job in its tube" do
108
+ s = t.stats_tube
109
+ # pp [ __LINE__, s ]
110
+ # PENDING
111
+ end
112
+
113
+ it "should be able to get status on job" do
114
+ job_id = sent_message[:beanstalk_job_id]
115
+ s = t.stats_job job_id
116
+ # pp [ __LINE__, job_id, s ]
117
+ s["id"].should == job_id
118
+ s["tube"].should == 'spec'
119
+ s["state"].should == 'ready'
120
+ end
121
+
122
+ context "with received message" do
123
+ let :state do
124
+ state = nil
125
+ Timeout.timeout(5) do
126
+ stream, stream = t._server_accept_connection! nil
127
+ state =
128
+ ASIR::Message::State.new(:in_stream => stream, :out_stream => stream)
129
+ # pp t
130
+ t.receive_message(state)
131
+ state.message.class.should == ASIR::Message
132
+ state.message.receiver.should == ASIR
133
+ state.message.selector.should == :name
134
+ state.message.arguments.should == [ ]
135
+ end
136
+ state
137
+ end
32
138
 
33
- before :each do
34
- @t = ASIR::Transport::Beanstalk.new
139
+ it "should have consumed job" do
140
+ t._after_invoke_message state
141
+ job_id = sent_message[:beanstalk_job_id]
142
+ s = t.stats_job job_id
143
+ # pp [ __LINE__, job_id, s ]
144
+ s.should == :NOT_FOUND
145
+ end
146
+ end
147
+ end
148
+ end
35
149
  end
36
150
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: asir_beanstalk
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.2.5
4
+ version: 1.2.6
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-03-13 00:00:00.000000000 Z
12
+ date: 2013-03-14 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: asir
@@ -18,7 +18,7 @@ dependencies:
18
18
  requirements:
19
19
  - - ~>
20
20
  - !ruby/object:Gem::Version
21
- version: 1.2.3
21
+ version: 1.2.6
22
22
  type: :runtime
23
23
  prerelease: false
24
24
  version_requirements: !ruby/object:Gem::Requirement
@@ -26,7 +26,7 @@ dependencies:
26
26
  requirements:
27
27
  - - ~>
28
28
  - !ruby/object:Gem::Version
29
- version: 1.2.3
29
+ version: 1.2.6
30
30
  - !ruby/object:Gem::Dependency
31
31
  name: rake
32
32
  requirement: !ruby/object:Gem::Requirement
@@ -119,7 +119,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
119
119
  version: '0'
120
120
  segments:
121
121
  - 0
122
- hash: 2965738020681731259
122
+ hash: -1356083774943575431
123
123
  required_rubygems_version: !ruby/object:Gem::Requirement
124
124
  none: false
125
125
  requirements:
@@ -128,7 +128,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
128
128
  version: '0'
129
129
  segments:
130
130
  - 0
131
- hash: 2965738020681731259
131
+ hash: -1356083774943575431
132
132
  requirements: []
133
133
  rubyforge_project:
134
134
  rubygems_version: 1.8.25