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.
Files changed (74) hide show
  1. checksums.yaml +4 -4
  2. data/.coveralls.yml +2 -0
  3. data/.rubocop.yml +26 -2
  4. data/.rubocop_todo.yml +15 -123
  5. data/.travis.yml +2 -1
  6. data/CHANGELOG.md +10 -1
  7. data/Gemfile +15 -6
  8. data/Rakefile +23 -12
  9. data/ci/reset_vhost +8 -3
  10. data/ci/travis_setup +0 -3
  11. data/features/.nav +6 -1
  12. data/features/CHANGELOG.md +10 -1
  13. data/features/amqp_specific_features/binding_amqp_destinations.feature +1 -0
  14. data/features/amqp_specific_features/declaring_amqp_exchanges.feature +1 -0
  15. data/features/amqp_specific_features/server_named_destinations.feature +1 -0
  16. data/features/destination_metadata.feature +26 -0
  17. data/features/logging.feature +1 -1
  18. data/features/middleware/middleware_basics.feature +91 -0
  19. data/features/middleware/middleware_ordering.feature +60 -0
  20. data/features/middleware/middleware_parameters.feature +43 -0
  21. data/features/middleware/middleware_with_blocks.feature +85 -0
  22. data/features/step_definitions/dynamic_destinations_steps.rb +1 -1
  23. data/features/step_definitions/message_consumers_steps.rb +5 -0
  24. data/features/step_definitions/middleware_steps.rb +10 -0
  25. data/features/step_definitions/steps.rb +10 -2
  26. data/features/support/env.rb +4 -3
  27. data/features/support/firewall_helper.rb +1 -1
  28. data/features/support/message_table_matcher.rb +3 -2
  29. data/features/support/no_error_matcher.rb +2 -2
  30. data/features/support/test_runner.rb +11 -57
  31. data/features/support/transforms.rb +12 -10
  32. data/lib/message_driver.rb +3 -1
  33. data/lib/message_driver/adapters/base.rb +11 -11
  34. data/lib/message_driver/adapters/bunny_adapter.rb +189 -132
  35. data/lib/message_driver/adapters/in_memory_adapter.rb +51 -34
  36. data/lib/message_driver/adapters/stomp_adapter.rb +22 -23
  37. data/lib/message_driver/broker.rb +21 -16
  38. data/lib/message_driver/client.rb +15 -16
  39. data/lib/message_driver/destination.rb +26 -8
  40. data/lib/message_driver/message.rb +5 -4
  41. data/lib/message_driver/middleware.rb +8 -0
  42. data/lib/message_driver/middleware/base.rb +19 -0
  43. data/lib/message_driver/middleware/block_middleware.rb +33 -0
  44. data/lib/message_driver/middleware/middleware_stack.rb +61 -0
  45. data/lib/message_driver/subscription.rb +2 -2
  46. data/lib/message_driver/version.rb +1 -1
  47. data/message-driver.gemspec +3 -4
  48. data/spec/integration/bunny/amqp_integration_spec.rb +21 -82
  49. data/spec/integration/bunny/bunny_adapter_spec.rb +288 -268
  50. data/spec/integration/in_memory/in_memory_adapter_spec.rb +93 -90
  51. data/spec/integration/stomp/stomp_adapter_spec.rb +126 -93
  52. data/spec/spec_helper.rb +11 -9
  53. data/spec/support/shared/adapter_examples.rb +1 -1
  54. data/spec/support/shared/client_ack_examples.rb +4 -4
  55. data/spec/support/shared/context_examples.rb +6 -4
  56. data/spec/support/shared/destination_examples.rb +54 -14
  57. data/spec/support/shared/subscription_examples.rb +33 -26
  58. data/spec/support/shared/transaction_examples.rb +12 -12
  59. data/spec/support/utils.rb +1 -1
  60. data/spec/units/message_driver/adapters/base_spec.rb +42 -40
  61. data/spec/units/message_driver/broker_spec.rb +38 -38
  62. data/spec/units/message_driver/client_spec.rb +87 -87
  63. data/spec/units/message_driver/destination_spec.rb +16 -11
  64. data/spec/units/message_driver/message_spec.rb +96 -70
  65. data/spec/units/message_driver/middleware/base_spec.rb +30 -0
  66. data/spec/units/message_driver/middleware/block_middleware_spec.rb +82 -0
  67. data/spec/units/message_driver/middleware/middleware_stack_spec.rb +165 -0
  68. data/spec/units/message_driver/subscription_spec.rb +18 -16
  69. data/test_lib/broker_config.rb +21 -5
  70. data/test_lib/coverage.rb +11 -0
  71. data/test_lib/provider/base.rb +59 -0
  72. data/test_lib/provider/in_memory.rb +6 -0
  73. data/test_lib/provider/rabbitmq.rb +67 -0
  74. metadata +46 -35
@@ -1,23 +1,25 @@
1
1
  require 'spec_helper'
2
2
 
3
- module MessageDriver::Subscription
4
- describe Base do
5
- let(:adapter) { double(MessageDriver::Adapters::Base) }
6
- let(:destination) { double(MessageDriver::Destination::Base) }
7
- let(:consumer) { double('a consumer') }
8
- subject(:subscription) { Base.new(adapter, destination, consumer) }
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
- it "sets it's adapter, destination and consumer on instansiation" do
11
- expect(subscription.adapter).to eq(adapter)
12
- expect(subscription.destination).to eq(destination)
13
- expect(subscription.consumer).to eq(consumer)
14
- end
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
- describe '#unsubscribe' do
17
- it 'raises an error' do
18
- expect {
19
- subscription.unsubscribe
20
- }.to raise_error('must be implemented in subclass')
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
@@ -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: 'message-driver-test',
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: 'message-driver-test',
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,11 @@
1
+ if ENV['CI']
2
+ require 'coveralls'
3
+ Coveralls.wear_merged! do
4
+ add_filter 'test_lib'
5
+ add_filter 'spec'
6
+ add_filter 'features'
7
+ add_filter 'ci'
8
+ add_filter 'examples'
9
+ command_name(ENV['COMMAND_NAME']) if ENV['COMMAND_NAME']
10
+ end
11
+ 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,6 @@
1
+ require_relative 'base'
2
+
3
+ class InMemoryProvider < BaseProvider
4
+ end
5
+
6
+ Provider = InMemoryProvider
@@ -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.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-07-03 00:00:00.000000000 Z
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: 2.14.0
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: 2.14.0
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
- - ".gitignore"
91
- - ".relish"
92
- - ".rspec"
93
- - ".rubocop.yml"
94
- - ".rubocop_todo.yml"
95
- - ".travis.yml"
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.2.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: