asir_beanstalk 1.2.5 → 1.2.6

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