stoplight 1.1.0 → 1.1.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
2
  SHA1:
3
- metadata.gz: c9ae554bc9377af5da84befa1e47b71f28d3610b
4
- data.tar.gz: a65e07dbe879f7895751607894992ad5e8a437f1
3
+ metadata.gz: 2da543aa5426e5354ed20f5e6d8547190597073d
4
+ data.tar.gz: 70aa5cfae4dbeec33fbefcadff88098317ccf0cc
5
5
  SHA512:
6
- metadata.gz: e7e320df17b172d01c35e397d21046f44d30608a3491eb05036b2cfeb75c79afc83c15e01c1fc676518de5e3313fa4597bfd5ca84f0322fbf30ff387bf5eead2
7
- data.tar.gz: 0db404935da87b9e0b731d9a191288234db19f0b37b240bfe4d32418482a9fe4a6a03f2a039263d379447b5db991e1b172629216997bcf69278f2fb0ed743eda
6
+ metadata.gz: 7c022ff3500336be177976073695d9d197800e2ecdcfc9e1a498215f239b69e302b82c475f2ab8f7cfd6be508d20b9d9fd0c1170adfa70de1006de11751013c8
7
+ data.tar.gz: 857d9ea2421f83e516f64e6319421100d0bda5992875f023909c474ef78d140a173570a28944abc5865fbf5c2b603a79ce9689acd21013f5fa3e0b6e1c6174a8
data/CHANGELOG.md CHANGED
@@ -2,6 +2,11 @@
2
2
 
3
3
  Stoplight uses [Semantic Versioning][1].
4
4
 
5
+ ## v1.1.1 (2015-07-16)
6
+
7
+ - Introduced a generic notifier to reduce duplication between the IO and Slack
8
+ notifiers.
9
+
5
10
  ## v1.1.0 (2015-07-04)
6
11
 
7
12
  - #71: Added Slack notifier. Thanks, @s1mplex!
data/README.md CHANGED
@@ -14,7 +14,7 @@ breaker pattern in Ruby.
14
14
 
15
15
  Does your code use unreliable systems, like a flaky database or a
16
16
  spotty web service? Wrap those up with stoplights to prevent them
17
- from affecting the rest of your application down.
17
+ from affecting the rest of your application.
18
18
 
19
19
  Check out [stoplight-admin][] for controlling your stoplights.
20
20
 
@@ -135,6 +135,9 @@ light.color
135
135
  # => "green"
136
136
  ```
137
137
 
138
+ The following errors are always allowed: `NoMemoryError`, `ScriptError`,
139
+ `SecurityError`, `SignalException`, `SystemExit`, and `SystemStackError`.
140
+
138
141
  ### Custom fallback
139
142
 
140
143
  By default, stoplights will re-raise errors when they're green.
@@ -178,6 +181,8 @@ light.run
178
181
  # Stoplight::Error::RedLight: example-5
179
182
  ```
180
183
 
184
+ The default threshold is `3`.
185
+
181
186
  ### Custom timeout
182
187
 
183
188
  Stoplights will automatically attempt to recover after a certain
@@ -203,7 +208,8 @@ light.run
203
208
  # RuntimeError:
204
209
  ```
205
210
 
206
- Set the timeout to `-1` to disable automatic recovery.
211
+ The default timeout is `60` seconds. Set the timeout to `-1` to disable
212
+ automatic recovery.
207
213
 
208
214
  ### Rails
209
215
 
data/lib/stoplight.rb CHANGED
@@ -17,6 +17,7 @@ require 'stoplight/data_store/redis'
17
17
 
18
18
  require 'stoplight/notifier'
19
19
  require 'stoplight/notifier/base'
20
+ require 'stoplight/notifier/generic'
20
21
  require 'stoplight/notifier/hip_chat'
21
22
  require 'stoplight/notifier/io'
22
23
  require 'stoplight/notifier/slack'
@@ -0,0 +1,30 @@
1
+ # coding: utf-8
2
+
3
+ module Stoplight
4
+ module Notifier
5
+ module Generic
6
+ # @return [Proc]
7
+ attr_reader :formatter
8
+
9
+ # @param object [Object]
10
+ # @param formatter [Proc, nil]
11
+ def initialize(object, formatter = nil)
12
+ @object = object
13
+ @formatter = formatter || Default::FORMATTER
14
+ end
15
+
16
+ # @see Base#notify
17
+ def notify(light, from_color, to_color, error)
18
+ message = formatter.call(light, from_color, to_color, error)
19
+ put(message)
20
+ message
21
+ end
22
+
23
+ private
24
+
25
+ def put(_message)
26
+ fail NotImplementedError
27
+ end
28
+ end
29
+ end
30
+ end
@@ -1,27 +1,20 @@
1
1
  # coding: utf-8
2
2
 
3
- require 'stringio'
4
-
5
3
  module Stoplight
6
4
  module Notifier
7
5
  # @see Base
8
6
  class IO < Base
9
- # @return [Proc]
10
- attr_reader :formatter
11
- # @return [::IO]
12
- attr_reader :io
7
+ include Generic
13
8
 
14
- # @param io [::IO]
15
- # @param formatter [Proc, nil]
16
- def initialize(io, formatter = nil)
17
- @io = io
18
- @formatter = formatter || Default::FORMATTER
9
+ # @return [::IO]
10
+ def io
11
+ @object
19
12
  end
20
13
 
21
- def notify(light, from_color, to_color, error)
22
- message = formatter.call(light, from_color, to_color, error)
14
+ private
15
+
16
+ def put(message)
23
17
  io.puts(message)
24
- message
25
18
  end
26
19
  end
27
20
  end
@@ -4,23 +4,17 @@ module Stoplight
4
4
  module Notifier
5
5
  # @see Base
6
6
  class Slack < Base
7
- # @return [Proc]
8
- attr_reader :formatter
7
+ include Generic
9
8
 
10
9
  # @return [::Slack::Notifier]
11
- attr_reader :slack
12
-
13
- # @param slack [::Slack::Notifier]
14
- # @param formatter [Proc, nil]
15
- def initialize(slack, formatter = nil)
16
- @slack = slack
17
- @formatter = formatter || Default::FORMATTER
10
+ def slack
11
+ @object
18
12
  end
19
13
 
20
- def notify(light, from_color, to_color, error)
21
- message = formatter.call(light, from_color, to_color, error)
14
+ private
15
+
16
+ def put(message)
22
17
  slack.ping(message)
23
- message
24
18
  end
25
19
  end
26
20
  end
@@ -1,5 +1,5 @@
1
1
  # coding: utf-8
2
2
 
3
3
  module Stoplight
4
- VERSION = Gem::Version.new('1.1.0')
4
+ VERSION = Gem::Version.new('1.1.1')
5
5
  end
@@ -1,6 +1,7 @@
1
1
  # coding: utf-8
2
2
 
3
3
  require 'spec_helper'
4
+ require 'stringio'
4
5
 
5
6
  RSpec.describe Stoplight::Light::Runnable do
6
7
  subject { Stoplight::Light.new(name, &code) }
@@ -1,6 +1,7 @@
1
1
  # coding: utf-8
2
2
 
3
3
  require 'spec_helper'
4
+ require 'stringio'
4
5
 
5
6
  RSpec.describe Stoplight::Light do
6
7
  let(:light) { described_class.new(name, &code) }
@@ -6,7 +6,7 @@ RSpec.describe Stoplight::Notifier::Base do
6
6
  let(:notifier) { described_class.new }
7
7
 
8
8
  it 'is a class' do
9
- expect(described_class).to be_a(Module)
9
+ expect(described_class).to be_a(Class)
10
10
  end
11
11
 
12
12
  describe '#notify' do
@@ -0,0 +1,50 @@
1
+ # coding: utf-8
2
+
3
+ require 'spec_helper'
4
+
5
+ RSpec.shared_examples_for 'a generic notifier' do
6
+ it 'includes Generic' do
7
+ expect(described_class).to include(Stoplight::Notifier::Generic)
8
+ end
9
+
10
+ describe '#formatter' do
11
+ it 'is initially the default' do
12
+ formatter = nil
13
+ expect(described_class.new(nil, formatter).formatter)
14
+ .to eql(Stoplight::Default::FORMATTER)
15
+ end
16
+
17
+ it 'reads the formatter' do
18
+ formatter = proc {}
19
+ expect(described_class.new(nil, formatter).formatter)
20
+ .to eql(formatter)
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(double.as_null_object) }
31
+
32
+ it 'returns the message' do
33
+ error = nil
34
+ expect(notifier.notify(light, from_color, to_color, error))
35
+ .to eql(notifier.formatter.call(light, from_color, to_color, error))
36
+ end
37
+
38
+ it 'returns the message with an error' do
39
+ error = ZeroDivisionError.new('divided by 0')
40
+ expect(notifier.notify(light, from_color, to_color, error))
41
+ .to eql(notifier.formatter.call(light, from_color, to_color, error))
42
+ end
43
+ end
44
+ end
45
+
46
+ RSpec.describe Stoplight::Notifier::Generic do
47
+ it 'is a module' do
48
+ expect(described_class).to be_a(Module)
49
+ end
50
+ end
@@ -5,7 +5,7 @@ require 'hipchat'
5
5
 
6
6
  RSpec.describe Stoplight::Notifier::HipChat do
7
7
  it 'is a class' do
8
- expect(described_class).to be_a(Module)
8
+ expect(described_class).to be_a(Class)
9
9
  end
10
10
 
11
11
  it 'is a subclass of Base' do
@@ -1,29 +1,19 @@
1
1
  # coding: utf-8
2
2
 
3
3
  require 'spec_helper'
4
+ require 'stringio'
4
5
 
5
6
  RSpec.describe Stoplight::Notifier::IO do
7
+ it_behaves_like 'a generic notifier'
8
+
6
9
  it 'is a class' do
7
- expect(described_class).to be_a(Module)
10
+ expect(described_class).to be_a(Class)
8
11
  end
9
12
 
10
13
  it 'is a subclass of Base' do
11
14
  expect(described_class).to be < Stoplight::Notifier::Base
12
15
  end
13
16
 
14
- describe '#formatter' do
15
- it 'is initially the default' do
16
- expect(described_class.new(nil).formatter)
17
- .to eql(Stoplight::Default::FORMATTER)
18
- end
19
-
20
- it 'reads the formatter' do
21
- formatter = proc {}
22
- expect(described_class.new(nil, formatter).formatter)
23
- .to eql(formatter)
24
- end
25
- end
26
-
27
17
  describe '#io' do
28
18
  it 'reads the IO' do
29
19
  io = StringIO.new
@@ -40,18 +30,6 @@ RSpec.describe Stoplight::Notifier::IO do
40
30
  let(:notifier) { described_class.new(io) }
41
31
  let(:io) { StringIO.new }
42
32
 
43
- it 'returns the message' do
44
- error = nil
45
- expect(notifier.notify(light, from_color, to_color, error))
46
- .to eql(notifier.formatter.call(light, from_color, to_color, error))
47
- end
48
-
49
- it 'returns the message with an error' do
50
- error = ZeroDivisionError.new('divided by 0')
51
- expect(notifier.notify(light, from_color, to_color, error))
52
- .to eql(notifier.formatter.call(light, from_color, to_color, error))
53
- end
54
-
55
33
  it 'writes the message' do
56
34
  error = nil
57
35
  notifier.notify(light, from_color, to_color, error)
@@ -4,23 +4,17 @@ require 'spec_helper'
4
4
  require 'slack-notifier'
5
5
 
6
6
  RSpec.describe Stoplight::Notifier::Slack do
7
- it 'is a subclass of Base' do
8
- expect(described_class).to be < Stoplight::Notifier::Base
9
- end
7
+ it_behaves_like 'a generic notifier'
10
8
 
11
- describe '#formatter' do
12
- it 'is initially the default' do
13
- expect(described_class.new(nil).formatter)
14
- .to eql(Stoplight::Default::FORMATTER)
15
- end
9
+ it 'is a class' do
10
+ expect(described_class).to be_a(Class)
11
+ end
16
12
 
17
- it 'reads the formatter' do
18
- formatter = proc {}
19
- expect(described_class.new(nil, formatter).formatter).to eql(formatter)
20
- end
13
+ it 'is a subclass of Base' do
14
+ expect(described_class).to be < Stoplight::Notifier::Base
21
15
  end
22
16
 
23
- describe '#slack_notifier' do
17
+ describe '#slack' do
24
18
  it 'reads Slack::Notifier client' do
25
19
  slack = Slack::Notifier.new('WEBHOOK_URL')
26
20
  expect(described_class.new(slack).slack).to eql(slack)
@@ -34,22 +28,13 @@ RSpec.describe Stoplight::Notifier::Slack do
34
28
  let(:from_color) { Stoplight::Color::GREEN }
35
29
  let(:to_color) { Stoplight::Color::RED }
36
30
  let(:notifier) { described_class.new(slack) }
37
- let(:slack) { double(Slack::Notifier) }
38
-
39
- before do
40
- expect(slack).to receive(:ping).with(kind_of(String))
41
- end
31
+ let(:slack) { double(Slack::Notifier).as_null_object }
42
32
 
43
- it 'returns the message' do
33
+ it 'pings Slack' do
44
34
  error = nil
45
- expect(notifier.notify(light, from_color, to_color, error))
46
- .to eql(notifier.formatter.call(light, from_color, to_color, error))
47
- end
48
-
49
- it 'returns the message with an error' do
50
- error = ZeroDivisionError.new('divided by 0')
51
- expect(notifier.notify(light, from_color, to_color, error))
52
- .to eql(notifier.formatter.call(light, from_color, to_color, error))
35
+ message = notifier.formatter.call(light, from_color, to_color, error)
36
+ expect(slack).to receive(:ping).with(message)
37
+ notifier.notify(light, from_color, to_color, error)
53
38
  end
54
39
  end
55
40
  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: 1.1.0
4
+ version: 1.1.1
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: 2015-07-04 00:00:00.000000000 Z
13
+ date: 2015-07-16 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: benchmark-ips
@@ -233,6 +233,7 @@ files:
233
233
  - lib/stoplight/light/runnable.rb
234
234
  - lib/stoplight/notifier.rb
235
235
  - lib/stoplight/notifier/base.rb
236
+ - lib/stoplight/notifier/generic.rb
236
237
  - lib/stoplight/notifier/hip_chat.rb
237
238
  - lib/stoplight/notifier/io.rb
238
239
  - lib/stoplight/notifier/slack.rb
@@ -250,6 +251,7 @@ files:
250
251
  - spec/stoplight/light/runnable_spec.rb
251
252
  - spec/stoplight/light_spec.rb
252
253
  - spec/stoplight/notifier/base_spec.rb
254
+ - spec/stoplight/notifier/generic_spec.rb
253
255
  - spec/stoplight/notifier/hip_chat_spec.rb
254
256
  - spec/stoplight/notifier/io_spec.rb
255
257
  - spec/stoplight/notifier/slack_spec.rb
@@ -277,7 +279,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
277
279
  version: '0'
278
280
  requirements: []
279
281
  rubyforge_project:
280
- rubygems_version: 2.4.6
282
+ rubygems_version: 2.4.5
281
283
  signing_key:
282
284
  specification_version: 4
283
285
  summary: Traffic control for code.
@@ -294,6 +296,7 @@ test_files:
294
296
  - spec/stoplight/light/runnable_spec.rb
295
297
  - spec/stoplight/light_spec.rb
296
298
  - spec/stoplight/notifier/base_spec.rb
299
+ - spec/stoplight/notifier/generic_spec.rb
297
300
  - spec/stoplight/notifier/hip_chat_spec.rb
298
301
  - spec/stoplight/notifier/io_spec.rb
299
302
  - spec/stoplight/notifier/slack_spec.rb