message-driver 0.4.0 → 0.5.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.coveralls.yml +2 -0
- data/.rubocop.yml +26 -2
- data/.rubocop_todo.yml +15 -123
- data/.travis.yml +2 -1
- data/CHANGELOG.md +10 -1
- data/Gemfile +15 -6
- data/Rakefile +23 -12
- data/ci/reset_vhost +8 -3
- data/ci/travis_setup +0 -3
- data/features/.nav +6 -1
- data/features/CHANGELOG.md +10 -1
- data/features/amqp_specific_features/binding_amqp_destinations.feature +1 -0
- data/features/amqp_specific_features/declaring_amqp_exchanges.feature +1 -0
- data/features/amqp_specific_features/server_named_destinations.feature +1 -0
- data/features/destination_metadata.feature +26 -0
- data/features/logging.feature +1 -1
- data/features/middleware/middleware_basics.feature +91 -0
- data/features/middleware/middleware_ordering.feature +60 -0
- data/features/middleware/middleware_parameters.feature +43 -0
- data/features/middleware/middleware_with_blocks.feature +85 -0
- data/features/step_definitions/dynamic_destinations_steps.rb +1 -1
- data/features/step_definitions/message_consumers_steps.rb +5 -0
- data/features/step_definitions/middleware_steps.rb +10 -0
- data/features/step_definitions/steps.rb +10 -2
- data/features/support/env.rb +4 -3
- data/features/support/firewall_helper.rb +1 -1
- data/features/support/message_table_matcher.rb +3 -2
- data/features/support/no_error_matcher.rb +2 -2
- data/features/support/test_runner.rb +11 -57
- data/features/support/transforms.rb +12 -10
- data/lib/message_driver.rb +3 -1
- data/lib/message_driver/adapters/base.rb +11 -11
- data/lib/message_driver/adapters/bunny_adapter.rb +189 -132
- data/lib/message_driver/adapters/in_memory_adapter.rb +51 -34
- data/lib/message_driver/adapters/stomp_adapter.rb +22 -23
- data/lib/message_driver/broker.rb +21 -16
- data/lib/message_driver/client.rb +15 -16
- data/lib/message_driver/destination.rb +26 -8
- data/lib/message_driver/message.rb +5 -4
- data/lib/message_driver/middleware.rb +8 -0
- data/lib/message_driver/middleware/base.rb +19 -0
- data/lib/message_driver/middleware/block_middleware.rb +33 -0
- data/lib/message_driver/middleware/middleware_stack.rb +61 -0
- data/lib/message_driver/subscription.rb +2 -2
- data/lib/message_driver/version.rb +1 -1
- data/message-driver.gemspec +3 -4
- data/spec/integration/bunny/amqp_integration_spec.rb +21 -82
- data/spec/integration/bunny/bunny_adapter_spec.rb +288 -268
- data/spec/integration/in_memory/in_memory_adapter_spec.rb +93 -90
- data/spec/integration/stomp/stomp_adapter_spec.rb +126 -93
- data/spec/spec_helper.rb +11 -9
- data/spec/support/shared/adapter_examples.rb +1 -1
- data/spec/support/shared/client_ack_examples.rb +4 -4
- data/spec/support/shared/context_examples.rb +6 -4
- data/spec/support/shared/destination_examples.rb +54 -14
- data/spec/support/shared/subscription_examples.rb +33 -26
- data/spec/support/shared/transaction_examples.rb +12 -12
- data/spec/support/utils.rb +1 -1
- data/spec/units/message_driver/adapters/base_spec.rb +42 -40
- data/spec/units/message_driver/broker_spec.rb +38 -38
- data/spec/units/message_driver/client_spec.rb +87 -87
- data/spec/units/message_driver/destination_spec.rb +16 -11
- data/spec/units/message_driver/message_spec.rb +96 -70
- data/spec/units/message_driver/middleware/base_spec.rb +30 -0
- data/spec/units/message_driver/middleware/block_middleware_spec.rb +82 -0
- data/spec/units/message_driver/middleware/middleware_stack_spec.rb +165 -0
- data/spec/units/message_driver/subscription_spec.rb +18 -16
- data/test_lib/broker_config.rb +21 -5
- data/test_lib/coverage.rb +11 -0
- data/test_lib/provider/base.rb +59 -0
- data/test_lib/provider/in_memory.rb +6 -0
- data/test_lib/provider/rabbitmq.rb +67 -0
- metadata +46 -35
@@ -1,23 +1,25 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
|
-
module MessageDriver
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
3
|
+
module MessageDriver
|
4
|
+
module Subscription
|
5
|
+
RSpec.describe Base do
|
6
|
+
let(:adapter) { double(MessageDriver::Adapters::Base) }
|
7
|
+
let(:destination) { double(MessageDriver::Destination::Base) }
|
8
|
+
let(:consumer) { double('a consumer') }
|
9
|
+
subject(:subscription) { Base.new(adapter, destination, consumer) }
|
9
10
|
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
11
|
+
it "sets it's adapter, destination and consumer on instansiation" do
|
12
|
+
expect(subscription.adapter).to eq(adapter)
|
13
|
+
expect(subscription.destination).to eq(destination)
|
14
|
+
expect(subscription.consumer).to eq(consumer)
|
15
|
+
end
|
15
16
|
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
17
|
+
describe '#unsubscribe' do
|
18
|
+
it 'raises an error' do
|
19
|
+
expect do
|
20
|
+
subscription.unsubscribe
|
21
|
+
end.to raise_error('must be implemented in subclass')
|
22
|
+
end
|
21
23
|
end
|
22
24
|
end
|
23
25
|
end
|
data/test_lib/broker_config.rb
CHANGED
@@ -3,28 +3,44 @@ class BrokerConfig
|
|
3
3
|
def config
|
4
4
|
adapter_file = File.expand_path('../../.adapter_under_test', __FILE__)
|
5
5
|
@adapter, @version = (ENV['ADAPTER'] || (File.exist?(adapter_file) ? File.read(adapter_file).chomp : '')).split(':')
|
6
|
+
vhost = ENV['VHOST'] || 'message-driver-test'
|
6
7
|
case @adapter
|
7
8
|
when 'bunny'
|
8
9
|
{
|
9
10
|
adapter: :bunny,
|
10
|
-
vhost:
|
11
|
+
vhost: vhost,
|
11
12
|
continuation_timeout: 10000
|
12
13
|
}
|
13
14
|
when 'in_memory'
|
14
|
-
{adapter: :in_memory}
|
15
|
+
{ adapter: :in_memory }
|
15
16
|
when 'stomp'
|
16
17
|
{
|
17
18
|
adapter: :stomp,
|
18
|
-
vhost:
|
19
|
-
hosts: [{host: 'localhost', login: 'guest', passcode: 'guest'}],
|
19
|
+
vhost: vhost,
|
20
|
+
hosts: [{ host: 'localhost', login: 'guest', passcode: 'guest' }],
|
20
21
|
reliable: false,
|
21
22
|
max_reconnect_attempts: 1
|
22
23
|
}
|
23
24
|
else
|
24
|
-
{adapter: :in_memory}
|
25
|
+
{ adapter: :in_memory }
|
25
26
|
end
|
26
27
|
end
|
27
28
|
|
29
|
+
def provider
|
30
|
+
case current_adapter
|
31
|
+
when :bunny, :stomp
|
32
|
+
:rabbitmq
|
33
|
+
when :in_memory
|
34
|
+
:in_memory
|
35
|
+
else
|
36
|
+
current_adapter
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
def setup_provider
|
41
|
+
require_relative "provider/#{provider}"
|
42
|
+
end
|
43
|
+
|
28
44
|
def all_adapters
|
29
45
|
%w(in_memory bunny stomp)
|
30
46
|
end
|
@@ -0,0 +1,59 @@
|
|
1
|
+
class BaseProvider
|
2
|
+
attr_accessor :broker_name, :read_queues_directly
|
3
|
+
|
4
|
+
def initialize
|
5
|
+
@read_queues_directly = false
|
6
|
+
end
|
7
|
+
|
8
|
+
def broker_name
|
9
|
+
@broker_name ||= MessageDriver::Broker::DEFAULT_BROKER_NAME
|
10
|
+
end
|
11
|
+
|
12
|
+
def pause_if_needed(seconds = 0.1)
|
13
|
+
seconds *= 10 if ENV['CI'] == 'true'
|
14
|
+
case BrokerConfig.current_adapter
|
15
|
+
when :in_memory
|
16
|
+
else
|
17
|
+
sleep seconds
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
def fetch_messages(destination_name, _opts = {})
|
22
|
+
destination = fetch_destination(destination_name)
|
23
|
+
pause_if_needed
|
24
|
+
result = []
|
25
|
+
loop do
|
26
|
+
msg = destination.pop_message
|
27
|
+
if msg.nil?
|
28
|
+
break
|
29
|
+
else
|
30
|
+
result << msg
|
31
|
+
end
|
32
|
+
end
|
33
|
+
result
|
34
|
+
end
|
35
|
+
|
36
|
+
def purge_destination(destination_name, _opts = {})
|
37
|
+
destination = fetch_destination(destination_name)
|
38
|
+
if destination.respond_to? :purge
|
39
|
+
destination.purge
|
40
|
+
else
|
41
|
+
fetch_messages(destination)
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
def fetch_destination(destination)
|
46
|
+
case destination
|
47
|
+
when String, Symbol
|
48
|
+
MessageDriver::Client[broker_name].find_destination(destination)
|
49
|
+
when MessageDriver::Destination::Base
|
50
|
+
destination
|
51
|
+
else
|
52
|
+
fail "didn't understand destination #{destination.inspect}"
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
def fetch_current_adapter_context
|
57
|
+
MessageDriver::Client[broker_name].current_adapter_context
|
58
|
+
end
|
59
|
+
end
|
@@ -0,0 +1,67 @@
|
|
1
|
+
require_relative 'base'
|
2
|
+
require 'rabbitmq/http/client'
|
3
|
+
|
4
|
+
class RabbitmqProvider < BaseProvider
|
5
|
+
class Context
|
6
|
+
def self.supports_client_acks?
|
7
|
+
false
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
def fetch_messages(destination_name, opts = {})
|
12
|
+
if read_queues_directly
|
13
|
+
super
|
14
|
+
else
|
15
|
+
destination = fetch_destination(destination_name)
|
16
|
+
pause_if_needed
|
17
|
+
result = []
|
18
|
+
loop do
|
19
|
+
msgs = rabbitmq.get_messages(vhost, destination.name, { count: 10, requeue: false, encoding: 'auto' }.merge(opts))
|
20
|
+
msgs.each do |msg|
|
21
|
+
if msg.nil?
|
22
|
+
break
|
23
|
+
else
|
24
|
+
result << build_message(msg)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
break if msgs.nil? || msgs.empty?
|
28
|
+
end
|
29
|
+
result
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
def purge_destination(destination_name, opts = {})
|
34
|
+
not_exists_ok = opts.fetch(:not_exists_ok, true)
|
35
|
+
if read_queues_directly
|
36
|
+
super
|
37
|
+
else
|
38
|
+
destination = fetch_destination(destination_name)
|
39
|
+
begin
|
40
|
+
rabbitmq.purge_queue(vhost, destination.name)
|
41
|
+
rescue Faraday::ResourceNotFound
|
42
|
+
raise unless not_exists_ok
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
private
|
48
|
+
|
49
|
+
def build_message(data)
|
50
|
+
props = data.properties.dup
|
51
|
+
headers = props.delete(:headers)
|
52
|
+
MessageDriver::Message::Base.new(Context, data.payload, headers, props)
|
53
|
+
end
|
54
|
+
|
55
|
+
def vhost
|
56
|
+
@vhost ||= BrokerConfig.config[:vhost]
|
57
|
+
end
|
58
|
+
|
59
|
+
def rabbitmq
|
60
|
+
@rabbitmq ||= begin
|
61
|
+
endpoint = 'http://127.0.0.1:15672'
|
62
|
+
RabbitMQ::HTTP::Client.new(endpoint, username: 'guest', password: 'guest')
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
Provider = RabbitmqProvider
|
metadata
CHANGED
@@ -1,83 +1,69 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: message-driver
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.5.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Matt Campbell
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-
|
11
|
+
date: 2014-09-17 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rake
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- -
|
17
|
+
- - ! '>='
|
18
18
|
- !ruby/object:Gem::Version
|
19
19
|
version: '0'
|
20
20
|
type: :development
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
|
-
- -
|
24
|
+
- - ! '>='
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: '0'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: rspec
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
|
-
- -
|
31
|
+
- - ~>
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version:
|
33
|
+
version: 3.1.0
|
34
34
|
type: :development
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
|
-
- -
|
38
|
+
- - ~>
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version:
|
40
|
+
version: 3.1.0
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: cucumber
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
|
-
- -
|
45
|
+
- - ! '>='
|
46
46
|
- !ruby/object:Gem::Version
|
47
47
|
version: '0'
|
48
48
|
type: :development
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
|
-
- -
|
52
|
+
- - ! '>='
|
53
53
|
- !ruby/object:Gem::Version
|
54
54
|
version: '0'
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
56
|
name: aruba
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
58
58
|
requirements:
|
59
|
-
- -
|
59
|
+
- - ! '>='
|
60
60
|
- !ruby/object:Gem::Version
|
61
61
|
version: '0'
|
62
62
|
type: :development
|
63
63
|
prerelease: false
|
64
64
|
version_requirements: !ruby/object:Gem::Requirement
|
65
65
|
requirements:
|
66
|
-
- -
|
67
|
-
- !ruby/object:Gem::Version
|
68
|
-
version: '0'
|
69
|
-
- !ruby/object:Gem::Dependency
|
70
|
-
name: rubocop
|
71
|
-
requirement: !ruby/object:Gem::Requirement
|
72
|
-
requirements:
|
73
|
-
- - ">="
|
74
|
-
- !ruby/object:Gem::Version
|
75
|
-
version: '0'
|
76
|
-
type: :development
|
77
|
-
prerelease: false
|
78
|
-
version_requirements: !ruby/object:Gem::Requirement
|
79
|
-
requirements:
|
80
|
-
- - ">="
|
66
|
+
- - ! '>='
|
81
67
|
- !ruby/object:Gem::Version
|
82
68
|
version: '0'
|
83
69
|
description: Easy message queues for ruby using AMQ, STOMP and others
|
@@ -87,12 +73,13 @@ executables: []
|
|
87
73
|
extensions: []
|
88
74
|
extra_rdoc_files: []
|
89
75
|
files:
|
90
|
-
-
|
91
|
-
-
|
92
|
-
-
|
93
|
-
-
|
94
|
-
-
|
95
|
-
-
|
76
|
+
- .coveralls.yml
|
77
|
+
- .gitignore
|
78
|
+
- .relish
|
79
|
+
- .rspec
|
80
|
+
- .rubocop.yml
|
81
|
+
- .rubocop_todo.yml
|
82
|
+
- .travis.yml
|
96
83
|
- CHANGELOG.md
|
97
84
|
- Gemfile
|
98
85
|
- Guardfile
|
@@ -128,6 +115,10 @@ files:
|
|
128
115
|
- features/message_consumers/prefetch_size.feature
|
129
116
|
- features/message_consumers/subscribe_with_a_block.feature
|
130
117
|
- features/message_consumers/transactional_ack_consumers.feature
|
118
|
+
- features/middleware/middleware_basics.feature
|
119
|
+
- features/middleware/middleware_ordering.feature
|
120
|
+
- features/middleware/middleware_parameters.feature
|
121
|
+
- features/middleware/middleware_with_blocks.feature
|
131
122
|
- features/publishing_a_message.feature
|
132
123
|
- features/publishing_with_transactions.feature
|
133
124
|
- features/rabbitmq_specific_features/dead_letter_queueing.feature
|
@@ -136,6 +127,7 @@ files:
|
|
136
127
|
- features/step_definitions/error_handling_steps.rb
|
137
128
|
- features/step_definitions/logging_steps.rb
|
138
129
|
- features/step_definitions/message_consumers_steps.rb
|
130
|
+
- features/step_definitions/middleware_steps.rb
|
139
131
|
- features/step_definitions/rabbitmq_specific_steps.rb
|
140
132
|
- features/step_definitions/steps.rb
|
141
133
|
- features/support/broker_config_helper.rb
|
@@ -157,6 +149,10 @@ files:
|
|
157
149
|
- lib/message_driver/errors.rb
|
158
150
|
- lib/message_driver/logging.rb
|
159
151
|
- lib/message_driver/message.rb
|
152
|
+
- lib/message_driver/middleware.rb
|
153
|
+
- lib/message_driver/middleware/base.rb
|
154
|
+
- lib/message_driver/middleware/block_middleware.rb
|
155
|
+
- lib/message_driver/middleware/middleware_stack.rb
|
160
156
|
- lib/message_driver/subscription.rb
|
161
157
|
- lib/message_driver/version.rb
|
162
158
|
- lib/vendor/.document
|
@@ -180,8 +176,15 @@ files:
|
|
180
176
|
- spec/units/message_driver/client_spec.rb
|
181
177
|
- spec/units/message_driver/destination_spec.rb
|
182
178
|
- spec/units/message_driver/message_spec.rb
|
179
|
+
- spec/units/message_driver/middleware/base_spec.rb
|
180
|
+
- spec/units/message_driver/middleware/block_middleware_spec.rb
|
181
|
+
- spec/units/message_driver/middleware/middleware_stack_spec.rb
|
183
182
|
- spec/units/message_driver/subscription_spec.rb
|
184
183
|
- test_lib/broker_config.rb
|
184
|
+
- test_lib/coverage.rb
|
185
|
+
- test_lib/provider/base.rb
|
186
|
+
- test_lib/provider/in_memory.rb
|
187
|
+
- test_lib/provider/rabbitmq.rb
|
185
188
|
homepage: https://github.com/message-driver/message-driver
|
186
189
|
licenses:
|
187
190
|
- MIT
|
@@ -192,17 +195,17 @@ require_paths:
|
|
192
195
|
- lib
|
193
196
|
required_ruby_version: !ruby/object:Gem::Requirement
|
194
197
|
requirements:
|
195
|
-
- -
|
198
|
+
- - ! '>='
|
196
199
|
- !ruby/object:Gem::Version
|
197
200
|
version: 1.9.2
|
198
201
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
199
202
|
requirements:
|
200
|
-
- -
|
203
|
+
- - ! '>='
|
201
204
|
- !ruby/object:Gem::Version
|
202
205
|
version: '0'
|
203
206
|
requirements: []
|
204
207
|
rubyforge_project:
|
205
|
-
rubygems_version: 2.
|
208
|
+
rubygems_version: 2.3.0
|
206
209
|
signing_key:
|
207
210
|
specification_version: 4
|
208
211
|
summary: Easy message queues for ruby
|
@@ -230,6 +233,10 @@ test_files:
|
|
230
233
|
- features/message_consumers/prefetch_size.feature
|
231
234
|
- features/message_consumers/subscribe_with_a_block.feature
|
232
235
|
- features/message_consumers/transactional_ack_consumers.feature
|
236
|
+
- features/middleware/middleware_basics.feature
|
237
|
+
- features/middleware/middleware_ordering.feature
|
238
|
+
- features/middleware/middleware_parameters.feature
|
239
|
+
- features/middleware/middleware_with_blocks.feature
|
233
240
|
- features/publishing_a_message.feature
|
234
241
|
- features/publishing_with_transactions.feature
|
235
242
|
- features/rabbitmq_specific_features/dead_letter_queueing.feature
|
@@ -238,6 +245,7 @@ test_files:
|
|
238
245
|
- features/step_definitions/error_handling_steps.rb
|
239
246
|
- features/step_definitions/logging_steps.rb
|
240
247
|
- features/step_definitions/message_consumers_steps.rb
|
248
|
+
- features/step_definitions/middleware_steps.rb
|
241
249
|
- features/step_definitions/rabbitmq_specific_steps.rb
|
242
250
|
- features/step_definitions/steps.rb
|
243
251
|
- features/support/broker_config_helper.rb
|
@@ -264,5 +272,8 @@ test_files:
|
|
264
272
|
- spec/units/message_driver/client_spec.rb
|
265
273
|
- spec/units/message_driver/destination_spec.rb
|
266
274
|
- spec/units/message_driver/message_spec.rb
|
275
|
+
- spec/units/message_driver/middleware/base_spec.rb
|
276
|
+
- spec/units/message_driver/middleware/block_middleware_spec.rb
|
277
|
+
- spec/units/message_driver/middleware/middleware_stack_spec.rb
|
267
278
|
- spec/units/message_driver/subscription_spec.rb
|
268
279
|
has_rdoc:
|