stoplight 0.4.0 → 0.4.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 +4 -4
- data/CHANGELOG.md +4 -0
- data/README.md +1 -1
- data/lib/stoplight/data_store/base.rb +5 -8
- data/lib/stoplight/data_store/memory.rb +5 -7
- data/lib/stoplight/data_store/redis.rb +7 -9
- data/lib/stoplight/light.rb +2 -2
- data/lib/stoplight.rb +1 -1
- data/spec/stoplight/data_store/base_spec.rb +1 -0
- data/spec/stoplight/light_spec.rb +22 -0
- data/spec/support/data_store.rb +0 -8
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 314c63808a80e427881c2d09152f74e68f4ffd37
|
4
|
+
data.tar.gz: 67ab9ca03f20512f5b119b95eec17494d7fdf726
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5a758d0cd6beeb2b0c034f424ec4b4b2fc1fe72f11a7eb598fe195e408437ec6ba3dd95aa9b29554d5a9e8a0727fabbfdc46aade4a7c1674cf457467459032c5
|
7
|
+
data.tar.gz: 50eb0565526a389406422fdca3b93a9ce4923bd7ab7e50aa558b976ca09ed56ee976c9bcc3fc4b0f72c6a28290964e4a676d1c6dbb741ae45fed26b9f30619ab
|
data/CHANGELOG.md
CHANGED
data/README.md
CHANGED
@@ -8,23 +8,25 @@ module Stoplight
|
|
8
8
|
fail NotImplementedError
|
9
9
|
end
|
10
10
|
|
11
|
-
# @return [nil]
|
12
11
|
def clear_stale
|
13
12
|
fail NotImplementedError
|
14
13
|
end
|
15
14
|
|
16
15
|
# @param _name [String]
|
17
|
-
# @return [nil]
|
18
16
|
def clear(_name)
|
19
17
|
fail NotImplementedError
|
20
18
|
end
|
21
19
|
|
22
20
|
# @param _name [String]
|
23
|
-
# @return [nil]
|
24
21
|
def sync(_name)
|
25
22
|
fail NotImplementedError
|
26
23
|
end
|
27
24
|
|
25
|
+
# @param _name [String]
|
26
|
+
def greenify(_name)
|
27
|
+
fail NotImplementedError
|
28
|
+
end
|
29
|
+
|
28
30
|
# @group Colors
|
29
31
|
|
30
32
|
# @param name [String]
|
@@ -72,7 +74,6 @@ module Stoplight
|
|
72
74
|
end
|
73
75
|
|
74
76
|
# @param _name [String]
|
75
|
-
# @return [nil]
|
76
77
|
def clear_attempts(_name)
|
77
78
|
fail NotImplementedError
|
78
79
|
end
|
@@ -93,7 +94,6 @@ module Stoplight
|
|
93
94
|
end
|
94
95
|
|
95
96
|
# @param _name [String]
|
96
|
-
# @return [nil]
|
97
97
|
def clear_failures(_name)
|
98
98
|
fail NotImplementedError
|
99
99
|
end
|
@@ -114,7 +114,6 @@ module Stoplight
|
|
114
114
|
end
|
115
115
|
|
116
116
|
# @param _name [String]
|
117
|
-
# @return [nil]
|
118
117
|
def clear_state(_name)
|
119
118
|
fail NotImplementedError
|
120
119
|
end
|
@@ -135,7 +134,6 @@ module Stoplight
|
|
135
134
|
end
|
136
135
|
|
137
136
|
# @param _name [String]
|
138
|
-
# @return [nil]
|
139
137
|
def clear_threshold(_name)
|
140
138
|
fail NotImplementedError
|
141
139
|
end
|
@@ -156,7 +154,6 @@ module Stoplight
|
|
156
154
|
end
|
157
155
|
|
158
156
|
# @param _name [String]
|
159
|
-
# @return [nil]
|
160
157
|
def clear_timeout(_name)
|
161
158
|
fail NotImplementedError
|
162
159
|
end
|
@@ -15,7 +15,6 @@ module Stoplight
|
|
15
15
|
names
|
16
16
|
.select { |name| get_failures(name).empty? }
|
17
17
|
.each { |name| clear(name) }
|
18
|
-
nil
|
19
18
|
end
|
20
19
|
|
21
20
|
def clear(name)
|
@@ -28,7 +27,11 @@ module Stoplight
|
|
28
27
|
|
29
28
|
def sync(name)
|
30
29
|
set_threshold(name, get_threshold(name))
|
31
|
-
|
30
|
+
end
|
31
|
+
|
32
|
+
def greenify(name)
|
33
|
+
clear_attempts(name)
|
34
|
+
clear_failures(name)
|
32
35
|
end
|
33
36
|
|
34
37
|
def get_color(name)
|
@@ -49,7 +52,6 @@ module Stoplight
|
|
49
52
|
|
50
53
|
def clear_attempts(name)
|
51
54
|
attempts.delete(name)
|
52
|
-
nil
|
53
55
|
end
|
54
56
|
|
55
57
|
def get_failures(name)
|
@@ -65,7 +67,6 @@ module Stoplight
|
|
65
67
|
|
66
68
|
def clear_failures(name)
|
67
69
|
@data.delete(DataStore.failures_key(name))
|
68
|
-
nil
|
69
70
|
end
|
70
71
|
|
71
72
|
def get_state(name)
|
@@ -79,7 +80,6 @@ module Stoplight
|
|
79
80
|
|
80
81
|
def clear_state(name)
|
81
82
|
states.delete(name)
|
82
|
-
nil
|
83
83
|
end
|
84
84
|
|
85
85
|
def get_threshold(name)
|
@@ -93,7 +93,6 @@ module Stoplight
|
|
93
93
|
|
94
94
|
def clear_threshold(name)
|
95
95
|
thresholds.delete(name)
|
96
|
-
nil
|
97
96
|
end
|
98
97
|
|
99
98
|
def get_timeout(name)
|
@@ -107,7 +106,6 @@ module Stoplight
|
|
107
106
|
|
108
107
|
def clear_timeout(name)
|
109
108
|
timeouts.delete(name)
|
110
|
-
nil
|
111
109
|
end
|
112
110
|
|
113
111
|
private
|
@@ -18,7 +18,6 @@ module Stoplight
|
|
18
18
|
names
|
19
19
|
.select { |name| get_failures(name).empty? }
|
20
20
|
.each { |name| clear(name) }
|
21
|
-
nil
|
22
21
|
end
|
23
22
|
|
24
23
|
def clear(name)
|
@@ -29,19 +28,23 @@ module Stoplight
|
|
29
28
|
clear_threshold(name)
|
30
29
|
clear_timeout(name)
|
31
30
|
end
|
32
|
-
|
33
|
-
nil
|
34
31
|
end
|
35
32
|
|
36
33
|
def sync(name)
|
37
34
|
threshold = @redis.hget(DataStore.thresholds_key, name)
|
38
35
|
threshold = normalize_threshold(threshold)
|
39
36
|
@redis.hset(DataStore.thresholds_key, name, threshold)
|
40
|
-
nil
|
41
37
|
rescue ::Redis::BaseError => error
|
42
38
|
raise Error::BadDataStore, error
|
43
39
|
end
|
44
40
|
|
41
|
+
def greenify(name)
|
42
|
+
@redis.pipelined do
|
43
|
+
clear_attempts(name)
|
44
|
+
clear_failures(name)
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
45
48
|
def get_color(name)
|
46
49
|
DataStore.colorize(*colorize_args(name))
|
47
50
|
end
|
@@ -56,7 +59,6 @@ module Stoplight
|
|
56
59
|
|
57
60
|
def clear_attempts(name)
|
58
61
|
@redis.hdel(DataStore.attempts_key, name)
|
59
|
-
nil
|
60
62
|
end
|
61
63
|
|
62
64
|
def get_failures(name)
|
@@ -71,7 +73,6 @@ module Stoplight
|
|
71
73
|
|
72
74
|
def clear_failures(name)
|
73
75
|
@redis.del(DataStore.failures_key(name))
|
74
|
-
nil
|
75
76
|
end
|
76
77
|
|
77
78
|
def get_state(name)
|
@@ -86,7 +87,6 @@ module Stoplight
|
|
86
87
|
|
87
88
|
def clear_state(name)
|
88
89
|
@redis.hdel(DataStore.states_key, name)
|
89
|
-
nil
|
90
90
|
end
|
91
91
|
|
92
92
|
def get_threshold(name)
|
@@ -101,7 +101,6 @@ module Stoplight
|
|
101
101
|
|
102
102
|
def clear_threshold(name)
|
103
103
|
@redis.hdel(DataStore.thresholds_key, name)
|
104
|
-
nil
|
105
104
|
end
|
106
105
|
|
107
106
|
def get_timeout(name)
|
@@ -116,7 +115,6 @@ module Stoplight
|
|
116
115
|
|
117
116
|
def clear_timeout(name)
|
118
117
|
@redis.hdel(DataStore.timeouts_key, name)
|
119
|
-
nil
|
120
118
|
end
|
121
119
|
|
122
120
|
private
|
data/lib/stoplight/light.rb
CHANGED
@@ -110,7 +110,7 @@ module Stoplight
|
|
110
110
|
private
|
111
111
|
|
112
112
|
def run_green
|
113
|
-
code.call.tap { Stoplight.data_store.
|
113
|
+
code.call.tap { Stoplight.data_store.greenify(name) }
|
114
114
|
rescue => error
|
115
115
|
handle_error(error)
|
116
116
|
raise
|
@@ -129,7 +129,7 @@ module Stoplight
|
|
129
129
|
|
130
130
|
def handle_error(error)
|
131
131
|
if error_allowed?(error)
|
132
|
-
Stoplight.data_store.
|
132
|
+
Stoplight.data_store.greenify(name)
|
133
133
|
else
|
134
134
|
Stoplight.data_store.record_failure(name, Failure.create(error))
|
135
135
|
end
|
data/lib/stoplight.rb
CHANGED
@@ -111,6 +111,28 @@ describe Stoplight::Light do
|
|
111
111
|
end
|
112
112
|
end
|
113
113
|
|
114
|
+
context 'conditionally failing' do
|
115
|
+
let(:code_result) { fail error if @fail }
|
116
|
+
let(:name) { 'failing' }
|
117
|
+
|
118
|
+
it 'clears the attempts' do
|
119
|
+
@fail = true
|
120
|
+
light.threshold.succ.times do
|
121
|
+
begin
|
122
|
+
light.run
|
123
|
+
rescue error_class, Stoplight::Error::RedLight
|
124
|
+
nil
|
125
|
+
end
|
126
|
+
end
|
127
|
+
|
128
|
+
@fail = false
|
129
|
+
Stoplight.data_store.set_timeout(light.name, 0)
|
130
|
+
light.run
|
131
|
+
|
132
|
+
expect(Stoplight.data_store.get_attempts(light.name)).to eq(0)
|
133
|
+
end
|
134
|
+
end
|
135
|
+
|
114
136
|
context 'with Redis' do
|
115
137
|
let(:data_store) { Stoplight::DataStore::Redis.new(redis) }
|
116
138
|
let(:redis) { Redis.new }
|
data/spec/support/data_store.rb
CHANGED
@@ -12,28 +12,20 @@ shared_examples_for 'a data store' do
|
|
12
12
|
let(:timeout) { rand(100) }
|
13
13
|
|
14
14
|
it { expect(data_store.names).to eql([]) }
|
15
|
-
it { expect(data_store.clear_stale).to eql(nil) }
|
16
|
-
it { expect(data_store.clear(name)).to eql(nil) }
|
17
|
-
it { expect(data_store.sync(name)).to eql(nil) }
|
18
15
|
it { expect(data_store.get_color(name)).to eql(Stoplight::DataStore::COLOR_GREEN) }
|
19
16
|
it { expect(data_store.green?(name)).to eql(true) }
|
20
17
|
it { expect(data_store.yellow?(name)).to eql(false) }
|
21
18
|
it { expect(data_store.red?(name)).to eql(false) }
|
22
19
|
it { expect(data_store.get_attempts(name)).to eql(Stoplight::DataStore::DEFAULT_ATTEMPTS) }
|
23
20
|
it { expect(data_store.record_attempt(name)).to eql(1) }
|
24
|
-
it { expect(data_store.clear_attempts(name)).to eql(nil) }
|
25
21
|
it { expect(data_store.get_failures(name)).to eql(Stoplight::DataStore::DEFAULT_FAILURES) }
|
26
22
|
it { expect(data_store.record_failure(name, failure)).to eql(failure) }
|
27
|
-
it { expect(data_store.clear_failures(name)).to eql(nil) }
|
28
23
|
it { expect(data_store.get_state(name)).to eql(Stoplight::DataStore::DEFAULT_STATE) }
|
29
24
|
it { expect(data_store.set_state(name, state)).to eql(state) }
|
30
|
-
it { expect(data_store.clear_state(name)).to eql(nil) }
|
31
25
|
it { expect(data_store.get_threshold(name)).to eql(Stoplight::DataStore::DEFAULT_THRESHOLD) }
|
32
26
|
it { expect(data_store.set_threshold(name, threshold)).to eql(threshold) }
|
33
|
-
it { expect(data_store.clear_threshold(name)).to eql(nil) }
|
34
27
|
it { expect(data_store.get_timeout(name)).to eql(Stoplight::DataStore::DEFAULT_TIMEOUT) }
|
35
28
|
it { expect(data_store.set_timeout(name, timeout)).to eql(timeout) }
|
36
|
-
it { expect(data_store.clear_timeout(name)).to eql(nil) }
|
37
29
|
|
38
30
|
it 'clears stale lights' do
|
39
31
|
data_store.sync(name)
|
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: 0.4.
|
4
|
+
version: 0.4.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Cameron Desautels
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2014-
|
12
|
+
date: 2014-10-03 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: benchmark-ips
|