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 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