hutch 0.28.0 → 1.1.1

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.
@@ -1,31 +1,26 @@
1
1
  require 'hutch/logging'
2
- require 'raven'
2
+ require 'sentry-ruby'
3
3
  require 'hutch/error_handlers/base'
4
4
 
5
5
  module Hutch
6
6
  module ErrorHandlers
7
7
  class Sentry < Base
8
-
9
- def initialize
10
- unless Raven.respond_to?(:capture_exception)
11
- raise "The Hutch Sentry error handler requires Raven >= 0.4.0"
12
- end
13
- end
14
-
15
8
  def handle(properties, payload, consumer, ex)
16
9
  message_id = properties.message_id
17
10
  prefix = "message(#{message_id || '-'}):"
18
11
  logger.error "#{prefix} Logging event to Sentry"
19
12
  logger.error "#{prefix} #{ex.class} - #{ex.message}"
20
- Raven.capture_exception(ex, extra: { payload: payload })
13
+ ::Sentry.configure_scope do |scope|
14
+ scope.set_context("payload", payload)
15
+ end
16
+ ::Sentry.capture_exception(ex)
21
17
  end
22
18
 
23
19
  def handle_setup_exception(ex)
24
20
  logger.error "Logging setup exception to Sentry"
25
21
  logger.error "#{ex.class} - #{ex.message}"
26
- Raven.capture_exception(ex)
22
+ ::Sentry.capture_exception(ex)
27
23
  end
28
-
29
24
  end
30
25
  end
31
26
  end
@@ -0,0 +1,31 @@
1
+ require 'hutch/logging'
2
+ require 'raven'
3
+ require 'hutch/error_handlers/base'
4
+
5
+ module Hutch
6
+ module ErrorHandlers
7
+ class SentryRaven < Base
8
+
9
+ def initialize
10
+ unless Raven.respond_to?(:capture_exception)
11
+ raise "The Hutch Sentry error handler requires Raven >= 0.4.0"
12
+ end
13
+ end
14
+
15
+ def handle(properties, payload, consumer, ex)
16
+ message_id = properties.message_id
17
+ prefix = "message(#{message_id || '-'}):"
18
+ logger.error "#{prefix} Logging event to Sentry"
19
+ logger.error "#{prefix} #{ex.class} - #{ex.message}"
20
+ Raven.capture_exception(ex, extra: { payload: payload })
21
+ end
22
+
23
+ def handle_setup_exception(ex)
24
+ logger.error "Logging setup exception to Sentry"
25
+ logger.error "#{ex.class} - #{ex.message}"
26
+ Raven.capture_exception(ex)
27
+ end
28
+
29
+ end
30
+ end
31
+ end
@@ -2,8 +2,10 @@ module Hutch
2
2
  module ErrorHandlers
3
3
  autoload :Logger, 'hutch/error_handlers/logger'
4
4
  autoload :Sentry, 'hutch/error_handlers/sentry'
5
+ autoload :SentryRaven, 'hutch/error_handlers/sentry_raven'
5
6
  autoload :Honeybadger, 'hutch/error_handlers/honeybadger'
6
7
  autoload :Airbrake, 'hutch/error_handlers/airbrake'
7
8
  autoload :Rollbar, 'hutch/error_handlers/rollbar'
9
+ autoload :Bugsnag, 'hutch/error_handlers/bugsnag'
8
10
  end
9
11
  end
@@ -6,7 +6,7 @@ module Hutch
6
6
  class JSON
7
7
 
8
8
  def self.encode(payload)
9
- ::JSON.dump(payload)
9
+ ::MultiJson.dump(payload)
10
10
  end
11
11
 
12
12
  def self.decode(payload)
@@ -0,0 +1,17 @@
1
+ require 'ddtrace'
2
+
3
+ module Hutch
4
+ module Tracers
5
+ class Datadog
6
+ def initialize(klass)
7
+ @klass = klass
8
+ end
9
+
10
+ def handle(message)
11
+ ::Datadog.tracer.trace(@klass.class.name, service: 'hutch', span_type: 'rabbitmq') do
12
+ @klass.process(message)
13
+ end
14
+ end
15
+ end
16
+ end
17
+ end
data/lib/hutch/tracers.rb CHANGED
@@ -2,5 +2,6 @@ module Hutch
2
2
  module Tracers
3
3
  autoload :NullTracer, 'hutch/tracers/null_tracer'
4
4
  autoload :NewRelic, 'hutch/tracers/newrelic'
5
+ autoload :Datadog, 'hutch/tracers/datadog'
5
6
  end
6
7
  end
data/lib/hutch/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Hutch
2
- VERSION = '0.28.0'.freeze
2
+ VERSION = '1.1.1'.freeze
3
3
  end
data/lib/hutch/worker.rb CHANGED
@@ -47,7 +47,7 @@ module Hutch
47
47
  def setup_queue(consumer)
48
48
  logger.info "setting up queue: #{consumer.get_queue_name}"
49
49
 
50
- queue = @broker.queue(consumer.get_queue_name, consumer.get_arguments)
50
+ queue = @broker.queue(consumer.get_queue_name, consumer.get_options)
51
51
  @broker.bind_queue(queue, consumer.routing_keys)
52
52
 
53
53
  queue.subscribe(consumer_tag: unique_consumer_tag, manual_ack: true) do |*args|
@@ -262,7 +262,7 @@ describe Hutch::Broker do
262
262
  args.first == ''
263
263
  args.last == arguments
264
264
  end
265
- broker.queue('test', arguments)
265
+ broker.queue('test', arguments: arguments)
266
266
  end
267
267
  end
268
268
 
@@ -49,6 +49,44 @@ describe Hutch::Config do
49
49
  context 'sets value in user config hash' do
50
50
  it { is_expected.to eq(new_value) }
51
51
  end
52
+
53
+ context 'type casting' do
54
+ context 'number attributes' do
55
+ before { Hutch::Config.set(:heartbeat, new_value) }
56
+ subject(:value) { Hutch::Config.user_config[:heartbeat] }
57
+
58
+ let(:new_value) { "0" }
59
+
60
+
61
+ specify 'casts values to integers' do
62
+ expect(value).to eq 0
63
+ end
64
+ end
65
+ end
66
+
67
+ context 'boolean attributes' do
68
+ before { Hutch::Config.set(:autoload_rails, new_value) }
69
+ subject(:value) { Hutch::Config.user_config[:autoload_rails] }
70
+
71
+ let(:new_value) { "t" }
72
+
73
+
74
+ specify 'casts values to booleans' do
75
+ expect(value).to eq true
76
+ end
77
+ end
78
+
79
+ context 'string attributes' do
80
+ before { Hutch::Config.set(:mq_exchange_type, new_value) }
81
+ subject(:value) { Hutch::Config.user_config[:mq_exchange_type] }
82
+
83
+ let(:new_value) { 1 }
84
+
85
+
86
+ specify 'does not perform any typecasting' do
87
+ expect(value).to eq new_value
88
+ end
89
+ end
52
90
  end
53
91
 
54
92
  context 'for invalid attributes' do
@@ -28,17 +28,30 @@ describe Hutch::Consumer do
28
28
  ComplexConsumer
29
29
  end
30
30
 
31
- let(:consumer_with_custom_queue_options) do
32
- unless defined? ConsumerWithCustomQueueOptions
33
- class ConsumerWithCustomQueueOptions
31
+ let(:consumer_using_quorum_queue) do
32
+ unless defined? ConsumerUsingQuorumQueue
33
+ class ConsumerUsingQuorumQueue
34
34
  include Hutch::Consumer
35
35
  consume 'hutch.test1'
36
36
  arguments foo: :bar
37
- lazy_queue
37
+
38
38
  quorum_queue
39
39
  end
40
40
  end
41
- ConsumerWithCustomQueueOptions
41
+ ConsumerUsingQuorumQueue
42
+ end
43
+
44
+ let(:consumer_using_classic_queue) do
45
+ unless defined? ConsumerUsingLazyQueue
46
+ class ConsumerUsingLazyQueue
47
+ include Hutch::Consumer
48
+ consume 'hutch.test1'
49
+ arguments foo: :bar
50
+ lazy_queue
51
+ classic_queue
52
+ end
53
+ end
54
+ ConsumerUsingLazyQueue
42
55
  end
43
56
 
44
57
  describe 'module inclusion' do
@@ -84,26 +97,33 @@ describe Hutch::Consumer do
84
97
  end
85
98
  end
86
99
 
87
- describe '.lazy_queue' do
88
- it 'does not use lazy mode by default' do
89
- expect(simple_consumer.queue_mode).to eq('default')
100
+ describe 'default queue mode' do
101
+ it 'does not specify any mode by default' do
102
+ expect(simple_consumer.queue_mode).to eq(nil)
103
+ expect(simple_consumer.queue_type).to eq(nil)
90
104
  end
105
+ end
91
106
 
107
+ describe '.lazy_queue' do
92
108
  context 'when queue mode has been set explicitly to lazy' do
93
109
  it 'sets queue mode to lazy' do
94
- expect(consumer_with_custom_queue_options.queue_mode).to eq('lazy')
110
+ expect(consumer_using_classic_queue.queue_mode).to eq('lazy')
95
111
  end
96
112
  end
97
113
  end
98
114
 
99
- describe '.quorum_queue' do
100
- it 'does not have quorum type by default' do
101
- expect(simple_consumer.queue_type).to eq('classic')
115
+ describe '.classic_queue' do
116
+ context 'when queue type has been set explicitly to classic' do
117
+ it 'sets queue type to classic' do
118
+ expect(consumer_using_classic_queue.queue_type).to eq('classic')
119
+ end
102
120
  end
121
+ end
103
122
 
123
+ describe '.quorum_queue' do
104
124
  context 'when queue type has been set explicitly to quorum' do
105
125
  it 'sets queue type to quorum' do
106
- expect(consumer_with_custom_queue_options.queue_type).to eq('quorum')
126
+ expect(consumer_using_quorum_queue.queue_type).to eq('quorum')
107
127
  end
108
128
 
109
129
  it 'accepts initial group size as an option' do
@@ -125,34 +145,26 @@ describe Hutch::Consumer do
125
145
  end
126
146
 
127
147
  describe '.get_arguments' do
128
-
129
148
  context 'when defined' do
130
149
  it { expect(complex_consumer.get_arguments).to include(foo: :bar) }
131
150
  end
132
151
 
133
- context 'when not defined' do
134
- it 'has the default values for queue custom options' do
135
- expect(simple_consumer.get_arguments).to have_key('x-queue-mode')
136
- .and have_key('x-queue-type')
137
- end
138
- end
139
-
140
152
  context 'when queue is lazy' do
141
153
  it 'has the x-queue-mode argument set to lazy' do
142
- expect(consumer_with_custom_queue_options.get_arguments['x-queue-mode'])
154
+ expect(consumer_using_classic_queue.get_arguments['x-queue-mode'])
143
155
  .to eq('lazy')
144
156
  end
145
157
  end
146
158
 
147
159
  context "when queue's type is quorum" do
148
- let(:arguments) { consumer_with_custom_queue_options.get_arguments }
160
+ let(:arguments) { consumer_using_quorum_queue.get_arguments }
149
161
  it 'has the x-queue-type argument set to quorum' do
150
162
  expect(arguments['x-queue-type']).to eq('quorum')
151
163
  expect(arguments).to_not have_key('x-quorum-initial-group-size')
152
164
  end
153
165
 
154
166
  it 'has the x-quorum-initial-group-size argument set to quorum' do
155
- consumer_with_custom_queue_options.quorum_queue(initial_group_size: 5)
167
+ consumer_using_quorum_queue.quorum_queue(initial_group_size: 5)
156
168
  expect(arguments['x-queue-type']).to eq('quorum')
157
169
  expect(arguments['x-quorum-initial-group-size']).to eq(5)
158
170
  end
@@ -0,0 +1,55 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "spec_helper"
4
+
5
+ describe Hutch::ErrorHandlers::Bugsnag do
6
+ let(:error_handler) { described_class.new }
7
+
8
+ before do
9
+ Bugsnag.configure do |bugsnag|
10
+ bugsnag.api_key = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
11
+ end
12
+ end
13
+
14
+ describe "#handle" do
15
+ let(:error) do
16
+ begin
17
+ raise "Stuff went wrong"
18
+ rescue RuntimeError => err
19
+ err
20
+ end
21
+ end
22
+
23
+ it "logs the error to Bugsnag" do
24
+ message_id = "1"
25
+ properties = OpenStruct.new(message_id: message_id)
26
+ payload = "{}"
27
+ consumer = double
28
+ ex = error
29
+ message = {
30
+ payload: payload,
31
+ consumer: consumer
32
+ }
33
+
34
+ expect(::Bugsnag).to receive(:notify).with(ex).and_call_original
35
+ expect_any_instance_of(::Bugsnag::Report).to receive(:add_tab).with(:hutch, message)
36
+ error_handler.handle(properties, payload, consumer, ex)
37
+ end
38
+ end
39
+
40
+ describe "#handle_setup_exception" do
41
+ let(:error) do
42
+ begin
43
+ raise "Stuff went wrong"
44
+ rescue RuntimeError => err
45
+ err
46
+ end
47
+ end
48
+
49
+ it "logs the error to Bugsnag" do
50
+ ex = error
51
+ expect(::Bugsnag).to receive(:notify).with(ex)
52
+ error_handler.handle_setup_exception(ex)
53
+ end
54
+ end
55
+ end
@@ -0,0 +1,37 @@
1
+ require 'spec_helper'
2
+
3
+ describe Hutch::ErrorHandlers::SentryRaven do
4
+ let(:error_handler) { Hutch::ErrorHandlers::SentryRaven.new }
5
+
6
+ describe '#handle' do
7
+ let(:properties) { OpenStruct.new(message_id: "1") }
8
+ let(:payload) { "{}" }
9
+ let(:error) do
10
+ begin
11
+ raise "Stuff went wrong"
12
+ rescue RuntimeError => err
13
+ err
14
+ end
15
+ end
16
+
17
+ it "logs the error to Sentry" do
18
+ expect(Raven).to receive(:capture_exception).with(error, extra: { payload: payload })
19
+ error_handler.handle(properties, payload, double, error)
20
+ end
21
+ end
22
+
23
+ describe '#handle_setup_exception' do
24
+ let(:error) do
25
+ begin
26
+ raise "Stuff went wrong during setup"
27
+ rescue RuntimeError => err
28
+ err
29
+ end
30
+ end
31
+
32
+ it "logs the error to Sentry" do
33
+ expect(Raven).to receive(:capture_exception).with(error)
34
+ error_handler.handle_setup_exception(error)
35
+ end
36
+ end
37
+ end
@@ -15,7 +15,8 @@ describe Hutch::ErrorHandlers::Sentry do
15
15
  end
16
16
 
17
17
  it "logs the error to Sentry" do
18
- expect(Raven).to receive(:capture_exception).with(error, extra: { payload: payload })
18
+ expect(::Sentry).to receive(:capture_exception).with(error).and_call_original
19
+
19
20
  error_handler.handle(properties, payload, double, error)
20
21
  end
21
22
  end
@@ -30,7 +31,8 @@ describe Hutch::ErrorHandlers::Sentry do
30
31
  end
31
32
 
32
33
  it "logs the error to Sentry" do
33
- expect(Raven).to receive(:capture_exception).with(error)
34
+ expect(::Sentry).to receive(:capture_exception).with(error).and_call_original
35
+
34
36
  error_handler.handle_setup_exception(error)
35
37
  end
36
38
  end
@@ -0,0 +1,44 @@
1
+ require 'spec_helper'
2
+
3
+ RSpec.describe Hutch::Tracers::Datadog do
4
+ describe "#handle" do
5
+ subject(:handle) { tracer.handle(message) }
6
+
7
+ let(:tracer) { described_class.new(klass) }
8
+ let(:klass) do
9
+ Class.new do
10
+ attr_reader :message
11
+
12
+ def initialize
13
+ @message = nil
14
+ end
15
+
16
+ def class
17
+ OpenStruct.new(name: 'ClassName')
18
+ end
19
+
20
+ def process(message)
21
+ @message = message
22
+ end
23
+ end.new
24
+ end
25
+ let(:message) { double(:message) }
26
+
27
+ before do
28
+ allow(Datadog.tracer).to receive(:trace).and_call_original
29
+ end
30
+
31
+ it 'uses Datadog tracer' do
32
+ handle
33
+
34
+ expect(Datadog.tracer).to have_received(:trace).with('ClassName',
35
+ hash_including(service: 'hutch', span_type: 'rabbitmq'))
36
+ end
37
+
38
+ it 'processes the message' do
39
+ expect {
40
+ handle
41
+ }.to change { klass.message }.from(nil).to(message)
42
+ end
43
+ end
44
+ end
@@ -4,7 +4,7 @@ require 'hutch/worker'
4
4
  describe Hutch::Worker do
5
5
  let(:consumer) { double('Consumer', routing_keys: %w( a b c ),
6
6
  get_queue_name: 'consumer', get_arguments: {},
7
- get_serializer: nil) }
7
+ get_options: {}, get_serializer: nil) }
8
8
  let(:consumers) { [consumer, double('Consumer')] }
9
9
  let(:broker) { Hutch::Broker.new }
10
10
  let(:setup_procs) { Array.new(2) { Proc.new {} } }
@@ -35,7 +35,7 @@ describe Hutch::Worker do
35
35
  before { allow(broker).to receive_messages(queue: queue, bind_queue: nil) }
36
36
 
37
37
  it 'creates a queue' do
38
- expect(broker).to receive(:queue).with(consumer.get_queue_name, consumer.get_arguments).and_return(queue)
38
+ expect(broker).to receive(:queue).with(consumer.get_queue_name, consumer.get_options).and_return(queue)
39
39
  worker.setup_queue(consumer)
40
40
  end
41
41
 
metadata CHANGED
@@ -1,14 +1,15 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: hutch
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.28.0
4
+ version: 1.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Harry Marr
8
- autorequire:
8
+ - Michael Klishin
9
+ autorequire:
9
10
  bindir: bin
10
11
  cert_chain: []
11
- date: 2020-03-17 00:00:00.000000000 Z
12
+ date: 2022-03-18 00:00:00.000000000 Z
12
13
  dependencies:
13
14
  - !ruby/object:Gem::Dependency
14
15
  name: bunny
@@ -16,20 +17,20 @@ dependencies:
16
17
  requirements:
17
18
  - - ">="
18
19
  - !ruby/object:Gem::Version
19
- version: '2.14'
20
+ version: '2.19'
20
21
  - - "<"
21
22
  - !ruby/object:Gem::Version
22
- version: '2.16'
23
+ version: '3.0'
23
24
  type: :runtime
24
25
  prerelease: false
25
26
  version_requirements: !ruby/object:Gem::Requirement
26
27
  requirements:
27
28
  - - ">="
28
29
  - !ruby/object:Gem::Version
29
- version: '2.14'
30
+ version: '2.19'
30
31
  - - "<"
31
32
  - !ruby/object:Gem::Version
32
- version: '2.16'
33
+ version: '3.0'
33
34
  - !ruby/object:Gem::Dependency
34
35
  name: carrot-top
35
36
  requirement: !ruby/object:Gem::Requirement
@@ -50,14 +51,14 @@ dependencies:
50
51
  requirements:
51
52
  - - "~>"
52
53
  - !ruby/object:Gem::Version
53
- version: '1.14'
54
+ version: '1.15'
54
55
  type: :runtime
55
56
  prerelease: false
56
57
  version_requirements: !ruby/object:Gem::Requirement
57
58
  requirements:
58
59
  - - "~>"
59
60
  - !ruby/object:Gem::Version
60
- version: '1.14'
61
+ version: '1.15'
61
62
  - !ruby/object:Gem::Dependency
62
63
  name: activesupport
63
64
  requirement: !ruby/object:Gem::Requirement
@@ -67,7 +68,7 @@ dependencies:
67
68
  version: '4.2'
68
69
  - - "<"
69
70
  - !ruby/object:Gem::Version
70
- version: '7'
71
+ version: '8'
71
72
  type: :runtime
72
73
  prerelease: false
73
74
  version_requirements: !ruby/object:Gem::Requirement
@@ -77,19 +78,18 @@ dependencies:
77
78
  version: '4.2'
78
79
  - - "<"
79
80
  - !ruby/object:Gem::Version
80
- version: '7'
81
+ version: '8'
81
82
  description: Hutch is a Ruby library for enabling asynchronous inter-service communication
82
- using RabbitMQ.
83
+ using RabbitMQ
83
84
  email:
84
- - developers@gocardless.com
85
85
  executables:
86
86
  - hutch
87
87
  extensions: []
88
88
  extra_rdoc_files: []
89
89
  files:
90
+ - ".github/workflows/test.yml"
90
91
  - ".gitignore"
91
92
  - ".rspec"
92
- - ".travis.yml"
93
93
  - ".yardopts"
94
94
  - CHANGELOG.md
95
95
  - Gemfile
@@ -98,6 +98,7 @@ files:
98
98
  - README.md
99
99
  - Rakefile
100
100
  - bin/ci/before_build.sh
101
+ - bin/ci/before_build_docker.sh
101
102
  - bin/ci/install_on_debian.sh
102
103
  - bin/hutch
103
104
  - examples/consumer.rb
@@ -116,10 +117,12 @@ files:
116
117
  - lib/hutch/error_handlers.rb
117
118
  - lib/hutch/error_handlers/airbrake.rb
118
119
  - lib/hutch/error_handlers/base.rb
120
+ - lib/hutch/error_handlers/bugsnag.rb
119
121
  - lib/hutch/error_handlers/honeybadger.rb
120
122
  - lib/hutch/error_handlers/logger.rb
121
123
  - lib/hutch/error_handlers/rollbar.rb
122
124
  - lib/hutch/error_handlers/sentry.rb
125
+ - lib/hutch/error_handlers/sentry_raven.rb
123
126
  - lib/hutch/exceptions.rb
124
127
  - lib/hutch/logging.rb
125
128
  - lib/hutch/message.rb
@@ -127,6 +130,7 @@ files:
127
130
  - lib/hutch/serializers/identity.rb
128
131
  - lib/hutch/serializers/json.rb
129
132
  - lib/hutch/tracers.rb
133
+ - lib/hutch/tracers/datadog.rb
130
134
  - lib/hutch/tracers/newrelic.rb
131
135
  - lib/hutch/tracers/null_tracer.rb
132
136
  - lib/hutch/version.rb
@@ -139,13 +143,16 @@ files:
139
143
  - spec/hutch/config_spec.rb
140
144
  - spec/hutch/consumer_spec.rb
141
145
  - spec/hutch/error_handlers/airbrake_spec.rb
146
+ - spec/hutch/error_handlers/bugsnag_spec.rb
142
147
  - spec/hutch/error_handlers/honeybadger_spec.rb
143
148
  - spec/hutch/error_handlers/logger_spec.rb
144
149
  - spec/hutch/error_handlers/rollbar_spec.rb
150
+ - spec/hutch/error_handlers/sentry_raven_spec.rb
145
151
  - spec/hutch/error_handlers/sentry_spec.rb
146
152
  - spec/hutch/logger_spec.rb
147
153
  - spec/hutch/message_spec.rb
148
154
  - spec/hutch/serializers/json_spec.rb
155
+ - spec/hutch/tracers/datadog_spec.rb
149
156
  - spec/hutch/waiter_spec.rb
150
157
  - spec/hutch/worker_spec.rb
151
158
  - spec/hutch_spec.rb
@@ -159,11 +166,11 @@ files:
159
166
  - templates/default/method_details/text/settings.erb
160
167
  - templates/default/module/html/settings.erb
161
168
  - templates/default/module/setup.rb
162
- homepage: https://github.com/gocardless/hutch
169
+ homepage: https://github.com/ruby-amqp/hutch
163
170
  licenses:
164
171
  - MIT
165
172
  metadata: {}
166
- post_install_message:
173
+ post_install_message:
167
174
  rdoc_options: []
168
175
  require_paths:
169
176
  - lib
@@ -178,23 +185,26 @@ required_rubygems_version: !ruby/object:Gem::Requirement
178
185
  - !ruby/object:Gem::Version
179
186
  version: '0'
180
187
  requirements: []
181
- rubygems_version: 3.0.3
182
- signing_key:
188
+ rubygems_version: 3.1.4
189
+ signing_key:
183
190
  specification_version: 4
184
- summary: Easy inter-service communication using RabbitMQ.
191
+ summary: Opinionated asynchronous inter-service communication using RabbitMQ
185
192
  test_files:
186
193
  - spec/hutch/broker_spec.rb
187
194
  - spec/hutch/cli_spec.rb
188
195
  - spec/hutch/config_spec.rb
189
196
  - spec/hutch/consumer_spec.rb
190
197
  - spec/hutch/error_handlers/airbrake_spec.rb
198
+ - spec/hutch/error_handlers/bugsnag_spec.rb
191
199
  - spec/hutch/error_handlers/honeybadger_spec.rb
192
200
  - spec/hutch/error_handlers/logger_spec.rb
193
201
  - spec/hutch/error_handlers/rollbar_spec.rb
202
+ - spec/hutch/error_handlers/sentry_raven_spec.rb
194
203
  - spec/hutch/error_handlers/sentry_spec.rb
195
204
  - spec/hutch/logger_spec.rb
196
205
  - spec/hutch/message_spec.rb
197
206
  - spec/hutch/serializers/json_spec.rb
207
+ - spec/hutch/tracers/datadog_spec.rb
198
208
  - spec/hutch/waiter_spec.rb
199
209
  - spec/hutch/worker_spec.rb
200
210
  - spec/hutch_spec.rb