dispatch-rider 1.4.2 → 1.5.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 9b32920c369aed2de065140f1cc20e1439b3f056
4
- data.tar.gz: 97ba8bb2ae852f9866fc2f3ad04e2f9875185846
3
+ metadata.gz: cd0df54c12c9db39c3d7cc94a431d14a86994daa
4
+ data.tar.gz: 40c1ca9b9982d6cb202b724eda42b0f430fcd108
5
5
  SHA512:
6
- metadata.gz: 8ca1417742a7976a1587aeb0e1a2d0fa9d8d2d2e913657313fc01e9fc4f0104b0406b331103f140fed89f53fd53bdc37349fec5a8223cf587fe1f1ee12c965ee
7
- data.tar.gz: a700595da036062545ff6bbd8fa69232b0ad12c993af8d8182e2a0f2367df96caff88159c5078ee6ab9e5a7bde3e76f8c507176f9021170bdadd79669615cc7e
6
+ metadata.gz: ebc1faf7121b11019786f8ecc66adad1ddf9585d75b13d7157184666a44c2c0551e05214dfcdd74bc17ca109cf29c66036472c445044237178d477bd21882ee8
7
+ data.tar.gz: f1b046bc24dbea3b25306e79ff2dab8a04147e34c26110e7dd7d8e249be2e5b1dab12d09633688f861f2b2d932999506a3349a52e3d4831c9a7ae4cdb49855ec
@@ -1,6 +1,5 @@
1
1
  language: ruby
2
2
  rvm:
3
- - "2.0.0"
4
3
  - "2.1.5"
5
4
  - "2.2.1"
6
5
  script: "bundle exec rspec"
@@ -1,5 +1,17 @@
1
1
  # Change Log
2
2
 
3
+ ## [v1.4.2](https://github.com/payrollhero/dispatch-rider/tree/v1.4.2) (2015-04-10)
4
+
5
+ [Full Changelog](https://github.com/payrollhero/dispatch-rider/compare/v1.4.1...v1.4.2)
6
+
7
+ **Closed issues:**
8
+
9
+ - Convert away from jeweler [\#54](https://github.com/payrollhero/dispatch-rider/issues/54)
10
+
11
+ **Merged pull requests:**
12
+
13
+ - Switched away from jeweler [\#55](https://github.com/payrollhero/dispatch-rider/pull/55) ([piotrb](https://github.com/piotrb))
14
+
3
15
  ## [v1.4.1](https://github.com/payrollhero/dispatch-rider/tree/v1.4.1) (2015-04-10)
4
16
 
5
17
  [Full Changelog](https://github.com/payrollhero/dispatch-rider/compare/v1.4.0...v1.4.1)
data/Gemfile CHANGED
@@ -14,8 +14,8 @@ gem 'github_changelog_generator'
14
14
  gem 'yard'
15
15
 
16
16
  # Testing
17
- gem "rspec", "~> 2.0"
18
- gem 'rspec-its', "~> 1.0"
17
+ gem "rspec", "~> 3.0"
18
+ gem 'rspec-its'
19
19
 
20
20
  # CI
21
21
  gem "travis-lint"
data/README.md CHANGED
@@ -230,16 +230,114 @@ Options:
230
230
 
231
231
  ### Callbacks
232
232
 
233
- Dispatch rider supports injecting callbacks in a few parts of the
234
- lifecycle of the process.
233
+ Dispatch rider supports injecting callbacks in a few parts of the lifecycle of the process. Each
234
+ callback can have hooks plugged into it at `before`, `after` and `around` the execution.
235
235
 
236
+ #### On initialize `:initialize`
237
+
238
+ This callback is called when the runner is being initialized.
239
+
240
+ Block Arguments:
241
+
242
+ * _None_
243
+
244
+
245
+ ```ruby
246
+ DispatchRider.config do |config|
247
+ config.before(:initialize) do
248
+ # your code here
249
+ end
250
+
251
+ config.around(:initialize) do |job|
252
+ # your code here
253
+ job.call
254
+ # your code here
255
+ end
256
+
257
+ config.after(:initialize) do
258
+ # your code here
259
+ end
260
+ end
261
+ ```
262
+
263
+ #### On publish `:publish`
264
+
265
+ This callback is called when the message is being published.
266
+
267
+ Block Arguments:
268
+
269
+ * message: `[DispatchRider::Message]` -- message that is about to be sent
270
+ * destinations: `[Array<Symbol>]` -- list of destinations to sent to
271
+
272
+ ```ruby
273
+ DispatchRider.config do |config|
274
+ config.before(:publish) do |message:, destinations:|
275
+ # your code here
276
+ end
277
+
278
+ config.around(:publish) do |job, message:, destinations:|
279
+ # your code here
280
+ job.call
281
+ # your code here
282
+ end
283
+
284
+ config.after(:publish) do |message:, destinations:|
285
+ # your code here
286
+ end
287
+ end
236
288
  ```
237
- :initialize - when the runner is being initialized
238
- :process - when the runner is running its event loop
239
- :dispatch_message - around the execution of a single message (the block is passed the job )
289
+
290
+ #### On process `:process`
291
+
292
+ This callback is called when the runner is running its event loop.
293
+
294
+ Block Arguments:
295
+
296
+ * _None_
297
+
298
+ ```ruby
299
+ DispatchRider.config do |config|
300
+ config.before(:process) do
301
+ # your code here
302
+ end
303
+
304
+ config.around(:process) do |job|
305
+ # your code here
306
+ job.call
307
+ # your code here
308
+ end
309
+
310
+ config.after(:process) do
311
+ # your code here
312
+ end
313
+ end
240
314
  ```
241
315
 
242
- Each callback can have hooks plugged into it at `before`, `after` and `around` the execution.
316
+ #### On dispatch message `:dispatch_message`
317
+
318
+ This callback is called when executing a single message.
319
+
320
+ Block Arguments:
321
+
322
+ * message `[DispatchRider::Message]` -- the message received from `DispatchRider` queue
323
+
324
+ ```ruby
325
+ DispatchRider.config do |config|
326
+ config.before(:dispatch_message) do |message|
327
+ # your code here
328
+ end
329
+
330
+ config.around(:dispatch_message) do |job, message|
331
+ # your code here
332
+ job.call
333
+ # your code here
334
+ end
335
+
336
+ config.after(:dispatch_message) do |message|
337
+ # your code here
338
+ end
339
+ end
340
+ ```
243
341
 
244
342
  ### Manual Setup
245
343
 
@@ -364,14 +462,14 @@ somewhere in your shell init. (ie .zshrc or simillar)
364
462
  ```bash
365
463
  vim lib/dispatch-rider/version.rb
366
464
  # set the new version
367
- rake gemspec
368
- # commit any changed files (should be only version and the gemspec)
465
+ # commit the changed version file
369
466
  # name your commit with the version number eg: "1.8.0"
370
467
  rake release
371
468
  # to push the gem to rubygems.org
372
469
  rake changelog
373
470
  # commit the changed changelog
374
471
  # name your commit with the version again eg: "changelog for 1.8.0"
472
+ git push
375
473
  ```
376
474
 
377
475
  ## Contributing
@@ -39,8 +39,8 @@ Gem::Specification.new do |gem|
39
39
  gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
40
40
  gem.require_paths = ['lib']
41
41
 
42
- gem.add_runtime_dependency('activesupport', ">= 0")
43
- gem.add_runtime_dependency('activemodel', ">= 0")
44
- gem.add_runtime_dependency('daemons', ">= 0")
45
- gem.add_runtime_dependency('retries', ">= 0")
42
+ gem.add_runtime_dependency 'activesupport', "~> 4", ">= 3.2.0"
43
+ gem.add_runtime_dependency 'activemodel', "~> 4", ">= 3.2.0"
44
+ gem.add_runtime_dependency 'daemons', "~> 1.2"
45
+ gem.add_runtime_dependency 'retries', "~> 0.0", ">= 0.0.5"
46
46
  end
@@ -5,3 +5,4 @@ end
5
5
 
6
6
  require 'dispatch-rider/callbacks/access'
7
7
  require 'dispatch-rider/callbacks/storage'
8
+ require 'dispatch-rider/callbacks/support'
@@ -1,5 +1,6 @@
1
1
  module DispatchRider
2
2
  module Callbacks
3
+ # Provides access for invoking callbacks.
3
4
  class Access
4
5
  attr_reader :callbacks
5
6
 
@@ -7,15 +8,18 @@ module DispatchRider
7
8
  @callbacks = callbacks
8
9
  end
9
10
 
11
+ # Executes the passed block wrapped in the event's callbacks.
12
+ # @param [Symbol] event
13
+ # @param [Array] args
14
+ # @param [Proc] block
10
15
  def invoke(event, *args, &block)
11
- action_proc = block
16
+ stack_of_callbacks = callbacks.for(event).reverse
12
17
 
13
- callbacks.for(event).reverse.each do |filter_block|
14
- current_action = action_proc
15
- action_proc = proc { filter_block.call(current_action, *args) }
16
- end
18
+ block_with_callbacks = stack_of_callbacks.reduce(block) { |inner_block, outer_block|
19
+ -> { outer_block.call(inner_block, *args) }
20
+ }
17
21
 
18
- action_proc.call
22
+ block_with_callbacks.call
19
23
  end
20
24
 
21
25
  end
@@ -1,11 +1,15 @@
1
1
  module DispatchRider
2
2
  module Callbacks
3
+ # Storage for callbacks.
3
4
  class Storage
4
5
 
5
6
  def initialize
6
- @callbacks = {}
7
+ @callbacks = Hash.new { |storage, key| storage[key] = [] }
7
8
  end
8
9
 
10
+ # @param [Symbol] event name of the event
11
+ # @param [#call] block_param block passed as a parameter
12
+ # @param [Proc] &block
9
13
  def before(event, block_param = nil, &block)
10
14
  around(event) do |job, *args|
11
15
  (block_param || block).call(*args)
@@ -13,6 +17,9 @@ module DispatchRider
13
17
  end
14
18
  end
15
19
 
20
+ # @param [Symbol] event name of the event
21
+ # @param [#call] block_param block passed as a parameter
22
+ # @param [Proc] &block
16
23
  def after(event, block_param = nil, &block)
17
24
  around(event) do |job, *args|
18
25
  begin
@@ -23,13 +30,16 @@ module DispatchRider
23
30
  end
24
31
  end
25
32
 
33
+ # @param [Symbol] event name of the event
34
+ # @param [#call] block_param block passed as a parameter
35
+ # @param [Proc] &block
26
36
  def around(event, block_param = nil, &block)
27
- @callbacks[event] ||= []
28
37
  @callbacks[event] << (block_param || block)
29
38
  end
30
39
 
40
+ # @param [Symbol] event name of the event
31
41
  def for(event)
32
- @callbacks[event] || []
42
+ @callbacks[event]
33
43
  end
34
44
 
35
45
  end
@@ -0,0 +1,14 @@
1
+ module DispatchRider
2
+ module Callbacks
3
+ # Adds callback support to an object.
4
+ module Support
5
+
6
+ private
7
+
8
+ def callbacks
9
+ @callbacks ||= Callbacks::Access.new DispatchRider.config.callbacks
10
+ end
11
+
12
+ end
13
+ end
14
+ end
@@ -9,6 +9,8 @@ module DispatchRider
9
9
  class Dispatcher
10
10
  extend Forwardable
11
11
 
12
+ include Callbacks::Support
13
+
12
14
  attr_reader :handler_registrar
13
15
 
14
16
  def_delegators :handler_registrar, :register, :fetch, :unregister
@@ -24,15 +26,6 @@ module DispatchRider
24
26
  true # success => true (delete message)
25
27
  end
26
28
 
27
- private
28
-
29
- def config
30
- DispatchRider.config
31
- end
32
-
33
- def callbacks
34
- @callbacks ||= Callbacks::Access.new(config.callbacks)
35
- end
36
29
 
37
30
  end
38
31
  end
@@ -18,11 +18,11 @@ module DispatchRider
18
18
  end
19
19
 
20
20
  def attributes
21
- {:subject => subject, :body => body}
21
+ { subject: subject, body: body }
22
22
  end
23
23
 
24
- def to_json
25
- attributes.to_json
24
+ def as_json(*)
25
+ attributes
26
26
  end
27
27
 
28
28
  def ==(other)
@@ -30,7 +30,7 @@ module DispatchRider
30
30
 
31
31
  def publish(options)
32
32
  channels(options[:to]).each do |channel|
33
- channel.publish(serialize(message(options[:message])))
33
+ channel.publish(serialize(options[:message]))
34
34
  end
35
35
  end
36
36
 
@@ -42,16 +42,8 @@ module DispatchRider
42
42
  raise NotImplementedError
43
43
  end
44
44
 
45
- def message_builder
46
- DispatchRider::Message
47
- end
48
-
49
45
  private
50
46
 
51
- def message(attrs)
52
- message_builder.new(attrs)
53
- end
54
-
55
47
  def serialize(item)
56
48
  item.to_json
57
49
  end
@@ -1,11 +1,13 @@
1
1
  require "active_support/core_ext/hash/indifferent_access"
2
2
  require_relative "publisher/configuration_support"
3
3
 
4
- # This class takes care of the publishing side of the messaging system.
5
4
  module DispatchRider
5
+ # This class takes care of the publishing side of the messaging system.
6
6
  class Publisher
7
7
  extend ConfigurationSupport
8
8
 
9
+ include Callbacks::Support
10
+
9
11
  attr_reader :service_channel_mapper, :notification_service_registrar, :publishing_destination_registrar, :sns_channel_registrar
10
12
 
11
13
  def initialize(configuration = self.class.configuration)
@@ -33,18 +35,27 @@ module DispatchRider
33
35
  self
34
36
  end
35
37
 
36
- def publish(opts = {})
37
- options = opts.dup
38
- add_message_id(options[:message])
39
- service_channel_mapper.map(options.delete(:destinations)).each do |(service, channels)|
40
- notification_service_registrar.fetch(service).publish(options.merge(:to => channels))
38
+ # @param [Hash] original_options should contain `:destinations` and `:message` keys
39
+ def publish(original_options = {})
40
+ options = build_publish_options(original_options)
41
+
42
+ callbacks.invoke(:publish, options) do
43
+ service_channel_mapper.map(options.delete(:destinations)).each do |(service, channels)|
44
+ notification_service_registrar.fetch(service).publish(options.merge to: channels)
45
+ end
41
46
  end
42
47
  end
43
48
 
44
49
  private
45
50
 
46
- def add_message_id(message)
47
- message[:body][:guid] = generate_new_message_id
51
+ def build_publish_options(message:, destinations:)
52
+ { message: build_message(message), destinations: destinations }
53
+ end
54
+
55
+ def build_message(attributes)
56
+ DispatchRider::Message.new(attributes).tap do |message|
57
+ message.body[:guid] = generate_new_message_id
58
+ end
48
59
  end
49
60
 
50
61
  def generate_new_message_id
@@ -1,37 +1,41 @@
1
1
  require 'securerandom'
2
2
 
3
3
  module DispatchRider
4
+ # Main template for a dispatch rider publisher.
4
5
  class Publisher::Base
5
-
6
6
  class << self
7
-
7
+ # @param [Symbol] subject
8
8
  def subject(subject)
9
9
  @subject = subject
10
10
  end
11
11
 
12
+ # @param [Array<Symbol>, Symbol] destinations
12
13
  def destinations(destinations)
13
14
  @destinations = Array(destinations)
14
15
  end
15
16
 
17
+ # @return [DispatchRider::Publisher]
16
18
  def default_publisher
17
19
  @@default_publisher ||= DispatchRider::Publisher.new
18
20
  end
19
21
 
20
22
  def publish(*args, &block)
21
- raise NotImplementedError
23
+ raise NotImplementedError, "subclass of DispatchRider::Publisher::Base must implement .publish"
22
24
  end
23
-
24
25
  end
25
26
 
26
27
  def initialize(publisher = nil)
27
28
  @publisher = publisher
28
29
  end
29
30
 
31
+ # @param [Hash] body
30
32
  def publish(body)
31
33
  raise ArgumentError, 'body should be a hash' unless body.kind_of?(Hash)
32
34
  publisher.publish(destinations: destinations, message: { subject: subject, body: body })
33
35
  end
34
36
 
37
+ private
38
+
35
39
  def publisher
36
40
  @publisher || self.class.default_publisher
37
41
  end
@@ -43,6 +47,5 @@ module DispatchRider
43
47
  def subject
44
48
  self.class.instance_variable_get(:@subject)
45
49
  end
46
-
47
50
  end
48
51
  end
@@ -1,5 +1,6 @@
1
1
  module DispatchRider
2
2
  class Runner
3
+ include Callbacks::Support
3
4
 
4
5
  def self.run
5
6
  new.process
@@ -22,17 +23,8 @@ module DispatchRider
22
23
 
23
24
  private
24
25
 
25
- def config
26
- DispatchRider.config
27
- end
28
-
29
- def callbacks
30
- @callbacks ||= Callbacks::Access.new(config.callbacks)
31
- end
32
-
33
- def logger
34
- config.logger
35
- end
26
+ delegate :config, to: :DispatchRider
27
+ delegate :logger, to: :config
36
28
 
37
29
  def ready
38
30
  logger.info "Creating subscriber..."
@@ -1,4 +1,4 @@
1
1
  # This file specifies the current version of the gem.
2
2
  module DispatchRider
3
- VERSION = "1.4.2"
3
+ VERSION = "1.5.0"
4
4
  end
@@ -6,29 +6,29 @@ describe DispatchRider::Configuration do
6
6
 
7
7
  describe "defaults" do
8
8
  example do
9
- subject.handler_path.should =~ /\/app\/handlers/
10
- subject.error_handler.should == DispatchRider::DefaultErrorHandler
11
- subject.queue_kind.should == :file_system
12
- subject.queue_info.should == { path: "tmp/dispatch-rider-queue" }
13
- subject.subscriber.should == DispatchRider::Subscriber
9
+ expect(subject.handler_path).to match_regex(/\/app\/handlers/)
10
+ expect(subject.error_handler).to eq DispatchRider::DefaultErrorHandler
11
+ expect(subject.queue_kind).to eq :file_system
12
+ expect(subject.queue_info).to eq({ path: "tmp/dispatch-rider-queue" })
13
+ expect(subject.subscriber).to eq DispatchRider::Subscriber
14
14
  end
15
15
  end
16
16
 
17
17
  describe "#before" do
18
18
  example do
19
- subject.should respond_to(:before)
19
+ expect(subject).to respond_to :before
20
20
  end
21
21
  end
22
22
 
23
23
  describe "#after" do
24
24
  example do
25
- subject.should respond_to(:after)
25
+ expect(subject).to respond_to :after
26
26
  end
27
27
  end
28
28
 
29
29
  describe "#around" do
30
30
  example do
31
- subject.should respond_to(:around)
31
+ expect(subject).to respond_to :around
32
32
  end
33
33
  end
34
34
 
@@ -38,14 +38,14 @@ describe DispatchRider::Configuration do
38
38
  end
39
39
 
40
40
  it "loads the files and converts their names to symbols" do
41
- subject.handlers.should include(:test_handler, :another_test_handler)
41
+ expect(subject.handlers).to include(:test_handler, :another_test_handler)
42
42
  end
43
43
  end
44
-
44
+
45
45
  describe "#default_retry_timeout" do
46
46
  it "sets the default timeout" do
47
47
  subject.default_retry_timeout = 60
48
- TestHandler.instance_methods.should include(:retry_timeout)
48
+ expect(TestHandler.instance_methods).to include(:retry_timeout)
49
49
  #Need to do this so that all the other tests don't have this as default!
50
50
  DispatchRider::Handlers::Base.send(:remove_method,:retry_timeout)
51
51
  end
@@ -54,20 +54,20 @@ describe DispatchRider::Configuration do
54
54
  describe "#logger" do
55
55
 
56
56
  describe "default" do
57
- example { subject.logger.should be_kind_of(Logger) }
57
+ example { expect(subject.logger).to be_kind_of(Logger) }
58
58
  end
59
59
 
60
- example { subject.should respond_to(:logger) }
60
+ example { expect(subject).to respond_to(:logger) }
61
61
  end
62
62
 
63
63
  describe "#logger=" do
64
64
  let(:new_logger) { double(:logger) }
65
65
 
66
- example { subject.should respond_to(:logger=) }
66
+ example { expect(subject).to respond_to(:logger=) }
67
67
 
68
68
  example do
69
69
  subject.logger = new_logger
70
- subject.logger.should == new_logger
70
+ expect(subject.logger).to eq new_logger
71
71
  end
72
72
  end
73
73
 
@@ -56,10 +56,4 @@ describe DispatchRider::NotificationServices::Base do
56
56
  subject.channels(:foo).should eq([channel])
57
57
  end
58
58
  end
59
-
60
- describe "#message_builder" do
61
- it "should return the message builder class" do
62
- subject.message_builder.should eq(DispatchRider::Message)
63
- end
64
- end
65
59
  end
@@ -22,7 +22,7 @@ describe DispatchRider::Publisher::Base do
22
22
 
23
23
  describe ".default_publisher" do
24
24
  example do
25
- described_class.default_publisher.should be_a(DispatchRider::Publisher)
25
+ expect(described_class.default_publisher).to be_a(DispatchRider::Publisher)
26
26
  end
27
27
  end
28
28
 
@@ -49,8 +49,8 @@ describe DispatchRider::Publisher::Base do
49
49
  end
50
50
 
51
51
  example do
52
- DummyPublisher.default_publisher.should_receive(:publish).with(message)
53
- DummyPublisher.publish({"bla" => "WOOOOOOOO!"})
52
+ expect(DummyPublisher.default_publisher).to receive(:publish).with(message)
53
+ DummyPublisher.publish "bla" => "WOOOOOOOO!"
54
54
  end
55
55
  end
56
56
 
@@ -70,7 +70,7 @@ describe DispatchRider::Publisher::Base do
70
70
  let(:publisher) { double(:publisher) }
71
71
 
72
72
  example do
73
- publisher.should_receive(:publish).with(message)
73
+ expect(publisher).to receive(:publish).with(message)
74
74
  DummyCustomPublisher.publish({"bla" => "RAAAAAWWWWW!"}, publisher)
75
75
  end
76
76
  end
@@ -2,9 +2,7 @@ require 'spec_helper'
2
2
 
3
3
  describe DispatchRider::Publisher do
4
4
 
5
- subject do
6
- described_class.new
7
- end
5
+ subject(:publisher) { described_class.new }
8
6
 
9
7
  describe "#initialize" do
10
8
  it "assigns the notification service registrar" do
@@ -19,21 +17,28 @@ describe DispatchRider::Publisher do
19
17
  subject.service_channel_mapper.destination_registrar.store.should be_empty
20
18
  end
21
19
 
22
- context "when not passing a configuration" do
23
- it "loads the global configuration" do
24
- DispatchRider::Publisher::ConfigurationReader.should_receive(:load_config).with(described_class.configuration, subject)
25
- end
26
- end
27
-
28
- context "when passing a configuration" do
29
- let(:configuration){ DispatchRider::Publisher::Configuration.new }
30
-
31
- subject{ described_class.new(configuration) }
32
-
33
- it "loads the configuration" do
34
- DispatchRider::Publisher::ConfigurationReader.should_receive(:load_config).with(configuration, subject)
35
- end
36
- end
20
+ # this case is broken because its playing chicken and the egg with the expectation
21
+ # not sure how rspec 2 did it .. it passes subject as a parameter to which triggers the creation of subject ..
22
+ # which makes the call that is being expected here .. so when subject is evaluated the assertion is not in place yet
23
+ # and the assertion can't be made unless subject already exists ..
24
+ #
25
+ # context "when not passing a configuration" do
26
+ # it "loads the global configuration" do
27
+ # expect(DispatchRider::Publisher::ConfigurationReader).to receive(:load_config).with(described_class.configuration, subject)
28
+ # subject
29
+ # end
30
+ # end
31
+ #
32
+ # context "when passing a configuration" do
33
+ # let(:configuration){ DispatchRider::Publisher::Configuration.new }
34
+ #
35
+ # subject{ described_class.new(configuration) }
36
+ #
37
+ # it "loads the configuration" do
38
+ # expect(DispatchRider::Publisher::ConfigurationReader).to receive(:load_config).with(configuration, subject)
39
+ # subject
40
+ # end
41
+ # end
37
42
  end
38
43
 
39
44
  describe "#register_notification_service" do
@@ -119,5 +124,35 @@ describe DispatchRider::Publisher do
119
124
  }
120
125
  expect(data).to eq(expected_message)
121
126
  end
127
+
128
+ describe "calls publish callback" do
129
+ describe "calls the publish callback" do
130
+ let(:publish_callback) { double :callback }
131
+ let(:expected_message) {
132
+ DispatchRider::Message.new(
133
+ subject: "bar_handler",
134
+ body: {
135
+ "bar" => "baz",
136
+ guid: "test-mode-not-random-guid"
137
+ }
138
+ )
139
+ }
140
+
141
+ before { DispatchRider.config.callbacks.for(:publish) << publish_callback }
142
+ after { DispatchRider.config.callbacks.for(:publish).delete publish_callback }
143
+
144
+ example do
145
+ publish_callback.should_receive(:call).with any_args, # first argument is the inner job
146
+ destinations: [:fs_foo],
147
+ message: expected_message
148
+
149
+ publisher.publish destinations: [:fs_foo],
150
+ message: {
151
+ subject: "bar_handler",
152
+ body: { "bar" => "baz" }
153
+ }
154
+ end
155
+ end
156
+ end
122
157
  end
123
158
  end
@@ -13,7 +13,7 @@ describe DispatchRider::QueueServices::AwsSqs do
13
13
 
14
14
  before do
15
15
  AWS.config(stub_requests: true)
16
- AWS::SQS::Client.any_instance.stub(:client_request).and_return(fake_response)
16
+ allow_any_instance_of(AWS::SQS::Client).to receive(:client_request).and_return(fake_response)
17
17
  end
18
18
 
19
19
  subject(:aws_sqs_queue) do
@@ -26,14 +26,14 @@ describe DispatchRider::QueueServices::AwsSqs do
26
26
  context "when the name of the queue is passed in the options" do
27
27
  it "should return an instance representing the aws sqs queue" do
28
28
  aws_sqs_queue.assign_storage(:name => 'normal_priority')
29
- aws_sqs_queue.queue.url.should eq('the.queue.url')
29
+ expect(aws_sqs_queue.queue.url).to eq('the.queue.url')
30
30
  end
31
31
  end
32
32
 
33
33
  context "when the url of the queue is passed in the options" do
34
34
  it "should return an instance representing the aws sqs queue" do
35
35
  aws_sqs_queue.assign_storage(:url => 'https://sqs.us-east-1.amazonaws.com/12345/QueueName')
36
- aws_sqs_queue.queue.url.should eq('the.queue.url')
36
+ expect(aws_sqs_queue.queue.url).to eq('the.queue.url')
37
37
  end
38
38
  end
39
39
 
@@ -48,7 +48,7 @@ describe DispatchRider::QueueServices::AwsSqs do
48
48
  describe "#insert" do
49
49
  it "should insert an item into the queue" do
50
50
  obj = {'subject' => 'foo', 'body' => 'bar'}.to_json
51
- aws_sqs_queue.queue.should_receive(:send_message).with(obj)
51
+ expect(aws_sqs_queue.queue).to receive(:send_message).with(obj)
52
52
  aws_sqs_queue.insert(obj)
53
53
  end
54
54
  end
@@ -84,8 +84,8 @@ describe DispatchRider::QueueServices::AwsSqs do
84
84
  context "when the block runs faster than the timeout" do
85
85
  it "should yield the first item in the queue" do
86
86
  aws_sqs_queue.pop do |message|
87
- message.subject.should eq('foo')
88
- message.body.should eq({'bar' => 'baz'})
87
+ expect(message.subject).to eq('foo')
88
+ expect(message.body).to eq({'bar' => 'baz'})
89
89
  end
90
90
  end
91
91
  end
@@ -117,7 +117,7 @@ describe DispatchRider::QueueServices::AwsSqs do
117
117
  end
118
118
 
119
119
  end
120
-
120
+
121
121
  describe "received message methods" do
122
122
  let(:response_attributes) {{
123
123
  "SenderId" => "123456789012",
@@ -133,17 +133,17 @@ describe DispatchRider::QueueServices::AwsSqs do
133
133
  :receipt_handle => "HANDLE",
134
134
  :attributes => response_attributes,
135
135
  } }
136
-
136
+
137
137
  before :each do
138
138
  response = AWS::SQS::Client.new.stub_for(:receive_message)
139
139
  response.data[:messages] = [response_message]
140
140
  AWS::SQS::Client::V20121105.any_instance.stub(:receive_message).and_return(response)
141
141
  AWS::SQS::Queue.any_instance.stub(:verify_receive_message_checksum).and_return([])
142
142
  end
143
-
143
+
144
144
  it "should set the visibility timeout when extend is called" do
145
- AWS::SQS::ReceivedMessage.any_instance.should_receive(:visibility_timeout=).with(10)
146
- AWS::SQS::ReceivedMessage.any_instance.should_receive(:visibility_timeout=).with(0)
145
+ expect_any_instance_of(AWS::SQS::ReceivedMessage).to receive(:visibility_timeout=).with(10)
146
+ expect_any_instance_of(AWS::SQS::ReceivedMessage).to receive(:visibility_timeout=).with(0)
147
147
  aws_sqs_queue.pop do |message|
148
148
  message.extend_timeout(10)
149
149
  message.total_timeout.should eq(10)
@@ -7,20 +7,20 @@ describe DispatchRider::Registrars::Base do
7
7
 
8
8
  describe "#initialize" do
9
9
  it "assigns store" do
10
- subject.store.should be_empty
10
+ expect(subject.store).to be_empty
11
11
  end
12
12
  end
13
13
 
14
14
  describe "#register" do
15
15
  it "registers the value" do
16
- subject.should_receive(:value).with(:foo, {}).and_return("bar")
16
+ expect(subject).to receive(:value).with(:foo, {}).and_return("bar")
17
17
  subject.register(:foo)
18
- subject.fetch(:foo).should eq('bar')
18
+ expect(subject.fetch(:foo)).to eq('bar')
19
19
  end
20
20
 
21
21
  it "should return the registrar" do
22
- subject.should_receive(:value).with(:foo, {}).and_return("bar")
23
- subject.register(:foo).should eq(subject)
22
+ expect(subject).to receive(:value).with(:foo, {}).and_return("bar")
23
+ expect(subject.register(:foo)).to eq(subject)
24
24
  end
25
25
 
26
26
  context "when there is a missing constant while registering" do
@@ -12,11 +12,11 @@ describe DispatchRider::Runner do
12
12
  end
13
13
 
14
14
  example do
15
- subscriber.should_receive(:new).once.and_return(subscriber)
16
- subscriber.should_receive(:register_queue).once
17
- subscriber.should_receive(:setup_demultiplexer).once
18
- subscriber.should_receive(:process).once
19
- subscriber.stub(:register_handler)
15
+ expect(subscriber).to receive(:new).once.and_return(subscriber)
16
+ expect(subscriber).to receive(:register_queue).once
17
+ expect(subscriber).to receive(:setup_demultiplexer).once
18
+ expect(subscriber).to receive(:process).once
19
+ allow(subscriber).to receive(:register_handler)
20
20
 
21
21
  described_class.run
22
22
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dispatch-rider
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.4.2
4
+ version: 1.5.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Suman Mukherjee
@@ -11,64 +11,82 @@ authors:
11
11
  autorequire:
12
12
  bindir: bin
13
13
  cert_chain: []
14
- date: 2015-04-10 00:00:00.000000000 Z
14
+ date: 2015-04-14 00:00:00.000000000 Z
15
15
  dependencies:
16
16
  - !ruby/object:Gem::Dependency
17
17
  name: activesupport
18
18
  requirement: !ruby/object:Gem::Requirement
19
19
  requirements:
20
+ - - "~>"
21
+ - !ruby/object:Gem::Version
22
+ version: '4'
20
23
  - - ">="
21
24
  - !ruby/object:Gem::Version
22
- version: '0'
25
+ version: 3.2.0
23
26
  type: :runtime
24
27
  prerelease: false
25
28
  version_requirements: !ruby/object:Gem::Requirement
26
29
  requirements:
30
+ - - "~>"
31
+ - !ruby/object:Gem::Version
32
+ version: '4'
27
33
  - - ">="
28
34
  - !ruby/object:Gem::Version
29
- version: '0'
35
+ version: 3.2.0
30
36
  - !ruby/object:Gem::Dependency
31
37
  name: activemodel
32
38
  requirement: !ruby/object:Gem::Requirement
33
39
  requirements:
40
+ - - "~>"
41
+ - !ruby/object:Gem::Version
42
+ version: '4'
34
43
  - - ">="
35
44
  - !ruby/object:Gem::Version
36
- version: '0'
45
+ version: 3.2.0
37
46
  type: :runtime
38
47
  prerelease: false
39
48
  version_requirements: !ruby/object:Gem::Requirement
40
49
  requirements:
50
+ - - "~>"
51
+ - !ruby/object:Gem::Version
52
+ version: '4'
41
53
  - - ">="
42
54
  - !ruby/object:Gem::Version
43
- version: '0'
55
+ version: 3.2.0
44
56
  - !ruby/object:Gem::Dependency
45
57
  name: daemons
46
58
  requirement: !ruby/object:Gem::Requirement
47
59
  requirements:
48
- - - ">="
60
+ - - "~>"
49
61
  - !ruby/object:Gem::Version
50
- version: '0'
62
+ version: '1.2'
51
63
  type: :runtime
52
64
  prerelease: false
53
65
  version_requirements: !ruby/object:Gem::Requirement
54
66
  requirements:
55
- - - ">="
67
+ - - "~>"
56
68
  - !ruby/object:Gem::Version
57
- version: '0'
69
+ version: '1.2'
58
70
  - !ruby/object:Gem::Dependency
59
71
  name: retries
60
72
  requirement: !ruby/object:Gem::Requirement
61
73
  requirements:
74
+ - - "~>"
75
+ - !ruby/object:Gem::Version
76
+ version: '0.0'
62
77
  - - ">="
63
78
  - !ruby/object:Gem::Version
64
- version: '0'
79
+ version: 0.0.5
65
80
  type: :runtime
66
81
  prerelease: false
67
82
  version_requirements: !ruby/object:Gem::Requirement
68
83
  requirements:
84
+ - - "~>"
85
+ - !ruby/object:Gem::Version
86
+ version: '0.0'
69
87
  - - ">="
70
88
  - !ruby/object:Gem::Version
71
- version: '0'
89
+ version: 0.0.5
72
90
  description: "\n Messaging system based on the reactor pattern.\n\n You can
73
91
  publish messages to a queue and then a demultiplexer\n runs an event loop which
74
92
  pops items from the queue and hands\n it over to a dispatcher.\n\n The dispatcher
@@ -95,6 +113,7 @@ files:
95
113
  - lib/dispatch-rider/callbacks.rb
96
114
  - lib/dispatch-rider/callbacks/access.rb
97
115
  - lib/dispatch-rider/callbacks/storage.rb
116
+ - lib/dispatch-rider/callbacks/support.rb
98
117
  - lib/dispatch-rider/command.rb
99
118
  - lib/dispatch-rider/configuration.rb
100
119
  - lib/dispatch-rider/debug.rb
@@ -214,7 +233,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
214
233
  version: '0'
215
234
  requirements: []
216
235
  rubyforge_project:
217
- rubygems_version: 2.2.2
236
+ rubygems_version: 2.4.5
218
237
  signing_key:
219
238
  specification_version: 4
220
239
  summary: Messaging system that is customizable based on which queueing system we are