stoplight 3.0.0 → 4.0.0

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 (65) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +176 -198
  3. data/lib/stoplight/builder.rb +68 -0
  4. data/lib/stoplight/circuit_breaker.rb +92 -0
  5. data/lib/stoplight/configurable.rb +95 -0
  6. data/lib/stoplight/configuration.rb +126 -0
  7. data/lib/stoplight/data_store/base.rb +9 -0
  8. data/lib/stoplight/data_store/memory.rb +46 -5
  9. data/lib/stoplight/data_store/redis.rb +75 -6
  10. data/lib/stoplight/default.rb +2 -0
  11. data/lib/stoplight/error.rb +1 -0
  12. data/lib/stoplight/light/deprecated.rb +44 -0
  13. data/lib/stoplight/light/lockable.rb +45 -0
  14. data/lib/stoplight/light/runnable.rb +34 -16
  15. data/lib/stoplight/light.rb +69 -63
  16. data/lib/stoplight/rspec/generic_notifier.rb +42 -0
  17. data/lib/stoplight/rspec.rb +3 -0
  18. data/lib/stoplight/version.rb +1 -1
  19. data/lib/stoplight.rb +33 -10
  20. data/spec/spec_helper.rb +7 -0
  21. data/spec/stoplight/builder_spec.rb +165 -0
  22. data/spec/stoplight/circuit_breaker_spec.rb +35 -0
  23. data/spec/stoplight/configurable_spec.rb +25 -0
  24. data/spec/stoplight/data_store/base_spec.rb +7 -0
  25. data/spec/stoplight/data_store/memory_spec.rb +12 -123
  26. data/spec/stoplight/data_store/redis_spec.rb +28 -129
  27. data/spec/stoplight/error_spec.rb +10 -0
  28. data/spec/stoplight/light/lockable_spec.rb +93 -0
  29. data/spec/stoplight/light/runnable_spec.rb +12 -233
  30. data/spec/stoplight/light_spec.rb +4 -28
  31. data/spec/stoplight/notifier/generic_spec.rb +35 -35
  32. data/spec/stoplight/notifier/io_spec.rb +1 -0
  33. data/spec/stoplight/notifier/logger_spec.rb +3 -0
  34. data/spec/stoplight_spec.rb +17 -6
  35. data/spec/support/configurable.rb +69 -0
  36. data/spec/support/data_store/base/clear_failures.rb +18 -0
  37. data/spec/support/data_store/base/clear_state.rb +20 -0
  38. data/spec/support/data_store/base/get_all.rb +44 -0
  39. data/spec/support/data_store/base/get_failures.rb +30 -0
  40. data/spec/support/data_store/base/get_state.rb +7 -0
  41. data/spec/support/data_store/base/names.rb +29 -0
  42. data/spec/support/data_store/base/record_failures.rb +70 -0
  43. data/spec/support/data_store/base/set_state.rb +15 -0
  44. data/spec/support/data_store/base/with_notification_lock.rb +27 -0
  45. data/spec/support/data_store/base.rb +21 -0
  46. data/spec/support/database_cleaner.rb +26 -0
  47. data/spec/support/exception_helpers.rb +9 -0
  48. data/spec/support/light/runnable/color.rb +79 -0
  49. data/spec/support/light/runnable/run.rb +247 -0
  50. data/spec/support/light/runnable.rb +4 -0
  51. metadata +56 -225
  52. data/lib/stoplight/notifier/bugsnag.rb +0 -37
  53. data/lib/stoplight/notifier/hip_chat.rb +0 -43
  54. data/lib/stoplight/notifier/honeybadger.rb +0 -44
  55. data/lib/stoplight/notifier/pagerduty.rb +0 -21
  56. data/lib/stoplight/notifier/raven.rb +0 -40
  57. data/lib/stoplight/notifier/rollbar.rb +0 -39
  58. data/lib/stoplight/notifier/slack.rb +0 -21
  59. data/spec/stoplight/notifier/bugsnag_spec.rb +0 -90
  60. data/spec/stoplight/notifier/hip_chat_spec.rb +0 -91
  61. data/spec/stoplight/notifier/honeybadger_spec.rb +0 -88
  62. data/spec/stoplight/notifier/pagerduty_spec.rb +0 -40
  63. data/spec/stoplight/notifier/raven_spec.rb +0 -90
  64. data/spec/stoplight/notifier/rollbar_spec.rb +0 -90
  65. data/spec/stoplight/notifier/slack_spec.rb +0 -46
@@ -0,0 +1,247 @@
1
+ # frozen_string_literal: true
2
+
3
+ RSpec.shared_examples 'Stoplight::Light::Runnable#run' do
4
+ let(:code) { -> { code_result } }
5
+ let(:code_result) { random_string }
6
+ let(:fallback) { ->(_) { fallback_result } }
7
+ let(:fallback_result) { random_string }
8
+ let(:name) { random_string }
9
+ let(:notifiers) { [notifier] }
10
+ let(:notifier) { Stoplight::Notifier::IO.new(io) }
11
+ let(:io) { StringIO.new }
12
+
13
+ before { light.with_notifiers(notifiers) }
14
+
15
+ shared_examples 'when the light is green' do
16
+ before { light.data_store.clear_failures(light) }
17
+
18
+ it 'runs the code' do
19
+ expect(run).to eql(code_result)
20
+ end
21
+
22
+ context 'with some failures' do
23
+ before { light.data_store.record_failure(light, failure) }
24
+
25
+ it 'clears the failures' do
26
+ run
27
+ expect(light.data_store.get_failures(light).size).to eql(0)
28
+ end
29
+ end
30
+
31
+ context 'when the code is failing' do
32
+ let(:code_result) { raise error }
33
+
34
+ it 're-raises the error' do
35
+ expect { run }.to raise_error(error.class)
36
+ end
37
+
38
+ it 'records the failure' do
39
+ expect(light.data_store.get_failures(light).size).to eql(0)
40
+ begin
41
+ run
42
+ rescue error.class
43
+ nil
44
+ end
45
+ expect(light.data_store.get_failures(light).size).to eql(1)
46
+ end
47
+
48
+ context 'when we did not send notifications yet' do
49
+ it 'notifies when transitioning to red' do
50
+ light.threshold.times do
51
+ expect(io.string).to eql('')
52
+ begin
53
+ run
54
+ rescue error.class
55
+ nil
56
+ end
57
+ end
58
+ expect(io.string).to_not eql('')
59
+ end
60
+ end
61
+
62
+ context 'when we already sent notifications' do
63
+ before do
64
+ light.data_store.with_notification_lock(light, Stoplight::Color::GREEN, Stoplight::Color::RED) {}
65
+ end
66
+
67
+ it 'does not send new notifications' do
68
+ light.threshold.times do
69
+ expect(io.string).to eql('')
70
+ begin
71
+ run
72
+ rescue error.class
73
+ nil
74
+ end
75
+ end
76
+ expect(io.string).to eql('')
77
+ end
78
+ end
79
+
80
+ it 'notifies when transitioning to red' do
81
+ light.threshold.times do
82
+ expect(io.string).to eql('')
83
+ begin
84
+ run
85
+ rescue error.class
86
+ nil
87
+ end
88
+ end
89
+ expect(io.string).to_not eql('')
90
+ end
91
+
92
+ context 'with an error handler' do
93
+ let(:result) do
94
+ run
95
+ expect(false).to be(true)
96
+ rescue error.class
97
+ expect(true).to be(true)
98
+ end
99
+
100
+ it 'records the failure when the handler does nothing' do
101
+ light.with_error_handler { |_error, _handler| }
102
+ expect { result }
103
+ .to change { light.data_store.get_failures(light).size }
104
+ .by(1)
105
+ end
106
+
107
+ it 'records the failure when the handler calls handle' do
108
+ light.with_error_handler { |error, handle| handle.call(error) }
109
+ expect { result }
110
+ .to change { light.data_store.get_failures(light).size }
111
+ .by(1)
112
+ end
113
+
114
+ it 'does not record the failure when the handler raises' do
115
+ light.with_error_handler { |error, _handle| raise error }
116
+ expect { result }
117
+ .to_not change { light.data_store.get_failures(light).size }
118
+ end
119
+ end
120
+
121
+ context 'with a fallback' do
122
+ before { light.with_fallback(&fallback) }
123
+
124
+ it 'runs the fallback' do
125
+ expect(run).to eql(fallback_result)
126
+ end
127
+
128
+ it 'passes the error to the fallback' do
129
+ light.with_fallback do |e|
130
+ expect(e).to eql(error)
131
+ fallback_result
132
+ end
133
+ expect(run).to eql(fallback_result)
134
+ end
135
+ end
136
+ end
137
+
138
+ context 'when the data store is failing' do
139
+ let(:error_notifier) { ->(_) {} }
140
+ let(:error) { StandardError.new('something went wrong') }
141
+
142
+ before do
143
+ expect(data_store).to receive(:clear_failures) { raise error }
144
+
145
+ light.with_error_notifier(&error_notifier)
146
+ end
147
+
148
+ it 'runs the code' do
149
+ expect(run).to eql(code_result)
150
+ end
151
+
152
+ it 'notifies about the error' do
153
+ has_notified = false
154
+ light.with_error_notifier do |e|
155
+ has_notified = true
156
+ expect(e).to eq(error)
157
+ end
158
+ run
159
+ expect(has_notified).to eql(true)
160
+ end
161
+ end
162
+ end
163
+
164
+ shared_examples 'when the light is yellow' do
165
+ let(:failure) { Stoplight::Failure.new(error.class.name, error.message, Time.new - light.cool_off_time) }
166
+ let(:failure2) { Stoplight::Failure.new(error.class.name, error.message, Time.new - light.cool_off_time - 10) }
167
+
168
+ before do
169
+ light.with_threshold(2)
170
+ light.data_store.record_failure(light, failure2)
171
+ light.data_store.record_failure(light, failure)
172
+ end
173
+
174
+ it 'runs the code' do
175
+ expect(run).to eql(code_result)
176
+ end
177
+
178
+ it 'notifies when transitioning to green' do
179
+ expect { run }
180
+ .to change(io, :string)
181
+ .from(be_empty)
182
+ .to(/Switching \w+ from red to green/)
183
+ end
184
+ end
185
+
186
+ shared_examples 'when the light is red' do
187
+ let(:other) do
188
+ Stoplight::Failure.new(error.class.name, error.message, Time.new - light.cool_off_time)
189
+ end
190
+
191
+ before do
192
+ light.with_threshold(2)
193
+ light.data_store.record_failure(light, other)
194
+ light.data_store.record_failure(light, failure)
195
+ end
196
+
197
+ it 'raises an error' do
198
+ expect { run }.to raise_error(Stoplight::Error::RedLight)
199
+ end
200
+
201
+ it 'uses the name as the error message' do
202
+ expect do
203
+ run
204
+ end.to raise_error(Stoplight::Error::RedLight, light.name)
205
+ end
206
+
207
+ context 'with a fallback' do
208
+ before { light.with_fallback(&fallback) }
209
+
210
+ it 'runs the fallback' do
211
+ expect(run).to eql(fallback_result)
212
+ end
213
+
214
+ it 'does not pass anything to the fallback' do
215
+ light.with_fallback do |e|
216
+ expect(e).to eql(nil)
217
+ fallback_result
218
+ end
219
+ expect(run).to eql(fallback_result)
220
+ end
221
+ end
222
+ end
223
+
224
+ context 'with code block' do
225
+ subject(:light) { Stoplight::Light.new(name) }
226
+
227
+ def run
228
+ light.run(&code)
229
+ end
230
+
231
+ it_behaves_like 'when the light is green'
232
+ it_behaves_like 'when the light is yellow'
233
+ it_behaves_like 'when the light is red'
234
+ end
235
+
236
+ context 'without code block' do
237
+ subject(:light) { Stoplight::Light.new(name, &code) }
238
+
239
+ def run
240
+ light.run
241
+ end
242
+
243
+ it_behaves_like 'when the light is green'
244
+ it_behaves_like 'when the light is yellow'
245
+ it_behaves_like 'when the light is red'
246
+ end
247
+ end
@@ -0,0 +1,4 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'runnable/color'
4
+ require_relative 'runnable/run'
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: stoplight
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.0.0
4
+ version: 4.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Cameron Desautels
@@ -10,218 +10,22 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2022-02-23 00:00:00.000000000 Z
13
+ date: 2023-08-18 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
- name: benchmark-ips
16
+ name: redlock
17
17
  requirement: !ruby/object:Gem::Requirement
18
18
  requirements:
19
19
  - - "~>"
20
20
  - !ruby/object:Gem::Version
21
- version: '2.3'
22
- type: :development
21
+ version: '1.0'
22
+ type: :runtime
23
23
  prerelease: false
24
24
  version_requirements: !ruby/object:Gem::Requirement
25
25
  requirements:
26
26
  - - "~>"
27
27
  - !ruby/object:Gem::Version
28
- version: '2.3'
29
- - !ruby/object:Gem::Dependency
30
- name: bugsnag
31
- requirement: !ruby/object:Gem::Requirement
32
- requirements:
33
- - - "~>"
34
- - !ruby/object:Gem::Version
35
- version: '4.0'
36
- type: :development
37
- prerelease: false
38
- version_requirements: !ruby/object:Gem::Requirement
39
- requirements:
40
- - - "~>"
41
- - !ruby/object:Gem::Version
42
- version: '4.0'
43
- - !ruby/object:Gem::Dependency
44
- name: fakeredis
45
- requirement: !ruby/object:Gem::Requirement
46
- requirements:
47
- - - "~>"
48
- - !ruby/object:Gem::Version
49
- version: '0.5'
50
- type: :development
51
- prerelease: false
52
- version_requirements: !ruby/object:Gem::Requirement
53
- requirements:
54
- - - "~>"
55
- - !ruby/object:Gem::Version
56
- version: '0.5'
57
- - !ruby/object:Gem::Dependency
58
- name: hipchat
59
- requirement: !ruby/object:Gem::Requirement
60
- requirements:
61
- - - "~>"
62
- - !ruby/object:Gem::Version
63
- version: '1.5'
64
- type: :development
65
- prerelease: false
66
- version_requirements: !ruby/object:Gem::Requirement
67
- requirements:
68
- - - "~>"
69
- - !ruby/object:Gem::Version
70
- version: '1.5'
71
- - !ruby/object:Gem::Dependency
72
- name: honeybadger
73
- requirement: !ruby/object:Gem::Requirement
74
- requirements:
75
- - - "~>"
76
- - !ruby/object:Gem::Version
77
- version: '2.5'
78
- type: :development
79
- prerelease: false
80
- version_requirements: !ruby/object:Gem::Requirement
81
- requirements:
82
- - - "~>"
83
- - !ruby/object:Gem::Version
84
- version: '2.5'
85
- - !ruby/object:Gem::Dependency
86
- name: pagerduty
87
- requirement: !ruby/object:Gem::Requirement
88
- requirements:
89
- - - "~>"
90
- - !ruby/object:Gem::Version
91
- version: 2.1.1
92
- type: :development
93
- prerelease: false
94
- version_requirements: !ruby/object:Gem::Requirement
95
- requirements:
96
- - - "~>"
97
- - !ruby/object:Gem::Version
98
- version: 2.1.1
99
- - !ruby/object:Gem::Dependency
100
- name: rake
101
- requirement: !ruby/object:Gem::Requirement
102
- requirements:
103
- - - "~>"
104
- - !ruby/object:Gem::Version
105
- version: '13.0'
106
- type: :development
107
- prerelease: false
108
- version_requirements: !ruby/object:Gem::Requirement
109
- requirements:
110
- - - "~>"
111
- - !ruby/object:Gem::Version
112
- version: '13.0'
113
- - !ruby/object:Gem::Dependency
114
- name: redis
115
- requirement: !ruby/object:Gem::Requirement
116
- requirements:
117
- - - "~>"
118
- - !ruby/object:Gem::Version
119
- version: '3.2'
120
- type: :development
121
- prerelease: false
122
- version_requirements: !ruby/object:Gem::Requirement
123
- requirements:
124
- - - "~>"
125
- - !ruby/object:Gem::Version
126
- version: '3.2'
127
- - !ruby/object:Gem::Dependency
128
- name: rspec
129
- requirement: !ruby/object:Gem::Requirement
130
- requirements:
131
- - - "~>"
132
- - !ruby/object:Gem::Version
133
- version: '3.3'
134
- type: :development
135
- prerelease: false
136
- version_requirements: !ruby/object:Gem::Requirement
137
- requirements:
138
- - - "~>"
139
- - !ruby/object:Gem::Version
140
- version: '3.3'
141
- - !ruby/object:Gem::Dependency
142
- name: rubocop
143
- requirement: !ruby/object:Gem::Requirement
144
- requirements:
145
- - - "~>"
146
- - !ruby/object:Gem::Version
147
- version: 1.0.0
148
- type: :development
149
- prerelease: false
150
- version_requirements: !ruby/object:Gem::Requirement
151
- requirements:
152
- - - "~>"
153
- - !ruby/object:Gem::Version
154
- version: 1.0.0
155
- - !ruby/object:Gem::Dependency
156
- name: sentry-raven
157
- requirement: !ruby/object:Gem::Requirement
158
- requirements:
159
- - - "~>"
160
- - !ruby/object:Gem::Version
161
- version: '1.2'
162
- type: :development
163
- prerelease: false
164
- version_requirements: !ruby/object:Gem::Requirement
165
- requirements:
166
- - - "~>"
167
- - !ruby/object:Gem::Version
168
- version: '1.2'
169
- - !ruby/object:Gem::Dependency
170
- name: simplecov
171
- requirement: !ruby/object:Gem::Requirement
172
- requirements:
173
- - - "~>"
174
- - !ruby/object:Gem::Version
175
- version: '0.21'
176
- type: :development
177
- prerelease: false
178
- version_requirements: !ruby/object:Gem::Requirement
179
- requirements:
180
- - - "~>"
181
- - !ruby/object:Gem::Version
182
- version: '0.21'
183
- - !ruby/object:Gem::Dependency
184
- name: simplecov-lcov
185
- requirement: !ruby/object:Gem::Requirement
186
- requirements:
187
- - - "~>"
188
- - !ruby/object:Gem::Version
189
- version: '0.8'
190
- type: :development
191
- prerelease: false
192
- version_requirements: !ruby/object:Gem::Requirement
193
- requirements:
194
- - - "~>"
195
- - !ruby/object:Gem::Version
196
- version: '0.8'
197
- - !ruby/object:Gem::Dependency
198
- name: slack-notifier
199
- requirement: !ruby/object:Gem::Requirement
200
- requirements:
201
- - - "~>"
202
- - !ruby/object:Gem::Version
203
- version: '1.3'
204
- type: :development
205
- prerelease: false
206
- version_requirements: !ruby/object:Gem::Requirement
207
- requirements:
208
- - - "~>"
209
- - !ruby/object:Gem::Version
210
- version: '1.3'
211
- - !ruby/object:Gem::Dependency
212
- name: timecop
213
- requirement: !ruby/object:Gem::Requirement
214
- requirements:
215
- - - "~>"
216
- - !ruby/object:Gem::Version
217
- version: '0.8'
218
- type: :development
219
- prerelease: false
220
- version_requirements: !ruby/object:Gem::Requirement
221
- requirements:
222
- - - "~>"
223
- - !ruby/object:Gem::Version
224
- version: '0.8'
28
+ version: '1.0'
225
29
  description: An implementation of the circuit breaker pattern.
226
30
  email:
227
31
  - camdez@gmail.com
@@ -235,7 +39,11 @@ files:
235
39
  - LICENSE.md
236
40
  - README.md
237
41
  - lib/stoplight.rb
42
+ - lib/stoplight/builder.rb
43
+ - lib/stoplight/circuit_breaker.rb
238
44
  - lib/stoplight/color.rb
45
+ - lib/stoplight/configurable.rb
46
+ - lib/stoplight/configuration.rb
239
47
  - lib/stoplight/data_store.rb
240
48
  - lib/stoplight/data_store/base.rb
241
49
  - lib/stoplight/data_store/memory.rb
@@ -244,23 +52,23 @@ files:
244
52
  - lib/stoplight/error.rb
245
53
  - lib/stoplight/failure.rb
246
54
  - lib/stoplight/light.rb
55
+ - lib/stoplight/light/deprecated.rb
56
+ - lib/stoplight/light/lockable.rb
247
57
  - lib/stoplight/light/runnable.rb
248
58
  - lib/stoplight/notifier.rb
249
59
  - lib/stoplight/notifier/base.rb
250
- - lib/stoplight/notifier/bugsnag.rb
251
60
  - lib/stoplight/notifier/generic.rb
252
- - lib/stoplight/notifier/hip_chat.rb
253
- - lib/stoplight/notifier/honeybadger.rb
254
61
  - lib/stoplight/notifier/io.rb
255
62
  - lib/stoplight/notifier/logger.rb
256
- - lib/stoplight/notifier/pagerduty.rb
257
- - lib/stoplight/notifier/raven.rb
258
- - lib/stoplight/notifier/rollbar.rb
259
- - lib/stoplight/notifier/slack.rb
63
+ - lib/stoplight/rspec.rb
64
+ - lib/stoplight/rspec/generic_notifier.rb
260
65
  - lib/stoplight/state.rb
261
66
  - lib/stoplight/version.rb
262
67
  - spec/spec_helper.rb
68
+ - spec/stoplight/builder_spec.rb
69
+ - spec/stoplight/circuit_breaker_spec.rb
263
70
  - spec/stoplight/color_spec.rb
71
+ - spec/stoplight/configurable_spec.rb
264
72
  - spec/stoplight/data_store/base_spec.rb
265
73
  - spec/stoplight/data_store/memory_spec.rb
266
74
  - spec/stoplight/data_store/redis_spec.rb
@@ -268,23 +76,33 @@ files:
268
76
  - spec/stoplight/default_spec.rb
269
77
  - spec/stoplight/error_spec.rb
270
78
  - spec/stoplight/failure_spec.rb
79
+ - spec/stoplight/light/lockable_spec.rb
271
80
  - spec/stoplight/light/runnable_spec.rb
272
81
  - spec/stoplight/light_spec.rb
273
82
  - spec/stoplight/notifier/base_spec.rb
274
- - spec/stoplight/notifier/bugsnag_spec.rb
275
83
  - spec/stoplight/notifier/generic_spec.rb
276
- - spec/stoplight/notifier/hip_chat_spec.rb
277
- - spec/stoplight/notifier/honeybadger_spec.rb
278
84
  - spec/stoplight/notifier/io_spec.rb
279
85
  - spec/stoplight/notifier/logger_spec.rb
280
- - spec/stoplight/notifier/pagerduty_spec.rb
281
- - spec/stoplight/notifier/raven_spec.rb
282
- - spec/stoplight/notifier/rollbar_spec.rb
283
- - spec/stoplight/notifier/slack_spec.rb
284
86
  - spec/stoplight/notifier_spec.rb
285
87
  - spec/stoplight/state_spec.rb
286
88
  - spec/stoplight/version_spec.rb
287
89
  - spec/stoplight_spec.rb
90
+ - spec/support/configurable.rb
91
+ - spec/support/data_store/base.rb
92
+ - spec/support/data_store/base/clear_failures.rb
93
+ - spec/support/data_store/base/clear_state.rb
94
+ - spec/support/data_store/base/get_all.rb
95
+ - spec/support/data_store/base/get_failures.rb
96
+ - spec/support/data_store/base/get_state.rb
97
+ - spec/support/data_store/base/names.rb
98
+ - spec/support/data_store/base/record_failures.rb
99
+ - spec/support/data_store/base/set_state.rb
100
+ - spec/support/data_store/base/with_notification_lock.rb
101
+ - spec/support/database_cleaner.rb
102
+ - spec/support/exception_helpers.rb
103
+ - spec/support/light/runnable.rb
104
+ - spec/support/light/runnable/color.rb
105
+ - spec/support/light/runnable/run.rb
288
106
  homepage: https://github.com/bolshakov/stoplight
289
107
  licenses:
290
108
  - MIT
@@ -297,20 +115,23 @@ required_ruby_version: !ruby/object:Gem::Requirement
297
115
  requirements:
298
116
  - - ">="
299
117
  - !ruby/object:Gem::Version
300
- version: '2.6'
118
+ version: 3.0.6
301
119
  required_rubygems_version: !ruby/object:Gem::Requirement
302
120
  requirements:
303
121
  - - ">="
304
122
  - !ruby/object:Gem::Version
305
123
  version: '0'
306
124
  requirements: []
307
- rubygems_version: 3.2.3
125
+ rubygems_version: 3.3.7
308
126
  signing_key:
309
127
  specification_version: 4
310
128
  summary: Traffic control for code.
311
129
  test_files:
312
130
  - spec/spec_helper.rb
131
+ - spec/stoplight/builder_spec.rb
132
+ - spec/stoplight/circuit_breaker_spec.rb
313
133
  - spec/stoplight/color_spec.rb
134
+ - spec/stoplight/configurable_spec.rb
314
135
  - spec/stoplight/data_store/base_spec.rb
315
136
  - spec/stoplight/data_store/memory_spec.rb
316
137
  - spec/stoplight/data_store/redis_spec.rb
@@ -318,20 +139,30 @@ test_files:
318
139
  - spec/stoplight/default_spec.rb
319
140
  - spec/stoplight/error_spec.rb
320
141
  - spec/stoplight/failure_spec.rb
142
+ - spec/stoplight/light/lockable_spec.rb
321
143
  - spec/stoplight/light/runnable_spec.rb
322
144
  - spec/stoplight/light_spec.rb
323
145
  - spec/stoplight/notifier/base_spec.rb
324
- - spec/stoplight/notifier/bugsnag_spec.rb
325
146
  - spec/stoplight/notifier/generic_spec.rb
326
- - spec/stoplight/notifier/hip_chat_spec.rb
327
- - spec/stoplight/notifier/honeybadger_spec.rb
328
147
  - spec/stoplight/notifier/io_spec.rb
329
148
  - spec/stoplight/notifier/logger_spec.rb
330
- - spec/stoplight/notifier/pagerduty_spec.rb
331
- - spec/stoplight/notifier/raven_spec.rb
332
- - spec/stoplight/notifier/rollbar_spec.rb
333
- - spec/stoplight/notifier/slack_spec.rb
334
149
  - spec/stoplight/notifier_spec.rb
335
150
  - spec/stoplight/state_spec.rb
336
151
  - spec/stoplight/version_spec.rb
337
152
  - spec/stoplight_spec.rb
153
+ - spec/support/configurable.rb
154
+ - spec/support/data_store/base/clear_failures.rb
155
+ - spec/support/data_store/base/clear_state.rb
156
+ - spec/support/data_store/base/get_all.rb
157
+ - spec/support/data_store/base/get_failures.rb
158
+ - spec/support/data_store/base/get_state.rb
159
+ - spec/support/data_store/base/names.rb
160
+ - spec/support/data_store/base/record_failures.rb
161
+ - spec/support/data_store/base/set_state.rb
162
+ - spec/support/data_store/base/with_notification_lock.rb
163
+ - spec/support/data_store/base.rb
164
+ - spec/support/database_cleaner.rb
165
+ - spec/support/exception_helpers.rb
166
+ - spec/support/light/runnable/color.rb
167
+ - spec/support/light/runnable/run.rb
168
+ - spec/support/light/runnable.rb
@@ -1,37 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Stoplight
4
- module Notifier
5
- # @see Base
6
- class Bugsnag < Base
7
- DEFAULT_OPTIONS = {
8
- severity: 'info'
9
- }.freeze
10
-
11
- StoplightStatusChange = Class.new(Error::Base)
12
-
13
- # @return [Proc]
14
- attr_reader :formatter
15
- # @return [::Bugsnag]
16
- attr_reader :bugsnag
17
- # @return [Hash{Symbol => Object}]
18
- attr_reader :options
19
-
20
- # @param bugsnag [::Bugsnag]
21
- # @param formatter [Proc, nil]
22
- # @param options [Hash{Symbol => Object}]
23
- # @option options [String] :severity
24
- def initialize(bugsnag, formatter = nil, options = {})
25
- @bugsnag = bugsnag
26
- @formatter = formatter || Default::FORMATTER
27
- @options = DEFAULT_OPTIONS.merge(options)
28
- end
29
-
30
- def notify(light, from_color, to_color, error)
31
- message = formatter.call(light, from_color, to_color, error)
32
- bugsnag.notify(StoplightStatusChange.new(message), options)
33
- message
34
- end
35
- end
36
- end
37
- end