hutch 0.21.0-java → 0.25.0-java

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.
Files changed (55) hide show
  1. checksums.yaml +5 -5
  2. data/.gitignore +3 -0
  3. data/.rspec +1 -0
  4. data/.travis.yml +11 -12
  5. data/.yardopts +5 -0
  6. data/CHANGELOG.md +118 -1
  7. data/Gemfile +15 -4
  8. data/Guardfile +13 -4
  9. data/README.md +274 -24
  10. data/Rakefile +8 -1
  11. data/hutch.gemspec +6 -7
  12. data/lib/hutch.rb +11 -8
  13. data/lib/hutch/adapters/march_hare.rb +1 -1
  14. data/lib/hutch/broker.rb +113 -110
  15. data/lib/hutch/cli.rb +42 -11
  16. data/lib/hutch/config.rb +209 -59
  17. data/lib/hutch/error_handlers.rb +1 -0
  18. data/lib/hutch/error_handlers/airbrake.rb +44 -16
  19. data/lib/hutch/error_handlers/base.rb +15 -0
  20. data/lib/hutch/error_handlers/honeybadger.rb +33 -18
  21. data/lib/hutch/error_handlers/logger.rb +12 -6
  22. data/lib/hutch/error_handlers/opbeat.rb +30 -0
  23. data/lib/hutch/error_handlers/sentry.rb +14 -6
  24. data/lib/hutch/logging.rb +5 -5
  25. data/lib/hutch/publisher.rb +75 -0
  26. data/lib/hutch/tracers.rb +1 -0
  27. data/lib/hutch/tracers/opbeat.rb +37 -0
  28. data/lib/hutch/version.rb +1 -1
  29. data/lib/hutch/waiter.rb +104 -0
  30. data/lib/hutch/worker.rb +50 -66
  31. data/lib/yard-settings/handler.rb +38 -0
  32. data/lib/yard-settings/yard-settings.rb +2 -0
  33. data/spec/hutch/broker_spec.rb +162 -77
  34. data/spec/hutch/cli_spec.rb +16 -3
  35. data/spec/hutch/config_spec.rb +83 -22
  36. data/spec/hutch/error_handlers/airbrake_spec.rb +25 -10
  37. data/spec/hutch/error_handlers/honeybadger_spec.rb +24 -2
  38. data/spec/hutch/error_handlers/logger_spec.rb +14 -1
  39. data/spec/hutch/error_handlers/opbeat_spec.rb +37 -0
  40. data/spec/hutch/error_handlers/sentry_spec.rb +18 -1
  41. data/spec/hutch/logger_spec.rb +12 -6
  42. data/spec/hutch/waiter_spec.rb +51 -0
  43. data/spec/hutch/worker_spec.rb +33 -4
  44. data/spec/spec_helper.rb +7 -5
  45. data/spec/tracers/opbeat_spec.rb +44 -0
  46. data/templates/default/class/html/settings.erb +0 -0
  47. data/templates/default/class/setup.rb +4 -0
  48. data/templates/default/fulldoc/html/css/hutch.css +13 -0
  49. data/templates/default/layout/html/setup.rb +7 -0
  50. data/templates/default/method_details/html/settings.erb +5 -0
  51. data/templates/default/method_details/setup.rb +4 -0
  52. data/templates/default/method_details/text/settings.erb +0 -0
  53. data/templates/default/module/html/settings.erb +40 -0
  54. data/templates/default/module/setup.rb +4 -0
  55. metadata +41 -38
@@ -7,7 +7,19 @@ describe Hutch::Worker do
7
7
  get_serializer: nil) }
8
8
  let(:consumers) { [consumer, double('Consumer')] }
9
9
  let(:broker) { Hutch::Broker.new }
10
- subject(:worker) { Hutch::Worker.new(broker, consumers) }
10
+ let(:setup_procs) { Array.new(2) { Proc.new {} } }
11
+ subject(:worker) { Hutch::Worker.new(broker, consumers, setup_procs) }
12
+
13
+ describe ".#run" do
14
+ it "calls each setup proc" do
15
+ setup_procs.each { |prc| expect(prc).to receive(:call) }
16
+ allow(worker).to receive(:setup_queues)
17
+ allow(Hutch::Waiter).to receive(:wait_until_signaled)
18
+ allow(broker).to receive(:stop)
19
+
20
+ worker.run
21
+ end
22
+ end
11
23
 
12
24
  describe '#setup_queues' do
13
25
  it 'sets up queues for each of the consumers' do
@@ -20,7 +32,6 @@ describe Hutch::Worker do
20
32
 
21
33
  describe '#setup_queue' do
22
34
  let(:queue) { double('Queue', bind: nil, subscribe: nil) }
23
- before { allow(worker).to receive_messages(consumer_queue: queue) }
24
35
  before { allow(broker).to receive_messages(queue: queue, bind_queue: nil) }
25
36
 
26
37
  it 'creates a queue' do
@@ -34,9 +45,27 @@ describe Hutch::Worker do
34
45
  end
35
46
 
36
47
  it 'sets up a subscription' do
37
- expect(queue).to receive(:subscribe).with(manual_ack: true)
48
+ expect(queue).to receive(:subscribe).with(consumer_tag: %r(^hutch\-.{36}$), manual_ack: true)
38
49
  worker.setup_queue(consumer)
39
50
  end
51
+
52
+ context 'with a configured consumer tag prefix' do
53
+ before { Hutch::Config.set(:consumer_tag_prefix, 'appname') }
54
+
55
+ it 'sets up a subscription with the configured tag prefix' do
56
+ expect(queue).to receive(:subscribe).with(consumer_tag: %r(^appname\-.{36}$), manual_ack: true)
57
+ worker.setup_queue(consumer)
58
+ end
59
+ end
60
+
61
+ context 'with a configured consumer tag prefix that is too long' do
62
+ let(:maximum_size) { 255 - SecureRandom.uuid.size - 1 }
63
+ before { Hutch::Config.set(:consumer_tag_prefix, 'a'.*(maximum_size + 1)) }
64
+
65
+ it 'raises an error' do
66
+ expect { worker.setup_queue(consumer) }.to raise_error(/Tag must be 255 bytes long at most/)
67
+ end
68
+ end
40
69
  end
41
70
 
42
71
  describe '#handle_message' do
@@ -68,7 +97,7 @@ describe Hutch::Worker do
68
97
  it 'requeues the message' do
69
98
  allow(consumer_instance).to receive(:process).and_raise('failed')
70
99
  requeuer = double
71
- allow(requeuer).to receive(:handle).ordered { |delivery_info, properties, broker, e|
100
+ allow(requeuer).to receive(:handle) { |delivery_info, properties, broker, e|
72
101
  broker.requeue delivery_info.delivery_tag
73
102
  true
74
103
  }
@@ -13,8 +13,10 @@ require 'raven'
13
13
  require 'hutch'
14
14
  require 'logger'
15
15
 
16
+ # set logger to be a null logger
17
+ Hutch::Logging.logger = Logger.new(File::NULL)
18
+
16
19
  RSpec.configure do |config|
17
- config.before(:all) { Hutch::Config.log_level = Logger::FATAL }
18
20
  config.raise_errors_for_deprecations!
19
21
 
20
22
  if defined?(JRUBY_VERSION)
@@ -22,6 +24,10 @@ RSpec.configure do |config|
22
24
  else
23
25
  config.filter_run_excluding adapter: :march_hare
24
26
  end
27
+
28
+ config.mock_with :rspec do |mocks|
29
+ mocks.verify_partial_doubles = true
30
+ end
25
31
  end
26
32
 
27
33
  # Constants (classes, etc) defined within a block passed to this method
@@ -34,7 +40,3 @@ ensure
34
40
  Object.send(:remove_const, constant)
35
41
  end
36
42
  end
37
-
38
- def deep_copy(obj)
39
- Marshal.load(Marshal.dump(obj))
40
- end
@@ -0,0 +1,44 @@
1
+ require 'hutch/message'
2
+ require 'hutch/serializers/identity'
3
+ require 'hutch/tracers'
4
+
5
+ RSpec.describe Hutch::Tracers::Opbeat do
6
+ let(:consumer) { double('the-consumer') }
7
+
8
+ subject(:tracer) { described_class.new(consumer) }
9
+
10
+ let(:message) do
11
+ Hutch::Message.new(double('the-delivery-info', routing_key: 'foo.bar',
12
+ exchange: 'foo'),
13
+ double('the-properties', message_id: 'the-id',
14
+ timestamp: 'the-time'),
15
+ double('the-payload', to_s: 'the-body'),
16
+ Hutch::Serializers::Identity)
17
+ end
18
+
19
+ it 'formats messages as extra information' do
20
+ expected_extra = {
21
+ body: 'the-body',
22
+ message_id: 'the-id',
23
+ timestamp: 'the-time',
24
+ routing_key: 'foo.bar'
25
+ }
26
+ expect(Opbeat).to receive(:transaction).with(anything,
27
+ 'messaging.hutch',
28
+ extra: expected_extra) {
29
+ double('done-callback', done: true)
30
+ }
31
+
32
+ tracer.handle(message)
33
+ end
34
+
35
+ it 'presents consumer class name as Opbeat tracing signature' do
36
+ expect(Opbeat).to receive(:transaction).with(consumer.class.name,
37
+ 'messaging.hutch',
38
+ anything) {
39
+ double('done-callback', done: true)
40
+ }
41
+
42
+ tracer.handle(message)
43
+ end
44
+ end
@@ -0,0 +1,4 @@
1
+ def init
2
+ super
3
+ sections.push :settings
4
+ end
@@ -0,0 +1,13 @@
1
+ .settings {
2
+ border-spacing: 2.5rem;
3
+ border-collapse: collapse;
4
+ }
5
+
6
+ .settings thead th {
7
+ text-align: left;
8
+ }
9
+
10
+ .settings thead th,
11
+ .settings tbody td {
12
+ padding: .5em 1em;
13
+ }
@@ -0,0 +1,7 @@
1
+ def init
2
+ super
3
+ end
4
+
5
+ def stylesheets
6
+ super + %w(css/hutch.css)
7
+ end
@@ -0,0 +1,5 @@
1
+ <% if object['custom_field'] %>
2
+ <p>
3
+ <%= object['custom_field'] %>
4
+ </p>
5
+ <% end %>
@@ -0,0 +1,4 @@
1
+ def init
2
+ super
3
+ sections.last.place(:settings).after(:source)
4
+ end
@@ -0,0 +1,40 @@
1
+ <% if object['setting_rows'] %>
2
+ <h2>
3
+ Configuration
4
+ </h2>
5
+
6
+ <div class="tags">
7
+ <table border="1" class="settings">
8
+ <thead>
9
+ <tr>
10
+ <th>
11
+ Setting name
12
+ </th>
13
+ <th>
14
+ Default value
15
+ </th>
16
+ <th>
17
+ Type
18
+ </th>
19
+ <th>
20
+ ENV variable
21
+ </th>
22
+ <th>
23
+ Description
24
+ </th>
25
+ </tr>
26
+ </thead>
27
+ <tbody>
28
+ <% for setting in object['setting_rows'] %>
29
+ <tr>
30
+ <td><tt><%= resolve_links "{Hutch::Config##{setting[:name]} #{setting[:name]}}" %></tt></td>
31
+ <td><%= setting[:default_value] %></td>
32
+ <td><%= setting[:type] %></td>
33
+ <td><tt>HUTCH_<%= setting[:name].upcase %></tt></td>
34
+ <td><%= html_markup_markdown setting[:first_line_of_description] %></td>
35
+ </tr>
36
+ <% end %>
37
+ </tbody>
38
+ </table>
39
+ </div>
40
+ <% end %>
@@ -0,0 +1,4 @@
1
+ def init
2
+ super
3
+ sections.place(:settings).before(:children)
4
+ end
metadata CHANGED
@@ -1,21 +1,21 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: hutch
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.21.0
4
+ version: 0.25.0
5
5
  platform: java
6
6
  authors:
7
7
  - Harry Marr
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-03-03 00:00:00.000000000 Z
11
+ date: 2018-01-17 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  requirement: !ruby/object:Gem::Requirement
15
15
  requirements:
16
16
  - - ">="
17
17
  - !ruby/object:Gem::Version
18
- version: 2.16.0
18
+ version: 3.0.0
19
19
  name: march_hare
20
20
  prerelease: false
21
21
  type: :runtime
@@ -23,7 +23,7 @@ dependencies:
23
23
  requirements:
24
24
  - - ">="
25
25
  - !ruby/object:Gem::Version
26
- version: 2.16.0
26
+ version: 3.0.0
27
27
  - !ruby/object:Gem::Dependency
28
28
  requirement: !ruby/object:Gem::Requirement
29
29
  requirements:
@@ -43,7 +43,7 @@ dependencies:
43
43
  requirements:
44
44
  - - "~>"
45
45
  - !ruby/object:Gem::Version
46
- version: 1.11.2
46
+ version: '1.12'
47
47
  name: multi_json
48
48
  prerelease: false
49
49
  type: :runtime
@@ -51,13 +51,16 @@ dependencies:
51
51
  requirements:
52
52
  - - "~>"
53
53
  - !ruby/object:Gem::Version
54
- version: 1.11.2
54
+ version: '1.12'
55
55
  - !ruby/object:Gem::Dependency
56
56
  requirement: !ruby/object:Gem::Requirement
57
57
  requirements:
58
58
  - - ">="
59
59
  - !ruby/object:Gem::Version
60
- version: '3.0'
60
+ version: '4.2'
61
+ - - "<"
62
+ - !ruby/object:Gem::Version
63
+ version: '6'
61
64
  name: activesupport
62
65
  prerelease: false
63
66
  type: :runtime
@@ -65,36 +68,12 @@ dependencies:
65
68
  requirements:
66
69
  - - ">="
67
70
  - !ruby/object:Gem::Version
68
- version: '3.0'
69
- - !ruby/object:Gem::Dependency
70
- requirement: !ruby/object:Gem::Requirement
71
- requirements:
72
- - - "~>"
71
+ version: '4.2'
72
+ - - "<"
73
73
  - !ruby/object:Gem::Version
74
- version: '3.0'
75
- name: rspec
76
- prerelease: false
77
- type: :development
78
- version_requirements: !ruby/object:Gem::Requirement
79
- requirements:
80
- - - "~>"
81
- - !ruby/object:Gem::Version
82
- version: '3.0'
83
- - !ruby/object:Gem::Dependency
84
- requirement: !ruby/object:Gem::Requirement
85
- requirements:
86
- - - "~>"
87
- - !ruby/object:Gem::Version
88
- version: 0.7.1
89
- name: simplecov
90
- prerelease: false
91
- type: :development
92
- version_requirements: !ruby/object:Gem::Requirement
93
- requirements:
94
- - - "~>"
95
- - !ruby/object:Gem::Version
96
- version: 0.7.1
97
- description: Hutch is a Ruby library for enabling asynchronous inter-service communication using RabbitMQ.
74
+ version: '6'
75
+ description: Hutch is a Ruby library for enabling asynchronous inter-service communication
76
+ using RabbitMQ.
98
77
  email:
99
78
  - developers@gocardless.com
100
79
  executables:
@@ -103,7 +82,9 @@ extensions: []
103
82
  extra_rdoc_files: []
104
83
  files:
105
84
  - ".gitignore"
85
+ - ".rspec"
106
86
  - ".travis.yml"
87
+ - ".yardopts"
107
88
  - CHANGELOG.md
108
89
  - Gemfile
109
90
  - Guardfile
@@ -126,19 +107,26 @@ files:
126
107
  - lib/hutch/consumer.rb
127
108
  - lib/hutch/error_handlers.rb
128
109
  - lib/hutch/error_handlers/airbrake.rb
110
+ - lib/hutch/error_handlers/base.rb
129
111
  - lib/hutch/error_handlers/honeybadger.rb
130
112
  - lib/hutch/error_handlers/logger.rb
113
+ - lib/hutch/error_handlers/opbeat.rb
131
114
  - lib/hutch/error_handlers/sentry.rb
132
115
  - lib/hutch/exceptions.rb
133
116
  - lib/hutch/logging.rb
134
117
  - lib/hutch/message.rb
118
+ - lib/hutch/publisher.rb
135
119
  - lib/hutch/serializers/identity.rb
136
120
  - lib/hutch/serializers/json.rb
137
121
  - lib/hutch/tracers.rb
138
122
  - lib/hutch/tracers/newrelic.rb
139
123
  - lib/hutch/tracers/null_tracer.rb
124
+ - lib/hutch/tracers/opbeat.rb
140
125
  - lib/hutch/version.rb
126
+ - lib/hutch/waiter.rb
141
127
  - lib/hutch/worker.rb
128
+ - lib/yard-settings/handler.rb
129
+ - lib/yard-settings/yard-settings.rb
142
130
  - spec/hutch/broker_spec.rb
143
131
  - spec/hutch/cli_spec.rb
144
132
  - spec/hutch/config_spec.rb
@@ -146,13 +134,25 @@ files:
146
134
  - spec/hutch/error_handlers/airbrake_spec.rb
147
135
  - spec/hutch/error_handlers/honeybadger_spec.rb
148
136
  - spec/hutch/error_handlers/logger_spec.rb
137
+ - spec/hutch/error_handlers/opbeat_spec.rb
149
138
  - spec/hutch/error_handlers/sentry_spec.rb
150
139
  - spec/hutch/logger_spec.rb
151
140
  - spec/hutch/message_spec.rb
152
141
  - spec/hutch/serializers/json_spec.rb
142
+ - spec/hutch/waiter_spec.rb
153
143
  - spec/hutch/worker_spec.rb
154
144
  - spec/hutch_spec.rb
155
145
  - spec/spec_helper.rb
146
+ - spec/tracers/opbeat_spec.rb
147
+ - templates/default/class/html/settings.erb
148
+ - templates/default/class/setup.rb
149
+ - templates/default/fulldoc/html/css/hutch.css
150
+ - templates/default/layout/html/setup.rb
151
+ - templates/default/method_details/html/settings.erb
152
+ - templates/default/method_details/setup.rb
153
+ - templates/default/method_details/text/settings.erb
154
+ - templates/default/module/html/settings.erb
155
+ - templates/default/module/setup.rb
156
156
  homepage: https://github.com/gocardless/hutch
157
157
  licenses:
158
158
  - MIT
@@ -165,7 +165,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
165
165
  requirements:
166
166
  - - ">="
167
167
  - !ruby/object:Gem::Version
168
- version: '0'
168
+ version: '2.2'
169
169
  required_rubygems_version: !ruby/object:Gem::Requirement
170
170
  requirements:
171
171
  - - ">="
@@ -173,7 +173,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
173
173
  version: '0'
174
174
  requirements: []
175
175
  rubyforge_project:
176
- rubygems_version: 2.4.8
176
+ rubygems_version: 2.6.13
177
177
  signing_key:
178
178
  specification_version: 4
179
179
  summary: Easy inter-service communication using RabbitMQ.
@@ -185,10 +185,13 @@ test_files:
185
185
  - spec/hutch/error_handlers/airbrake_spec.rb
186
186
  - spec/hutch/error_handlers/honeybadger_spec.rb
187
187
  - spec/hutch/error_handlers/logger_spec.rb
188
+ - spec/hutch/error_handlers/opbeat_spec.rb
188
189
  - spec/hutch/error_handlers/sentry_spec.rb
189
190
  - spec/hutch/logger_spec.rb
190
191
  - spec/hutch/message_spec.rb
191
192
  - spec/hutch/serializers/json_spec.rb
193
+ - spec/hutch/waiter_spec.rb
192
194
  - spec/hutch/worker_spec.rb
193
195
  - spec/hutch_spec.rb
194
196
  - spec/spec_helper.rb
197
+ - spec/tracers/opbeat_spec.rb