superbolt 0.7.1 → 0.7.2

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: 6156fe224308697980844511e2ab5b8a10979683
4
- data.tar.gz: 5bb9ddb432a7fb6184c21d2e8158c314be2a757e
3
+ metadata.gz: e553aac5d606b63183b802cb08a07c43e2a04e9d
4
+ data.tar.gz: 06a774880b8b0f9164defd612b5212d28655adaa
5
5
  SHA512:
6
- metadata.gz: 451095576178948ed0caae0d240ff3c59e92709b1aea62509b7ffedc04d07f6c5bd84f8f5552803ee041d556bce1327ba2943835aac25c16b898d442d27e9638
7
- data.tar.gz: c148e78686e11cd817dc929951995937c75719e8848d37a1876a455c9346e3e3aa50b546f6ecaa7a98ddb39b8c152430b3763acc3f88bff84bc1b950840204fd
6
+ metadata.gz: 7de9c9e6a98e5609d9157e23edc4c542d81c6bf533f6dc79d2b7cd54f2c7875c6650edd05344b682e7f3f7fa9d607010a1e1211da81004ff38dd355ff4b1d7d1
7
+ data.tar.gz: 1f8f67313fa1b123a73de0975e1f090467bd610f8dcf56f02b2c66d35efe45d2a5f6abc09fe50798b42618aadc4befbc3ed543f2d6c4b9b096976c4a739a3875
data/README.md CHANGED
@@ -222,12 +222,6 @@ the Superbolt app. Errors will be logged and the notification will be sent
222
222
  to the error notifier (none by default, can be airbrake) with information
223
223
  about the exception raised.
224
224
 
225
- The app can be shutdown gracefully by sending a quit message to a
226
- special queue:
227
-
228
- quit_queue = Superbolt::App.new('dorothy_inbox').quit_queue
229
- quit_queue.push(message: 'for a deploy')
230
-
231
225
  ## Error reporting
232
226
 
233
227
  `Superbolt::App` can hook into Airbrake by your command:
@@ -1,6 +1,5 @@
1
1
  require 'json'
2
2
 
3
- require 'file_marshal'
4
3
  require 'bunny'
5
4
  require 'amqp'
6
5
  require 'eventmachine'
@@ -36,9 +35,6 @@ require "superbolt/app"
36
35
  require "superbolt/processor"
37
36
  require "superbolt/facade"
38
37
  require "superbolt/messenger"
39
- require "superbolt/file_manager"
40
- require "superbolt/file_unpacker"
41
- require "superbolt/file_packer"
42
38
 
43
39
  require "superbolt/spec_helpers"
44
40
 
@@ -16,11 +16,6 @@ module Superbolt
16
16
  env ? "#{@name}_#{env}" : @name
17
17
  end
18
18
 
19
- # just in case you have a handle to the app and want to quit it
20
- def quit_queue
21
- Queue.new("#{connection.name}.quit", connection.config)
22
- end
23
-
24
19
  def connection
25
20
  @connection ||= Connection::Queue.new(name, config)
26
21
  end
@@ -33,15 +28,8 @@ module Superbolt
33
28
  connection.q
34
29
  end
35
30
 
36
- def quit_subscriber_queue
37
- connection.qq
38
- end
39
-
40
31
  def run(&block)
41
32
  runner_class.new(queue, error_notifier, logger, block).run
42
- # quit_subscriber_queue.subscribe do |message|
43
- # (message)
44
- # end
45
33
  end
46
34
 
47
35
  def runner_class
@@ -9,11 +9,6 @@ module Superbolt
9
9
  connection.close(&block)
10
10
  @connection = nil
11
11
  @q = nil
12
- @qq = nil
13
- end
14
-
15
- def qq
16
- @qq ||= connection.queue("#{name}.quit", self.class.default_options)
17
12
  end
18
13
  end
19
14
  end
@@ -22,10 +22,6 @@ module Superbolt
22
22
  q # to make sure it is connected
23
23
  connection.exchange
24
24
  end
25
-
26
- def qq
27
- @qq ||= connection.queue("#{name}.quit", self.class.default_options)
28
- end
29
25
  end
30
26
  end
31
27
  end
@@ -9,8 +9,7 @@ module Superbolt
9
9
  end
10
10
 
11
11
  def parse
12
- hash = JSON.parse(payload)
13
- unpack_files(hash)
12
+ JSON.parse(payload)
14
13
  rescue JSON::ParserError
15
14
  payload
16
15
  end
@@ -22,11 +21,5 @@ module Superbolt
22
21
  def ack
23
22
  channel.acknowledge(tag)
24
23
  end
25
-
26
- def unpack_files(hash)
27
- return hash unless hash.is_a?(Hash) && hash["arguments"].is_a?(Hash)
28
- hash['arguments'] = FileUnpacker.new(hash["arguments"]).perform
29
- hash
30
- end
31
24
  end
32
25
  end
@@ -47,18 +47,9 @@ module Superbolt
47
47
 
48
48
  def send!(args=nil)
49
49
  self.arguments = args if args
50
- pack_files
51
50
  queue.push(message)
52
51
  end
53
52
 
54
- def pack_files
55
- return unless arguments.is_a?(Hash)
56
- file_keys = arguments.keys.find_all { |key| key.to_s.match(Superbolt.file_matcher) }
57
- file_keys.each do |key|
58
- arguments[key] = FileMarshal::Dumper.new(arguments[key]).to_hash
59
- end
60
- end
61
-
62
53
  def queue
63
54
  unless name
64
55
  raise "no destination app name defined, please pass one in"
@@ -2,12 +2,20 @@ module Superbolt
2
2
  module Runner
3
3
  class Pg < AckOne
4
4
  def on_error(message, error)
5
- if error == PG::UnableToSend || error == PG::ConnectionBad
6
- ActiveRecord::Base.connection.reset!
5
+ if reconnect_after_error?(error)
6
+ ActiveRecord::Base.connection.reconnect!
7
7
  end
8
8
 
9
9
  super
10
10
  end
11
+
12
+ private
13
+
14
+ def reconnect_after_error?(error)
15
+ error.is_a?(ActiveRecord::StatementInvalid) and
16
+ error.message.start_with?("PG::UnableToSend") or
17
+ error.message.start_with?("PG::ConnectionBad")
18
+ end
11
19
  end
12
20
  end
13
21
  end
@@ -1,3 +1,3 @@
1
1
  module Superbolt
2
- VERSION = "0.7.1" #possibly broken for file transfer :(
2
+ VERSION = "0.7.2"
3
3
  end
@@ -13,33 +13,17 @@ describe Superbolt::App do
13
13
  let(:name) { 'superbolt' }
14
14
  let(:logger) { Logger.new('/dev/null') }
15
15
  let(:queue) { Superbolt::Queue.new("#{name}_#{env}") }
16
- let(:quit_queue) { Superbolt::Queue.new("#{name}_#{env}.quit") }
17
- let(:error_queue) { Superbolt::Queue.new("#{name}_#{env}.error") }
18
16
  let(:messages) { [] }
19
17
 
20
18
  before do
21
19
  queue.clear
22
- quit_queue.clear
23
- error_queue.clear
24
20
  end
25
21
 
26
22
  after do
27
23
  queue.clear
28
- quit_queue.clear
29
- error_queue.clear
30
24
  end
31
25
 
32
26
  shared_examples 'app' do
33
- # it "shuts down with any message to the quit queue" do
34
- # queue.push({please: 'stop'})
35
- # app.run do |arguments|
36
- # quit_queue.push({message: 'just because'})
37
- # end
38
-
39
- # queue.size.should == 0
40
- # quit_queue.size.should == 0
41
- # end
42
-
43
27
  it 'passes messages to the block for processing' do
44
28
  queue.push({first: 1})
45
29
  queue.push({last: 2})
@@ -88,11 +72,10 @@ describe Superbolt::App do
88
72
 
89
73
  app.run do |message, logger|
90
74
  logger.info(message)
91
- # quit_queue.push({message: 'stop!'})
92
75
  app.quit
93
76
  end
94
77
 
95
- message_received.should be_true
78
+ message_received.should eq true
96
79
  end
97
80
 
98
81
  context 'notifying errors' do
@@ -18,7 +18,7 @@ describe Superbolt::Config do
18
18
  }
19
19
 
20
20
  it "should make the app name available" do
21
- config.app_name.should == 'my_great_app'
21
+ expect(config.app_name).to eq 'my_great_app'
22
22
  end
23
23
 
24
24
  it "should make the env available" do
@@ -19,18 +19,6 @@ describe Superbolt::IncomingMessage do
19
19
  it "parses it to a hash" do
20
20
  message.parse.should == {'some' => 'message'}
21
21
  end
22
-
23
- context 'payload has a file' do
24
- let(:payload) { { 'arguments' => {'some_file' => {'file_hash' => 'yup'}} }.to_json }
25
- let(:packer) { double('packer', perform: {'some_file' => 'some_file'} ) }
26
-
27
- it "uses FilePacker to rewrite files into a hash" do
28
- Superbolt::FileUnpacker.should_receive(:new)
29
- .with({'some_file' => {'file_hash' => 'yup'}})
30
- .and_return(packer)
31
- message.parse.should == {'arguments' => packer.perform}
32
- end
33
- end
34
22
  end
35
23
  end
36
24
 
@@ -2,52 +2,45 @@ require 'spec_helper'
2
2
 
3
3
  module ActiveRecord
4
4
  class Base
5
- end
6
- end
7
-
8
- module PG
9
- class UnableToSend
10
- def self.message
11
- 'oh noes'
5
+ def self.connection
6
+ @@connection
12
7
  end
13
8
 
14
- def self.backtrace
15
- 'trace me'
9
+ @@connection = Class.new do
10
+ def self.reset!
11
+ end
16
12
  end
17
13
  end
18
14
 
19
- class ConnectionBad
20
- def self.message
21
- 'oh noes'
22
- end
23
-
24
- def self.backtrace
25
- 'trace me'
26
- end
15
+ class StatementInvalid < StandardError
27
16
  end
28
17
  end
29
18
 
19
+ PG_UNABLE_TO_SEND_ERROR = ActiveRecord::StatementInvalid.new("PG::UnableToSend: server closed the connection unexpectedly\n\tThis probably means the server terminated abnormally\n\tbefore or while processing the request.\n: SELECT \"data_sources\".* FROM \"data_sources\" WHERE \"data_sources\".\"program_id\" = 1 AND \"data_sources\".\"identifier\" = 'qz.com/feed' ORDER BY \"data_sources\".\"id\" ASC LIMIT 1")
20
+
21
+ PG_CONNECTION_BAD_ERROR = ActiveRecord::StatementInvalid.new("PG::ConnectionBad: PQsocket() can't get socket descriptor: BEGIN")
22
+
30
23
  describe "Superbolt::Runner::Pg" do
31
- let(:runner) { Superbolt::Runner::Pg.new('berkin', Superbolt::ErrorNotifier::None.new, 'whatever', 'some block') }
32
- let(:connection) { double('connection', reset!: true) }
24
+ subject(:runner) { Superbolt::Runner::Pg.new('berkin', Superbolt::ErrorNotifier::None.new, 'whatever', 'some block') }
33
25
 
34
- before do
35
- ActiveRecord::Base.stub(:connection).and_return(connection)
36
- end
26
+ describe "#on_error" do
27
+ it "reconnects ActiveRecord when it gets PG::UnableToSend" do
28
+ expect(ActiveRecord::Base.connection).to receive(:reconnect!)
29
+ report_error(PG_UNABLE_TO_SEND_ERROR)
30
+ end
37
31
 
38
- describe "on_error" do
39
- context "PG::UnableToSend" do
40
- it "should handle it" do
41
- connection.should_receive(:reset!).and_return(true)
42
- runner.on_error({message: 'somethig has gone very wrong'}, PG::UnableToSend)
43
- end
32
+ it "reconnects ActiveRecord when it gets PG::ConnectionBad" do
33
+ expect(ActiveRecord::Base.connection).to receive(:reconnect!)
34
+ report_error(PG_CONNECTION_BAD_ERROR)
44
35
  end
45
36
 
46
- context "PG::ConnectionBad " do
47
- it "should handle it" do
48
- connection.should_receive(:reset!).and_return(true)
49
- runner.on_error({message: 'somethig has gone very wrong'}, PG::ConnectionBad)
50
- end
37
+ it "doesn't reconnect for AR::StatementInvalid with a different message" do
38
+ expect(ActiveRecord::Base.connection).to_not receive(:reconnect!)
39
+ report_error(ActiveRecord::StatementInvalid.new("some other message"))
51
40
  end
52
41
  end
42
+
43
+ def report_error(exception)
44
+ runner.on_error({"superbolt_message_payload" => "hello"}, exception)
45
+ end
53
46
  end
@@ -51,17 +51,12 @@ describe Superbolt::Messenger do
51
51
  messenger.re('zap')
52
52
  message[:event].should == 'zap'
53
53
  end
54
-
55
- it "passes data to the message" do
56
- messenger.data({foo: 'bar'})
57
- message[:arguments].should == {foo: 'bar'}
58
- end
59
54
  end
60
55
 
61
56
  context 'reading' do
62
57
  it '#to returns the name' do
63
58
  messenger.to('transducer')
64
- messenger.to.should == 'transducer'
59
+ expect(messenger.to).to eq 'transducer'
65
60
  end
66
61
 
67
62
  it '#from returns the origin' do
@@ -82,8 +77,6 @@ describe Superbolt::Messenger do
82
77
  end
83
78
 
84
79
  describe 'send!' do
85
- let(:image_file) { File.open(File.dirname(__FILE__) + '/support/commodore.jpg')}
86
-
87
80
  before do
88
81
  messenger
89
82
  .to(name)
@@ -99,14 +92,5 @@ describe Superbolt::Messenger do
99
92
  'arguments' => 'none'
100
93
  }
101
94
  end
102
-
103
- it "converts any values that have key ending in '_file' with FileMarshal" do
104
- messenger.send!({
105
- image_file: image_file
106
- })
107
-
108
- message = queue.pop
109
- message['arguments']['image_file'].should be_a(Tempfile)
110
- end
111
95
  end
112
96
  end
@@ -15,9 +15,9 @@ describe 'Superbolt::Queue' do
15
15
  end
16
16
 
17
17
  it "is setup with the right defaults" do
18
- queue.exclusive?.should be_false
19
- queue.durable?.should be_true
20
- queue.auto_delete?.should be_false
18
+ queue.exclusive?.should eq false
19
+ queue.durable?.should eq true
20
+ queue.auto_delete?.should eq false
21
21
  end
22
22
 
23
23
  describe 'queue/array operations' do
@@ -22,7 +22,6 @@ Gem::Specification.new do |spec|
22
22
  spec.add_dependency "amqp"
23
23
  spec.add_dependency "bunny"
24
24
  spec.add_dependency 'eventmachine'
25
- spec.add_dependency 'file_marshal'
26
25
 
27
26
  spec.add_development_dependency "bundler", "~> 1.3"
28
27
  spec.add_development_dependency "rake"
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.7.1
4
+ version: 0.7.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - socialchorus
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-07-24 00:00:00.000000000 Z
11
+ date: 2014-10-24 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -66,20 +66,6 @@ dependencies:
66
66
  - - '>='
67
67
  - !ruby/object:Gem::Version
68
68
  version: '0'
69
- - !ruby/object:Gem::Dependency
70
- name: file_marshal
71
- requirement: !ruby/object:Gem::Requirement
72
- requirements:
73
- - - '>='
74
- - !ruby/object:Gem::Version
75
- version: '0'
76
- type: :runtime
77
- prerelease: false
78
- version_requirements: !ruby/object:Gem::Requirement
79
- requirements:
80
- - - '>='
81
- - !ruby/object:Gem::Version
82
- version: '0'
83
69
  - !ruby/object:Gem::Dependency
84
70
  name: bundler
85
71
  requirement: !ruby/object:Gem::Requirement
@@ -147,9 +133,6 @@ files:
147
133
  - lib/superbolt/error_notifier/airbrake.rb
148
134
  - lib/superbolt/error_notifier/none.rb
149
135
  - lib/superbolt/facade.rb
150
- - lib/superbolt/file_manager.rb
151
- - lib/superbolt/file_packer.rb
152
- - lib/superbolt/file_unpacker.rb
153
136
  - lib/superbolt/incoming_message.rb
154
137
  - lib/superbolt/message_handler.rb
155
138
  - lib/superbolt/messenger.rb
@@ -170,8 +153,6 @@ files:
170
153
  - spec/app_spec.rb
171
154
  - spec/config_spec.rb
172
155
  - spec/connection_spec.rb
173
- - spec/file_packer_spec.rb
174
- - spec/file_unpacker_spec.rb
175
156
  - spec/incoming_message_spec.rb
176
157
  - spec/lib/superbolt/error_notifier/airbrake_spec.rb
177
158
  - spec/lib/superbolt/error_notifier/none_spec.rb
@@ -181,7 +162,6 @@ files:
181
162
  - spec/router_spec.rb
182
163
  - spec/spec_helper.rb
183
164
  - spec/superbolt_spec.rb
184
- - spec/support/commodore.jpg
185
165
  - spec/support/em_mocking.rb
186
166
  - spec/support/queue_helpers.rb
187
167
  - superbolt.gemspec
@@ -205,7 +185,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
205
185
  version: '0'
206
186
  requirements: []
207
187
  rubyforge_project:
208
- rubygems_version: 2.2.2
188
+ rubygems_version: 2.0.14
209
189
  signing_key:
210
190
  specification_version: 4
211
191
  summary: Superbolt is a gem that makes SOA intra-app communication easy, via RabbitMQ
@@ -213,8 +193,6 @@ test_files:
213
193
  - spec/app_spec.rb
214
194
  - spec/config_spec.rb
215
195
  - spec/connection_spec.rb
216
- - spec/file_packer_spec.rb
217
- - spec/file_unpacker_spec.rb
218
196
  - spec/incoming_message_spec.rb
219
197
  - spec/lib/superbolt/error_notifier/airbrake_spec.rb
220
198
  - spec/lib/superbolt/error_notifier/none_spec.rb
@@ -224,6 +202,5 @@ test_files:
224
202
  - spec/router_spec.rb
225
203
  - spec/spec_helper.rb
226
204
  - spec/superbolt_spec.rb
227
- - spec/support/commodore.jpg
228
205
  - spec/support/em_mocking.rb
229
206
  - spec/support/queue_helpers.rb
@@ -1,24 +0,0 @@
1
- module Superbolt
2
- class FileManager
3
- attr_reader :hash
4
-
5
- def initialize(hash)
6
- @hash = hash
7
- end
8
-
9
- def perform
10
- file_keys.each do |key|
11
- hash[key] = process_file(hash[key])
12
- end
13
- hash
14
- end
15
-
16
- def file_keys
17
- @file_keys ||= hash.keys.find_all { |key| key.to_s.match(Superbolt.file_matcher) }
18
- end
19
-
20
- def process_file(arg)
21
- raise NotImplementedError
22
- end
23
- end
24
- end
@@ -1,7 +0,0 @@
1
- module Superbolt
2
- class FilePacker < FileManager
3
- def process_file(file)
4
- FileMarshal::Dumper.new(file).to_hash
5
- end
6
- end
7
- end
@@ -1,7 +0,0 @@
1
- module Superbolt
2
- class FileUnpacker < FileManager
3
- def process_file(file_hash)
4
- FileMarshal::Loader.new(file_hash).tempfile
5
- end
6
- end
7
- end
@@ -1,27 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe Superbolt::FilePacker do
4
- let(:packer) { Superbolt::FilePacker.new(hash) }
5
-
6
- let(:hash) {
7
- {
8
- my_file: file,
9
- foo: 'bar'
10
- }
11
- }
12
-
13
- let(:dumper) { double('dumper', to_hash: {}) }
14
-
15
- let(:file) { double('file') }
16
-
17
- describe '#perform' do
18
- it "makes matching keys into a file hash via FileMarshal" do
19
- FileMarshal::Dumper.should_receive(:new).with(file).and_return(dumper)
20
- dumper.should_receive(:to_hash)
21
- packer.perform.should == {
22
- foo: 'bar',
23
- my_file: {}
24
- }
25
- end
26
- end
27
- end
@@ -1,26 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe Superbolt::FileUnpacker do
4
- let(:unpacker){ Superbolt::FileUnpacker.new(hash) }
5
- let(:file) { File.open(File.dirname(__FILE__) + '/support/commodore.jpg')}
6
- let(:file_hash) {
7
- # back and forth in JSON required due to Time.parse issues
8
- JSON.parse(FileMarshal::Dumper.new(file).to_hash.to_json)
9
- }
10
- let(:hash) {
11
- {
12
- my_file: file_hash,
13
- foo: 'bar'
14
- }
15
- }
16
-
17
- describe "#perform" do
18
- it "makes the keys matching the Superbolt.file_matcher" do
19
- unpacker.perform[:my_file].should be_a Tempfile
20
- end
21
-
22
- it "leaves everything else alone" do
23
- unpacker.perform[:foo].should == "bar"
24
- end
25
- end
26
- end
Binary file