superbolt 0.3.5 → 0.3.6

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: a855cc5c7f275eaded2255e896d67e2a765b7f06
4
- data.tar.gz: 12e8c87da121d2b1d3e67261ec95950e8dcd6b69
3
+ metadata.gz: dfc8976e1d00e4f51ff26d28b413bd750ae3f317
4
+ data.tar.gz: 13cf9ddcbd97306aa7ea95862531a3d4d256e473
5
5
  SHA512:
6
- metadata.gz: 2cdb3838b54af6621c62b9275b5729657068642257055109da51f639fbec89a50fe538fa414cbbd12402e2ff3a63d24aa2a9481bdd6bc249a4da79cea7860403
7
- data.tar.gz: e3ef96919cc0c703107be66b2b1d8fac27a65730fe1ab060aeb1cb84b0350a338ef746e3a1a489586ddc9d0eaa991217f817865502167b8a1226c8e2b6cfc35d
6
+ metadata.gz: 122d5b6a367f4aa7bc6fd7641de8113d2fb70042066d362b8c385dc8641eb75e205965bd44077700417078fd730eb1c581d127cb98bf09a5926935d8cdb639ce
7
+ data.tar.gz: 085ecc038bba6700579e840a3192b38ba9929e622b1fb59861150a051f86f3fc48a43e151ef7608027867daa06c0519aa59953adfeb7cc9d53c9dd3134d88fdb
data/lib/superbolt/app.rb CHANGED
@@ -1,19 +1,29 @@
1
1
  module Superbolt
2
2
  class App
3
- attr_reader :config, :env
3
+ attr_reader :config, :env, :runner_type
4
4
  attr_accessor :logger
5
5
 
6
6
  def initialize(name, options={})
7
7
  @name = name
8
- @env = options[:env] || Superbolt.env
9
- @logger = options[:logger] || Logger.new($stdout)
10
- @config = options[:config] || Superbolt.config
8
+ @env = options[:env] || Superbolt.env
9
+ @logger = options[:logger] || Logger.new($stdout)
10
+ @runner_type = options[:runner] || :default
11
+ @config = options[:config] || Superbolt.config
11
12
  end
12
13
 
13
14
  def name
14
15
  env ? "#{@name}_#{env}" : @name
15
16
  end
16
17
 
18
+ # just in case you have a handle to the app and want to quit it
19
+ def quit_queue
20
+ Queue.new("#{connection.name}.quit", connection.config)
21
+ end
22
+
23
+ def error_queue
24
+ Queue.new("#{connection.name}.error", connection.config)
25
+ end
26
+
17
27
  def connection
18
28
  @connection ||= Connection::App.new(name, config)
19
29
  end
@@ -30,29 +40,11 @@ module Superbolt
30
40
  connection.qq
31
41
  end
32
42
 
33
- def quit_queue
34
- Queue.new("#{connection.name}.quit", connection.config)
35
- end
36
-
37
- def error_queue
38
- Queue.new("#{connection.name}.error", connection.config)
39
- end
40
-
41
43
  def run(&block)
42
44
  EventMachine.run do
43
- # only get one message at a time for performance
44
- # and tell it to auto reconnect, duh!
45
- queue.channel.prefetch(1)
46
45
  queue.channel.auto_recovery = true
47
46
 
48
- queue.subscribe(ack: true) do |metadata, payload|
49
- message = IncomingMessage.new(metadata, payload, channel)
50
- processor = Processor.new(message, logger, &block)
51
- unless processor.perform
52
- on_error(message.parse, processor.exception)
53
- end
54
- message.ack
55
- end
47
+ runner_class.new(queue, error_queue, logger, block).run
56
48
 
57
49
  quit_subscriber_queue.subscribe do |message|
58
50
  quit(message)
@@ -60,14 +52,21 @@ module Superbolt
60
52
  end
61
53
  end
62
54
 
63
- def on_error(message, error)
64
- error_message = message.merge({error: {
65
- class: error.class,
66
- message: error.message,
67
- backtrace: error.backtrace,
68
- errored_at: Time.now
69
- }})
70
- error_queue.push(error_message)
55
+ def runner_class
56
+ runner_map[runner_type] || default_runner
57
+ end
58
+
59
+ def runner_map
60
+ {
61
+ pop: Runner::Pop,
62
+ ack_one: Runner::AckOne,
63
+ ack: Runner::Ack,
64
+ greedy: Runner::Greedy
65
+ }
66
+ end
67
+
68
+ def default_runner
69
+ runner_map[:ack_one]
71
70
  end
72
71
 
73
72
  def quit(message='no message given')
@@ -0,0 +1,9 @@
1
+ module Superbolt
2
+ module Runner
3
+ class Ack < Default
4
+ def ack
5
+ true
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,13 @@
1
+ module Superbolt
2
+ module Runner
3
+ class AckOne < Default
4
+ def ack
5
+ true
6
+ end
7
+
8
+ def prefetch
9
+ 1
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,28 @@
1
+ module Superbolt
2
+ module Runner
3
+ class Base
4
+ attr_reader :queue, :error_queue, :logger, :block
5
+
6
+ def initialize(queue, error_queue, logger, block)
7
+ @queue = queue
8
+ @error_queue = error_queue
9
+ @logger = logger
10
+ @block = block
11
+ end
12
+
13
+ def channel
14
+ queue.channel
15
+ end
16
+
17
+ def on_error(message, error)
18
+ error_message = message.merge({error: {
19
+ class: error.class,
20
+ message: error.message,
21
+ backtrace: error.backtrace,
22
+ errored_at: Time.now
23
+ }})
24
+ error_queue.push(error_message)
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,31 @@
1
+ module Superbolt
2
+ module Runner
3
+ class Default < Base
4
+ def run
5
+ set_prefetch
6
+ subscribe
7
+ end
8
+
9
+ def set_prefetch
10
+ channel.prefetch(prefetch) if prefetch
11
+ end
12
+
13
+ def subscribe
14
+ queue.subscribe(ack: ack) do |metadata, payload|
15
+ message = IncomingMessage.new(metadata, payload, channel)
16
+ processor = Processor.new(message, logger, &block)
17
+ unless processor.perform
18
+ on_error(message.parse, processor.exception)
19
+ end
20
+ message.ack if ack
21
+ end
22
+ end
23
+
24
+ def ack
25
+ end
26
+
27
+ def prefetch
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,6 @@
1
+ module Superbolt
2
+ module Runner
3
+ class Greedy < Default
4
+ end
5
+ end
6
+ end
@@ -0,0 +1,23 @@
1
+ module Superbolt
2
+ module Runner
3
+ class Pop < Base
4
+ attr_reader :message
5
+
6
+ def run
7
+ EventMachine.add_periodic_timer(0.01) do
8
+ next if message
9
+
10
+ queue.pop do |metadata, payload|
11
+ @message = IncomingMessage.new(metadata, payload, channel)
12
+ processor = Processor.new(message, logger, &block)
13
+
14
+ unless processor.perform
15
+ on_error(message.parse, processor.exception)
16
+ end
17
+ @message = nil
18
+ end
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
@@ -1,3 +1,3 @@
1
1
  module Superbolt
2
- VERSION = "0.3.5"
2
+ VERSION = "0.3.6"
3
3
  end
data/lib/superbolt.rb CHANGED
@@ -7,12 +7,22 @@ require 'active_support/core_ext/module/delegation'
7
7
 
8
8
  require "superbolt/version"
9
9
  require "superbolt/config"
10
+
10
11
  require "superbolt/adapter/base"
11
12
  require "superbolt/adapter/bunny"
12
13
  require "superbolt/adapter/amqp"
14
+
13
15
  require "superbolt/connection/base"
14
16
  require "superbolt/connection/queue"
15
17
  require "superbolt/connection/app"
18
+
19
+ require "superbolt/runner/base"
20
+ require "superbolt/runner/default"
21
+ require "superbolt/runner/ack_one"
22
+ require "superbolt/runner/ack"
23
+ require "superbolt/runner/pop"
24
+ require "superbolt/runner/greedy"
25
+
16
26
  require "superbolt/queue"
17
27
  require "superbolt/incoming_message"
18
28
  require "superbolt/app"
data/spec/app_spec.rb CHANGED
@@ -1,15 +1,17 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe Superbolt::App do
4
+ let(:app) {
5
+ Superbolt::App.new(name, {
6
+ env: env,
7
+ logger: logger,
8
+ runner: runner_type
9
+ })
10
+ }
11
+
4
12
  let(:env) { 'test' }
5
13
  let(:name) { 'superbolt' }
6
14
  let(:logger) { Logger.new('/dev/null') }
7
- let(:app) {
8
- Superbolt::App.new(name, {
9
- env: env,
10
- logger: logger
11
- })
12
- }
13
15
  let(:queue) { Superbolt::Queue.new("#{name}_#{env}") }
14
16
  let(:quit_queue) { Superbolt::Queue.new("#{name}_#{env}.quit") }
15
17
  let(:error_queue) { Superbolt::Queue.new("#{name}_#{env}.error") }
@@ -21,7 +23,7 @@ describe Superbolt::App do
21
23
  error_queue.clear
22
24
  end
23
25
 
24
- describe '#run' do
26
+ shared_examples 'app' do
25
27
  it "shuts down with any message to the quit queue" do
26
28
  queue.push({please: 'stop'})
27
29
 
@@ -95,4 +97,28 @@ describe Superbolt::App do
95
97
  error_queue.size.should == 1
96
98
  end
97
99
  end
100
+
101
+ context 'when runner acknowledges one' do
102
+ let(:runner_type) { :ack_one }
103
+
104
+ it_should_behave_like "app"
105
+ end
106
+
107
+ context 'when runner acknowledges without a prefetch limit' do
108
+ let(:runner_type) { :ack }
109
+
110
+ it_should_behave_like 'app'
111
+ end
112
+
113
+ context 'when runner does not acknowledge and has no limits' do
114
+ let(:runner_type) { :greedy }
115
+
116
+ it_should_behave_like 'app'
117
+ end
118
+
119
+ context 'when the runner pops without acknowledgment' do
120
+ let(:runner_type) { :pop }
121
+
122
+ it_should_behave_like "app"
123
+ end
98
124
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: superbolt
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.5
4
+ version: 0.3.6
5
5
  platform: ruby
6
6
  authors:
7
7
  - socialchorus
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-01-27 00:00:00.000000000 Z
11
+ date: 2014-01-28 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -135,6 +135,12 @@ files:
135
135
  - lib/superbolt/messenger.rb
136
136
  - lib/superbolt/processor.rb
137
137
  - lib/superbolt/queue.rb
138
+ - lib/superbolt/runner/ack.rb
139
+ - lib/superbolt/runner/ack_one.rb
140
+ - lib/superbolt/runner/base.rb
141
+ - lib/superbolt/runner/default.rb
142
+ - lib/superbolt/runner/greedy.rb
143
+ - lib/superbolt/runner/pop.rb
138
144
  - lib/superbolt/spec_helpers.rb
139
145
  - lib/superbolt/version.rb
140
146
  - spec/app_spec.rb