stoplight 2.1.0 → 2.2.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.
- checksums.yaml +5 -5
- data/README.md +35 -4
- data/lib/stoplight.rb +2 -0
- data/lib/stoplight/data_store/memory.rb +16 -25
- data/lib/stoplight/data_store/redis.rb +3 -2
- data/lib/stoplight/failure.rb +14 -7
- data/lib/stoplight/notifier/pagerduty.rb +21 -0
- data/lib/stoplight/notifier/rollbar.rb +39 -0
- data/lib/stoplight/version.rb +1 -1
- data/spec/stoplight/data_store/memory_spec.rb +6 -0
- data/spec/stoplight/data_store/redis_spec.rb +6 -0
- data/spec/stoplight/default_spec.rb +1 -1
- data/spec/stoplight/failure_spec.rb +15 -0
- data/spec/stoplight/notifier/bugsnag_spec.rb +1 -3
- data/spec/stoplight/notifier/pagerduty_spec.rb +40 -0
- data/spec/stoplight/notifier/rollbar_spec.rb +90 -0
- metadata +46 -41
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: e26d25f913bb759dccd62f2b12576cbe51550753c3c6428fb16cdb6052559928
|
4
|
+
data.tar.gz: 6cbfd0ccd62da40cb335e671c8ba2d84348652e206520355fa651eb2276e16ea
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a186fc199cd54411996a65c369c687dc1165ecb2115699c72e6aa005f1b3d5b0da3b5f90402d2c49b12d73ca708628b09f5b9ba02e57c127ce89a33f8dc16cd2
|
7
|
+
data.tar.gz: 7ee5b81cad78ed7aaa7200aedf74cba3af8aff5b1e95940c572ca93bbefa28676ceb507ef04ce63bef28d9b6e7dcb2590653dd06704cf14b561653662c9fa30b
|
data/README.md
CHANGED
@@ -3,7 +3,6 @@
|
|
3
3
|
[![Version badge][]][version]
|
4
4
|
[![Build badge][]][build]
|
5
5
|
[![Coverage badge][]][coverage]
|
6
|
-
[![Grade badge][]][grade]
|
7
6
|
[![Climate badge][]][climate]
|
8
7
|
[![Dependencies badge][]][dependencies]
|
9
8
|
|
@@ -33,6 +32,8 @@ Check out [stoplight-admin][] for controlling your stoplights.
|
|
33
32
|
- [HipChat](#hipchat)
|
34
33
|
- [Honeybadger](#honeybadger)
|
35
34
|
- [Logger](#logger)
|
35
|
+
- [Pagerduty](#pagerduty)
|
36
|
+
- [Rollbar](#rollbar)
|
36
37
|
- [Sentry](#sentry)
|
37
38
|
- [Slack](#slack)
|
38
39
|
- [Rails](#rails-1)
|
@@ -205,7 +206,7 @@ The default threshold is `3`.
|
|
205
206
|
### Custom cool off time
|
206
207
|
|
207
208
|
Stoplights will automatically attempt to recover after a certain amount of
|
208
|
-
time. A light in the red state for longer than the cool
|
209
|
+
time. A light in the red state for longer than the cool off period will
|
209
210
|
transition to the yellow state. This cool off time is customizable.
|
210
211
|
|
211
212
|
``` rb
|
@@ -357,6 +358,36 @@ Stoplight::Light.default_notifiers += [notifier]
|
|
357
358
|
# => [#<Stoplight::Notifier::IO:...>, #<Stoplight::Notifier::Logger:...>]
|
358
359
|
```
|
359
360
|
|
361
|
+
#### Pagerduty
|
362
|
+
|
363
|
+
Make sure you have [the Pagerduty gem][] (`~> 2.1`) installed before configuring
|
364
|
+
Stoplight.
|
365
|
+
|
366
|
+
``` rb
|
367
|
+
require 'pagerduty'
|
368
|
+
# => true
|
369
|
+
pagerduty = Pagerduty.new('http://www.example.com/webhook-url')
|
370
|
+
# => #<Pagerduty:...>
|
371
|
+
notifier = Stoplight::Notifier::Pagerduty.new(pagerduty)
|
372
|
+
# => #<Stoplight::Notifier::Pagerduty:...>
|
373
|
+
Stoplight::Light.default_notifiers += [notifier]
|
374
|
+
# => [#<Stoplight::Notifier::IO:...>, #<Stoplight::Notifier::Pagerduty:...>]
|
375
|
+
```
|
376
|
+
|
377
|
+
#### Rollbar
|
378
|
+
|
379
|
+
Make sure you have [the Rollbar gem][] (`~> 2.0`) installed before configuring
|
380
|
+
Stoplight.
|
381
|
+
|
382
|
+
``` rb
|
383
|
+
require 'rollbar'
|
384
|
+
# => true
|
385
|
+
notifier = Stoplight::Notifier::Rollbar.new(Rollbar)
|
386
|
+
# => #<Stoplight::Notifier::Rollbar:...>
|
387
|
+
Stoplight::Light.default_notifiers += [notifier]
|
388
|
+
# => [#<Stoplight::Notifier::IO:...>, #<Stoplight::Notifier::Rollbar:...>]
|
389
|
+
```
|
390
|
+
|
360
391
|
#### Sentry
|
361
392
|
|
362
393
|
Make sure you have [the Sentry gem][] (`~> 1.2`) installed before configuring
|
@@ -477,8 +508,6 @@ Stoplight is licensed under [the MIT License][].
|
|
477
508
|
[build]: https://travis-ci.org/orgsync/stoplight
|
478
509
|
[Coverage badge]: https://img.shields.io/coveralls/orgsync/stoplight/master.svg?label=coverage
|
479
510
|
[coverage]: https://coveralls.io/r/orgsync/stoplight
|
480
|
-
[Grade badge]: https://img.shields.io/badge/grade-A-brightgreen.svg
|
481
|
-
[grade]: http://www.libgrader.com/libraries/ruby/stoplight
|
482
511
|
[Climate badge]: https://img.shields.io/codeclimate/github/orgsync/stoplight.svg?label=climate
|
483
512
|
[climate]: https://codeclimate.com/github/orgsync/stoplight
|
484
513
|
[Dependencies badge]: https://img.shields.io/gemnasium/orgsync/stoplight.svg?label=dependencies
|
@@ -493,8 +522,10 @@ Stoplight is licensed under [the MIT License][].
|
|
493
522
|
[the HipChat gem]: https://rubygems.org/gems/hipchat
|
494
523
|
[the Honeybadger gem]: https://rubygems.org/gems/honeybadger
|
495
524
|
[the Logger class]: http://ruby-doc.org/stdlib-2.2.3/libdoc/logger/rdoc/Logger.html
|
525
|
+
[the Rollbar gem]: https://rubygems.org/gems/rollbar
|
496
526
|
[the Sentry gem]: https://rubygems.org/gems/sentry-raven
|
497
527
|
[the Slack gem]: https://rubygems.org/gems/slack-notifier
|
528
|
+
[the Pagerduty gem]: https://rubygems.org/gems/pagerduty
|
498
529
|
[@camdez]: https://github.com/camdez
|
499
530
|
[@tfausak]: https://github.com/tfausak
|
500
531
|
[@orgsync]: https://github.com/OrgSync
|
data/lib/stoplight.rb
CHANGED
@@ -24,7 +24,9 @@ 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/pagerduty'
|
27
28
|
require 'stoplight/notifier/raven'
|
29
|
+
require 'stoplight/notifier/rollbar'
|
28
30
|
require 'stoplight/notifier/slack'
|
29
31
|
|
30
32
|
require 'stoplight/default'
|
@@ -1,62 +1,53 @@
|
|
1
1
|
# coding: utf-8
|
2
2
|
|
3
|
-
require '
|
3
|
+
require 'monitor'
|
4
4
|
|
5
5
|
module Stoplight
|
6
6
|
module DataStore
|
7
7
|
# @see Base
|
8
8
|
class Memory < Base
|
9
|
+
include MonitorMixin
|
10
|
+
|
9
11
|
def initialize
|
10
|
-
@failures =
|
11
|
-
@states =
|
12
|
-
|
12
|
+
@failures = Hash.new { |h, k| h[k] = [] }
|
13
|
+
@states = Hash.new { |h, k| h[k] = State::UNLOCKED }
|
14
|
+
super() # MonitorMixin
|
13
15
|
end
|
14
16
|
|
15
17
|
def names
|
16
|
-
|
18
|
+
synchronize { @failures.keys | @states.keys }
|
17
19
|
end
|
18
20
|
|
19
21
|
def get_all(light)
|
20
|
-
[
|
22
|
+
synchronize { [@failures[light.name], @states[light.name]] }
|
21
23
|
end
|
22
24
|
|
23
25
|
def get_failures(light)
|
24
|
-
|
26
|
+
synchronize { @failures[light.name] }
|
25
27
|
end
|
26
28
|
|
27
29
|
def record_failure(light, failure)
|
28
|
-
|
30
|
+
synchronize do
|
29
31
|
n = light.threshold - 1
|
30
|
-
failures =
|
31
|
-
|
32
|
-
failures.size
|
32
|
+
@failures[light.name] = @failures[light.name].first(n)
|
33
|
+
@failures[light.name].unshift(failure).size
|
33
34
|
end
|
34
35
|
end
|
35
36
|
|
36
37
|
def clear_failures(light)
|
37
|
-
|
38
|
+
synchronize { @failures.delete(light.name) }
|
38
39
|
end
|
39
40
|
|
40
41
|
def get_state(light)
|
41
|
-
|
42
|
+
synchronize { @states[light.name] }
|
42
43
|
end
|
43
44
|
|
44
45
|
def set_state(light, state)
|
45
|
-
|
46
|
+
synchronize { @states[light.name] = state }
|
46
47
|
end
|
47
48
|
|
48
49
|
def clear_state(light)
|
49
|
-
|
50
|
-
end
|
51
|
-
|
52
|
-
private
|
53
|
-
|
54
|
-
def all_failures
|
55
|
-
@failures
|
56
|
-
end
|
57
|
-
|
58
|
-
def all_states
|
59
|
-
@states
|
50
|
+
synchronize { @states.delete(light.name) }
|
60
51
|
end
|
61
52
|
end
|
62
53
|
end
|
@@ -16,8 +16,9 @@ module Stoplight
|
|
16
16
|
state_names = @redis.hkeys(states_key)
|
17
17
|
|
18
18
|
pattern = key('failures', '*')
|
19
|
+
prefix_regex = /^#{key('failures', '')}/
|
19
20
|
failure_names = @redis.scan_each(match: pattern).to_a.map do |key|
|
20
|
-
key.
|
21
|
+
key.sub(prefix_regex, '')
|
21
22
|
end
|
22
23
|
|
23
24
|
(state_names + failure_names).uniq
|
@@ -26,7 +27,7 @@ module Stoplight
|
|
26
27
|
def get_all(light)
|
27
28
|
failures, state = @redis.multi do
|
28
29
|
query_failures(light)
|
29
|
-
@redis.hget(
|
30
|
+
@redis.hget(states_key, light.name)
|
30
31
|
end
|
31
32
|
|
32
33
|
[
|
data/lib/stoplight/failure.rb
CHANGED
@@ -5,6 +5,8 @@ require 'time'
|
|
5
5
|
|
6
6
|
module Stoplight
|
7
7
|
class Failure # rubocop:disable Style/Documentation
|
8
|
+
TIME_FORMAT = '%Y-%m-%dT%H:%M:%S.%N%:z'.freeze
|
9
|
+
|
8
10
|
# @return [String]
|
9
11
|
attr_reader :error_class
|
10
12
|
# @return [String]
|
@@ -24,9 +26,10 @@ module Stoplight
|
|
24
26
|
# @raise [ArgumentError]
|
25
27
|
def self.from_json(json)
|
26
28
|
object = JSON.parse(json)
|
29
|
+
error_object = object['error']
|
27
30
|
|
28
|
-
error_class =
|
29
|
-
error_message =
|
31
|
+
error_class = error_object['class']
|
32
|
+
error_message = error_object['message']
|
30
33
|
time = Time.parse(object['time'])
|
31
34
|
|
32
35
|
new(error_class, error_message, time)
|
@@ -49,14 +52,18 @@ module Stoplight
|
|
49
52
|
time == other.time
|
50
53
|
end
|
51
54
|
|
55
|
+
# @param options [Object, nil]
|
52
56
|
# @return [String]
|
53
|
-
def to_json
|
57
|
+
def to_json(options = nil)
|
54
58
|
JSON.generate(
|
55
|
-
|
56
|
-
|
57
|
-
|
59
|
+
{
|
60
|
+
error: {
|
61
|
+
class: error_class,
|
62
|
+
message: error_message
|
63
|
+
},
|
64
|
+
time: time.strftime(TIME_FORMAT)
|
58
65
|
},
|
59
|
-
|
66
|
+
options
|
60
67
|
)
|
61
68
|
end
|
62
69
|
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
|
3
|
+
module Stoplight
|
4
|
+
module Notifier
|
5
|
+
# @see Base
|
6
|
+
class Pagerduty < Base
|
7
|
+
include Generic
|
8
|
+
|
9
|
+
# @return [::Pagerduty]
|
10
|
+
def pagerduty
|
11
|
+
@object
|
12
|
+
end
|
13
|
+
|
14
|
+
private
|
15
|
+
|
16
|
+
def put(message)
|
17
|
+
pagerduty.trigger(message)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
|
3
|
+
module Stoplight
|
4
|
+
module Notifier
|
5
|
+
# @see Base
|
6
|
+
class Rollbar < 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 [::Rollbar]
|
16
|
+
attr_reader :rollbar
|
17
|
+
# @return [Hash{Symbol => Object}]
|
18
|
+
attr_reader :options
|
19
|
+
|
20
|
+
# @param rollbar [::Rollbar]
|
21
|
+
# @param formatter [Proc, nil]
|
22
|
+
# @param options [Hash{Symbol => Object}]
|
23
|
+
# @option options [String] :severity
|
24
|
+
def initialize(rollbar, formatter = nil, options = {})
|
25
|
+
@rollbar = rollbar
|
26
|
+
@formatter = formatter || Default::FORMATTER
|
27
|
+
@options = DEFAULT_OPTIONS.merge(options)
|
28
|
+
end
|
29
|
+
|
30
|
+
def notify(light, from_color, to_color, error)
|
31
|
+
formatter.call(light, from_color, to_color, error).tap do |message|
|
32
|
+
severity = options.fetch(:severity)
|
33
|
+
exception = StoplightStatusChange.new(message)
|
34
|
+
rollbar.__send__(severity, exception)
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
data/lib/stoplight/version.rb
CHANGED
@@ -36,6 +36,12 @@ RSpec.describe Stoplight::DataStore::Memory do
|
|
36
36
|
data_store.set_state(light, Stoplight::State::UNLOCKED)
|
37
37
|
expect(data_store.names).to eql([light.name])
|
38
38
|
end
|
39
|
+
|
40
|
+
it 'supports names containing colons' do
|
41
|
+
light = Stoplight::Light.new('http://api.example.com/some/action')
|
42
|
+
data_store.record_failure(light, failure)
|
43
|
+
expect(data_store.names).to eql([light.name])
|
44
|
+
end
|
39
45
|
end
|
40
46
|
|
41
47
|
describe '#get_all' do
|
@@ -40,6 +40,12 @@ RSpec.describe Stoplight::DataStore::Redis do
|
|
40
40
|
data_store.set_state(light, Stoplight::State::UNLOCKED)
|
41
41
|
expect(data_store.names).to eql([light.name])
|
42
42
|
end
|
43
|
+
|
44
|
+
it 'supports names containing colons' do
|
45
|
+
light = Stoplight::Light.new('http://api.example.com/some/action')
|
46
|
+
data_store.record_failure(light, failure)
|
47
|
+
expect(data_store.names).to eql([light.name])
|
48
|
+
end
|
43
49
|
end
|
44
50
|
|
45
51
|
describe '#get_all' do
|
@@ -89,5 +89,20 @@ RSpec.describe Stoplight::Failure do
|
|
89
89
|
expect(described_class.new(error_class, error_message, time).to_json)
|
90
90
|
.to eql(json)
|
91
91
|
end
|
92
|
+
|
93
|
+
it 'generates JSON with options' do
|
94
|
+
expect(described_class.new(error_class, error_message, time).to_json({}))
|
95
|
+
.to eql(json)
|
96
|
+
end
|
97
|
+
end
|
98
|
+
|
99
|
+
describe '::TIME_FORMAT' do
|
100
|
+
it 'is a string' do
|
101
|
+
expect(described_class::TIME_FORMAT).to be_a(String)
|
102
|
+
end
|
103
|
+
|
104
|
+
it 'is frozen' do
|
105
|
+
expect(described_class::TIME_FORMAT).to be_frozen
|
106
|
+
end
|
92
107
|
end
|
93
108
|
end
|
@@ -7,8 +7,6 @@ module Bugsnag
|
|
7
7
|
end
|
8
8
|
|
9
9
|
RSpec.describe Stoplight::Notifier::Bugsnag do
|
10
|
-
StoplightStatusChange = Stoplight::Notifier::Bugsnag::StoplightStatusChange
|
11
|
-
|
12
10
|
it 'is a class' do
|
13
11
|
expect(described_class).to be_a(Class)
|
14
12
|
end
|
@@ -65,7 +63,7 @@ RSpec.describe Stoplight::Notifier::Bugsnag do
|
|
65
63
|
end
|
66
64
|
|
67
65
|
before do
|
68
|
-
status_change = StoplightStatusChange.new(message)
|
66
|
+
status_change = described_class::StoplightStatusChange.new(message)
|
69
67
|
expect(bugsnag).to receive(:notify).with(status_change, severity: 'info')
|
70
68
|
end
|
71
69
|
|
@@ -0,0 +1,40 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
|
3
|
+
require 'spec_helper'
|
4
|
+
require 'pagerduty'
|
5
|
+
|
6
|
+
RSpec.describe Stoplight::Notifier::Pagerduty do
|
7
|
+
it_behaves_like 'a generic notifier'
|
8
|
+
|
9
|
+
it 'is a class' do
|
10
|
+
expect(described_class).to be_a(Class)
|
11
|
+
end
|
12
|
+
|
13
|
+
it 'is a subclass of Base' do
|
14
|
+
expect(described_class).to be < Stoplight::Notifier::Base
|
15
|
+
end
|
16
|
+
|
17
|
+
describe '#pagerduty' do
|
18
|
+
it 'reads Pagerduty client' do
|
19
|
+
pagerduty = Pagerduty.new('WEBHOOK_URL')
|
20
|
+
expect(described_class.new(pagerduty).pagerduty).to eql(pagerduty)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
describe '#notify' do
|
25
|
+
let(:light) { Stoplight::Light.new(name, &code) }
|
26
|
+
let(:name) { ('a'..'z').to_a.shuffle.join }
|
27
|
+
let(:code) { -> {} }
|
28
|
+
let(:from_color) { Stoplight::Color::GREEN }
|
29
|
+
let(:to_color) { Stoplight::Color::RED }
|
30
|
+
let(:notifier) { described_class.new(pagerduty) }
|
31
|
+
let(:pagerduty) { double(Pagerduty).as_null_object }
|
32
|
+
|
33
|
+
it 'pings Pagerduty' do
|
34
|
+
error = nil
|
35
|
+
message = notifier.formatter.call(light, from_color, to_color, error)
|
36
|
+
expect(pagerduty).to receive(:trigger).with(message)
|
37
|
+
notifier.notify(light, from_color, to_color, error)
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
@@ -0,0 +1,90 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
|
3
|
+
require 'spec_helper'
|
4
|
+
|
5
|
+
# require 'rollbar'
|
6
|
+
module Rollbar
|
7
|
+
end
|
8
|
+
|
9
|
+
RSpec.describe Stoplight::Notifier::Rollbar do
|
10
|
+
it 'is a class' do
|
11
|
+
expect(described_class).to be_a(Class)
|
12
|
+
end
|
13
|
+
|
14
|
+
it 'is a subclass of Base' do
|
15
|
+
expect(described_class).to be < Stoplight::Notifier::Base
|
16
|
+
end
|
17
|
+
|
18
|
+
describe '#formatter' do
|
19
|
+
it 'is initially the default' do
|
20
|
+
expect(described_class.new(nil, nil).formatter)
|
21
|
+
.to eql(Stoplight::Default::FORMATTER)
|
22
|
+
end
|
23
|
+
|
24
|
+
it 'reads the formatter' do
|
25
|
+
formatter = proc {}
|
26
|
+
expect(described_class.new(nil, formatter).formatter)
|
27
|
+
.to eql(formatter)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
describe '#options' do
|
32
|
+
it 'is initially the default' do
|
33
|
+
expect(described_class.new(nil, nil).options)
|
34
|
+
.to eql(Stoplight::Notifier::Rollbar::DEFAULT_OPTIONS)
|
35
|
+
end
|
36
|
+
|
37
|
+
it 'reads the options' do
|
38
|
+
options = { key: :value }
|
39
|
+
expect(described_class.new(nil, nil, options).options)
|
40
|
+
.to eql(Stoplight::Notifier::Rollbar::DEFAULT_OPTIONS.merge(options))
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
describe '#rollbar' do
|
45
|
+
it 'reads the Rollbar client' do
|
46
|
+
client = Rollbar
|
47
|
+
expect(described_class.new(client, nil).rollbar)
|
48
|
+
.to eql(client)
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
describe '#notify' do
|
53
|
+
let(:light) { Stoplight::Light.new(name, &code) }
|
54
|
+
let(:name) { ('a'..'z').to_a.shuffle.join }
|
55
|
+
let(:code) { -> {} }
|
56
|
+
let(:from_color) { Stoplight::Color::GREEN }
|
57
|
+
let(:to_color) { Stoplight::Color::RED }
|
58
|
+
let(:notifier) { described_class.new(rollbar) }
|
59
|
+
let(:rollbar) { Rollbar }
|
60
|
+
|
61
|
+
subject(:result) do
|
62
|
+
notifier.notify(light, from_color, to_color, error)
|
63
|
+
end
|
64
|
+
|
65
|
+
before do
|
66
|
+
status_change = described_class::StoplightStatusChange.new(message)
|
67
|
+
expect(rollbar).to receive(:info).with(status_change)
|
68
|
+
end
|
69
|
+
|
70
|
+
context 'when no error given' do
|
71
|
+
let(:error) { nil }
|
72
|
+
|
73
|
+
it 'logs message' do
|
74
|
+
expect(result).to eq(message)
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
context 'when message with an error given' do
|
79
|
+
let(:error) { ZeroDivisionError.new('divided by 0') }
|
80
|
+
|
81
|
+
it 'logs message' do
|
82
|
+
expect(result).to eq(message)
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
def message
|
87
|
+
notifier.formatter.call(light, from_color, to_color, error)
|
88
|
+
end
|
89
|
+
end
|
90
|
+
end
|
metadata
CHANGED
@@ -1,31 +1,17 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: stoplight
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.1
|
4
|
+
version: 2.2.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Cameron Desautels
|
8
8
|
- Taylor Fausak
|
9
9
|
- Justin Steffy
|
10
|
-
autorequire:
|
10
|
+
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date:
|
13
|
+
date: 2020-07-16 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
|
-
- !ruby/object:Gem::Dependency
|
16
|
-
name: concurrent-ruby
|
17
|
-
requirement: !ruby/object:Gem::Requirement
|
18
|
-
requirements:
|
19
|
-
- - "~>"
|
20
|
-
- !ruby/object:Gem::Version
|
21
|
-
version: '1.0'
|
22
|
-
type: :runtime
|
23
|
-
prerelease: false
|
24
|
-
version_requirements: !ruby/object:Gem::Requirement
|
25
|
-
requirements:
|
26
|
-
- - "~>"
|
27
|
-
- !ruby/object:Gem::Version
|
28
|
-
version: '1.0'
|
29
15
|
- !ruby/object:Gem::Dependency
|
30
16
|
name: benchmark-ips
|
31
17
|
requirement: !ruby/object:Gem::Requirement
|
@@ -111,19 +97,19 @@ dependencies:
|
|
111
97
|
- !ruby/object:Gem::Version
|
112
98
|
version: '2.5'
|
113
99
|
- !ruby/object:Gem::Dependency
|
114
|
-
name:
|
100
|
+
name: pagerduty
|
115
101
|
requirement: !ruby/object:Gem::Requirement
|
116
102
|
requirements:
|
117
103
|
- - "~>"
|
118
104
|
- !ruby/object:Gem::Version
|
119
|
-
version:
|
105
|
+
version: 2.1.1
|
120
106
|
type: :development
|
121
107
|
prerelease: false
|
122
108
|
version_requirements: !ruby/object:Gem::Requirement
|
123
109
|
requirements:
|
124
110
|
- - "~>"
|
125
111
|
- !ruby/object:Gem::Version
|
126
|
-
version:
|
112
|
+
version: 2.1.1
|
127
113
|
- !ruby/object:Gem::Dependency
|
128
114
|
name: rake
|
129
115
|
requirement: !ruby/object:Gem::Requirement
|
@@ -180,6 +166,20 @@ dependencies:
|
|
180
166
|
- - "~>"
|
181
167
|
- !ruby/object:Gem::Version
|
182
168
|
version: 0.40.0
|
169
|
+
- !ruby/object:Gem::Dependency
|
170
|
+
name: sentry-raven
|
171
|
+
requirement: !ruby/object:Gem::Requirement
|
172
|
+
requirements:
|
173
|
+
- - "~>"
|
174
|
+
- !ruby/object:Gem::Version
|
175
|
+
version: '1.2'
|
176
|
+
type: :development
|
177
|
+
prerelease: false
|
178
|
+
version_requirements: !ruby/object:Gem::Requirement
|
179
|
+
requirements:
|
180
|
+
- - "~>"
|
181
|
+
- !ruby/object:Gem::Version
|
182
|
+
version: '1.2'
|
183
183
|
- !ruby/object:Gem::Dependency
|
184
184
|
name: slack-notifier
|
185
185
|
requirement: !ruby/object:Gem::Requirement
|
@@ -239,7 +239,9 @@ files:
|
|
239
239
|
- lib/stoplight/notifier/honeybadger.rb
|
240
240
|
- lib/stoplight/notifier/io.rb
|
241
241
|
- lib/stoplight/notifier/logger.rb
|
242
|
+
- lib/stoplight/notifier/pagerduty.rb
|
242
243
|
- lib/stoplight/notifier/raven.rb
|
244
|
+
- lib/stoplight/notifier/rollbar.rb
|
243
245
|
- lib/stoplight/notifier/slack.rb
|
244
246
|
- lib/stoplight/state.rb
|
245
247
|
- lib/stoplight/version.rb
|
@@ -261,7 +263,9 @@ files:
|
|
261
263
|
- spec/stoplight/notifier/honeybadger_spec.rb
|
262
264
|
- spec/stoplight/notifier/io_spec.rb
|
263
265
|
- spec/stoplight/notifier/logger_spec.rb
|
266
|
+
- spec/stoplight/notifier/pagerduty_spec.rb
|
264
267
|
- spec/stoplight/notifier/raven_spec.rb
|
268
|
+
- spec/stoplight/notifier/rollbar_spec.rb
|
265
269
|
- spec/stoplight/notifier/slack_spec.rb
|
266
270
|
- spec/stoplight/notifier_spec.rb
|
267
271
|
- spec/stoplight/state_spec.rb
|
@@ -271,7 +275,7 @@ homepage: https://github.com/orgsync/stoplight
|
|
271
275
|
licenses:
|
272
276
|
- MIT
|
273
277
|
metadata: {}
|
274
|
-
post_install_message:
|
278
|
+
post_install_message:
|
275
279
|
rdoc_options: []
|
276
280
|
require_paths:
|
277
281
|
- lib
|
@@ -286,33 +290,34 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
286
290
|
- !ruby/object:Gem::Version
|
287
291
|
version: '0'
|
288
292
|
requirements: []
|
289
|
-
|
290
|
-
|
291
|
-
signing_key:
|
293
|
+
rubygems_version: 3.1.2
|
294
|
+
signing_key:
|
292
295
|
specification_version: 4
|
293
296
|
summary: Traffic control for code.
|
294
297
|
test_files:
|
295
298
|
- spec/spec_helper.rb
|
296
|
-
- spec/
|
297
|
-
- spec/stoplight/data_store/base_spec.rb
|
298
|
-
- spec/stoplight/data_store/memory_spec.rb
|
299
|
-
- spec/stoplight/data_store/redis_spec.rb
|
300
|
-
- spec/stoplight/data_store_spec.rb
|
301
|
-
- spec/stoplight/default_spec.rb
|
299
|
+
- spec/stoplight_spec.rb
|
302
300
|
- spec/stoplight/error_spec.rb
|
303
301
|
- spec/stoplight/failure_spec.rb
|
304
|
-
- spec/stoplight/
|
305
|
-
- spec/stoplight/
|
306
|
-
- spec/stoplight/notifier/base_spec.rb
|
307
|
-
- spec/stoplight/notifier/bugsnag_spec.rb
|
308
|
-
- spec/stoplight/notifier/generic_spec.rb
|
309
|
-
- spec/stoplight/notifier/hip_chat_spec.rb
|
310
|
-
- spec/stoplight/notifier/honeybadger_spec.rb
|
302
|
+
- spec/stoplight/notifier/pagerduty_spec.rb
|
303
|
+
- spec/stoplight/notifier/raven_spec.rb
|
311
304
|
- spec/stoplight/notifier/io_spec.rb
|
312
305
|
- spec/stoplight/notifier/logger_spec.rb
|
313
|
-
- spec/stoplight/notifier/
|
306
|
+
- spec/stoplight/notifier/honeybadger_spec.rb
|
307
|
+
- spec/stoplight/notifier/generic_spec.rb
|
314
308
|
- spec/stoplight/notifier/slack_spec.rb
|
315
|
-
- spec/stoplight/
|
316
|
-
- spec/stoplight/
|
309
|
+
- spec/stoplight/notifier/rollbar_spec.rb
|
310
|
+
- spec/stoplight/notifier/base_spec.rb
|
311
|
+
- spec/stoplight/notifier/bugsnag_spec.rb
|
312
|
+
- spec/stoplight/notifier/hip_chat_spec.rb
|
317
313
|
- spec/stoplight/version_spec.rb
|
318
|
-
- spec/
|
314
|
+
- spec/stoplight/state_spec.rb
|
315
|
+
- spec/stoplight/notifier_spec.rb
|
316
|
+
- spec/stoplight/color_spec.rb
|
317
|
+
- spec/stoplight/default_spec.rb
|
318
|
+
- spec/stoplight/data_store_spec.rb
|
319
|
+
- spec/stoplight/data_store/memory_spec.rb
|
320
|
+
- spec/stoplight/data_store/redis_spec.rb
|
321
|
+
- spec/stoplight/data_store/base_spec.rb
|
322
|
+
- spec/stoplight/light/runnable_spec.rb
|
323
|
+
- spec/stoplight/light_spec.rb
|