superbolt 0.2.1 → 0.2.3

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: 4c1ae682e276cb88e28fe0226a34506473ef92f0
4
- data.tar.gz: 89c3df502b1f1a8de17d411686f40412fafdb670
3
+ metadata.gz: 9edf5a20e4fe7b10dc3d4a0ce51ba6db321733a3
4
+ data.tar.gz: 8d46eb9f8f272c78813dadd3555831e130d02276
5
5
  SHA512:
6
- metadata.gz: 2846d21f6ffd39d49f7e93eab88c24c5baca3bd02fb7bede0e33d4d40e8eb413cb23ba973af0385fe3deb56d2314d258274f2d44da9789f7db3206fe7c513493
7
- data.tar.gz: 47c71f8a760809c45d308bd973da1a72e154cb0ce36d4c58f368f258f84b74308de066b52817e093e6eea6f7671712e052775096e2e431fc499088d9cd18b436
6
+ metadata.gz: 77c29a55feed037520f3f456a1a309b7750493296640ea46f71c3b3174de13223122c0f0f1c116c4db58dd2976f0c686d552b69f15b5dee48c817526540229ff
7
+ data.tar.gz: 019a6f7fff3af4a3b1d4543af28658d7c3ed5d620e09c9c2c99739c9af4ee75178638e87e00c07931f870212474ba07ff55b23da9834dfecb12792969d5a264b
data/README.md CHANGED
@@ -4,7 +4,7 @@
4
4
 
5
5
  Superbolt is an easy intra-app communication system for sending messages
6
6
  between applications. It is backed by RabbitMQ and under the covers it
7
- uses both the Bunny gem and the AMQP gem.
7
+ uses the Bunny gem.
8
8
 
9
9
  #### Why not just use those gems?
10
10
 
data/lib/superbolt.rb CHANGED
@@ -1,14 +1,13 @@
1
1
  require 'json'
2
2
 
3
3
  require 'bunny'
4
- require 'amqp'
5
4
  require 'active_support/core_ext/module/delegation'
5
+ require 'eventmachine'
6
6
 
7
7
  require "superbolt/version"
8
8
  require "superbolt/config"
9
9
  require "superbolt/adapter/base"
10
10
  require "superbolt/adapter/bunny"
11
- require "superbolt/adapter/amqp"
12
11
  require "superbolt/connection/base"
13
12
  require "superbolt/connection/queue"
14
13
  require "superbolt/connection/app"
@@ -17,7 +16,6 @@ require "superbolt/incoming_message"
17
16
  require "superbolt/app"
18
17
  require "superbolt/processor"
19
18
  require "superbolt/facade"
20
- require "superbolt/message_ram"
21
19
  require "superbolt/messenger"
22
20
  require "superbolt/spec_helpers"
23
21
 
@@ -5,6 +5,7 @@ module Superbolt
5
5
 
6
6
  def initialize(config=nil)
7
7
  @config = config || Superbolt.config
8
+ @channel = new_channel
8
9
  end
9
10
 
10
11
  delegate :closed?, :open, :open?,
@@ -16,13 +17,6 @@ module Superbolt
16
17
  @channel = nil
17
18
  response
18
19
  end
19
-
20
- delegate :queues, :acknowledge, :reject, :queue,
21
- to: :channel
22
-
23
- def exchange
24
- channel.default_exchange
25
- end
26
20
  end
27
21
  end
28
22
  end
@@ -8,8 +8,12 @@ module Superbolt
8
8
  @socket
9
9
  end
10
10
 
11
- def channel
12
- @channel ||= socket.create_channel
11
+ def new_channel
12
+ socket.create_channel
13
+ end
14
+
15
+ def channel=(new_channel)
16
+ @channel = new_channel
13
17
  end
14
18
  end
15
19
  end
data/lib/superbolt/app.rb CHANGED
@@ -19,7 +19,7 @@ module Superbolt
19
19
  end
20
20
 
21
21
  delegate :close, :closing, :exclusive?, :durable?, :auto_delete?,
22
- :writer, :channel, :q,
22
+ :channel, :q,
23
23
  to: :connection
24
24
 
25
25
  def queue
@@ -2,19 +2,19 @@ module Superbolt
2
2
  module Connection
3
3
  class App < Base
4
4
  def connection
5
- @connection ||= Adapter::Bunny.new(config)
5
+ CONNECTION
6
6
  end
7
7
 
8
8
  def close(&block)
9
- connection.close
10
- @connection = nil
9
+ channel.close
10
+ @channel = nil
11
11
  @q = nil
12
12
  @qq = nil
13
13
  block.call
14
14
  end
15
15
 
16
16
  def qq
17
- @qq ||= connection.queue("#{name}.quit", self.class.default_options)
17
+ @qq ||= channel.queue("#{name}.quit", self.class.default_options)
18
18
  end
19
19
  end
20
20
  end
@@ -17,16 +17,24 @@ module Superbolt
17
17
  end
18
18
 
19
19
  def q
20
- @q ||= connection.queue(name, self.class.default_options)
20
+ @q ||= channel.queue(name, self.class.default_options)
21
21
  end
22
22
 
23
23
  delegate :exclusive?, :durable?, :auto_delete?,
24
24
  to: :q
25
25
 
26
26
  def channel
27
- connection.channel
27
+ return @channel if @channel.try(:open?)
28
+ tries = 0
29
+ begin
30
+ @channel = connection.new_channel
31
+ rescue ::Bunny::CommandInvalid # only happens if a channel is already open
32
+ @channel.close
33
+ tries += 1
34
+ retry if tries < 2
35
+ end
28
36
  end
29
-
37
+
30
38
  def self.default_options
31
39
  {
32
40
  :auto_delete => false,
@@ -2,12 +2,12 @@ module Superbolt
2
2
  module Connection
3
3
  class Queue < Base
4
4
  def connection
5
- @connection ||= Adapter::Bunny.new(config)
5
+ CONNECTION
6
6
  end
7
7
 
8
8
  def close
9
- connection.close
10
- @connection = nil
9
+ channel.close
10
+ @channel = nil
11
11
  @q = nil
12
12
  end
13
13
 
@@ -16,11 +16,6 @@ module Superbolt
16
16
  close
17
17
  response
18
18
  end
19
-
20
- def writer
21
- q # to make sure it is connected
22
- connection.exchange
23
- end
24
19
  end
25
20
  end
26
21
  end
@@ -1,4 +1,5 @@
1
1
  module Superbolt
2
+
2
3
  def self.config=(options)
3
4
  @config = Config.new(options)
4
5
  end
@@ -23,4 +24,5 @@ module Superbolt
23
24
  def self.message(args={})
24
25
  Superbolt::Messenger.new(args)
25
26
  end
27
+ CONNECTION = Adapter::Bunny.new(config)
26
28
  end
@@ -4,7 +4,7 @@ module Superbolt
4
4
 
5
5
  def initialize(delivery_info, payload, channel)
6
6
  @payload = payload
7
- @tag = delivery_info.delivery_tag
7
+ @tag = delivery_info.delivery_tag if delivery_info
8
8
  @channel = channel
9
9
  end
10
10
 
@@ -14,8 +14,8 @@ module Superbolt
14
14
  payload
15
15
  end
16
16
 
17
- def reject
18
- channel.reject(tag)
17
+ def reject(requeue=true)
18
+ channel.reject(tag, requeue)
19
19
  end
20
20
 
21
21
  def ack
@@ -1,6 +1,6 @@
1
1
  module Superbolt
2
2
  class Messenger
3
- attr_accessor :origin, :name, :event, :arguments, :env, :retry_time, :timeout
3
+ attr_accessor :origin, :name, :event, :arguments, :env, :retry_time, :timeout, :live_queue
4
4
 
5
5
  def initialize(options={})
6
6
  @name = options.delete(:to)
@@ -57,18 +57,15 @@ module Superbolt
57
57
 
58
58
  def send!(args=nil)
59
59
  self.arguments = args if args
60
- MessageRam.new(self, 'push_to_queue').besiege
61
- end
62
-
63
- def push_to_queue
64
60
  queue.push(message)
65
61
  end
66
62
 
63
+
67
64
  def queue
68
65
  unless name
69
66
  raise "no destination app name defined, please pass one in"
70
67
  end
71
- Queue.new(destination_name)
68
+ @live_queue = Queue.new(destination_name)
72
69
  end
73
70
 
74
71
  def destination_name
@@ -12,36 +12,36 @@ module Superbolt
12
12
  end
13
13
 
14
14
  delegate :close, :closing, :exclusive?, :durable?, :auto_delete?,
15
- :writer, :channel, :q,
16
- to: :connection
15
+ :channel, :q,
16
+ to: :connection
17
17
 
18
18
  def push(message)
19
19
  closing do
20
- writer.publish(message.to_json, routing_key: name)
20
+ q.publish(message.to_json)
21
21
  end
22
22
  end
23
23
 
24
24
  def size
25
- closing do
26
- q.message_count
27
- end
25
+ q.message_count
28
26
  end
29
27
 
30
28
  def clear
31
- closing do
32
- q.purge
33
- end
29
+ q.purge
34
30
  end
35
31
 
36
32
  # TODO: roll up some of these subscribe methods
37
33
 
38
34
  def read
35
+ current_size = size
39
36
  messages = []
40
37
  closing do
41
38
  q.subscribe(:ack => true) do |delivery_info, metadata, payload|
42
39
  message = IncomingMessage.new(delivery_info, payload, channel)
43
40
  messages << message
44
41
  end
42
+ while messages.length < current_size
43
+ true
44
+ end
45
45
  end
46
46
  messages
47
47
  end
@@ -51,20 +51,22 @@ module Superbolt
51
51
  end
52
52
 
53
53
  def peek
54
- all.first
54
+ message = pop
55
+ push(message)
56
+ message
55
57
  end
56
58
 
57
59
  def pop
58
60
  closing do
59
- q.pop do |delivery_info, metadata, message|
60
- message = IncomingMessage.new(delivery_info, message, channel)
61
+ q.pop(ack: false) do |delivery_info, metadata, payload|
62
+ message = IncomingMessage.new(delivery_info, payload, channel) if payload
61
63
  message && message.parse
62
64
  end
63
65
  end
64
66
  end
65
67
 
66
68
  delegate :slice, :[],
67
- to: :all
69
+ to: :all
68
70
 
69
71
  def delete
70
72
  messages = []
@@ -77,11 +79,11 @@ module Superbolt
77
79
  message.ack
78
80
  end
79
81
  end
80
-
81
82
  # channel is closed by block before message ack can complete
82
83
  # therefore we must sleep :(
83
84
  sleep 0.02
84
85
  end
86
+
85
87
  messages
86
88
  end
87
89
  end
@@ -1,3 +1,3 @@
1
1
  module Superbolt
2
- VERSION = "0.2.1"
2
+ VERSION = "0.2.3"
3
3
  end
@@ -2,6 +2,7 @@ require 'spec_helper'
2
2
 
3
3
  describe Superbolt::Adapter::Bunny do
4
4
  let(:connection) { Superbolt::Adapter::Bunny.new }
5
+ let(:channel) { connection.new_channel }
5
6
 
6
7
  it "has an underlying open connection via Bunny" do
7
8
  connection.socket.should be_a Bunny::Session
@@ -9,13 +10,15 @@ describe Superbolt::Adapter::Bunny do
9
10
  connection.should be_open
10
11
  end
11
12
 
12
- it "has a channel" do
13
- connection.channel.should be_a Bunny::Channel
13
+ describe 'new_channel' do
14
+ it "creates a channel" do
15
+ connection.new_channel.should be_a Bunny::Channel
16
+ end
14
17
  end
15
18
 
16
19
  it "delegates queue creation to the channel" do
17
- queue = connection.queue('changelica')
20
+ queue = channel.queue('changelica')
18
21
  queue.should be_a Bunny::Queue
19
- connection.queues.keys.should include('changelica')
22
+ channel.queues.keys.should include('changelica')
20
23
  end
21
24
  end
data/spec/queue_spec.rb CHANGED
@@ -2,7 +2,6 @@ require 'spec_helper'
2
2
 
3
3
  describe 'Superbolt::Queue' do
4
4
  let(:name) { 'superbolt_test' }
5
- let(:connection) { Superbolt::Connection.new }
6
5
  let(:queue) { Superbolt::Queue.new(name) }
7
6
  let(:messages) { [] }
8
7
 
@@ -60,19 +59,15 @@ describe 'Superbolt::Queue' do
60
59
  end
61
60
 
62
61
  describe '#all' do
63
- before do
62
+ before do
64
63
  queue.push(message)
65
64
  queue.push(message)
66
65
  queue.push(message)
67
66
  end
68
67
 
69
- it "returns all the messages on the queue" do
70
- messages = queue.all
71
- messages.size.should == 3
72
- messages.uniq.should == [decoded]
73
- end
74
-
75
- it "does not consume the messages" do
68
+ it "returns all the messages on the queue and doesnt consume them" do
69
+ Superbolt::IncomingMessage.should_receive(:new).exactly(3).times.and_return(double('whatever', parse:true))
70
+ queue.all
76
71
  queue.size.should == 3
77
72
  end
78
73
  end
@@ -117,8 +112,8 @@ describe 'Superbolt::Queue' do
117
112
  end
118
113
 
119
114
  it "returns all messages where the block is true" do
120
- messages = queue.delete{|json| json['i'] > 2 && json['i'] != 6 && json['i'] < 8 }
121
- messages.map{|json| json['i']}.should == [3,4,5,7]
115
+ messages = queue.delete{|json| json['i'] % 2 != 0 }
116
+ messages.map{|json| json['i']}.should == [1,3,5,7,9]
122
117
  end
123
118
 
124
119
  it "removes those messages from the queue" do
data/superbolt.gemspec CHANGED
@@ -19,10 +19,10 @@ Gem::Specification.new do |spec|
19
19
  spec.require_paths = ["lib"]
20
20
 
21
21
  spec.add_dependency "activesupport"
22
- spec.add_dependency "amqp"
23
- spec.add_dependency "bunny", "~> 0.9.0.rc1"
22
+ spec.add_dependency "bunny", "~> 1.0.5"
24
23
 
25
24
  spec.add_development_dependency "bundler", "~> 1.3"
26
25
  spec.add_development_dependency "rake"
27
26
  spec.add_development_dependency "rspec"
27
+ spec.add_development_dependency "eventmachine"
28
28
  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.2.1
4
+ version: 0.2.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - socialchorus
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-11-15 00:00:00.000000000 Z
11
+ date: 2013-12-18 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -24,34 +24,20 @@ dependencies:
24
24
  - - '>='
25
25
  - !ruby/object:Gem::Version
26
26
  version: '0'
27
- - !ruby/object:Gem::Dependency
28
- name: amqp
29
- requirement: !ruby/object:Gem::Requirement
30
- requirements:
31
- - - '>='
32
- - !ruby/object:Gem::Version
33
- version: '0'
34
- type: :runtime
35
- prerelease: false
36
- version_requirements: !ruby/object:Gem::Requirement
37
- requirements:
38
- - - '>='
39
- - !ruby/object:Gem::Version
40
- version: '0'
41
27
  - !ruby/object:Gem::Dependency
42
28
  name: bunny
43
29
  requirement: !ruby/object:Gem::Requirement
44
30
  requirements:
45
31
  - - ~>
46
32
  - !ruby/object:Gem::Version
47
- version: 0.9.0.rc1
33
+ version: 1.0.5
48
34
  type: :runtime
49
35
  prerelease: false
50
36
  version_requirements: !ruby/object:Gem::Requirement
51
37
  requirements:
52
38
  - - ~>
53
39
  - !ruby/object:Gem::Version
54
- version: 0.9.0.rc1
40
+ version: 1.0.5
55
41
  - !ruby/object:Gem::Dependency
56
42
  name: bundler
57
43
  requirement: !ruby/object:Gem::Requirement
@@ -94,6 +80,20 @@ dependencies:
94
80
  - - '>='
95
81
  - !ruby/object:Gem::Version
96
82
  version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: eventmachine
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - '>='
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - '>='
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
97
  description: Superbolt is comprised of a standalone app, and a queue-like queue for
98
98
  sending messages between services and applications.
99
99
  email:
@@ -108,7 +108,6 @@ files:
108
108
  - README.md
109
109
  - Rakefile
110
110
  - lib/superbolt.rb
111
- - lib/superbolt/adapter/amqp.rb
112
111
  - lib/superbolt/adapter/base.rb
113
112
  - lib/superbolt/adapter/bunny.rb
114
113
  - lib/superbolt/app.rb
@@ -118,7 +117,6 @@ files:
118
117
  - lib/superbolt/connection/queue.rb
119
118
  - lib/superbolt/facade.rb
120
119
  - lib/superbolt/incoming_message.rb
121
- - lib/superbolt/message_ram.rb
122
120
  - lib/superbolt/messenger.rb
123
121
  - lib/superbolt/processor.rb
124
122
  - lib/superbolt/queue.rb
@@ -127,7 +125,6 @@ files:
127
125
  - spec/app_spec.rb
128
126
  - spec/config_spec.rb
129
127
  - spec/connection_spec.rb
130
- - spec/message_ram_spec.rb
131
128
  - spec/messenger_spec.rb
132
129
  - spec/queue_spec.rb
133
130
  - spec/spec_helper.rb
@@ -154,7 +151,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
154
151
  version: '0'
155
152
  requirements: []
156
153
  rubyforge_project:
157
- rubygems_version: 2.1.5
154
+ rubygems_version: 2.0.6
158
155
  signing_key:
159
156
  specification_version: 4
160
157
  summary: Superbolt is a gem that makes SOA intra-app communication easy, via RabbitMQ
@@ -162,7 +159,6 @@ test_files:
162
159
  - spec/app_spec.rb
163
160
  - spec/config_spec.rb
164
161
  - spec/connection_spec.rb
165
- - spec/message_ram_spec.rb
166
162
  - spec/messenger_spec.rb
167
163
  - spec/queue_spec.rb
168
164
  - spec/spec_helper.rb
@@ -1,18 +0,0 @@
1
- module Superbolt
2
- module Adapter
3
- class AMQP < Base
4
- def socket
5
- @socket ||= ::AMQP.connect(config.connection_params)
6
- end
7
-
8
- def channel
9
- @channel ||= ::AMQP::Channel.new(socket)
10
- end
11
-
12
- def close(&block)
13
- socket.close(&block)
14
- end
15
- end
16
- end
17
- end
18
-
@@ -1,31 +0,0 @@
1
- module Superbolt
2
- class MessageRam
3
- attr_reader :messenger, :method_name
4
- attr_accessor :run_time
5
- def initialize(messenger, method_name)
6
- @messenger = messenger
7
- @method_name = method_name
8
- @run_time = 0
9
- end
10
-
11
- def besiege
12
- messenger.send(method_name)
13
- rescue => e
14
- puts "Something went wrong: #{e}"
15
- puts "=========================="
16
- puts "Continuing the siege in #{messenger.retry_time} seconds...\n"
17
- sleep(messenger.retry_time)
18
- retreat(e) if retreat?
19
- besiege
20
- end
21
-
22
- def retreat?
23
- @run_time += messenger.retry_time
24
- run_time >= messenger.timeout
25
- end
26
-
27
- def retreat(error)
28
- raise error
29
- end
30
- end
31
- end
@@ -1,43 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe Superbolt::MessageRam do
4
- let(:error_class) { Exception }
5
- let(:messenger) { double(
6
- retry_time: 1,
7
- timeout: 5
8
- )}
9
- let(:ram) { Superbolt::MessageRam.new(messenger, :some_method ) }
10
-
11
- before do
12
- messenger.should_receive(:some_method).ordered.and_raise('Some Error')
13
- end
14
-
15
- context "failed to open connection" do
16
- before do
17
- expect(messenger)
18
- .to receive(:some_method).ordered
19
- .and_return(true)
20
- end
21
-
22
- it 'should raise no errors' do
23
- expect {
24
- ram.besiege
25
- }.to_not raise_error
26
- end
27
-
28
- it "retries on a configured interval" do
29
- ram.besiege.should == true
30
- end
31
- end
32
-
33
- context 'it runs out of time' do
34
- before do
35
- ram.run_time = 6
36
- end
37
- it 'should raise error' do
38
- expect {
39
- ram.besiege
40
- }.to raise_error(Exception)
41
- end
42
- end
43
- end