stoplight 2.1.0 → 2.2.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: c744702c57c79bb96de6ba01eeb2c4adcc65eadd
4
- data.tar.gz: face2e75b1ac458693f3d160a33d534dd1e0b226
2
+ SHA256:
3
+ metadata.gz: e26d25f913bb759dccd62f2b12576cbe51550753c3c6428fb16cdb6052559928
4
+ data.tar.gz: 6cbfd0ccd62da40cb335e671c8ba2d84348652e206520355fa651eb2276e16ea
5
5
  SHA512:
6
- metadata.gz: 258fd3aa57d2f49e4b049d98d83c899f80d47cdbd354436b854b56959aabd0e21f9d34e25fc607dc7d189dcdb8896e5b4cbdb6825f27435d3cd4e40654096179
7
- data.tar.gz: 8369dc5c2f5355ed9936eea5d8999bdfa3965a891dbf62150dc1f748196aa46f87bec0e5201a473f5e72c6c0ef008e3f135cd8170bc5f72c1023784b862a62a7
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 of period will
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
@@ -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 'concurrent'
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 = Concurrent::Map.new { [] }
11
- @states = Concurrent::Map.new { State::UNLOCKED }
12
- @lock = Monitor.new
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
- (all_failures.keys + all_states.keys).uniq
18
+ synchronize { @failures.keys | @states.keys }
17
19
  end
18
20
 
19
21
  def get_all(light)
20
- [get_failures(light), get_state(light)]
22
+ synchronize { [@failures[light.name], @states[light.name]] }
21
23
  end
22
24
 
23
25
  def get_failures(light)
24
- all_failures[light.name]
26
+ synchronize { @failures[light.name] }
25
27
  end
26
28
 
27
29
  def record_failure(light, failure)
28
- @lock.synchronize do
30
+ synchronize do
29
31
  n = light.threshold - 1
30
- failures = get_failures(light).first(n).unshift(failure)
31
- all_failures[light.name] = failures
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
- all_failures.delete(light.name)
38
+ synchronize { @failures.delete(light.name) }
38
39
  end
39
40
 
40
41
  def get_state(light)
41
- all_states[light.name]
42
+ synchronize { @states[light.name] }
42
43
  end
43
44
 
44
45
  def set_state(light, state)
45
- all_states[light.name] = state
46
+ synchronize { @states[light.name] = state }
46
47
  end
47
48
 
48
49
  def clear_state(light)
49
- all_states.delete(light.name)
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.split(KEY_SEPARATOR).last
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('stoplight:states', light.name)
30
+ @redis.hget(states_key, light.name)
30
31
  end
31
32
 
32
33
  [
@@ -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 = object['error']['class']
29
- error_message = object['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
- error: {
56
- class: error_class,
57
- message: error_message
59
+ {
60
+ error: {
61
+ class: error_class,
62
+ message: error_message
63
+ },
64
+ time: time.strftime(TIME_FORMAT)
58
65
  },
59
- time: time.strftime('%Y-%m-%dT%H:%M:%S.%N%:z')
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
@@ -1,5 +1,5 @@
1
1
  # coding: utf-8
2
2
 
3
3
  module Stoplight
4
- VERSION = Gem::Version.new('2.1.0')
4
+ VERSION = Gem::Version.new('2.2.1')
5
5
  end
@@ -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
@@ -74,7 +74,7 @@ RSpec.describe Stoplight::Default do
74
74
 
75
75
  describe '::THRESHOLD' do
76
76
  it 'is an integer' do
77
- expect(Stoplight::Default::THRESHOLD).to be_a(Fixnum)
77
+ expect(Stoplight::Default::THRESHOLD).to be_a(Integer)
78
78
  end
79
79
  end
80
80
  end
@@ -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.0
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: 2016-08-04 00:00:00.000000000 Z
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: sentry-raven
100
+ name: pagerduty
115
101
  requirement: !ruby/object:Gem::Requirement
116
102
  requirements:
117
103
  - - "~>"
118
104
  - !ruby/object:Gem::Version
119
- version: '1.2'
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: '1.2'
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
- rubyforge_project:
290
- rubygems_version: 2.6.4
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/stoplight/color_spec.rb
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/light/runnable_spec.rb
305
- - spec/stoplight/light_spec.rb
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/raven_spec.rb
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/notifier_spec.rb
316
- - spec/stoplight/state_spec.rb
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/stoplight_spec.rb
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