hoth 0.3.1 → 0.3.2.beta1

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.
@@ -5,8 +5,8 @@ module Hoth
5
5
  class Json
6
6
 
7
7
  class <<self
8
- def encode(string)
9
- string.to_json
8
+ def encode(object)
9
+ object.to_json
10
10
  end
11
11
 
12
12
  def decode(string)
@@ -25,4 +25,4 @@ module Hoth
25
25
 
26
26
  end
27
27
  end
28
- end
28
+ end
@@ -11,6 +11,10 @@ module Hoth
11
11
  def self.module(module_name)
12
12
  instance.service_modules[module_name]
13
13
  end
14
+
15
+ def self.service_modules
16
+ instance.service_modules
17
+ end
14
18
 
15
19
  def service_module(module_name, &block)
16
20
  service_module = ServiceModule.new(:name => module_name)
@@ -24,4 +28,4 @@ module Hoth
24
28
  @service_modules = {}
25
29
  end
26
30
  end
27
- end
31
+ end
@@ -0,0 +1,48 @@
1
+ begin
2
+ require 'em-jack'
3
+ rescue LoadError
4
+ STDERR.puts "You need the 'em-jack' gem if you want to use Beanstalkd provider."
5
+ end
6
+
7
+ module Hoth
8
+ module Providers
9
+
10
+ class BeanstalkdProvider
11
+
12
+ def initialize
13
+ @services_to_listen_for = Hoth::Modules.service_modules.values.inject([]) do |services, service_module|
14
+ services << service_module.registered_services.select do |service|
15
+ service.endpoint.transport == :beanstalkd
16
+ end
17
+ services.flatten
18
+ end
19
+ end
20
+
21
+ def listen
22
+ EM.run {
23
+ @services_to_listen_for.each do |service|
24
+ conn_for_service = EMJack::Connection.new(:host => service.endpoint.host, :port => service.endpoint.port)
25
+ conn_for_service.watch("#{service.endpoint.module_name}/#{service.name}")
26
+ conn_for_service.each_job do |job|
27
+ responsible_service = ServiceRegistry.locate_service(service.name)
28
+
29
+ raise ServiceNotFoundException.new("The requested service '#{service.name}' was not found!") if responsible_service.nil?
30
+
31
+ begin
32
+ decoded_params = responsible_service.transport.encoder.decode(job.body)
33
+ Rails.logger.debug "decoded_params: #{decoded_params}"
34
+ Hoth::Services.send(service.name, *decoded_params)
35
+ rescue => e
36
+ Rails.logger.warn "An error occured while invoking the service: #{e.message}"
37
+ ensure
38
+ conn_for_service.delete(job)
39
+ end
40
+ end
41
+ end
42
+ }
43
+ end
44
+
45
+ end
46
+
47
+ end
48
+ end
@@ -1,6 +1,5 @@
1
1
  module Hoth
2
2
  class ServiceModule
3
- attr_accessor :name, :environments
4
3
 
5
4
  class Environment
6
5
  attr_accessor :endpoints
@@ -19,8 +18,11 @@ module Hoth
19
18
  end
20
19
  end
21
20
 
21
+ attr_accessor :name, :environments, :registered_services
22
+
22
23
  def initialize(attributes = {})
23
24
  @environments = {}
25
+ @registered_services = []
24
26
  @name = attributes[:name]
25
27
  end
26
28
 
@@ -39,6 +41,8 @@ module Hoth
39
41
 
40
42
  service.module = self
41
43
  service.via_endpoint(options[:via])
44
+
45
+ @registered_services << service
42
46
  end
43
47
 
44
48
  def [](env_name)
@@ -46,4 +50,4 @@ module Hoth
46
50
  end
47
51
 
48
52
  end
49
- end
53
+ end
@@ -3,6 +3,7 @@ require 'hoth/transport/http'
3
3
  require 'hoth/transport/https'
4
4
  require 'hoth/transport/bert'
5
5
  require 'hoth/transport/workling'
6
+ require 'hoth/transport/beanstalkd'
6
7
 
7
8
  require 'hoth/encoding/json'
8
9
  require 'hoth/encoding/no_op'
@@ -25,6 +26,11 @@ module Hoth
25
26
 
26
27
  :workling => {
27
28
  :transport_class => Transport::Workling
29
+ },
30
+
31
+ :beanstalkd => {
32
+ :transport_class => Transport::Beanstalkd,
33
+ :encoder => Encoding::Json
28
34
  }
29
35
  }
30
36
 
@@ -47,4 +53,4 @@ module Hoth
47
53
  end
48
54
 
49
55
  end
50
- end
56
+ end
@@ -0,0 +1,24 @@
1
+ begin
2
+ require 'beanstalk-client'
3
+ rescue LoadError
4
+ STDERR.puts "You need the 'beanstalk-client' gem if you want to use Beanstalkd transport."
5
+ end
6
+
7
+ module Hoth
8
+ module Transport
9
+
10
+ class Beanstalkd < Base
11
+
12
+ def call_remote_with(*args)
13
+ connection = Beanstalk::Pool.new(["#{endpoint.host}:#{endpoint.port}"])
14
+ connection.use("#{endpoint.module_name}/#{name}")
15
+
16
+ encoded_args = encoder.encode(args)
17
+ Rails.logger.debug "encoded_args: #{encoded_args}"
18
+ connection.put encoded_args
19
+ end
20
+
21
+ end
22
+
23
+ end
24
+ end
metadata CHANGED
@@ -1,13 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: hoth
3
3
  version: !ruby/object:Gem::Version
4
- hash: 17
5
- prerelease: false
4
+ hash: -1848230051
5
+ prerelease: true
6
6
  segments:
7
7
  - 0
8
8
  - 3
9
- - 1
10
- version: 0.3.1
9
+ - 2
10
+ - beta1
11
+ version: 0.3.2.beta1
11
12
  platform: ruby
12
13
  authors:
13
14
  - Dirk Breuer
@@ -15,7 +16,7 @@ autorequire:
15
16
  bindir: bin
16
17
  cert_chain: []
17
18
 
18
- date: 2011-01-03 00:00:00 +01:00
19
+ date: 2011-01-06 00:00:00 +01:00
19
20
  default_executable:
20
21
  dependencies:
21
22
  - !ruby/object:Gem::Dependency
@@ -88,6 +89,34 @@ dependencies:
88
89
  version: "0"
89
90
  type: :development
90
91
  version_requirements: *id005
92
+ - !ruby/object:Gem::Dependency
93
+ name: beanstalk-client
94
+ prerelease: false
95
+ requirement: &id006 !ruby/object:Gem::Requirement
96
+ none: false
97
+ requirements:
98
+ - - ">="
99
+ - !ruby/object:Gem::Version
100
+ hash: 3
101
+ segments:
102
+ - 0
103
+ version: "0"
104
+ type: :development
105
+ version_requirements: *id006
106
+ - !ruby/object:Gem::Dependency
107
+ name: em-jack
108
+ prerelease: false
109
+ requirement: &id007 !ruby/object:Gem::Requirement
110
+ none: false
111
+ requirements:
112
+ - - ">="
113
+ - !ruby/object:Gem::Version
114
+ hash: 3
115
+ segments:
116
+ - 0
117
+ version: "0"
118
+ type: :development
119
+ version_requirements: *id007
91
120
  description: |
92
121
  Creating a SOA requires a centralized location to define all services within the
93
122
  SOA. Furthermore you want to know where to deploy those services.
@@ -112,6 +141,7 @@ files:
112
141
  - lib/hoth/exceptions.rb
113
142
  - lib/hoth/extension/core/exception.rb
114
143
  - lib/hoth/modules.rb
144
+ - lib/hoth/providers/beanstalkd_provider.rb
115
145
  - lib/hoth/providers/bertrpc_provider.rb
116
146
  - lib/hoth/providers/rack_provider.rb
117
147
  - lib/hoth/service.rb
@@ -121,6 +151,7 @@ files:
121
151
  - lib/hoth/services.rb
122
152
  - lib/hoth/transport.rb
123
153
  - lib/hoth/transport/base.rb
154
+ - lib/hoth/transport/beanstalkd.rb
124
155
  - lib/hoth/transport/bert.rb
125
156
  - lib/hoth/transport/http.rb
126
157
  - lib/hoth/transport/https.rb
@@ -162,12 +193,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
162
193
  required_rubygems_version: !ruby/object:Gem::Requirement
163
194
  none: false
164
195
  requirements:
165
- - - ">="
196
+ - - ">"
166
197
  - !ruby/object:Gem::Version
167
- hash: 3
198
+ hash: 25
168
199
  segments:
169
- - 0
170
- version: "0"
200
+ - 1
201
+ - 3
202
+ - 1
203
+ version: 1.3.1
171
204
  requirements: []
172
205
 
173
206
  rubyforge_project: