batsir 0.1.0 → 0.3.7
Sign up to get free protection for your applications and to get access to all the features.
- data/.travis.yml +9 -1
- data/CHANGES.md +54 -0
- data/Gemfile +7 -10
- data/README.md +49 -5
- data/Rakefile +23 -16
- data/batsir.gemspec +43 -15
- data/lib/batsir/acceptors/acceptor.rb +31 -5
- data/lib/batsir/acceptors/amqp_acceptor.rb +36 -8
- data/lib/batsir/amqp.rb +35 -7
- data/lib/batsir/amqp_consumer.rb +8 -0
- data/lib/batsir/compiler/stage_worker_compiler.rb +86 -0
- data/lib/batsir/config.rb +208 -24
- data/lib/batsir/dsl/conditional_notifier_declaration.rb +31 -0
- data/lib/batsir/dsl/dsl_mappings.rb +27 -2
- data/lib/batsir/errors.rb +18 -0
- data/lib/batsir/filter.rb +5 -0
- data/lib/batsir/log.rb +7 -0
- data/lib/batsir/logger.rb +37 -0
- data/lib/batsir/logo.rb +3 -8
- data/lib/batsir/notifiers/amqp_notifier.rb +14 -4
- data/lib/batsir/notifiers/conditional_notifier.rb +29 -0
- data/lib/batsir/notifiers/notifier.rb +6 -5
- data/lib/batsir/registry.rb +6 -2
- data/lib/batsir/stage.rb +9 -4
- data/lib/batsir/stage_worker.rb +3 -56
- data/lib/batsir/strategies/retry_strategy.rb +35 -0
- data/lib/batsir/strategies/strategy.rb +20 -0
- data/lib/batsir/transformers/field_transformer.rb +2 -3
- data/lib/batsir/transformers/json_input_transformer.rb +6 -2
- data/lib/batsir/transformers/json_output_transformer.rb +6 -2
- data/lib/batsir/transformers/transformer.rb +5 -1
- data/lib/batsir/version.rb +10 -0
- data/lib/batsir.rb +31 -13
- data/spec/batsir/acceptors/acceptor_spec.rb +7 -78
- data/spec/batsir/acceptors/amqp_acceptor_spec.rb +55 -66
- data/spec/batsir/acceptors/shared_examples.rb +102 -0
- data/spec/batsir/amqp_spec.rb +58 -0
- data/spec/batsir/chain_spec.rb +4 -4
- data/spec/batsir/config_spec.rb +97 -0
- data/spec/batsir/dsl/chain_mapping_spec.rb +5 -6
- data/spec/batsir/dsl/conditional_notifier_mapping_spec.rb +80 -0
- data/spec/batsir/dsl/stage_mapping_spec.rb +38 -20
- data/spec/batsir/filter_queue_spec.rb +9 -15
- data/spec/batsir/filter_spec.rb +4 -5
- data/spec/batsir/log_spec.rb +10 -0
- data/spec/batsir/logger_spec.rb +46 -0
- data/spec/batsir/notifiers/amqp_notifier_spec.rb +43 -22
- data/spec/batsir/notifiers/conditional_notifier_spec.rb +62 -0
- data/spec/batsir/notifiers/notifier_spec.rb +4 -66
- data/spec/batsir/notifiers/shared_examples.rb +100 -0
- data/spec/batsir/registry_spec.rb +48 -0
- data/spec/batsir/stage_spec.rb +91 -85
- data/spec/batsir/stage_worker_spec.rb +13 -13
- data/spec/batsir/strategies/retry_strategy_spec.rb +58 -0
- data/spec/batsir/strategies/strategy_spec.rb +28 -0
- data/spec/batsir/support/bunny_mocks.rb +78 -5
- data/spec/batsir/transformers/field_transformer_spec.rb +22 -22
- data/spec/batsir/transformers/json_input_transformer_spec.rb +8 -3
- data/spec/batsir/transformers/json_output_transformer_spec.rb +2 -2
- data/spec/batsir/transformers/transformer_spec.rb +18 -4
- data/spec/spec_helper.rb +6 -2
- metadata +78 -23
- data/VERSION +0 -1
@@ -0,0 +1,20 @@
|
|
1
|
+
module Batsir
|
2
|
+
module Strategies
|
3
|
+
class Strategy
|
4
|
+
|
5
|
+
attr_reader :context
|
6
|
+
|
7
|
+
def initialize(context)
|
8
|
+
if context.respond_to? :execute
|
9
|
+
@context = context
|
10
|
+
else
|
11
|
+
raise Batsir::Errors::ExecuteMethodNotImplementedError.new
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
def execute(message, error = nil)
|
16
|
+
end
|
17
|
+
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -14,7 +14,7 @@ module Batsir
|
|
14
14
|
end
|
15
15
|
end
|
16
16
|
|
17
|
-
def
|
17
|
+
def execute(message)
|
18
18
|
fields = self.fields
|
19
19
|
if fields.any? && message.respond_to?(:keys)
|
20
20
|
symbolized_message_keys = {}
|
@@ -25,7 +25,7 @@ module Batsir
|
|
25
25
|
fields_to_remove = symbolized_message_keys.keys - fields.keys - fields.values
|
26
26
|
|
27
27
|
fields.each do |new, old|
|
28
|
-
message[new] = message.delete(symbolized_message_keys[old])
|
28
|
+
message[new.to_s] = message.delete(symbolized_message_keys[old])
|
29
29
|
end
|
30
30
|
|
31
31
|
fields_to_remove.each do |field|
|
@@ -34,7 +34,6 @@ module Batsir
|
|
34
34
|
end
|
35
35
|
message
|
36
36
|
end
|
37
|
-
|
38
37
|
end
|
39
38
|
end
|
40
39
|
end
|
@@ -1,8 +1,12 @@
|
|
1
1
|
module Batsir
|
2
2
|
module Transformers
|
3
3
|
class JSONInputTransformer < Transformer
|
4
|
-
def
|
5
|
-
|
4
|
+
def execute(message)
|
5
|
+
begin
|
6
|
+
JSON.parse(message, :symbolize_names => false)
|
7
|
+
rescue JSON::JSONError => e
|
8
|
+
raise Batsir::Errors::JSONInputTransformError.new(e.message)
|
9
|
+
end
|
6
10
|
end
|
7
11
|
end
|
8
12
|
end
|
@@ -1,8 +1,12 @@
|
|
1
1
|
module Batsir
|
2
2
|
module Transformers
|
3
3
|
class JSONOutputTransformer < Transformer
|
4
|
-
def
|
5
|
-
|
4
|
+
def execute(message)
|
5
|
+
begin
|
6
|
+
JSON.dump(message)
|
7
|
+
rescue JSON::JSONError => e
|
8
|
+
raise Batsir::Errors::JSONOutputTransformError.new(e.message)
|
9
|
+
end
|
6
10
|
end
|
7
11
|
end
|
8
12
|
end
|
data/lib/batsir.rb
CHANGED
@@ -1,42 +1,48 @@
|
|
1
1
|
require 'blockenspiel'
|
2
2
|
require 'celluloid'
|
3
3
|
require 'json'
|
4
|
+
require 'log4r'
|
4
5
|
require 'bunny'
|
5
6
|
require 'sidekiq'
|
6
7
|
require 'sidekiq/cli'
|
7
|
-
require 'batsir/
|
8
|
+
require 'batsir/amqp_consumer'
|
8
9
|
require 'batsir/config'
|
9
10
|
require 'batsir/chain'
|
11
|
+
require 'batsir/errors'
|
10
12
|
require 'batsir/filter'
|
11
13
|
require 'batsir/filter_queue'
|
14
|
+
require 'batsir/log'
|
15
|
+
require 'batsir/logger'
|
16
|
+
require 'batsir/logo'
|
17
|
+
require 'batsir/registry'
|
12
18
|
require 'batsir/stage'
|
13
19
|
require 'batsir/stage_worker'
|
20
|
+
require 'batsir/compiler/stage_worker_compiler'
|
14
21
|
require 'batsir/dsl/dsl_mappings'
|
22
|
+
require 'batsir/dsl/conditional_notifier_declaration'
|
15
23
|
require 'batsir/acceptors/acceptor'
|
16
24
|
require 'batsir/acceptors/amqp_acceptor'
|
17
25
|
require 'batsir/notifiers/notifier'
|
18
26
|
require 'batsir/notifiers/amqp_notifier'
|
27
|
+
require 'batsir/notifiers/conditional_notifier'
|
19
28
|
require 'batsir/transformers/transformer'
|
20
29
|
require 'batsir/transformers/field_transformer'
|
21
30
|
require 'batsir/transformers/json_input_transformer'
|
22
31
|
require 'batsir/transformers/json_output_transformer'
|
23
|
-
require 'batsir/
|
32
|
+
require 'batsir/strategies/strategy'
|
33
|
+
require 'batsir/strategies/retry_strategy'
|
34
|
+
require 'batsir/version'
|
24
35
|
|
25
36
|
module Batsir
|
26
|
-
def self.config
|
27
|
-
@config ||= Batsir::Config.new(config_defaults)
|
28
|
-
end
|
29
37
|
|
30
|
-
def self.
|
31
|
-
|
32
|
-
:redis_url => "redis://localhost:6379/0"
|
33
|
-
}
|
38
|
+
def self.config
|
39
|
+
Batsir::Config
|
34
40
|
end
|
35
41
|
|
36
42
|
def self.create(&block)
|
37
43
|
puts logo
|
38
44
|
new_block = ::Proc.new do
|
39
|
-
aggregator_chain
|
45
|
+
aggregator_chain(&block)
|
40
46
|
end
|
41
47
|
@chain = ::Blockenspiel.invoke(new_block, Batsir::DSL::ChainMapping.new)
|
42
48
|
end
|
@@ -45,7 +51,7 @@ module Batsir
|
|
45
51
|
return unless @chain
|
46
52
|
|
47
53
|
sidekiq_cli = Sidekiq::CLI.instance
|
48
|
-
Sidekiq.options[:queues] <<
|
54
|
+
Sidekiq.options[:queues] << Batsir::Config.sidekiq_queue
|
49
55
|
|
50
56
|
initialize_sidekiq
|
51
57
|
|
@@ -58,11 +64,12 @@ module Batsir
|
|
58
64
|
end
|
59
65
|
|
60
66
|
def self.initialize_sidekiq
|
67
|
+
Sidekiq.logger = Batsir::Logger.log
|
61
68
|
Sidekiq.configure_server do |config|
|
62
|
-
config.redis = {:url =>
|
69
|
+
config.redis = {:url => redis_url, :namespace => redis_namespace}
|
63
70
|
end
|
64
71
|
Sidekiq.configure_client do |config|
|
65
|
-
config.redis = {:url =>
|
72
|
+
config.redis = {:url => redis_url, :namespace => redis_namespace}
|
66
73
|
end
|
67
74
|
end
|
68
75
|
|
@@ -70,4 +77,15 @@ module Batsir
|
|
70
77
|
create(&block)
|
71
78
|
start
|
72
79
|
end
|
80
|
+
|
81
|
+
def self.redis_url
|
82
|
+
host = Batsir::Config.redis_host
|
83
|
+
port = Batsir::Config.redis_port
|
84
|
+
dbase = Batsir::Config.redis_database
|
85
|
+
"redis://#{host}:#{port}/#{dbase}"
|
86
|
+
end
|
87
|
+
|
88
|
+
def self.redis_namespace
|
89
|
+
Batsir::Config.redis_namespace
|
90
|
+
end
|
73
91
|
end
|
@@ -1,89 +1,19 @@
|
|
1
1
|
require File.join( File.dirname(__FILE__), "..", "..", "spec_helper" )
|
2
|
+
require File.join( File.dirname(__FILE__), 'shared_examples')
|
3
|
+
|
2
4
|
|
3
5
|
describe Batsir::Acceptors::Acceptor do
|
6
|
+
it_behaves_like "an acceptor", Batsir::Acceptors::Acceptor
|
7
|
+
|
4
8
|
let( :acceptor_class ) {
|
5
9
|
Batsir::Acceptors::Acceptor
|
6
10
|
}
|
7
11
|
|
8
|
-
it "
|
12
|
+
it "is a Celluloid actor" do
|
9
13
|
acceptor_class.ancestors.should include Celluloid
|
10
14
|
end
|
11
15
|
|
12
|
-
it "
|
13
|
-
acceptor = acceptor_class.new
|
14
|
-
stage_name = "some stage"
|
15
|
-
acceptor.stage_name = stage_name
|
16
|
-
acceptor.stage_name.should == stage_name
|
17
|
-
end
|
18
|
-
|
19
|
-
it "should have a #start method" do
|
20
|
-
acceptor_class.instance_methods.map{|im| im.to_s}.should include "start"
|
21
|
-
end
|
22
|
-
|
23
|
-
it "should have an #start_filter_chain method" do
|
24
|
-
acceptor_class.instance_methods.map{|im| im.to_s}.should include "start_filter_chain"
|
25
|
-
end
|
26
|
-
|
27
|
-
it "should be possible to initialize an Acceptor with on options hash" do
|
28
|
-
acceptor = acceptor_class.new({})
|
29
|
-
acceptor.should_not be_nil
|
30
|
-
end
|
31
|
-
|
32
|
-
it "should look up a worker class when the #start_filter_chain method is called" do
|
33
|
-
acceptor = acceptor_class.new
|
34
|
-
stage_name = "some stage"
|
35
|
-
acceptor.stage_name = stage_name
|
36
|
-
Batsir::Registry.should_receive(:get).with(stage_name)
|
37
|
-
acceptor.start_filter_chain({})
|
38
|
-
end
|
39
|
-
|
40
|
-
it "should have a transformer_queue" do
|
41
|
-
acceptor = acceptor_class.new
|
42
|
-
acceptor.transformer_queue.should_not be_nil
|
43
|
-
end
|
44
|
-
|
45
|
-
it "should initially have an empty transformer_queue" do
|
46
|
-
acceptor = acceptor_class.new
|
47
|
-
acceptor.transformer_queue.should_not be_nil
|
48
|
-
acceptor.transformer_queue.should be_empty
|
49
|
-
end
|
50
|
-
|
51
|
-
it "should be possible to add a transformer to the transformer_queue" do
|
52
|
-
transformer = :transformer
|
53
|
-
|
54
|
-
acceptor = acceptor_class.new
|
55
|
-
acceptor.add_transformer transformer
|
56
|
-
|
57
|
-
acceptor.transformer_queue.should_not be_empty
|
58
|
-
acceptor.transformer_queue.size.should == 1
|
59
|
-
acceptor.transformer_queue.first.should == :transformer
|
60
|
-
end
|
61
|
-
|
62
|
-
it "should be possible to add a transformer multiple times" do
|
63
|
-
transformer = :transformer
|
64
|
-
|
65
|
-
acceptor = acceptor_class.new
|
66
|
-
acceptor.add_transformer transformer
|
67
|
-
acceptor.add_transformer transformer
|
68
|
-
|
69
|
-
acceptor.transformer_queue.should_not be_empty
|
70
|
-
acceptor.transformer_queue.size.should == 2
|
71
|
-
end
|
72
|
-
|
73
|
-
it "should be possible to set a cancellator" do
|
74
|
-
cancellator = :cancel
|
75
|
-
acceptor = acceptor_class.new
|
76
|
-
acceptor.cancellator = cancellator
|
77
|
-
acceptor.cancellator.should == cancellator
|
78
|
-
end
|
79
|
-
|
80
|
-
it "should be possible to set a cancellator in the constructor using a hash" do
|
81
|
-
cancellator = :cancel
|
82
|
-
acceptor = acceptor_class.new(:cancellator => cancellator)
|
83
|
-
acceptor.cancellator.should == cancellator
|
84
|
-
end
|
85
|
-
|
86
|
-
it "should call the #perform_async on the worker class when #start_filter_chain is called" do
|
16
|
+
it "calls the #perform_async on the worker class when #start_filter_chain is called" do
|
87
17
|
class MockWorker
|
88
18
|
def self.stage_name
|
89
19
|
"mock_stage"
|
@@ -108,7 +38,7 @@ describe Batsir::Acceptors::Acceptor do
|
|
108
38
|
acceptor.start_filter_chain({})
|
109
39
|
end
|
110
40
|
|
111
|
-
it "
|
41
|
+
it "calls #transform on the acceptor transformers" do
|
112
42
|
class MockTransformer < Batsir::Transformers::Transformer
|
113
43
|
def transform(message)
|
114
44
|
@@transformed ||= 0
|
@@ -123,7 +53,6 @@ describe Batsir::Acceptors::Acceptor do
|
|
123
53
|
|
124
54
|
acceptor = acceptor_class.new
|
125
55
|
stage_name = "some stage"
|
126
|
-
|
127
56
|
acceptor.stage_name = stage_name
|
128
57
|
acceptor.add_transformer MockTransformer.new
|
129
58
|
|
@@ -1,53 +1,69 @@
|
|
1
1
|
require File.join( File.dirname(__FILE__), "..", "..", "spec_helper" )
|
2
|
+
require File.join( File.dirname(__FILE__), 'shared_examples')
|
2
3
|
|
3
4
|
describe Batsir::Acceptors::AMQPAcceptor do
|
5
|
+
it_behaves_like "an acceptor", Batsir::Acceptors::AMQPAcceptor
|
4
6
|
|
5
7
|
let(:acceptor_class){
|
6
8
|
Batsir::Acceptors::AMQPAcceptor
|
7
9
|
}
|
8
10
|
|
9
|
-
context "
|
11
|
+
context "instantiating" do
|
12
|
+
it "sets a bunny pool" do
|
13
|
+
acceptor = acceptor_class.new
|
14
|
+
acceptor.bunny_pool.should be_kind_of ConnectionPool
|
15
|
+
end
|
10
16
|
|
11
|
-
it "
|
12
|
-
acceptor_class.
|
17
|
+
it "uses the same ConnectionPool instance for each acceptor" do
|
18
|
+
acceptor1 = acceptor_class.new
|
19
|
+
acceptor2 = acceptor_class.new
|
20
|
+
acceptor1.should_not eql acceptor2
|
21
|
+
acceptor1.bunny_pool.should eql acceptor2.bunny_pool
|
13
22
|
end
|
23
|
+
end
|
14
24
|
|
15
|
-
|
25
|
+
context "setting options" do
|
26
|
+
it "can set the queue on which to listen" do
|
16
27
|
acceptor = acceptor_class.new(:queue => :queue)
|
17
28
|
acceptor.queue.should == :queue
|
18
29
|
end
|
19
30
|
|
20
|
-
it "
|
31
|
+
it "can set the host of the amqp broker" do
|
21
32
|
acceptor = acceptor_class.new(:host => 'localhost')
|
22
33
|
acceptor.host.should == 'localhost'
|
23
34
|
end
|
24
35
|
|
25
|
-
it "
|
36
|
+
it "can set the port of the amqp broker" do
|
26
37
|
acceptor = acceptor_class.new(:port => 1234)
|
27
38
|
acceptor.port.should == 1234
|
28
39
|
end
|
29
40
|
|
30
|
-
it "
|
41
|
+
it "can set the username with which to connect to the broker" do
|
31
42
|
acceptor = acceptor_class.new(:username => 'some_user')
|
32
43
|
acceptor.username.should == 'some_user'
|
33
44
|
end
|
34
45
|
|
35
|
-
it "
|
46
|
+
it "can set the password with which to connect to the broker" do
|
36
47
|
acceptor = acceptor_class.new(:password => 'password')
|
37
48
|
acceptor.password.should == 'password'
|
38
49
|
end
|
39
50
|
|
40
|
-
it "
|
51
|
+
it "can set the vhost to use on the broker" do
|
41
52
|
acceptor = acceptor_class.new(:vhost => '/vhost')
|
42
53
|
acceptor.vhost.should == '/vhost'
|
43
54
|
end
|
44
55
|
|
45
|
-
it "
|
56
|
+
it "can set the exchange to use on the broker" do
|
46
57
|
acceptor = acceptor_class.new(:exchange => 'amq.direct')
|
47
58
|
acceptor.exchange.should == 'amq.direct'
|
48
59
|
end
|
49
60
|
|
50
|
-
it "
|
61
|
+
it "can set the queue to be durable" do
|
62
|
+
acceptor = acceptor_class.new(:durable => true)
|
63
|
+
acceptor.durable.should == true
|
64
|
+
end
|
65
|
+
|
66
|
+
it "defaults to amqp://guest:guest@localhost:5672/ with direct exchange on vhost ''" do
|
51
67
|
acceptor = acceptor_class.new(:queue => :somequeue)
|
52
68
|
acceptor.queue.should == :somequeue
|
53
69
|
acceptor.host.should == 'localhost'
|
@@ -59,79 +75,58 @@ describe Batsir::Acceptors::AMQPAcceptor do
|
|
59
75
|
end
|
60
76
|
end
|
61
77
|
|
62
|
-
context "
|
78
|
+
context "starting the acceptor" do
|
63
79
|
def new_acceptor(options = {})
|
64
|
-
acceptor_class.new(options)
|
80
|
+
acceptor_class.new({:queue => 'test_queue'}.merge options)
|
65
81
|
end
|
66
82
|
|
67
|
-
it "
|
68
|
-
acceptor = new_acceptor(
|
69
|
-
acceptor.
|
70
|
-
|
71
|
-
|
83
|
+
it "starts listening on the configured queue" do
|
84
|
+
acceptor = new_acceptor()
|
85
|
+
acceptor.bunny_pool do |bunny|
|
86
|
+
acceptor.consumer.queue.name.should == 'test_queue'
|
87
|
+
end
|
72
88
|
end
|
73
89
|
|
74
|
-
it "
|
75
|
-
acceptor = new_acceptor(:
|
90
|
+
it "connects to the configured host" do
|
91
|
+
acceptor = new_acceptor(:host => 'localhost')
|
76
92
|
acceptor.start
|
77
|
-
|
78
|
-
instance.options[:port].should == 1234
|
93
|
+
acceptor.consumer.queue.channel.connection.host.should == 'localhost'
|
79
94
|
end
|
80
95
|
|
81
|
-
it "
|
82
|
-
acceptor = new_acceptor(:
|
96
|
+
it "connects to the configured port" do
|
97
|
+
acceptor = new_acceptor(:port => 5672)
|
83
98
|
acceptor.start
|
84
|
-
|
85
|
-
instance.options[:user].should == 'user'
|
99
|
+
acceptor.consumer.queue.channel.connection.port.should == 5672
|
86
100
|
end
|
87
101
|
|
88
|
-
it "
|
89
|
-
acceptor = new_acceptor(:password => '
|
102
|
+
it "connects with the configured username" do
|
103
|
+
acceptor = new_acceptor(:username => 'guest', :password => 'guest')
|
90
104
|
acceptor.start
|
91
|
-
|
92
|
-
|
105
|
+
acceptor.consumer.queue.channel.connection.user.should == 'guest'
|
106
|
+
acceptor.consumer.queue.channel.connection.pass.should == 'guest'
|
93
107
|
end
|
94
108
|
|
95
|
-
it "
|
96
|
-
acceptor = new_acceptor(:vhost => '/
|
109
|
+
it "connects to the configured vhost" do
|
110
|
+
acceptor = new_acceptor(:vhost => '/')
|
97
111
|
acceptor.start
|
98
|
-
|
99
|
-
instance.options[:vhost].should == '/vhost'
|
112
|
+
acceptor.consumer.queue.channel.connection.vhost.should == '/'
|
100
113
|
end
|
101
114
|
|
102
|
-
it "
|
115
|
+
it "declares the configured exchange" do
|
103
116
|
acceptor = new_acceptor(:exchange => 'some_exchange')
|
104
117
|
acceptor.start
|
105
|
-
|
106
|
-
instance.exchange.name.should == 'some_exchange'
|
118
|
+
acceptor.consumer.queue.instance_variable_get(:@bindings).first[:exchange].should == 'some_exchange'
|
107
119
|
end
|
108
120
|
|
109
|
-
it "
|
121
|
+
it "binds the configured exchange to the queue" do
|
110
122
|
acceptor = new_acceptor(:exchange => 'some_exchange', :queue => :queue)
|
111
123
|
acceptor.start
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
queue.bound_key.should == :queue
|
124
|
+
binding = acceptor.consumer.queue.instance_variable_get(:@bindings).first
|
125
|
+
binding[:exchange].should == 'some_exchange'
|
126
|
+
binding[:routing_key].should == :queue
|
116
127
|
end
|
117
128
|
|
118
|
-
it "
|
119
|
-
acceptor = new_acceptor(:queue => :some_queue)
|
120
|
-
acceptor.start
|
121
|
-
instance = Bunny.instance
|
122
|
-
instance.queues.size.should == 1
|
123
|
-
instance.queues.keys.should include :some_queue
|
124
|
-
end
|
125
|
-
|
126
|
-
it "should initialize the subscription with the acceptor's cancellator" do
|
127
|
-
cancellator = :cancellator
|
128
|
-
acceptor = new_acceptor(:queue => :some_queue, :cancellator => cancellator)
|
129
|
-
acceptor.start
|
130
|
-
instance = Bunny.instance
|
131
|
-
puts instance.queues[:some_queue].arguments.first[:cancellator].should == cancellator
|
132
|
-
end
|
133
|
-
|
134
|
-
it "should call the #start_filter_chain method when a message is received" do
|
129
|
+
it "calls the #start_filter_chain method when a message is received" do
|
135
130
|
acceptor = new_acceptor(:queue => :some_queue)
|
136
131
|
|
137
132
|
# Because acceptor is a Celluloid Actor, it is not possible to define a method
|
@@ -155,13 +150,7 @@ describe Batsir::Acceptors::AMQPAcceptor do
|
|
155
150
|
acceptor._send_(:define_singleton_method, :method_called, method_called_mock_method)
|
156
151
|
|
157
152
|
acceptor.start
|
158
|
-
|
159
|
-
instance = Bunny.instance
|
160
|
-
queue = instance.queues[:some_queue]
|
161
|
-
queue.should_not be_nil
|
162
|
-
|
163
|
-
block = queue.block
|
164
|
-
block.call({})
|
153
|
+
acceptor.consumer.call({})
|
165
154
|
|
166
155
|
acceptor.method_called.should == 1
|
167
156
|
end
|
@@ -0,0 +1,102 @@
|
|
1
|
+
shared_examples_for "an acceptor" do |acceptor_class|
|
2
|
+
before :each do
|
3
|
+
subject{acceptor_class.new}
|
4
|
+
end
|
5
|
+
|
6
|
+
context 'properties' do
|
7
|
+
it "is a Batsir::Acceptors::Acceptor" do
|
8
|
+
subject.should be_kind_of Batsir::Acceptors::Acceptor
|
9
|
+
end
|
10
|
+
|
11
|
+
it "has a #start method" do
|
12
|
+
subject.class.instance_methods.map{|im| im.to_s}.should include "start"
|
13
|
+
end
|
14
|
+
|
15
|
+
it "has a #start_filter_chain method" do
|
16
|
+
subject.class.instance_methods.map{|im| im.to_s}.should include "start_filter_chain"
|
17
|
+
end
|
18
|
+
|
19
|
+
it "has a transformer_queue" do
|
20
|
+
subject.transformer_queue.should_not be_nil
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
context 'instances' do
|
25
|
+
it "can initialize an Acceptor with on options hash" do
|
26
|
+
acceptor = acceptor_class.new({})
|
27
|
+
acceptor.should_not be_nil
|
28
|
+
end
|
29
|
+
|
30
|
+
it "initially has an empty transformer_queue" do
|
31
|
+
subject.transformer_queue.should_not be_nil
|
32
|
+
subject.transformer_queue.should be_empty
|
33
|
+
end
|
34
|
+
|
35
|
+
it "can set the stage name for the acceptor" do
|
36
|
+
acceptor = acceptor_class.new
|
37
|
+
stage_name = "some stage"
|
38
|
+
acceptor.stage_name = stage_name
|
39
|
+
acceptor.stage_name.should == stage_name
|
40
|
+
end
|
41
|
+
|
42
|
+
it "looks up a worker class when the #start_filter_chain method is called" do
|
43
|
+
acceptor = acceptor_class.new
|
44
|
+
stage_name = "some stage"
|
45
|
+
acceptor.stage_name = stage_name
|
46
|
+
Batsir::Registry.should_receive(:get).with(stage_name)
|
47
|
+
acceptor.start_filter_chain({})
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
context 'transformers' do
|
52
|
+
it "can add a transformer to the transformer_queue" do
|
53
|
+
transformer = :transformer
|
54
|
+
|
55
|
+
acceptor = acceptor_class.new
|
56
|
+
acceptor.add_transformer transformer
|
57
|
+
|
58
|
+
acceptor.transformer_queue.should_not be_empty
|
59
|
+
acceptor.transformer_queue.size.should == 1
|
60
|
+
acceptor.transformer_queue.first.should == :transformer
|
61
|
+
end
|
62
|
+
|
63
|
+
it "can add a transformer multiple times" do
|
64
|
+
transformer = :transformer
|
65
|
+
|
66
|
+
acceptor = acceptor_class.new
|
67
|
+
acceptor.add_transformer transformer
|
68
|
+
acceptor.add_transformer transformer
|
69
|
+
|
70
|
+
acceptor.transformer_queue.should_not be_empty
|
71
|
+
acceptor.transformer_queue.size.should == 2
|
72
|
+
end
|
73
|
+
|
74
|
+
it "handles errors thrown by transformers" do
|
75
|
+
class ErrorAcceptor < Batsir::Acceptors::Acceptor
|
76
|
+
attr_accessor :message
|
77
|
+
def process_message_error(message, error)
|
78
|
+
message = "error"
|
79
|
+
@message = message
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
class MockTransformer < Batsir::Transformers::Transformer
|
84
|
+
def transform(message)
|
85
|
+
raise Batsir::Errors::TransformError.new
|
86
|
+
end
|
87
|
+
end
|
88
|
+
|
89
|
+
acceptor = ErrorAcceptor.new
|
90
|
+
stage_name = "some stage"
|
91
|
+
acceptor.stage_name = stage_name
|
92
|
+
acceptor.add_transformer MockTransformer.new
|
93
|
+
|
94
|
+
acceptor.message.should be_nil
|
95
|
+
|
96
|
+
acceptor.start_filter_chain({})
|
97
|
+
|
98
|
+
acceptor.message.should == "error"
|
99
|
+
end
|
100
|
+
end
|
101
|
+
|
102
|
+
end
|
@@ -0,0 +1,58 @@
|
|
1
|
+
require File.join( File.dirname(__FILE__), "..", "spec_helper" )
|
2
|
+
|
3
|
+
describe Batsir::AMQP do
|
4
|
+
before :all do
|
5
|
+
class AMQPTest
|
6
|
+
include Batsir::AMQP
|
7
|
+
end
|
8
|
+
@test = AMQPTest.new
|
9
|
+
end
|
10
|
+
|
11
|
+
context 'with respect to default variables' do
|
12
|
+
it 'has a host' do
|
13
|
+
@test.host.should == 'localhost'
|
14
|
+
end
|
15
|
+
|
16
|
+
it 'has a port' do
|
17
|
+
@test.port.should == 5672
|
18
|
+
end
|
19
|
+
|
20
|
+
it 'has a username' do
|
21
|
+
@test.username.should == 'guest'
|
22
|
+
end
|
23
|
+
|
24
|
+
it 'has a password' do
|
25
|
+
@test.password.should == 'guest'
|
26
|
+
end
|
27
|
+
|
28
|
+
it 'has a vhost' do
|
29
|
+
@test.vhost.should == '/'
|
30
|
+
end
|
31
|
+
|
32
|
+
it 'has a exchange' do
|
33
|
+
@test.exchange.should == 'amq.direct'
|
34
|
+
end
|
35
|
+
|
36
|
+
it 'is durable' do
|
37
|
+
@test.durable.should == true
|
38
|
+
end
|
39
|
+
|
40
|
+
it 'is undead' do
|
41
|
+
@test.heartbeat.should == 0
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
context 'with respect to setting variables' do
|
46
|
+
it 'can change host' do
|
47
|
+
localhost = '127.0.0.1'
|
48
|
+
@test.host = localhost
|
49
|
+
@test.host.should == localhost
|
50
|
+
end
|
51
|
+
|
52
|
+
it 'can change heartbeat' do
|
53
|
+
hb = 512
|
54
|
+
@test.heartbeat = hb
|
55
|
+
@test.heartbeat.should == hb
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|