stoplight 2.1.3 → 2.2.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: e73b740e1d020caa3c2231d358358f7f1405d339
4
- data.tar.gz: f228a34259327f769ee5a43630815ee31ec754ee
2
+ SHA256:
3
+ metadata.gz: b66bb764bd763618206249ec2f6942377ccdd3d9f61dd98c96ddfa27f4020c63
4
+ data.tar.gz: a0b78e0231f0ae7cd15a41ac749ebb4bccec204ca25475cc780b6d45a2dc6f5b
5
5
  SHA512:
6
- metadata.gz: ef7a7ec7291ffc27d4b12c2900e52927abe9b9faf93e26f5086959742e57c69c4b8d05a880e66eba7439193686983bd516f429d1c4e6eb61067b86d5870c9f9d
7
- data.tar.gz: 68ef1c8e9583434ae5da043aa0c7ef3f5e0a23a9b9bef40ac58bdffac57fa83de4d9d148e3bfbf68bda3caaf8f831cd10a5d28882952a533655a47fb3b7f21f2
6
+ metadata.gz: 95050e149634a50373a73a62a7de560fc2beb97e0dede532dbeb25b45e09c887655e20454604bb3b07c7b4306a13f5b819459c5f1ec03807f1a13d7ed2fc772b
7
+ data.tar.gz: 98753fc93435db4bd0b8626e85e84ed37c25e8e4fef5e9cf40d608f24a3c5c4a49b3add526fa0eb918964f949f0087c78c052eec3af9a3e5e18ae93194ee4c4a
data/README.md CHANGED
@@ -32,6 +32,8 @@ Check out [stoplight-admin][] for controlling your stoplights.
32
32
  - [HipChat](#hipchat)
33
33
  - [Honeybadger](#honeybadger)
34
34
  - [Logger](#logger)
35
+ - [Pagerduty](#pagerduty)
36
+ - [Rollbar](#rollbar)
35
37
  - [Sentry](#sentry)
36
38
  - [Slack](#slack)
37
39
  - [Rails](#rails-1)
@@ -204,7 +206,7 @@ The default threshold is `3`.
204
206
  ### Custom cool off time
205
207
 
206
208
  Stoplights will automatically attempt to recover after a certain amount of
207
- 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
208
210
  transition to the yellow state. This cool off time is customizable.
209
211
 
210
212
  ``` rb
@@ -356,6 +358,36 @@ Stoplight::Light.default_notifiers += [notifier]
356
358
  # => [#<Stoplight::Notifier::IO:...>, #<Stoplight::Notifier::Logger:...>]
357
359
  ```
358
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
+
359
391
  #### Sentry
360
392
 
361
393
  Make sure you have [the Sentry gem][] (`~> 1.2`) installed before configuring
@@ -490,8 +522,10 @@ Stoplight is licensed under [the MIT License][].
490
522
  [the HipChat gem]: https://rubygems.org/gems/hipchat
491
523
  [the Honeybadger gem]: https://rubygems.org/gems/honeybadger
492
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
493
526
  [the Sentry gem]: https://rubygems.org/gems/sentry-raven
494
527
  [the Slack gem]: https://rubygems.org/gems/slack-notifier
528
+ [the Pagerduty gem]: https://rubygems.org/gems/pagerduty
495
529
  [@camdez]: https://github.com/camdez
496
530
  [@tfausak]: https://github.com/tfausak
497
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'
@@ -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.3')
4
+ VERSION = Gem::Version.new('2.2.0')
5
5
  end
@@ -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
@@ -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,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: stoplight
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.1.3
4
+ version: 2.2.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: 2018-04-01 00:00:00.000000000 Z
13
+ date: 2019-10-24 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: benchmark-ips
@@ -97,19 +97,19 @@ dependencies:
97
97
  - !ruby/object:Gem::Version
98
98
  version: '2.5'
99
99
  - !ruby/object:Gem::Dependency
100
- name: sentry-raven
100
+ name: pagerduty
101
101
  requirement: !ruby/object:Gem::Requirement
102
102
  requirements:
103
103
  - - "~>"
104
104
  - !ruby/object:Gem::Version
105
- version: '1.2'
105
+ version: 2.1.1
106
106
  type: :development
107
107
  prerelease: false
108
108
  version_requirements: !ruby/object:Gem::Requirement
109
109
  requirements:
110
110
  - - "~>"
111
111
  - !ruby/object:Gem::Version
112
- version: '1.2'
112
+ version: 2.1.1
113
113
  - !ruby/object:Gem::Dependency
114
114
  name: rake
115
115
  requirement: !ruby/object:Gem::Requirement
@@ -166,6 +166,20 @@ dependencies:
166
166
  - - "~>"
167
167
  - !ruby/object:Gem::Version
168
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'
169
183
  - !ruby/object:Gem::Dependency
170
184
  name: slack-notifier
171
185
  requirement: !ruby/object:Gem::Requirement
@@ -225,7 +239,9 @@ 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/pagerduty.rb
228
243
  - lib/stoplight/notifier/raven.rb
244
+ - lib/stoplight/notifier/rollbar.rb
229
245
  - lib/stoplight/notifier/slack.rb
230
246
  - lib/stoplight/state.rb
231
247
  - lib/stoplight/version.rb
@@ -247,7 +263,9 @@ files:
247
263
  - spec/stoplight/notifier/honeybadger_spec.rb
248
264
  - spec/stoplight/notifier/io_spec.rb
249
265
  - spec/stoplight/notifier/logger_spec.rb
266
+ - spec/stoplight/notifier/pagerduty_spec.rb
250
267
  - spec/stoplight/notifier/raven_spec.rb
268
+ - spec/stoplight/notifier/rollbar_spec.rb
251
269
  - spec/stoplight/notifier/slack_spec.rb
252
270
  - spec/stoplight/notifier_spec.rb
253
271
  - spec/stoplight/state_spec.rb
@@ -272,8 +290,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
272
290
  - !ruby/object:Gem::Version
273
291
  version: '0'
274
292
  requirements: []
275
- rubyforge_project:
276
- rubygems_version: 2.5.2
293
+ rubygems_version: 3.0.3
277
294
  signing_key:
278
295
  specification_version: 4
279
296
  summary: Traffic control for code.
@@ -282,12 +299,14 @@ test_files:
282
299
  - spec/stoplight_spec.rb
283
300
  - spec/stoplight/error_spec.rb
284
301
  - spec/stoplight/failure_spec.rb
302
+ - spec/stoplight/notifier/pagerduty_spec.rb
285
303
  - spec/stoplight/notifier/raven_spec.rb
286
304
  - spec/stoplight/notifier/io_spec.rb
287
305
  - spec/stoplight/notifier/logger_spec.rb
288
306
  - spec/stoplight/notifier/honeybadger_spec.rb
289
307
  - spec/stoplight/notifier/generic_spec.rb
290
308
  - spec/stoplight/notifier/slack_spec.rb
309
+ - spec/stoplight/notifier/rollbar_spec.rb
291
310
  - spec/stoplight/notifier/base_spec.rb
292
311
  - spec/stoplight/notifier/bugsnag_spec.rb
293
312
  - spec/stoplight/notifier/hip_chat_spec.rb