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 +5 -0
- data/asir_beanstalk.gemspec +1 -1
- data/lib/asir/transport/beanstalk.rb +46 -0
- data/lib/asir_beanstalk/version.rb +1 -1
- data/spec/beanstalk_spec.rb +117 -3
- metadata +6 -6
data/Changelog
CHANGED
data/asir_beanstalk.gemspec
CHANGED
@@ -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.
|
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
|
data/spec/beanstalk_spec.rb
CHANGED
@@ -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
|
-
|
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
|
-
|
34
|
-
|
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.
|
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-
|
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.
|
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.
|
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:
|
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:
|
131
|
+
hash: -1356083774943575431
|
132
132
|
requirements: []
|
133
133
|
rubyforge_project:
|
134
134
|
rubygems_version: 1.8.25
|