message-driver 0.4.0 → 0.5.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.
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: