stoplight 2.0.0 → 2.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +18 -0
- data/lib/stoplight.rb +1 -0
- data/lib/stoplight/failure.rb +1 -1
- data/lib/stoplight/light/runnable.rb +4 -5
- data/lib/stoplight/notifier/honeybadger.rb +2 -1
- data/lib/stoplight/notifier/raven.rb +40 -0
- data/lib/stoplight/version.rb +1 -1
- data/spec/stoplight/failure_spec.rb +2 -1
- data/spec/stoplight/light/runnable_spec.rb +6 -3
- data/spec/stoplight/notifier/honeybadger_spec.rb +16 -7
- data/spec/stoplight/notifier/raven_spec.rb +90 -0
- metadata +22 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c744702c57c79bb96de6ba01eeb2c4adcc65eadd
|
4
|
+
data.tar.gz: face2e75b1ac458693f3d160a33d534dd1e0b226
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 258fd3aa57d2f49e4b049d98d83c899f80d47cdbd354436b854b56959aabd0e21f9d34e25fc607dc7d189dcdb8896e5b4cbdb6825f27435d3cd4e40654096179
|
7
|
+
data.tar.gz: 8369dc5c2f5355ed9936eea5d8999bdfa3965a891dbf62150dc1f748196aa46f87bec0e5201a473f5e72c6c0ef008e3f135cd8170bc5f72c1023784b862a62a7
|
data/README.md
CHANGED
@@ -33,6 +33,7 @@ Check out [stoplight-admin][] for controlling your stoplights.
|
|
33
33
|
- [HipChat](#hipchat)
|
34
34
|
- [Honeybadger](#honeybadger)
|
35
35
|
- [Logger](#logger)
|
36
|
+
- [Sentry](#sentry)
|
36
37
|
- [Slack](#slack)
|
37
38
|
- [Rails](#rails-1)
|
38
39
|
- [Advanced usage](#advanced-usage)
|
@@ -356,6 +357,22 @@ Stoplight::Light.default_notifiers += [notifier]
|
|
356
357
|
# => [#<Stoplight::Notifier::IO:...>, #<Stoplight::Notifier::Logger:...>]
|
357
358
|
```
|
358
359
|
|
360
|
+
#### Sentry
|
361
|
+
|
362
|
+
Make sure you have [the Sentry gem][] (`~> 1.2`) installed before configuring
|
363
|
+
Stoplight.
|
364
|
+
|
365
|
+
``` rb
|
366
|
+
require 'sentry-raven'
|
367
|
+
# => true
|
368
|
+
configuration = Raven::Configuration.new
|
369
|
+
# => #<Raven::Configuration:...>
|
370
|
+
notifier = Stoplight::Notifier::Raven.new(configuration)
|
371
|
+
# => #<Stoplight::Notifier::Raven:...>
|
372
|
+
Stoplight::Light.default_notifiers += [notifier]
|
373
|
+
# => [#<Stoplight::Notifier::IO:...>, #<Stoplight::Notifier::Raven:...>]
|
374
|
+
```
|
375
|
+
|
359
376
|
#### Slack
|
360
377
|
|
361
378
|
Make sure you have [the Slack gem][] (`~> 1.3`) installed before configuring
|
@@ -476,6 +493,7 @@ Stoplight is licensed under [the MIT License][].
|
|
476
493
|
[the HipChat gem]: https://rubygems.org/gems/hipchat
|
477
494
|
[the Honeybadger gem]: https://rubygems.org/gems/honeybadger
|
478
495
|
[the Logger class]: http://ruby-doc.org/stdlib-2.2.3/libdoc/logger/rdoc/Logger.html
|
496
|
+
[the Sentry gem]: https://rubygems.org/gems/sentry-raven
|
479
497
|
[the Slack gem]: https://rubygems.org/gems/slack-notifier
|
480
498
|
[@camdez]: https://github.com/camdez
|
481
499
|
[@tfausak]: https://github.com/tfausak
|
data/lib/stoplight.rb
CHANGED
@@ -24,6 +24,7 @@ require 'stoplight/notifier/hip_chat'
|
|
24
24
|
require 'stoplight/notifier/honeybadger'
|
25
25
|
require 'stoplight/notifier/io'
|
26
26
|
require 'stoplight/notifier/logger'
|
27
|
+
require 'stoplight/notifier/raven'
|
27
28
|
require 'stoplight/notifier/slack'
|
28
29
|
|
29
30
|
require 'stoplight/default'
|
data/lib/stoplight/failure.rb
CHANGED
@@ -8,11 +8,10 @@ module Stoplight
|
|
8
8
|
failures, state = failures_and_state
|
9
9
|
failure = failures.first
|
10
10
|
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
when failure && Time.new - failure.time >= cool_off_time
|
11
|
+
if state == State::LOCKED_GREEN then Color::GREEN
|
12
|
+
elsif state == State::LOCKED_RED then Color::RED
|
13
|
+
elsif failures.size < threshold then Color::GREEN
|
14
|
+
elsif failure && Time.now - failure.time >= cool_off_time
|
16
15
|
Color::YELLOW
|
17
16
|
else Color::RED
|
18
17
|
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
|
3
|
+
module Stoplight
|
4
|
+
module Notifier
|
5
|
+
# @see Base
|
6
|
+
class Raven < Base
|
7
|
+
DEFAULT_OPTIONS = {
|
8
|
+
extra: {}
|
9
|
+
}.freeze
|
10
|
+
|
11
|
+
# @return [::Raven::Configuration]
|
12
|
+
attr_reader :configuration
|
13
|
+
# @return [Proc]
|
14
|
+
attr_reader :formatter
|
15
|
+
# @return [Hash{Symbol => Object}]
|
16
|
+
attr_reader :options
|
17
|
+
|
18
|
+
# @param api_key [String]
|
19
|
+
# @param formatter [Proc, nil]
|
20
|
+
# @param options [Hash{Symbol => Object}]
|
21
|
+
# @option options [Hash] :extra
|
22
|
+
def initialize(configuration, formatter = nil, options = {})
|
23
|
+
@configuration = configuration
|
24
|
+
@formatter = formatter || Default::FORMATTER
|
25
|
+
@options = DEFAULT_OPTIONS.merge(options)
|
26
|
+
end
|
27
|
+
|
28
|
+
def notify(light, from_color, to_color, error)
|
29
|
+
message = formatter.call(light, from_color, to_color, error)
|
30
|
+
|
31
|
+
h = options.merge(
|
32
|
+
configuration: configuration,
|
33
|
+
backtrace: (error.backtrace if error)
|
34
|
+
)
|
35
|
+
::Raven.capture_message(message, h)
|
36
|
+
message
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
data/lib/stoplight/version.rb
CHANGED
@@ -10,7 +10,8 @@ RSpec.describe Stoplight::Failure do
|
|
10
10
|
let(:json) do
|
11
11
|
JSON.generate(
|
12
12
|
error: { class: error_class, message: error_message },
|
13
|
-
time: time.strftime('%Y-%m-%dT%H:%M:%S.%N%:z')
|
13
|
+
time: time.strftime('%Y-%m-%dT%H:%M:%S.%N%:z')
|
14
|
+
)
|
14
15
|
end
|
15
16
|
|
16
17
|
it 'is a class' do
|
@@ -51,14 +51,16 @@ RSpec.describe Stoplight::Light::Runnable do
|
|
51
51
|
subject.data_store.record_failure(subject, failure)
|
52
52
|
end
|
53
53
|
other = Stoplight::Failure.new(
|
54
|
-
error.class.name, error.message, Time.new - subject.cool_off_time
|
54
|
+
error.class.name, error.message, Time.new - subject.cool_off_time
|
55
|
+
)
|
55
56
|
subject.data_store.record_failure(subject, other)
|
56
57
|
expect(subject.color).to eql(Stoplight::Color::YELLOW)
|
57
58
|
end
|
58
59
|
|
59
60
|
it 'is red when the least recent failure is old' do
|
60
61
|
other = Stoplight::Failure.new(
|
61
|
-
error.class.name, error.message, Time.new - subject.cool_off_time
|
62
|
+
error.class.name, error.message, Time.new - subject.cool_off_time
|
63
|
+
)
|
62
64
|
subject.data_store.record_failure(subject, other)
|
63
65
|
(subject.threshold - 1).times do
|
64
66
|
subject.data_store.record_failure(subject, failure)
|
@@ -200,7 +202,8 @@ RSpec.describe Stoplight::Light::Runnable do
|
|
200
202
|
end
|
201
203
|
|
202
204
|
other = Stoplight::Failure.new(
|
203
|
-
error.class.name, error.message, time - subject.cool_off_time
|
205
|
+
error.class.name, error.message, time - subject.cool_off_time
|
206
|
+
)
|
204
207
|
subject.data_store.record_failure(subject, other)
|
205
208
|
end
|
206
209
|
|
@@ -18,7 +18,8 @@ RSpec.describe Stoplight::Notifier::Honeybadger do
|
|
18
18
|
describe '#formatter' do
|
19
19
|
it 'is initially the default' do
|
20
20
|
expect(described_class.new(nil).formatter).to eql(
|
21
|
-
Stoplight::Default::FORMATTER
|
21
|
+
Stoplight::Default::FORMATTER
|
22
|
+
)
|
22
23
|
end
|
23
24
|
|
24
25
|
it 'reads the formatter' do
|
@@ -30,13 +31,15 @@ RSpec.describe Stoplight::Notifier::Honeybadger do
|
|
30
31
|
describe '#options' do
|
31
32
|
it 'is initially the default' do
|
32
33
|
expect(described_class.new(nil).options).to eql(
|
33
|
-
Stoplight::Notifier::Honeybadger::DEFAULT_OPTIONS
|
34
|
+
Stoplight::Notifier::Honeybadger::DEFAULT_OPTIONS
|
35
|
+
)
|
34
36
|
end
|
35
37
|
|
36
38
|
it 'reads the options' do
|
37
39
|
options = { key: :value }
|
38
40
|
expect(described_class.new(nil, nil, options).options).to eql(
|
39
|
-
Stoplight::Notifier::Honeybadger::DEFAULT_OPTIONS.merge(options)
|
41
|
+
Stoplight::Notifier::Honeybadger::DEFAULT_OPTIONS.merge(options)
|
42
|
+
)
|
40
43
|
end
|
41
44
|
end
|
42
45
|
|
@@ -57,23 +60,29 @@ RSpec.describe Stoplight::Notifier::Honeybadger do
|
|
57
60
|
error = nil
|
58
61
|
message = notifier.formatter.call(light, from_color, to_color, error)
|
59
62
|
expect(notifier.notify(light, from_color, to_color, error)).to eql(
|
60
|
-
message
|
63
|
+
message
|
64
|
+
)
|
61
65
|
expect(Honeybadger).to have_received(:notify).with(
|
62
66
|
hash_including(
|
63
67
|
api_key: api_key,
|
64
|
-
error_message: message
|
68
|
+
error_message: message
|
69
|
+
)
|
70
|
+
)
|
65
71
|
end
|
66
72
|
|
67
73
|
it 'returns the message with an error' do
|
68
74
|
error = ZeroDivisionError.new('divided by 0')
|
69
75
|
message = notifier.formatter.call(light, from_color, to_color, error)
|
70
76
|
expect(notifier.notify(light, from_color, to_color, error)).to eql(
|
71
|
-
message
|
77
|
+
message
|
78
|
+
)
|
72
79
|
expect(Honeybadger).to have_received(:notify).with(
|
73
80
|
hash_including(
|
74
81
|
api_key: api_key,
|
75
82
|
error_message: message,
|
76
|
-
backtrace: error.backtrace
|
83
|
+
backtrace: error.backtrace
|
84
|
+
)
|
85
|
+
)
|
77
86
|
end
|
78
87
|
end
|
79
88
|
end
|
@@ -0,0 +1,90 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
|
3
|
+
require 'spec_helper'
|
4
|
+
|
5
|
+
# require 'sentry-raven'
|
6
|
+
module Raven
|
7
|
+
class Configuration
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
RSpec.describe Stoplight::Notifier::Raven do
|
12
|
+
it 'is a class' do
|
13
|
+
expect(described_class).to be_a(Class)
|
14
|
+
end
|
15
|
+
|
16
|
+
it 'is a subclass of Base' do
|
17
|
+
expect(described_class).to be < Stoplight::Notifier::Base
|
18
|
+
end
|
19
|
+
|
20
|
+
describe '#formatter' do
|
21
|
+
it 'is initially the default' do
|
22
|
+
expect(described_class.new(nil).formatter).to eql(
|
23
|
+
Stoplight::Default::FORMATTER
|
24
|
+
)
|
25
|
+
end
|
26
|
+
|
27
|
+
it 'reads the formatter' do
|
28
|
+
formatter = proc {}
|
29
|
+
expect(described_class.new(nil, formatter).formatter).to eql(formatter)
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
describe '#options' do
|
34
|
+
it 'is initially the default' do
|
35
|
+
expect(described_class.new(nil).options).to eql(
|
36
|
+
Stoplight::Notifier::Raven::DEFAULT_OPTIONS
|
37
|
+
)
|
38
|
+
end
|
39
|
+
|
40
|
+
it 'reads the options' do
|
41
|
+
options = { key: :value }
|
42
|
+
expect(described_class.new(nil, nil, options).options).to eql(
|
43
|
+
Stoplight::Notifier::Raven::DEFAULT_OPTIONS.merge(options)
|
44
|
+
)
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
describe '#notify' do
|
49
|
+
let(:light) { Stoplight::Light.new(name, &code) }
|
50
|
+
let(:name) { ('a'..'z').to_a.shuffle.join }
|
51
|
+
let(:code) { -> {} }
|
52
|
+
let(:from_color) { Stoplight::Color::GREEN }
|
53
|
+
let(:to_color) { Stoplight::Color::RED }
|
54
|
+
let(:notifier) { described_class.new(configuration) }
|
55
|
+
let(:configuration) { instance_double(::Raven::Configuration) }
|
56
|
+
|
57
|
+
before do
|
58
|
+
allow(::Raven).to receive(:capture_message)
|
59
|
+
end
|
60
|
+
|
61
|
+
it 'returns the message' do
|
62
|
+
error = nil
|
63
|
+
message = notifier.formatter.call(light, from_color, to_color, error)
|
64
|
+
expect(notifier.notify(light, from_color, to_color, error)).to eql(
|
65
|
+
message
|
66
|
+
)
|
67
|
+
expect(::Raven).to have_received(:capture_message).with(
|
68
|
+
message,
|
69
|
+
hash_including(
|
70
|
+
configuration: configuration
|
71
|
+
)
|
72
|
+
)
|
73
|
+
end
|
74
|
+
|
75
|
+
it 'returns the message with an error' do
|
76
|
+
error = ZeroDivisionError.new('divided by 0')
|
77
|
+
message = notifier.formatter.call(light, from_color, to_color, error)
|
78
|
+
expect(notifier.notify(light, from_color, to_color, error)).to eql(
|
79
|
+
message
|
80
|
+
)
|
81
|
+
expect(::Raven).to have_received(:capture_message).with(
|
82
|
+
message,
|
83
|
+
hash_including(
|
84
|
+
configuration: configuration,
|
85
|
+
backtrace: error.backtrace
|
86
|
+
)
|
87
|
+
)
|
88
|
+
end
|
89
|
+
end
|
90
|
+
end
|
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: 2.
|
4
|
+
version: 2.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Cameron Desautels
|
@@ -10,7 +10,7 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date: 2016-04
|
13
|
+
date: 2016-08-04 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: concurrent-ruby
|
@@ -110,6 +110,20 @@ dependencies:
|
|
110
110
|
- - "~>"
|
111
111
|
- !ruby/object:Gem::Version
|
112
112
|
version: '2.5'
|
113
|
+
- !ruby/object:Gem::Dependency
|
114
|
+
name: sentry-raven
|
115
|
+
requirement: !ruby/object:Gem::Requirement
|
116
|
+
requirements:
|
117
|
+
- - "~>"
|
118
|
+
- !ruby/object:Gem::Version
|
119
|
+
version: '1.2'
|
120
|
+
type: :development
|
121
|
+
prerelease: false
|
122
|
+
version_requirements: !ruby/object:Gem::Requirement
|
123
|
+
requirements:
|
124
|
+
- - "~>"
|
125
|
+
- !ruby/object:Gem::Version
|
126
|
+
version: '1.2'
|
113
127
|
- !ruby/object:Gem::Dependency
|
114
128
|
name: rake
|
115
129
|
requirement: !ruby/object:Gem::Requirement
|
@@ -158,14 +172,14 @@ dependencies:
|
|
158
172
|
requirements:
|
159
173
|
- - "~>"
|
160
174
|
- !ruby/object:Gem::Version
|
161
|
-
version: 0.
|
175
|
+
version: 0.40.0
|
162
176
|
type: :development
|
163
177
|
prerelease: false
|
164
178
|
version_requirements: !ruby/object:Gem::Requirement
|
165
179
|
requirements:
|
166
180
|
- - "~>"
|
167
181
|
- !ruby/object:Gem::Version
|
168
|
-
version: 0.
|
182
|
+
version: 0.40.0
|
169
183
|
- !ruby/object:Gem::Dependency
|
170
184
|
name: slack-notifier
|
171
185
|
requirement: !ruby/object:Gem::Requirement
|
@@ -225,6 +239,7 @@ files:
|
|
225
239
|
- lib/stoplight/notifier/honeybadger.rb
|
226
240
|
- lib/stoplight/notifier/io.rb
|
227
241
|
- lib/stoplight/notifier/logger.rb
|
242
|
+
- lib/stoplight/notifier/raven.rb
|
228
243
|
- lib/stoplight/notifier/slack.rb
|
229
244
|
- lib/stoplight/state.rb
|
230
245
|
- lib/stoplight/version.rb
|
@@ -246,6 +261,7 @@ files:
|
|
246
261
|
- spec/stoplight/notifier/honeybadger_spec.rb
|
247
262
|
- spec/stoplight/notifier/io_spec.rb
|
248
263
|
- spec/stoplight/notifier/logger_spec.rb
|
264
|
+
- spec/stoplight/notifier/raven_spec.rb
|
249
265
|
- spec/stoplight/notifier/slack_spec.rb
|
250
266
|
- spec/stoplight/notifier_spec.rb
|
251
267
|
- spec/stoplight/state_spec.rb
|
@@ -271,7 +287,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
271
287
|
version: '0'
|
272
288
|
requirements: []
|
273
289
|
rubyforge_project:
|
274
|
-
rubygems_version: 2.6.
|
290
|
+
rubygems_version: 2.6.4
|
275
291
|
signing_key:
|
276
292
|
specification_version: 4
|
277
293
|
summary: Traffic control for code.
|
@@ -294,6 +310,7 @@ test_files:
|
|
294
310
|
- spec/stoplight/notifier/honeybadger_spec.rb
|
295
311
|
- spec/stoplight/notifier/io_spec.rb
|
296
312
|
- spec/stoplight/notifier/logger_spec.rb
|
313
|
+
- spec/stoplight/notifier/raven_spec.rb
|
297
314
|
- spec/stoplight/notifier/slack_spec.rb
|
298
315
|
- spec/stoplight/notifier_spec.rb
|
299
316
|
- spec/stoplight/state_spec.rb
|