hoth 0.3.2.beta4 → 0.3.3
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/Gemfile.lock +10 -7
- data/lib/hoth/providers/beanstalkd_provider.rb +17 -10
- data/lib/hoth/providers/rack_provider.rb +1 -3
- data/lib/hoth/transport/beanstalkd.rb +10 -4
- data/spec/unit/providers/beanstalkd_provider_spec.rb +39 -0
- data/spec/unit/transport/beanstalkd_spec.rb +61 -0
- metadata +114 -56
data/Gemfile.lock
CHANGED
@@ -1,21 +1,25 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
hoth (0.3.
|
4
|
+
hoth (0.3.2.beta6)
|
5
5
|
activesupport
|
6
6
|
bertrpc
|
7
|
+
hoth
|
7
8
|
json
|
8
9
|
|
9
10
|
GEM
|
10
11
|
remote: http://rubygems.org/
|
11
12
|
specs:
|
12
|
-
activesupport (3.0.
|
13
|
+
activesupport (3.0.6)
|
14
|
+
beanstalk-client (1.1.0)
|
13
15
|
bert (1.1.2)
|
14
16
|
bertrpc (1.3.0)
|
15
|
-
bert (
|
17
|
+
bert (< 2.0.0, >= 1.1.0)
|
16
18
|
diff-lcs (1.1.2)
|
19
|
+
em-jack (0.1.3)
|
20
|
+
eventmachine
|
17
21
|
eventmachine (0.12.10)
|
18
|
-
json (1.
|
22
|
+
json (1.5.1)
|
19
23
|
memcache-client (1.8.5)
|
20
24
|
rspec (2.4.0)
|
21
25
|
rspec-core (~> 2.4.0)
|
@@ -37,9 +41,8 @@ PLATFORMS
|
|
37
41
|
ruby
|
38
42
|
|
39
43
|
DEPENDENCIES
|
40
|
-
|
41
|
-
|
44
|
+
beanstalk-client
|
45
|
+
em-jack
|
42
46
|
hoth!
|
43
|
-
json
|
44
47
|
rspec
|
45
48
|
simple_publisher
|
@@ -9,18 +9,17 @@ module Hoth
|
|
9
9
|
|
10
10
|
class BeanstalkdProvider
|
11
11
|
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
end
|
12
|
+
attr_reader :module_name, :services_to_listen_for
|
13
|
+
|
14
|
+
def initialize(module_name = nil)
|
15
|
+
raise ArgumentError.new("You have to specify the module name for the beanstalkd provider") unless module_name
|
16
|
+
@module_name = module_name
|
17
|
+
identify_services_to_listen_for
|
19
18
|
end
|
20
19
|
|
21
20
|
def listen
|
22
21
|
EM.run {
|
23
|
-
|
22
|
+
self.services_to_listen_for.each do |service|
|
24
23
|
conn_for_service = EMJack::Connection.new(:host => service.endpoint.host, :port => service.endpoint.port)
|
25
24
|
conn_for_service.watch(service.transport.tube_name)
|
26
25
|
conn_for_service.each_job do |job|
|
@@ -30,10 +29,10 @@ module Hoth
|
|
30
29
|
|
31
30
|
begin
|
32
31
|
decoded_params = responsible_service.transport.encoder.decode(job.body)
|
33
|
-
|
32
|
+
Hoth::Logger.debug "decoded_params: #{decoded_params}"
|
34
33
|
Hoth::Services.send(service.name, *decoded_params)
|
35
34
|
rescue => e
|
36
|
-
|
35
|
+
Hoth::Logger.warn "An error occured while invoking the service: #{e.message}"
|
37
36
|
ensure
|
38
37
|
conn_for_service.delete(job)
|
39
38
|
end
|
@@ -41,6 +40,14 @@ module Hoth
|
|
41
40
|
end
|
42
41
|
}
|
43
42
|
end
|
43
|
+
|
44
|
+
private
|
45
|
+
|
46
|
+
def identify_services_to_listen_for
|
47
|
+
@services_to_listen_for = Hoth::Modules.service_modules[self.module_name.to_sym].registered_services.select do |service|
|
48
|
+
service.endpoint.transport == :beanstalkd
|
49
|
+
end
|
50
|
+
end
|
44
51
|
|
45
52
|
end
|
46
53
|
|
@@ -9,11 +9,9 @@ module Hoth
|
|
9
9
|
end
|
10
10
|
|
11
11
|
def call(env)
|
12
|
-
Hoth::Logger.debug "env: #{env.inspect}"
|
13
12
|
if env["PATH_INFO"] =~ /^\/execute/
|
14
13
|
begin
|
15
14
|
req = Rack::Request.new(env)
|
16
|
-
Hoth::Logger.debug "req: #{req.inspect}"
|
17
15
|
|
18
16
|
service_name = req.params["name"]
|
19
17
|
service_params = req.params["params"]
|
@@ -51,4 +49,4 @@ module Hoth
|
|
51
49
|
|
52
50
|
end
|
53
51
|
end
|
54
|
-
end
|
52
|
+
end
|
@@ -10,12 +10,18 @@ module Hoth
|
|
10
10
|
class Beanstalkd < Base
|
11
11
|
|
12
12
|
def call_remote_with(*args)
|
13
|
-
connection = Beanstalk::
|
13
|
+
connection = Beanstalk::Connection.new("#{endpoint.host}:#{endpoint.port}")
|
14
14
|
connection.use(tube_name)
|
15
15
|
|
16
|
-
|
17
|
-
|
18
|
-
|
16
|
+
begin
|
17
|
+
encoded_args = encoder.encode(args)
|
18
|
+
Hoth::Logger.debug "encoded_args: #{encoded_args}"
|
19
|
+
connection.put encoded_args
|
20
|
+
rescue => e
|
21
|
+
Hoth::Logger.warn "An error occured while sending a payload to beanstalkd: #{e.message}"
|
22
|
+
ensure
|
23
|
+
connection.close
|
24
|
+
end
|
19
25
|
end
|
20
26
|
|
21
27
|
def tube_name
|
@@ -0,0 +1,39 @@
|
|
1
|
+
require File.expand_path(File.join(File.dirname(__FILE__), '../../', 'spec_helper'))
|
2
|
+
|
3
|
+
require File.expand_path(File.join(File.dirname(__FILE__), '../../../', 'lib', 'hoth', 'providers', 'beanstalkd_provider'))
|
4
|
+
|
5
|
+
require 'rack/mock'
|
6
|
+
|
7
|
+
module Hoth
|
8
|
+
module Providers
|
9
|
+
describe BeanstalkdProvider do
|
10
|
+
|
11
|
+
it "should know its module name" do
|
12
|
+
# cannot be tested since i do not know how to mock constructor call
|
13
|
+
# http://stackoverflow.com/questions/5270819/how-to-test-a-method-call-in-a-constructor-with-rspec
|
14
|
+
# Hoth::Providers::BeanstalkdProvider.any_instance.stub!(:identify_services_to_listen_for)
|
15
|
+
# beanstalkd_provider = Hoth::Providers::BeanstalkdProvider.new("foo_module")
|
16
|
+
# beanstalkd_provider.module_name.should == "foo_module"
|
17
|
+
end
|
18
|
+
|
19
|
+
it "should throw an error if no module name is passed" do
|
20
|
+
lambda { Hoth::Providers::BeanstalkdProvider.new }.should raise_error(ArgumentError)
|
21
|
+
end
|
22
|
+
|
23
|
+
it "should only listen for services defined for the passed module name" do
|
24
|
+
mail_module = Hoth::ServiceModule.new(:name => "mail_module")
|
25
|
+
mail_module.should_not_receive(:registered_services)
|
26
|
+
foo_module = Hoth::ServiceModule.new(:name => "foo_module")
|
27
|
+
service = mock("RegisteredService")
|
28
|
+
service.stub_chain(:endpoint, :transport).and_return :beanstalkd
|
29
|
+
foo_module.should_receive(:registered_services).and_return([service])
|
30
|
+
Hoth::Modules.should_receive(:service_modules).and_return({
|
31
|
+
:mail_module => mail_module,
|
32
|
+
:foo_module => foo_module
|
33
|
+
})
|
34
|
+
beanstalkd_provider = Hoth::Providers::BeanstalkdProvider.new("foo_module")
|
35
|
+
end
|
36
|
+
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
@@ -0,0 +1,61 @@
|
|
1
|
+
require File.expand_path(File.join(File.dirname(__FILE__), '../../', 'spec_helper'))
|
2
|
+
|
3
|
+
module Hoth
|
4
|
+
module Transport
|
5
|
+
|
6
|
+
describe "Beanstalkd" do
|
7
|
+
before(:each) do
|
8
|
+
endpoint = mock("EndpointMock")
|
9
|
+
endpoint.stub(:host).and_return("localhost")
|
10
|
+
endpoint.stub(:port).and_return("11300")
|
11
|
+
|
12
|
+
service_module = mock("ServiceModule")
|
13
|
+
service_module.should_receive(:name).and_return(:test_service_module)
|
14
|
+
|
15
|
+
@service = mock("ServiceMock")
|
16
|
+
@service.should_receive(:name).and_return(:test_service)
|
17
|
+
@service.should_receive(:endpoint).any_number_of_times.and_return(endpoint)
|
18
|
+
@service.should_receive(:module).any_number_of_times.and_return(service_module)
|
19
|
+
|
20
|
+
@beanstalk_connection = mock("Beanstalk::Connection")
|
21
|
+
end
|
22
|
+
|
23
|
+
it "should send the payload over a simple Beanstalk::Connection and close the connection afterwards" do
|
24
|
+
Beanstalk::Connection.should_receive(:new).with("localhost:11300").and_return(@beanstalk_connection)
|
25
|
+
@beanstalk_connection.should_receive(:use).with(anything)
|
26
|
+
@beanstalk_connection.should_receive(:put).with(["some_data_to_send"])
|
27
|
+
@beanstalk_connection.should_receive(:close)
|
28
|
+
|
29
|
+
transport = Beanstalkd.new(@service)
|
30
|
+
transport.call_remote_with("some_data_to_send")
|
31
|
+
end
|
32
|
+
|
33
|
+
it "should ensure to close the connection after sending the payload to beanstalkd" do
|
34
|
+
Beanstalk::Connection.should_receive(:new).with("localhost:11300").and_return(@beanstalk_connection)
|
35
|
+
@beanstalk_connection.should_receive(:use).with(anything)
|
36
|
+
@beanstalk_connection.should_receive(:put).never
|
37
|
+
@beanstalk_connection.should_receive(:close)
|
38
|
+
|
39
|
+
transport = Beanstalkd.new(@service)
|
40
|
+
transport.encoder.should_receive(:encode).with(anything).and_raise("some error")
|
41
|
+
transport.call_remote_with("some_data_to_send")
|
42
|
+
end
|
43
|
+
|
44
|
+
it "should use the beanstalk tube specified by the transport" do
|
45
|
+
Beanstalk::Connection.should_receive(:new).with("localhost:11300").and_return(@beanstalk_connection)
|
46
|
+
transport = Beanstalkd.new(@service)
|
47
|
+
@beanstalk_connection.should_receive(:use).with(transport.tube_name)
|
48
|
+
@beanstalk_connection.should_receive(:put).with(["some_data_to_send"])
|
49
|
+
@beanstalk_connection.should_receive(:close)
|
50
|
+
|
51
|
+
transport.call_remote_with("some_data_to_send")
|
52
|
+
end
|
53
|
+
|
54
|
+
it "should define the tube_name according to the module and service name" do
|
55
|
+
transport = Beanstalkd.new(@service)
|
56
|
+
transport.tube_name.should == "test-service-module/test-service"
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
end
|
61
|
+
end
|
metadata
CHANGED
@@ -1,15 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: hoth
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
5
|
-
prerelease:
|
4
|
+
hash: 21
|
5
|
+
prerelease:
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 3
|
9
|
-
-
|
10
|
-
|
11
|
-
- 4
|
12
|
-
version: 0.3.2.beta4
|
9
|
+
- 3
|
10
|
+
version: 0.3.3
|
13
11
|
platform: ruby
|
14
12
|
authors:
|
15
13
|
- Dirk Breuer
|
@@ -17,12 +15,10 @@ autorequire:
|
|
17
15
|
bindir: bin
|
18
16
|
cert_chain: []
|
19
17
|
|
20
|
-
date: 2011-
|
21
|
-
default_executable:
|
18
|
+
date: 2011-05-27 00:00:00 Z
|
22
19
|
dependencies:
|
23
20
|
- !ruby/object:Gem::Dependency
|
24
|
-
|
25
|
-
prerelease: false
|
21
|
+
type: :runtime
|
26
22
|
requirement: &id001 !ruby/object:Gem::Requirement
|
27
23
|
none: false
|
28
24
|
requirements:
|
@@ -32,25 +28,27 @@ dependencies:
|
|
32
28
|
segments:
|
33
29
|
- 0
|
34
30
|
version: "0"
|
35
|
-
|
31
|
+
prerelease: false
|
36
32
|
version_requirements: *id001
|
33
|
+
name: hoth
|
37
34
|
- !ruby/object:Gem::Dependency
|
38
|
-
|
39
|
-
prerelease: false
|
35
|
+
type: :development
|
40
36
|
requirement: &id002 !ruby/object:Gem::Requirement
|
41
37
|
none: false
|
42
38
|
requirements:
|
43
|
-
- -
|
39
|
+
- - ~>
|
44
40
|
- !ruby/object:Gem::Version
|
45
|
-
hash:
|
41
|
+
hash: 23
|
46
42
|
segments:
|
43
|
+
- 2
|
44
|
+
- 6
|
47
45
|
- 0
|
48
|
-
version:
|
49
|
-
|
46
|
+
version: 2.6.0
|
47
|
+
prerelease: false
|
50
48
|
version_requirements: *id002
|
49
|
+
name: rspec
|
51
50
|
- !ruby/object:Gem::Dependency
|
52
|
-
|
53
|
-
prerelease: false
|
51
|
+
type: :development
|
54
52
|
requirement: &id003 !ruby/object:Gem::Requirement
|
55
53
|
none: false
|
56
54
|
requirements:
|
@@ -60,11 +58,11 @@ dependencies:
|
|
60
58
|
segments:
|
61
59
|
- 0
|
62
60
|
version: "0"
|
63
|
-
|
61
|
+
prerelease: false
|
64
62
|
version_requirements: *id003
|
63
|
+
name: simple_publisher
|
65
64
|
- !ruby/object:Gem::Dependency
|
66
|
-
|
67
|
-
prerelease: false
|
65
|
+
type: :development
|
68
66
|
requirement: &id004 !ruby/object:Gem::Requirement
|
69
67
|
none: false
|
70
68
|
requirements:
|
@@ -74,11 +72,11 @@ dependencies:
|
|
74
72
|
segments:
|
75
73
|
- 0
|
76
74
|
version: "0"
|
77
|
-
|
75
|
+
prerelease: false
|
78
76
|
version_requirements: *id004
|
77
|
+
name: beanstalk-client
|
79
78
|
- !ruby/object:Gem::Dependency
|
80
|
-
|
81
|
-
prerelease: false
|
79
|
+
type: :development
|
82
80
|
requirement: &id005 !ruby/object:Gem::Requirement
|
83
81
|
none: false
|
84
82
|
requirements:
|
@@ -88,11 +86,11 @@ dependencies:
|
|
88
86
|
segments:
|
89
87
|
- 0
|
90
88
|
version: "0"
|
91
|
-
|
89
|
+
prerelease: false
|
92
90
|
version_requirements: *id005
|
91
|
+
name: em-jack
|
93
92
|
- !ruby/object:Gem::Dependency
|
94
|
-
|
95
|
-
prerelease: false
|
93
|
+
type: :runtime
|
96
94
|
requirement: &id006 !ruby/object:Gem::Requirement
|
97
95
|
none: false
|
98
96
|
requirements:
|
@@ -102,11 +100,11 @@ dependencies:
|
|
102
100
|
segments:
|
103
101
|
- 0
|
104
102
|
version: "0"
|
105
|
-
|
103
|
+
prerelease: false
|
106
104
|
version_requirements: *id006
|
105
|
+
name: activesupport
|
107
106
|
- !ruby/object:Gem::Dependency
|
108
|
-
|
109
|
-
prerelease: false
|
107
|
+
type: :runtime
|
110
108
|
requirement: &id007 !ruby/object:Gem::Requirement
|
111
109
|
none: false
|
112
110
|
requirements:
|
@@ -116,8 +114,81 @@ dependencies:
|
|
116
114
|
segments:
|
117
115
|
- 0
|
118
116
|
version: "0"
|
119
|
-
|
117
|
+
prerelease: false
|
120
118
|
version_requirements: *id007
|
119
|
+
name: bertrpc
|
120
|
+
- !ruby/object:Gem::Dependency
|
121
|
+
type: :runtime
|
122
|
+
requirement: &id008 !ruby/object:Gem::Requirement
|
123
|
+
none: false
|
124
|
+
requirements:
|
125
|
+
- - ">="
|
126
|
+
- !ruby/object:Gem::Version
|
127
|
+
hash: 3
|
128
|
+
segments:
|
129
|
+
- 0
|
130
|
+
version: "0"
|
131
|
+
prerelease: false
|
132
|
+
version_requirements: *id008
|
133
|
+
name: json
|
134
|
+
- !ruby/object:Gem::Dependency
|
135
|
+
type: :development
|
136
|
+
requirement: &id009 !ruby/object:Gem::Requirement
|
137
|
+
none: false
|
138
|
+
requirements:
|
139
|
+
- - ~>
|
140
|
+
- !ruby/object:Gem::Version
|
141
|
+
hash: 23
|
142
|
+
segments:
|
143
|
+
- 2
|
144
|
+
- 6
|
145
|
+
- 0
|
146
|
+
version: 2.6.0
|
147
|
+
prerelease: false
|
148
|
+
version_requirements: *id009
|
149
|
+
name: rspec
|
150
|
+
- !ruby/object:Gem::Dependency
|
151
|
+
type: :development
|
152
|
+
requirement: &id010 !ruby/object:Gem::Requirement
|
153
|
+
none: false
|
154
|
+
requirements:
|
155
|
+
- - ">="
|
156
|
+
- !ruby/object:Gem::Version
|
157
|
+
hash: 3
|
158
|
+
segments:
|
159
|
+
- 0
|
160
|
+
version: "0"
|
161
|
+
prerelease: false
|
162
|
+
version_requirements: *id010
|
163
|
+
name: simple_publisher
|
164
|
+
- !ruby/object:Gem::Dependency
|
165
|
+
type: :development
|
166
|
+
requirement: &id011 !ruby/object:Gem::Requirement
|
167
|
+
none: false
|
168
|
+
requirements:
|
169
|
+
- - ">="
|
170
|
+
- !ruby/object:Gem::Version
|
171
|
+
hash: 3
|
172
|
+
segments:
|
173
|
+
- 0
|
174
|
+
version: "0"
|
175
|
+
prerelease: false
|
176
|
+
version_requirements: *id011
|
177
|
+
name: beanstalk-client
|
178
|
+
- !ruby/object:Gem::Dependency
|
179
|
+
type: :development
|
180
|
+
requirement: &id012 !ruby/object:Gem::Requirement
|
181
|
+
none: false
|
182
|
+
requirements:
|
183
|
+
- - ">="
|
184
|
+
- !ruby/object:Gem::Version
|
185
|
+
hash: 3
|
186
|
+
segments:
|
187
|
+
- 0
|
188
|
+
version: "0"
|
189
|
+
prerelease: false
|
190
|
+
version_requirements: *id012
|
191
|
+
name: em-jack
|
121
192
|
description: |
|
122
193
|
Creating a SOA requires a centralized location to define all services within the
|
123
194
|
SOA. Furthermore you want to know where to deploy those services.
|
@@ -163,23 +234,24 @@ files:
|
|
163
234
|
- spec/unit/endpoint_spec.rb
|
164
235
|
- spec/unit/extension/core/exception_spec.rb
|
165
236
|
- spec/unit/hoth_spec.rb
|
237
|
+
- spec/unit/providers/beanstalkd_provider_spec.rb
|
166
238
|
- spec/unit/providers/rack_provider_spec.rb
|
167
239
|
- spec/unit/service_definition_spec.rb
|
168
240
|
- spec/unit/service_module_spec.rb
|
169
241
|
- spec/unit/service_spec.rb
|
170
242
|
- spec/unit/transport/base_spec.rb
|
243
|
+
- spec/unit/transport/beanstalkd_spec.rb
|
171
244
|
- spec/unit/transport/http_spec.rb
|
172
245
|
- spec/unit/transport/workling_spec.rb
|
173
246
|
- spec/unit/transport_spec.rb
|
174
247
|
- LICENSE
|
175
248
|
- TODO
|
176
|
-
has_rdoc: true
|
177
249
|
homepage: http://github.com/galaxycats/hoth
|
178
250
|
licenses: []
|
179
251
|
|
180
252
|
post_install_message:
|
181
|
-
rdoc_options:
|
182
|
-
|
253
|
+
rdoc_options: []
|
254
|
+
|
183
255
|
require_paths:
|
184
256
|
- lib
|
185
257
|
required_ruby_version: !ruby/object:Gem::Requirement
|
@@ -194,32 +266,18 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
194
266
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
195
267
|
none: false
|
196
268
|
requirements:
|
197
|
-
- - "
|
269
|
+
- - ">="
|
198
270
|
- !ruby/object:Gem::Version
|
199
|
-
hash:
|
271
|
+
hash: 3
|
200
272
|
segments:
|
201
|
-
-
|
202
|
-
|
203
|
-
- 1
|
204
|
-
version: 1.3.1
|
273
|
+
- 0
|
274
|
+
version: "0"
|
205
275
|
requirements: []
|
206
276
|
|
207
277
|
rubyforge_project:
|
208
|
-
rubygems_version: 1.4
|
278
|
+
rubygems_version: 1.8.4
|
209
279
|
signing_key:
|
210
280
|
specification_version: 3
|
211
281
|
summary: Registry and deployment description abstraction for SOA-Services
|
212
|
-
test_files:
|
213
|
-
|
214
|
-
- spec/unit/encoding/json_spec.rb
|
215
|
-
- spec/unit/endpoint_spec.rb
|
216
|
-
- spec/unit/extension/core/exception_spec.rb
|
217
|
-
- spec/unit/hoth_spec.rb
|
218
|
-
- spec/unit/providers/rack_provider_spec.rb
|
219
|
-
- spec/unit/service_definition_spec.rb
|
220
|
-
- spec/unit/service_module_spec.rb
|
221
|
-
- spec/unit/service_spec.rb
|
222
|
-
- spec/unit/transport/base_spec.rb
|
223
|
-
- spec/unit/transport/http_spec.rb
|
224
|
-
- spec/unit/transport/workling_spec.rb
|
225
|
-
- spec/unit/transport_spec.rb
|
282
|
+
test_files: []
|
283
|
+
|