combi 0.3.0 → 0.4.0

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: e8d52d86d25a8990c1034e0acfaadb4417164c07
4
- data.tar.gz: 90ae51a9bf47ce6a2ff6fcfe13ea95fb076a8ba6
3
+ metadata.gz: 929a53569645c090a360edc9fdfdb0a96ba436b9
4
+ data.tar.gz: 4557b6eb644fb82dda359e1cd12fd4298b570e28
5
5
  SHA512:
6
- metadata.gz: 67235e10e87a924be9c053eead194bf0f6f30f47682a3c13a204d0f77d01354810841664116b2791ae2ade902103d0f9a1c2fe31ca8e6bf6771aa6c7b68b829e
7
- data.tar.gz: 0d5f694d3db7fc22d18a01cc40d64474a296e4811bf40ac9084347e7c89ae17cc824165c3a7729cc0430a034d6a1e2bcf84aa7d91666bae54917d4f16caeb5ac
6
+ metadata.gz: f9060e9b6d9eda5dea793471870156502765b0f105b20f026af987491db76e97fca336ce6773df9c00f86a078897ebf7aa8e1e7b1ed09e937e1bfd09734da3ae
7
+ data.tar.gz: 9e7d357112557849289c2438cc76d8502f18ac487c95c274a5632269d7c5e25a582af7559817c0f7058bfa3cf00ee8d281ba9c57e82ea9e89e11b28e9f4e8f6c
@@ -1,2 +1,34 @@
1
+ require 'logger'
2
+
3
+ module Combi
4
+ def self.logger
5
+ @logger ||= create_logger
6
+ end
7
+
8
+ def self.logger_class
9
+ @logger_class ||= Logger
10
+ end
11
+
12
+ def self.logger_class=(custom_class)
13
+ @logger_class = custom_class
14
+ end
15
+
16
+ protected
17
+
18
+ def self.create_logger
19
+ if ENV['LOG_LEVEL'] and Logger::Severity.const_defined?(ENV['LOG_LEVEL'])
20
+ severity = Logger::Severity.const_get(ENV['LOG_LEVEL'])
21
+ elsif ENV['LOG_LEVEL'] == 'NONE'
22
+ severity = Logger::Severity::UNKNOWN
23
+ elsif ENV['DEBUG'] == 'true'
24
+ severity = Logger::Severity::DEBUG
25
+ else
26
+ severity = Logger::Severity::INFO
27
+ end
28
+ logger = logger_class.new(STDOUT)
29
+ logger.level = severity
30
+ return logger
31
+ end
32
+ end
1
33
  require 'combi/version'
2
34
  require 'combi/service_bus'
@@ -55,11 +55,6 @@ module Combi
55
55
  end
56
56
  end
57
57
 
58
- def log(message)
59
- return unless @debug_mode ||= ENV['DEBUG'] == 'true'
60
- puts "#{Time.now.to_f} #{self.class.name} #{message}"
61
- end
62
-
63
58
  protected
64
59
 
65
60
  def make_service_instance(service_definition)
@@ -98,7 +93,7 @@ module Combi
98
93
 
99
94
  def add_route_for(service_name, action_name, service_instance)
100
95
  path = [service_name, action_name].join('/')
101
- puts "New route: #{path} :: #{service_instance}"
96
+ Combi.logger.info {"New route: #{path} :: #{service_instance}"}
102
97
  @routes[path] = service_instance
103
98
  end
104
99
 
@@ -112,8 +107,8 @@ module Combi
112
107
  def resolve_route(service_name, kind)
113
108
  path = [service_name, kind].join('/')
114
109
  return @routes[path] if @routes[path]
115
- log "[WARNING] Service Path #{path} not found"
116
- log "[WARNING] routes: #{@routes.keys.inspect}"
110
+ Combi.logger.warn {"Service Path #{path} not found"}
111
+ Combi.logger.warn {"routes: #{@routes.keys.inspect}"}
117
112
  raise UnknownStop.new(path)
118
113
  end
119
114
 
@@ -128,14 +123,14 @@ module Combi
128
123
  deferrable.errback &log_service_invocation(false, t0, path)
129
124
  deferrable
130
125
  rescue StandardError => e
131
- # TODO: report in a more effective way (I will not read server logs to find this)
132
- require 'yaml'
133
- puts " *** ERROR INVOKING SERVICE ***"
134
- puts " - #{e.inspect}"
135
- puts " - #{service_name} #{service_instance.class.ancestors.join ' > '}"
136
- puts " - #{action}"
137
- puts " - #{params.to_yaml.split("\n").join("\n\t")}"
138
- # FIXME: strings because is what in_process tests expects
126
+ Combi.logger.error do
127
+ require 'yaml'
128
+ msg = " *** ERROR INVOKING SERVICE ***" +
129
+ " - #{e.inspect}" +
130
+ " - #{service_name} #{service_instance.class.ancestors.join ' > '}" +
131
+ " - #{action}" +
132
+ " - #{params.to_yaml.split("\n").join("\n\t")}"
133
+ end
139
134
  return sync_to_async error: { klass: e.class.name, message: e.message, backtrace: e.backtrace }
140
135
  end
141
136
 
@@ -152,11 +147,13 @@ module Combi
152
147
 
153
148
  def log_service_invocation(success, t0, path)
154
149
  Proc.new do |response|
155
- result = success ? 'OK' : 'KO'
156
- time = '%10.6fs' % (Time.now - t0)
157
- base_msg = "#{result}\t#{time}\t#{path}"
158
- base_msg += "\t#{response.inspect}" if success == false
159
- puts base_msg
150
+ Combi.logger.info do
151
+ result = success ? 'OK' : 'KO'
152
+ time = '%10.6fs' % (Time.now - t0)
153
+ base_msg = "#{result}\t#{time}\t#{path}"
154
+ base_msg += "\t#{response.inspect}" if success == false
155
+ base_msg
156
+ end
160
157
  end
161
158
  end
162
159
 
@@ -31,13 +31,13 @@ module Combi
31
31
  end
32
32
 
33
33
  def create_queue_for_service(service_name)
34
- log "creating queue #{service_name}"
34
+ Combi.logger.debug {"creating queue #{service_name}"}
35
35
  queue_options = {}
36
36
  subscription_options = {}
37
37
  subscription_options[:ack] = true
38
38
  queue_service.ready do
39
39
  queue_service.queue(service_name.to_s, queue_options) do |queue|
40
- log "subscribing to queue #{service_name.to_s}"
40
+ Combi.logger.debug {"subscribing to queue #{service_name.to_s}"}
41
41
  queue.subscribe(subscription_options) do |delivery_info, payload|
42
42
  process_queue_message service_name, payload, delivery_info
43
43
  queue_service.acknowledge delivery_info
@@ -47,7 +47,7 @@ module Combi
47
47
  end
48
48
 
49
49
  def request(name, kind, message, timeout: RPC_DEFAULT_TIMEOUT, fast: false)
50
- log "Preparing request: #{name}.#{kind} #{message.inspect[0..500]}\t|| timeout: #{timeout} fast: #{fast}"
50
+ Combi.logger.debug {"Preparing request: #{name}.#{kind} #{message.inspect[0..500]}\t|| timeout: #{timeout} fast: #{fast}"}
51
51
  options = {
52
52
  timeout: timeout,
53
53
  routing_key: name.to_s
@@ -60,7 +60,7 @@ module Combi
60
60
  waiter = @response_store.wait_for correlation_id, timeout
61
61
  end
62
62
  queue_service.next_ready_only do
63
- log "Making request: #{name}.#{kind} #{message.inspect[0..500]}\t|| #{options.inspect[0..500]}"
63
+ Combi.logger.debug {"Making request: #{name}.#{kind} #{message.inspect[0..500]}\t|| #{options.inspect[0..500]}"}
64
64
  queue_service.publish_request(kind, message, options)
65
65
  end
66
66
  waiter
@@ -18,12 +18,12 @@ module Combi
18
18
  end
19
19
 
20
20
  def on_open(ws, handler)
21
- @bus.log "ON OPEN #{handler.inspect}"
21
+ Combi.logger.debug { "ON OPEN #{handler.inspect}" }
22
22
  handler.new_session(ws)
23
23
  end
24
24
 
25
25
  def on_message(ws, session, raw_message)
26
- @bus.log "WS SERVER ON MESSAGE #{raw_message[0..500]}"
26
+ Combi.logger.debug {"WS SERVER ON MESSAGE #{raw_message[0..500]}"}
27
27
  message = Yajl::Parser.parse raw_message, symbolize_keys: true
28
28
  @bus.on_message(ws, message, session)
29
29
  end
@@ -49,7 +49,7 @@ module Combi
49
49
 
50
50
  def stop!
51
51
  ws && ws.close
52
- @bus.log "stop requested"
52
+ Combi.logger.debug {"stop requested"}
53
53
  end
54
54
 
55
55
  def restart!
@@ -58,29 +58,28 @@ module Combi
58
58
  end
59
59
 
60
60
  def open_websocket
61
- @bus.log @remote_api
61
+ Combi.logger.debug { "Remote API #{@remote_api}" }
62
62
  @ws = ws = Faye::WebSocket::Client.new(@remote_api)
63
63
  ws.on :open do |event|
64
- @bus.log "OPEN"
65
- @bus.log "HANDLER #{@handler.inspect}"
64
+ Combi.logger.debug {"OPEN WITH HANDLER #{@handler.inspect}"}
66
65
  @handler.on_open if @handler.respond_to?(:on_open)
67
66
  @bus.ready.succeed
68
67
  end
69
68
 
70
69
  ws.on :message do |event|
71
- @bus.log "ON MESSAGE: #{event.data[0..500]}"
70
+ Combi.logger.debug {"ON MESSAGE: #{event.data[0..500]}"}
72
71
  message = Yajl::Parser.parse event.data, symbolize_keys: true
73
72
  @bus.on_message(ws, message)
74
73
  end
75
74
 
76
75
  ws.on :close do |event|
77
- @bus.log "close #{event.code}: #{event.reason}"
76
+ Combi.logger.debug {"close #{event.code}: #{event.reason}"}
78
77
  @handler.on_close if @handler.respond_to?(:on_close)
79
78
  @ws = ws = nil
80
79
  end
81
80
 
82
81
  ws.on :error do |event|
83
- @bus.log "received error: #{event.inspect}"
82
+ Combi.logger.debug {"received error: #{event.inspect}"}
84
83
  stop!
85
84
  end
86
85
  end
@@ -157,7 +156,7 @@ module Combi
157
156
  def on_message(ws, message, session = nil)
158
157
  if message[:correlation_id] && message.has_key?(:result)
159
158
  @response_store.handle_rpc_response(message)
160
- log "Handled response with correlation_id #{message[:correlation_id]} - #{message.inspect[0..500]}"
159
+ Combi.logger.debug {"Handled response with correlation_id #{message[:correlation_id]} - #{message.inspect[0..500]}"}
161
160
  return
162
161
  end
163
162
  service_name = message[:service]
@@ -207,7 +206,7 @@ module Combi
207
206
  web_socket = @machine.respond_to?(:ws) ? @machine.ws : ws
208
207
  unless web_socket.nil?
209
208
  serialized = Yajl::Encoder.encode msg
210
- log "sending request #{serialized}"
209
+ Combi.logger.debug {"sending request #{serialized}"}
211
210
  web_socket.send serialized
212
211
  end
213
212
  end
@@ -1,129 +1,122 @@
1
1
  require 'amqp'
2
2
  require 'amqp/utilities/event_loop_helper'
3
3
 
4
- module Combi
5
- class QueueService
4
+ class Combi::QueueService
6
5
 
7
- attr_accessor :rpc_callback
6
+ attr_accessor :rpc_callback
8
7
 
9
- def initialize(config, options)
10
- @config = config
11
- @options = options
12
- @rpc_queue = nil
13
- @ready_defer = EventMachine::DefaultDeferrable.new
14
- @ready_callbacks = []
15
- end
16
-
17
- def ready(&block)
18
- @ready_callbacks << block
19
- @ready_defer.callback &block
20
- end
8
+ def initialize(config, options)
9
+ @config = config
10
+ @options = options
11
+ @rpc_queue = nil
12
+ @ready_defer = EventMachine::DefaultDeferrable.new
13
+ @ready_callbacks = []
14
+ end
21
15
 
22
- def next_ready_only(&block)
23
- @ready_defer.callback &block
24
- end
16
+ def ready(&block)
17
+ @ready_callbacks << block
18
+ @ready_defer.callback &block
19
+ end
25
20
 
26
- def status
27
- @amqp_conn && @amqp_conn.status
28
- end
21
+ def next_ready_only(&block)
22
+ @ready_defer.callback &block
23
+ end
29
24
 
30
- def log(message)
31
- return unless @debug_mode ||= ENV['DEBUG'] == 'true'
32
- puts "#{Time.now.to_f} #{self.class.name} #{message}"
33
- end
25
+ def status
26
+ @amqp_conn && @amqp_conn.status
27
+ end
34
28
 
35
- def start
36
- @config[:reconnect_period] ||= 4
37
- reconnection_proc = Proc.new { EM.add_timer(@config[:reconnect_period] * rand) { start } }
38
- @config[:on_tcp_connection_failure] = reconnection_proc
39
- @config[:on_possible_authentication_failure] = reconnection_proc
40
- connect @config do
41
- if @options[:rpc] == :enabled
42
- create_rpc_queue
43
- else
44
- @ready_defer.succeed
45
- end
29
+ def start
30
+ @config[:reconnect_period] ||= 4
31
+ reconnection_proc = Proc.new { EM.add_timer(@config[:reconnect_period] * rand) { start } }
32
+ @config[:on_tcp_connection_failure] = reconnection_proc
33
+ @config[:on_possible_authentication_failure] = reconnection_proc
34
+ connect @config do
35
+ if @options[:rpc] == :enabled
36
+ create_rpc_queue
37
+ else
38
+ @ready_defer.succeed
46
39
  end
47
40
  end
41
+ end
48
42
 
49
- def connect(config, &after_connect)
50
- puts "[INFO] trying to connect to queue server"
51
- @amqp_conn = AMQP.connect(config) do |connection, open_ok|
52
- @channel = AMQP::Channel.new @amqp_conn
53
- @channel.auto_recovery = true
54
- @exchange = @channel.direct ''
55
- after_connect.call
56
- connection.on_error do |conn, connection_close|
57
- puts "[amqp connection.close] Reply code = #{connection_close.reply_code}, reply text = #{connection_close.reply_text}"
58
- if connection_close.reply_code == 320
59
- puts "[amqp connection.close] Setting up a periodic reconnection timer..."
60
- reconnect
61
- end
62
- end
63
- connection.on_tcp_connection_loss do |conn, settings|
64
- puts "[ERROR] Connection failed, resetting for reconnect"
43
+ def connect(config, &after_connect)
44
+ Combi.logger.info {"trying to connect to queue server"}
45
+ @amqp_conn = AMQP.connect(config) do |connection, open_ok|
46
+ @channel = AMQP::Channel.new @amqp_conn
47
+ @channel.auto_recovery = true
48
+ @exchange = @channel.direct ''
49
+ after_connect.call
50
+ connection.on_error do |conn, connection_close|
51
+ Combi.logger.info {"[amqp connection.close] Reply code = #{connection_close.reply_code}, reply text = #{connection_close.reply_text}"}
52
+ if connection_close.reply_code == 320
53
+ Combi.logger.info {"[amqp connection.close] Setting up a periodic reconnection timer..."}
65
54
  reconnect
66
55
  end
67
56
  end
68
- end
69
-
70
- def reconnect
71
- @ready_defer = EventMachine::DefaultDeferrable.new
72
- @ready_callbacks.each do |callback|
73
- @ready_defer.callback &callback
57
+ connection.on_tcp_connection_loss do |conn, settings|
58
+ Combi.logger.error {"Connection failed, resetting for reconnect"}
59
+ reconnect
74
60
  end
75
- start
76
61
  end
62
+ end
77
63
 
78
- def disconnect
79
- @amqp_conn.close
64
+ def reconnect
65
+ @ready_defer = EventMachine::DefaultDeferrable.new
66
+ @ready_callbacks.each do |callback|
67
+ @ready_defer.callback &callback
80
68
  end
69
+ start
70
+ end
81
71
 
82
- def publish(*args, &block)
83
- @exchange.publish *args do
84
- block.call if block_given?
85
- end
86
- end
72
+ def disconnect
73
+ @amqp_conn.close
74
+ end
87
75
 
88
- def queue(name, options = {}, &block)
89
- @channel.queue(name, options, &block)
76
+ def publish(*args, &block)
77
+ @exchange.publish *args do
78
+ block.call if block_given?
90
79
  end
80
+ end
91
81
 
92
- def acknowledge(delivery_info)
93
- @channel.acknowledge(delivery_info.delivery_tag, false)
94
- end
82
+ def queue(name, options = {}, &block)
83
+ @channel.queue(name, options, &block)
84
+ end
95
85
 
96
- def respond(response, delivery_info)
97
- serialized = Yajl::Encoder.encode response
98
- publish serialized, routing_key: delivery_info.reply_to, correlation_id: delivery_info.correlation_id
99
- end
86
+ def acknowledge(delivery_info)
87
+ @channel.acknowledge(delivery_info.delivery_tag, false)
88
+ end
100
89
 
101
- def create_rpc_queue
102
- @rpc_queue.unsubscribe unless @rpc_queue.nil?
103
- @rpc_queue = queue('', exclusive: true, auto_delete: true) do |rpc_queue|
104
- log "\tRPC QUEUE: #{@rpc_queue.name}"
105
- rpc_queue.subscribe do |metadata, response|
106
- parsed_response = Yajl::Parser.parse response, symbolize_keys: true
107
- message = {
108
- correlation_id: metadata.correlation_id,
109
- response: parsed_response
110
- }
111
- rpc_callback.call(message) unless rpc_callback.nil?
112
- end
113
- @ready_defer.succeed
114
- end
115
- end
90
+ def respond(response, delivery_info)
91
+ serialized = Yajl::Encoder.encode response
92
+ publish serialized, routing_key: delivery_info.reply_to, correlation_id: delivery_info.correlation_id
93
+ end
116
94
 
117
- def publish_request(kind, message, options = {})
118
- if options.has_key? :correlation_id
119
- # wants a response
120
- options[:reply_to] = @rpc_queue.name
95
+ def create_rpc_queue
96
+ @rpc_queue.unsubscribe unless @rpc_queue.nil?
97
+ @rpc_queue = queue('', exclusive: true, auto_delete: true) do |rpc_queue|
98
+ Combi.logger.debug {"\tRPC QUEUE: #{@rpc_queue.name}"}
99
+ rpc_queue.subscribe do |metadata, response|
100
+ parsed_response = Yajl::Parser.parse response, symbolize_keys: true
101
+ message = {
102
+ correlation_id: metadata.correlation_id,
103
+ response: parsed_response
104
+ }
105
+ rpc_callback.call(message) unless rpc_callback.nil?
121
106
  end
122
- options[:expiration] = ((options[:timeout] || RPC_DEFAULT_TIMEOUT) * 1000).to_i
123
- log "sending request #{kind} #{message.inspect[0..500]} with options #{options.inspect}"
124
- request = Yajl::Encoder.encode kind: kind, payload: message, options: {}
125
- publish request, options
107
+ @ready_defer.succeed
126
108
  end
109
+ end
127
110
 
111
+ def publish_request(kind, message, options = {})
112
+ if options.has_key? :correlation_id
113
+ # wants a response
114
+ options[:reply_to] = @rpc_queue.name
115
+ end
116
+ options[:expiration] = ((options[:timeout] || RPC_DEFAULT_TIMEOUT) * 1000).to_i
117
+ Combi.logger.debug {"sending request #{kind} #{message.inspect[0..500]} with options #{options.inspect}"}
118
+ request = Yajl::Encoder.encode kind: kind, payload: message, options: {}
119
+ publish request, options
128
120
  end
121
+
129
122
  end
@@ -1,47 +1,40 @@
1
1
  require 'eventmachine'
2
2
 
3
- module Combi
4
- class Reactor
5
- def self.start(&block)
6
- EM::error_handler do |error|
7
- STDERR << "ERROR IN EM\n"
8
- STDERR << "\t#{error.inspect}"
9
- STDERR << "\t#{error.backtrace.join("\t\n")}" << "\n"
10
- end
11
- log "-EM.start- the reactor is running: #{EM::reactor_running?}"
12
- raise "EM did not shut down" if EM::reactor_running?
13
- @@reactor_thread = Thread.new do
14
- begin
15
- log "------- starting EM reactor"
16
- EM::run do
17
- log "------- reactor started"
18
- block.call unless block.nil?
19
- end
20
- ensure
21
- puts "------- reactor stopped"
22
- end
23
- end
24
- 30.times do
25
- sleep 0.1 unless EM::reactor_running?
26
- end
3
+ class Combi::Reactor
4
+ def self.start(&block)
5
+ EM::error_handler do |error|
6
+ STDERR << "ERROR IN EM\n"
7
+ STDERR << "\t#{error.inspect}"
8
+ STDERR << "\t#{error.backtrace.join("\t\n")}" << "\n"
27
9
  end
28
-
29
- def self.stop
30
- log "-EM.stop- the reactor is running: #{EM::reactor_running?}"
31
- EM::stop_event_loop if EM::reactor_running?
32
- 50.times do
33
- sleep 0.3 if EM::reactor_running?
10
+ Combi.logger.info {"-EM.start- the reactor is running: #{EM::reactor_running?}"}
11
+ raise "EM did not shut down" if EM::reactor_running?
12
+ @@reactor_thread = Thread.new do
13
+ begin
14
+ Combi.logger.debug {"------- starting EM reactor"}
15
+ EM::run do
16
+ Combi.logger.debug {"------- reactor started"}
17
+ block.call unless block.nil?
18
+ end
19
+ ensure
20
+ Combi.logger.info {"------- reactor stopped"}
34
21
  end
35
22
  end
36
-
37
- def self.join_thread
38
- @@reactor_thread.join if @@reactor_thread
23
+ 30.times do
24
+ sleep 0.1 unless EM::reactor_running?
39
25
  end
26
+ end
40
27
 
41
- def self.log(message)
42
- return unless @debug_mode ||= ENV['DEBUG'] == 'true'
43
- puts "#{object_id} #{self.class.name} #{message}"
28
+ def self.stop
29
+ Combi.logger.debug {"-EM.stop- the reactor is running: #{EM::reactor_running?}"}
30
+ EM::stop_event_loop if EM::reactor_running?
31
+ 50.times do
32
+ sleep 0.3 if EM::reactor_running?
44
33
  end
34
+ end
45
35
 
36
+ def self.join_thread
37
+ @@reactor_thread.join if @@reactor_thread
46
38
  end
39
+
47
40
  end
@@ -1,41 +1,39 @@
1
1
  require 'eventmachine'
2
2
 
3
- module Combi
4
- class ResponseStore
5
- def initialize()
6
- @waiters = {}
7
- end
3
+ class Combi::ResponseStore
4
+ def initialize()
5
+ @waiters = {}
6
+ end
8
7
 
9
- # Returns an EM::Deferrable
10
- def wait_for(correlation_id, timeout)
11
- waiter = EM::DefaultDeferrable.new
12
- add_waiter correlation_id, waiter
13
- waiter.timeout timeout, error: 'Timeout::Error'
14
- end
8
+ # Returns an EM::Deferrable
9
+ def wait_for(correlation_id, timeout)
10
+ waiter = EM::DefaultDeferrable.new
11
+ add_waiter correlation_id, waiter
12
+ waiter.timeout timeout, error: 'Timeout::Error'
13
+ end
15
14
 
16
- def handle_rpc_response(response)
17
- correlation_id = response[:correlation_id]
18
- waiter = @waiters[correlation_id]
19
- return unless waiter
20
- response = response[:response] #Yajl::Parser.parse response[:response], sybolize_keys: true
21
- if response.respond_to?(:keys) and response[:error]
22
- waiter.fail response
23
- else
24
- waiter.succeed response
25
- end
15
+ def handle_rpc_response(response)
16
+ correlation_id = response[:correlation_id]
17
+ waiter = @waiters[correlation_id]
18
+ return unless waiter
19
+ response = response[:response] #Yajl::Parser.parse response[:response], sybolize_keys: true
20
+ if response.respond_to?(:keys) and response[:error]
21
+ waiter.fail response
22
+ else
23
+ waiter.succeed response
26
24
  end
25
+ end
27
26
 
28
- protected
27
+ protected
29
28
 
30
- def add_waiter(correlation_id, waiter)
31
- @waiters[correlation_id] = waiter
32
- waiter.callback { |r| remove_waiter correlation_id }
33
- waiter.errback { |r| remove_waiter correlation_id }
34
- waiter
35
- end
29
+ def add_waiter(correlation_id, waiter)
30
+ @waiters[correlation_id] = waiter
31
+ waiter.callback { |r| remove_waiter correlation_id }
32
+ waiter.errback { |r| remove_waiter correlation_id }
33
+ waiter
34
+ end
36
35
 
37
- def remove_waiter(correlation_id)
38
- @waiters.delete correlation_id
39
- end
36
+ def remove_waiter(correlation_id)
37
+ @waiters.delete correlation_id
40
38
  end
41
39
  end
@@ -1,54 +1,50 @@
1
- module Combi
2
- module Service
3
-
4
- def setup(service_bus, context)
5
- context ||= {}
6
- context[:service_bus] = service_bus
7
- setup_context(context)
8
- setup_services
9
- self
10
- end
1
+ module Combi::Service
2
+ def setup(service_bus, context)
3
+ context ||= {}
4
+ context[:service_bus] = service_bus
5
+ setup_context(context)
6
+ setup_services
7
+ self
8
+ end
11
9
 
12
- def setup_context(context)
13
- @context = context
14
- @context.keys.each do |context_var|
15
- define_singleton_method context_var do
16
- @context[context_var]
17
- end
10
+ def setup_context(context)
11
+ @context = context
12
+ @context.keys.each do |context_var|
13
+ define_singleton_method context_var do
14
+ @context[context_var]
18
15
  end
19
16
  end
17
+ end
20
18
 
21
- def setup_services
22
- end
23
-
24
- def no_response
25
- nil
26
- end
19
+ def setup_services
20
+ end
27
21
 
28
- def async_response(&block)
29
- lambda &block
30
- end
22
+ def no_response
23
+ nil
24
+ end
31
25
 
32
- def actions
33
- []
34
- end
26
+ def async_response(&block)
27
+ lambda &block
28
+ end
35
29
 
36
- def remote_methods
37
- @_REMOTE_METHODS ||= public_methods(false) - Combi::Service.public_instance_methods
38
- end
30
+ def actions
31
+ []
32
+ end
39
33
 
40
- def service_bus
41
- @service_bus
42
- end
34
+ def remote_methods
35
+ @_REMOTE_METHODS ||= public_methods(false) - Combi::Service.public_instance_methods
36
+ end
43
37
 
44
- def enable(*services, &block)
45
- service_bus.enable(services)
46
- yield block if block_given?
47
- end
38
+ def service_bus
39
+ @service_bus
40
+ end
48
41
 
49
- def to_s
50
- @_TO_S ||= "#{self.class.name}"
51
- end
42
+ def enable(*services, &block)
43
+ service_bus.enable(services)
44
+ yield block if block_given?
45
+ end
52
46
 
47
+ def to_s
48
+ @_TO_S ||= "#{self.class.name}"
53
49
  end
54
50
  end
@@ -1,31 +1,28 @@
1
- module Combi
2
- class ServiceBus
3
- class << self
4
- @@buses = {}
1
+ class Combi::ServiceBus
2
+ class << self
3
+ @@buses = {}
5
4
 
6
- def for(kind, options = {})
7
- @@buses[kind] ||= init_for(kind, options)
8
- end
5
+ def for(kind, options = {})
6
+ @@buses[kind] ||= init_for(kind, options)
7
+ end
9
8
 
10
- def init_for(kind, options)
11
- require 'combi/buses/bus'
9
+ def init_for(kind, options)
10
+ require 'combi/buses/bus'
12
11
 
13
- case kind
14
- when :in_process
15
- require 'combi/buses/in_process'
16
- Combi::InProcess.new(options)
17
- when :queue
18
- require 'combi/buses/queue'
19
- Combi::Queue.new(options)
20
- when :web_socket
21
- require 'combi/buses/web_socket'
22
- Combi::WebSocket.new(options)
23
- when :http
24
- require 'combi/buses/http'
25
- Combi::Http.new(options)
26
- end
12
+ case kind
13
+ when :in_process
14
+ require 'combi/buses/in_process'
15
+ Combi::InProcess.new(options)
16
+ when :queue
17
+ require 'combi/buses/queue'
18
+ Combi::Queue.new(options)
19
+ when :web_socket
20
+ require 'combi/buses/web_socket'
21
+ Combi::WebSocket.new(options)
22
+ when :http
23
+ require 'combi/buses/http'
24
+ Combi::Http.new(options)
27
25
  end
28
26
  end
29
-
30
27
  end
31
28
  end
@@ -1,3 +1,3 @@
1
1
  module Combi
2
- VERSION = '0.3.0'
2
+ VERSION = '0.4.0'
3
3
  end
@@ -28,11 +28,7 @@ describe 'Combi::Bus' do
28
28
  end
29
29
  end
30
30
  Given(:path) { 'module/remote' }
31
- When { bus.add_service service_definition
32
- puts bus.routes.inspect
33
- puts bus.routes[path].inspect
34
- puts bus.routes.keys.inspect
35
- }
31
+ When { bus.add_service service_definition }
36
32
  Then { bus.routes.keys.length == 1 }
37
33
  And { bus.routes[path].is_a? service_definition }
38
34
  end
@@ -68,7 +68,7 @@ describe 'Combi::Queue' do
68
68
  end
69
69
 
70
70
  context "it resist a reconnection" do
71
- puts "VERY UNSTABLE TEST"
71
+ Given!("notice") { puts "VERY UNSTABLE TEST" }
72
72
  When(:service) { provider.add_service null_service }
73
73
  Then do
74
74
  em do
@@ -1,6 +1,7 @@
1
1
  require 'singleton'
2
2
  require 'socket'
3
3
  require 'timeout'
4
+ require 'combi'
4
5
  # Uses docker to start a server
5
6
  class RabbitmqServer
6
7
  include Singleton
@@ -11,9 +12,9 @@ class RabbitmqServer
11
12
  def start!
12
13
  needs_to_start = !container_running?
13
14
  if needs_to_start
14
- puts "Starting new Rabbitmq container"
15
+ Combi.logger.debug {"Starting new Rabbitmq container"}
15
16
  system "docker run -d -P -e RABBITMQ_PASS=#{PASSWORD} --name #{NAME} tutum/rabbitmq"
16
- puts "RABBITMQ STARTING"
17
+ Combi.logger.debug {"RABBITMQ STARTING"}
17
18
  end
18
19
  start_forwarder!
19
20
  is_port_open?('localhost', port)
@@ -32,11 +33,11 @@ class RabbitmqServer
32
33
  return if @_command_running ||= `ps`.include?(command)
33
34
  @forwarder_pid = Process.spawn command
34
35
  #Process.detach @forwarder_pid
35
- puts "starting forwarder pid: #{@forwarder_pid}"
36
+ Combi.logger.debug {"starting forwarder pid: #{@forwarder_pid}"}
36
37
  end
37
38
 
38
39
  def stop_forwarder!
39
- puts "stopping forwarder pid #{@forwarder_pid}"
40
+ Combi.logger.debug {"stopping forwarder pid #{@forwarder_pid}"}
40
41
  Process.kill 'TERM', @forwarder_pid if @forwarder_pid
41
42
  rescue Error::ESRCH => e
42
43
  # the forwarder process has already died
@@ -48,7 +49,7 @@ class RabbitmqServer
48
49
  if port_match
49
50
  return port_match[1].to_i
50
51
  else
51
- puts "Container not running yet, sleeping"
52
+ Combi.logger.info {"Container not running yet, sleeping"}
52
53
  sleep 0.2
53
54
  port
54
55
  end
@@ -63,14 +64,13 @@ class RabbitmqServer
63
64
  s.close
64
65
  return true
65
66
  rescue Errno::ECONNREFUSED, Errno::EHOSTUNREACH
66
- puts "conn error to #{service}"
67
67
  sleep 1
68
- puts "\tretrying connection to #{service}"
68
+ Combi.logger.info {"\tretrying connection to #{service}"}
69
69
  retry
70
70
  end
71
71
  end
72
72
  rescue Timeout::Error
73
- puts "Cannot connect to RABBIT server after #{timeout} seconds"
73
+ Combi.logger.error {"Cannot connect to RABBIT server after #{timeout} seconds"}
74
74
  end
75
75
 
76
76
  return false
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: combi
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.0
4
+ version: 0.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - German Del Zotto
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2014-07-02 00:00:00.000000000 Z
12
+ date: 2014-07-04 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: yajl-ruby