berater 0.6.0 → 0.8.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 +4 -4
- data/lib/berater.rb +14 -13
- data/lib/berater/concurrency_limiter.rb +19 -37
- data/lib/berater/dsl.rb +8 -8
- data/lib/berater/inhibitor.rb +4 -7
- data/lib/berater/limiter.rb +49 -19
- data/lib/berater/lock.rb +2 -1
- data/lib/berater/rate_limiter.rb +40 -40
- data/lib/berater/rspec.rb +1 -2
- data/lib/berater/rspec/matchers.rb +26 -48
- data/lib/berater/static_limiter.rb +49 -0
- data/lib/berater/test_mode.rb +31 -36
- data/lib/berater/unlimiter.rb +8 -6
- data/lib/berater/utils.rb +9 -0
- data/lib/berater/version.rb +1 -1
- data/spec/berater_spec.rb +26 -76
- data/spec/concurrency_limiter_spec.rb +73 -57
- data/spec/dsl_refinement_spec.rb +0 -12
- data/spec/dsl_spec.rb +5 -17
- data/spec/inhibitor_spec.rb +10 -5
- data/spec/limiter_spec.rb +95 -9
- data/spec/matchers_spec.rb +21 -85
- data/spec/rate_limiter_spec.rb +88 -38
- data/spec/riddle_spec.rb +6 -2
- data/spec/static_limiter_spec.rb +79 -0
- data/spec/test_mode_spec.rb +48 -106
- data/spec/unlimiter_spec.rb +11 -5
- metadata +5 -2
data/spec/test_mode_spec.rb
CHANGED
@@ -1,35 +1,20 @@
|
|
1
|
-
describe Berater::TestMode
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
Berater.test_mode = nil if reset_test_mode
|
6
|
-
end
|
7
|
-
|
8
|
-
context 'after test_mode.rb was required, but not used' do
|
9
|
-
let(:reset_test_mode) { false }
|
10
|
-
|
11
|
-
it 'has already been loaded by "berater/rspec", unfortunately' do
|
12
|
-
expect {
|
13
|
-
expect { Berater.test_mode }.to raise_error(NoMethodError)
|
14
|
-
}.to fail
|
1
|
+
describe Berater::TestMode do
|
2
|
+
context 'after test_mode.rb has been loaded' do
|
3
|
+
it 'monkey patches Berater' do
|
4
|
+
expect(Berater).to respond_to(:test_mode)
|
15
5
|
end
|
16
6
|
|
17
7
|
it 'defaults to off' do
|
18
8
|
expect(Berater.test_mode).to be nil
|
19
9
|
end
|
20
10
|
|
21
|
-
it '
|
22
|
-
expect(Berater::
|
23
|
-
|
24
|
-
|
25
|
-
it 'prepends when first turned on' do
|
26
|
-
Berater.test_mode = :pass
|
27
|
-
|
28
|
-
expect(Berater::Limiter.singleton_class.ancestors).to include(described_class)
|
11
|
+
it 'prepends Limiter subclasses' do
|
12
|
+
expect(Berater::Unlimiter.ancestors).to include(Berater::Limiter::TestMode)
|
13
|
+
expect(Berater::Inhibitor.ancestors).to include(Berater::Limiter::TestMode)
|
29
14
|
end
|
30
15
|
|
31
16
|
it 'preserves the original functionality via super' do
|
32
|
-
expect { Berater::Limiter.new }.to raise_error(
|
17
|
+
expect { Berater::Limiter.new }.to raise_error(NoMethodError)
|
33
18
|
end
|
34
19
|
end
|
35
20
|
|
@@ -50,31 +35,53 @@ describe Berater::TestMode, order: :defined do
|
|
50
35
|
it 'validates input' do
|
51
36
|
expect { Berater.test_mode = :foo }.to raise_error(ArgumentError)
|
52
37
|
end
|
53
|
-
end
|
54
38
|
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
39
|
+
it 'works no matter when limiter was created' do
|
40
|
+
limiter = Berater::Unlimiter.new
|
41
|
+
expect(limiter).not_to be_overloaded
|
42
|
+
|
43
|
+
Berater.test_mode = :fail
|
44
|
+
expect(limiter).to be_overloaded
|
45
|
+
end
|
46
|
+
|
47
|
+
it 'supports a generic expectation' do
|
48
|
+
Berater.test_mode = :pass
|
49
|
+
expect_any_instance_of(Berater::Limiter).to receive(:limit)
|
50
|
+
Berater::Unlimiter.new.limit
|
59
51
|
end
|
52
|
+
end
|
60
53
|
|
61
|
-
|
54
|
+
describe '.reset' do
|
55
|
+
before { Berater.test_mode = :pass }
|
62
56
|
|
63
|
-
it '
|
64
|
-
|
57
|
+
it 'resets test_mode' do
|
58
|
+
expect(Berater.test_mode).to be :pass
|
59
|
+
Berater.reset
|
60
|
+
expect(Berater.test_mode).to be nil
|
65
61
|
end
|
66
62
|
end
|
67
63
|
|
68
|
-
shared_examples 'it
|
64
|
+
shared_examples 'it supports test_mode' do
|
69
65
|
before do
|
66
|
+
# without hitting Redis
|
70
67
|
Berater.redis = nil
|
71
68
|
expect_any_instance_of(Berater::LuaScript).not_to receive(:eval)
|
72
69
|
end
|
73
70
|
|
74
|
-
|
71
|
+
context 'with test_mode = :pass' do
|
72
|
+
before { Berater.test_mode = :pass }
|
73
|
+
|
74
|
+
it_behaves_like 'it is not overloaded'
|
75
|
+
|
76
|
+
it 'always works' do
|
77
|
+
10.times { subject.limit }
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
context 'with test_mode = :fail' do
|
82
|
+
before { Berater.test_mode = :fail }
|
75
83
|
|
76
|
-
|
77
|
-
expect { subject }.to be_overloaded
|
84
|
+
it_behaves_like 'it is overloaded'
|
78
85
|
end
|
79
86
|
end
|
80
87
|
|
@@ -84,23 +91,10 @@ describe Berater::TestMode, order: :defined do
|
|
84
91
|
context 'when test_mode = nil' do
|
85
92
|
before { Berater.test_mode = nil }
|
86
93
|
|
87
|
-
it
|
88
|
-
it_behaves_like 'it always works, without redis'
|
89
|
-
end
|
90
|
-
|
91
|
-
context 'when test_mode = :pass' do
|
92
|
-
before { Berater.test_mode = :pass }
|
93
|
-
|
94
|
-
it { is_expected.to be_a Berater::Unlimiter }
|
95
|
-
it_behaves_like 'it always works, without redis'
|
94
|
+
it_behaves_like 'it is not overloaded'
|
96
95
|
end
|
97
96
|
|
98
|
-
|
99
|
-
before { Berater.test_mode = :fail }
|
100
|
-
|
101
|
-
it { is_expected.to be_a Berater::Unlimiter }
|
102
|
-
it_behaves_like 'it never works, without redis'
|
103
|
-
end
|
97
|
+
it_behaves_like 'it supports test_mode'
|
104
98
|
end
|
105
99
|
|
106
100
|
describe 'Inhibitor' do
|
@@ -109,42 +103,18 @@ describe Berater::TestMode, order: :defined do
|
|
109
103
|
context 'when test_mode = nil' do
|
110
104
|
before { Berater.test_mode = nil }
|
111
105
|
|
112
|
-
it
|
113
|
-
it_behaves_like 'it never works, without redis'
|
114
|
-
end
|
115
|
-
|
116
|
-
context 'when test_mode = :pass' do
|
117
|
-
before { Berater.test_mode = :pass }
|
118
|
-
|
119
|
-
it { is_expected.to be_a Berater::Inhibitor }
|
120
|
-
it_behaves_like 'it always works, without redis'
|
106
|
+
it_behaves_like 'it is overloaded'
|
121
107
|
end
|
122
108
|
|
123
|
-
|
124
|
-
before { Berater.test_mode = :fail }
|
125
|
-
|
126
|
-
it { is_expected.to be_a Berater::Inhibitor }
|
127
|
-
it_behaves_like 'it never works, without redis'
|
128
|
-
end
|
109
|
+
it_behaves_like 'it supports test_mode'
|
129
110
|
end
|
130
111
|
|
131
112
|
describe 'RateLimiter' do
|
132
113
|
subject { Berater::RateLimiter.new(:key, 1, :second) }
|
133
114
|
|
134
|
-
shared_examples 'a RateLimiter' do
|
135
|
-
it { is_expected.to be_a Berater::RateLimiter }
|
136
|
-
|
137
|
-
it 'checks arguments' do
|
138
|
-
expect {
|
139
|
-
Berater::RateLimiter.new(:key, 1)
|
140
|
-
}.to raise_error(ArgumentError)
|
141
|
-
end
|
142
|
-
end
|
143
|
-
|
144
115
|
context 'when test_mode = nil' do
|
145
116
|
before { Berater.test_mode = nil }
|
146
117
|
|
147
|
-
it_behaves_like 'a RateLimiter'
|
148
118
|
it_behaves_like 'it is not overloaded'
|
149
119
|
|
150
120
|
it 'works per usual' do
|
@@ -154,19 +124,7 @@ describe Berater::TestMode, order: :defined do
|
|
154
124
|
end
|
155
125
|
end
|
156
126
|
|
157
|
-
|
158
|
-
before { Berater.test_mode = :pass }
|
159
|
-
|
160
|
-
it_behaves_like 'a RateLimiter'
|
161
|
-
it_behaves_like 'it always works, without redis'
|
162
|
-
end
|
163
|
-
|
164
|
-
context 'when test_mode = :fail' do
|
165
|
-
before { Berater.test_mode = :fail }
|
166
|
-
|
167
|
-
it_behaves_like 'a RateLimiter'
|
168
|
-
it_behaves_like 'it never works, without redis'
|
169
|
-
end
|
127
|
+
it_behaves_like 'it supports test_mode'
|
170
128
|
end
|
171
129
|
|
172
130
|
describe 'ConcurrencyLimiter' do
|
@@ -175,8 +133,6 @@ describe Berater::TestMode, order: :defined do
|
|
175
133
|
context 'when test_mode = nil' do
|
176
134
|
before { Berater.test_mode = nil }
|
177
135
|
|
178
|
-
it { is_expected.to be_a Berater::ConcurrencyLimiter }
|
179
|
-
|
180
136
|
it_behaves_like 'it is not overloaded'
|
181
137
|
|
182
138
|
it 'works per usual' do
|
@@ -186,21 +142,7 @@ describe Berater::TestMode, order: :defined do
|
|
186
142
|
end
|
187
143
|
end
|
188
144
|
|
189
|
-
|
190
|
-
before { Berater.test_mode = :pass }
|
191
|
-
|
192
|
-
it { is_expected.to be_a Berater::ConcurrencyLimiter }
|
193
|
-
|
194
|
-
it_behaves_like 'it always works, without redis'
|
195
|
-
end
|
196
|
-
|
197
|
-
context 'when test_mode = :fail' do
|
198
|
-
before { Berater.test_mode = :fail }
|
199
|
-
|
200
|
-
it { is_expected.to be_a Berater::ConcurrencyLimiter }
|
201
|
-
|
202
|
-
it_behaves_like 'it never works, without redis'
|
203
|
-
end
|
145
|
+
it_behaves_like 'it supports test_mode'
|
204
146
|
end
|
205
147
|
|
206
148
|
end
|
data/spec/unlimiter_spec.rb
CHANGED
@@ -1,9 +1,11 @@
|
|
1
1
|
describe Berater::Unlimiter do
|
2
|
+
subject { described_class.new }
|
3
|
+
|
2
4
|
it_behaves_like 'a limiter', described_class.new
|
3
5
|
|
4
6
|
describe '.new' do
|
5
7
|
it 'initializes without any arguments or options' do
|
6
|
-
|
8
|
+
is_expected.to be_a described_class
|
7
9
|
end
|
8
10
|
|
9
11
|
it 'initializes with any arguments and options' do
|
@@ -11,14 +13,12 @@ describe Berater::Unlimiter do
|
|
11
13
|
end
|
12
14
|
|
13
15
|
it 'has default values' do
|
14
|
-
expect(
|
15
|
-
expect(
|
16
|
+
expect(subject.key).to be :unlimiter
|
17
|
+
expect(subject.redis).to be Berater.redis
|
16
18
|
end
|
17
19
|
end
|
18
20
|
|
19
21
|
describe '#limit' do
|
20
|
-
subject { described_class.new }
|
21
|
-
|
22
22
|
it_behaves_like 'it is not overloaded'
|
23
23
|
|
24
24
|
it 'is never overloaded' do
|
@@ -27,4 +27,10 @@ describe Berater::Unlimiter do
|
|
27
27
|
end
|
28
28
|
end
|
29
29
|
end
|
30
|
+
|
31
|
+
describe '#to_s' do
|
32
|
+
it do
|
33
|
+
expect(subject.to_s).to include described_class.to_s
|
34
|
+
end
|
35
|
+
end
|
30
36
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: berater
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.8.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Daniel Pepper
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2021-03-
|
11
|
+
date: 2021-03-22 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: redis
|
@@ -138,6 +138,7 @@ files:
|
|
138
138
|
- lib/berater/rate_limiter.rb
|
139
139
|
- lib/berater/rspec.rb
|
140
140
|
- lib/berater/rspec/matchers.rb
|
141
|
+
- lib/berater/static_limiter.rb
|
141
142
|
- lib/berater/test_mode.rb
|
142
143
|
- lib/berater/unlimiter.rb
|
143
144
|
- lib/berater/utils.rb
|
@@ -152,6 +153,7 @@ files:
|
|
152
153
|
- spec/matchers_spec.rb
|
153
154
|
- spec/rate_limiter_spec.rb
|
154
155
|
- spec/riddle_spec.rb
|
156
|
+
- spec/static_limiter_spec.rb
|
155
157
|
- spec/test_mode_spec.rb
|
156
158
|
- spec/unlimiter_spec.rb
|
157
159
|
- spec/utils_spec.rb
|
@@ -190,5 +192,6 @@ test_files:
|
|
190
192
|
- spec/utils_spec.rb
|
191
193
|
- spec/berater_spec.rb
|
192
194
|
- spec/limiter_spec.rb
|
195
|
+
- spec/static_limiter_spec.rb
|
193
196
|
- spec/inhibitor_spec.rb
|
194
197
|
- spec/unlimiter_spec.rb
|