berater 0.7.1 → 0.10.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/lib/berater/concurrency_limiter.rb +9 -13
- data/lib/berater/inhibitor.rb +4 -0
- data/lib/berater/limiter.rb +53 -21
- data/lib/berater/limiter_set.rb +66 -0
- data/lib/berater/lock.rb +2 -1
- data/lib/berater/lua_script.rb +4 -3
- data/lib/berater/rate_limiter.rb +9 -8
- data/lib/berater/rspec.rb +0 -1
- data/lib/berater/static_limiter.rb +49 -0
- data/lib/berater/test_mode.rb +27 -16
- data/lib/berater/unlimiter.rb +4 -0
- data/lib/berater/utils.rb +4 -0
- data/lib/berater/version.rb +1 -1
- data/lib/berater.rb +21 -10
- data/spec/berater_spec.rb +39 -71
- data/spec/concurrency_limiter_spec.rb +8 -2
- data/spec/inhibitor_spec.rb +10 -5
- data/spec/limiter_set_spec.rb +173 -0
- data/spec/limiter_spec.rb +97 -8
- data/spec/lua_script_spec.rb +0 -1
- data/spec/middleware_spec.rb +110 -0
- data/spec/rate_limiter_spec.rb +2 -1
- data/spec/riddle_spec.rb +1 -1
- data/spec/static_limiter_spec.rb +79 -0
- data/spec/test_mode_spec.rb +12 -6
- data/spec/unlimiter_spec.rb +11 -5
- metadata +27 -5
@@ -0,0 +1,79 @@
|
|
1
|
+
describe Berater::StaticLimiter do
|
2
|
+
it_behaves_like 'a limiter', described_class.new(:key, 3)
|
3
|
+
it_behaves_like 'a limiter', described_class.new(:key, 3.5)
|
4
|
+
|
5
|
+
describe '#limit' do
|
6
|
+
let(:limiter) { described_class.new(:key, 3) }
|
7
|
+
|
8
|
+
it 'limits excessive calls' do
|
9
|
+
3.times { limiter.limit }
|
10
|
+
|
11
|
+
expect(limiter).to be_overloaded
|
12
|
+
end
|
13
|
+
|
14
|
+
context 'when capacity is a Float' do
|
15
|
+
let(:limiter) { described_class.new(:key, 1.5) }
|
16
|
+
|
17
|
+
it 'still works' do
|
18
|
+
limiter.limit
|
19
|
+
expect(limiter).not_to be_overloaded
|
20
|
+
|
21
|
+
expect { limiter.limit }.to be_overloaded
|
22
|
+
|
23
|
+
limiter.limit(cost: 0.5)
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
it 'accepts a dynamic capacity' do
|
28
|
+
limiter = described_class.new(:key, 1)
|
29
|
+
|
30
|
+
expect { limiter.limit(capacity: 0) }.to be_overloaded
|
31
|
+
5.times { limiter.limit(capacity: 10) }
|
32
|
+
expect { limiter }.to be_overloaded
|
33
|
+
end
|
34
|
+
|
35
|
+
context 'works with cost parameter' do
|
36
|
+
let(:limiter) { described_class.new(:key, 3) }
|
37
|
+
|
38
|
+
it { expect { limiter.limit(cost: 4) }.to be_overloaded }
|
39
|
+
|
40
|
+
it 'works within limit' do
|
41
|
+
limiter.limit(cost: 3)
|
42
|
+
expect { limiter.limit }.to be_overloaded
|
43
|
+
end
|
44
|
+
|
45
|
+
context 'when cost is a Float' do
|
46
|
+
it 'still works' do
|
47
|
+
2.times { limiter.limit(cost: 1.5) }
|
48
|
+
expect(limiter).to be_overloaded
|
49
|
+
end
|
50
|
+
|
51
|
+
it 'calculates contention correctly' do
|
52
|
+
lock = limiter.limit(cost: 1.5)
|
53
|
+
expect(lock.contention).to be 1.5
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
describe '#utilization' do
|
60
|
+
let(:limiter) { described_class.new(:key, 10) }
|
61
|
+
|
62
|
+
it do
|
63
|
+
expect(limiter.utilization).to be 0.0
|
64
|
+
|
65
|
+
2.times { limiter.limit }
|
66
|
+
expect(limiter.utilization).to be 0.2
|
67
|
+
|
68
|
+
8.times { limiter.limit }
|
69
|
+
expect(limiter.utilization).to be 1.0
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
describe '#to_s' do
|
74
|
+
let(:limiter) { described_class.new(:key, 3) }
|
75
|
+
|
76
|
+
it { expect(limiter.to_s).to include '3' }
|
77
|
+
end
|
78
|
+
|
79
|
+
end
|
data/spec/test_mode_spec.rb
CHANGED
@@ -1,8 +1,4 @@
|
|
1
1
|
describe Berater::TestMode do
|
2
|
-
after do
|
3
|
-
Berater.test_mode = nil
|
4
|
-
end
|
5
|
-
|
6
2
|
context 'after test_mode.rb has been loaded' do
|
7
3
|
it 'monkey patches Berater' do
|
8
4
|
expect(Berater).to respond_to(:test_mode)
|
@@ -13,8 +9,8 @@ describe Berater::TestMode do
|
|
13
9
|
end
|
14
10
|
|
15
11
|
it 'prepends Limiter subclasses' do
|
16
|
-
expect(Berater::Unlimiter.ancestors).to include(
|
17
|
-
expect(Berater::Inhibitor.ancestors).to include(
|
12
|
+
expect(Berater::Unlimiter.ancestors).to include(Berater::Limiter::TestMode)
|
13
|
+
expect(Berater::Inhibitor.ancestors).to include(Berater::Limiter::TestMode)
|
18
14
|
end
|
19
15
|
|
20
16
|
it 'preserves the original functionality via super' do
|
@@ -55,6 +51,16 @@ describe Berater::TestMode do
|
|
55
51
|
end
|
56
52
|
end
|
57
53
|
|
54
|
+
describe '.reset' do
|
55
|
+
before { Berater.test_mode = :pass }
|
56
|
+
|
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
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
58
64
|
shared_examples 'it supports test_mode' do
|
59
65
|
before do
|
60
66
|
# without hitting Redis
|
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,29 +1,43 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: berater
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.10.1
|
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-
|
11
|
+
date: 2021-09-18 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: meddleware
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ">="
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0.2'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0.2'
|
13
27
|
- !ruby/object:Gem::Dependency
|
14
28
|
name: redis
|
15
29
|
requirement: !ruby/object:Gem::Requirement
|
16
30
|
requirements:
|
17
31
|
- - ">="
|
18
32
|
- !ruby/object:Gem::Version
|
19
|
-
version: '
|
33
|
+
version: '3'
|
20
34
|
type: :runtime
|
21
35
|
prerelease: false
|
22
36
|
version_requirements: !ruby/object:Gem::Requirement
|
23
37
|
requirements:
|
24
38
|
- - ">="
|
25
39
|
- !ruby/object:Gem::Version
|
26
|
-
version: '
|
40
|
+
version: '3'
|
27
41
|
- !ruby/object:Gem::Dependency
|
28
42
|
name: benchmark
|
29
43
|
requirement: !ruby/object:Gem::Requirement
|
@@ -133,11 +147,13 @@ files:
|
|
133
147
|
- lib/berater/dsl.rb
|
134
148
|
- lib/berater/inhibitor.rb
|
135
149
|
- lib/berater/limiter.rb
|
150
|
+
- lib/berater/limiter_set.rb
|
136
151
|
- lib/berater/lock.rb
|
137
152
|
- lib/berater/lua_script.rb
|
138
153
|
- lib/berater/rate_limiter.rb
|
139
154
|
- lib/berater/rspec.rb
|
140
155
|
- lib/berater/rspec/matchers.rb
|
156
|
+
- lib/berater/static_limiter.rb
|
141
157
|
- lib/berater/test_mode.rb
|
142
158
|
- lib/berater/unlimiter.rb
|
143
159
|
- lib/berater/utils.rb
|
@@ -147,11 +163,14 @@ files:
|
|
147
163
|
- spec/dsl_refinement_spec.rb
|
148
164
|
- spec/dsl_spec.rb
|
149
165
|
- spec/inhibitor_spec.rb
|
166
|
+
- spec/limiter_set_spec.rb
|
150
167
|
- spec/limiter_spec.rb
|
151
168
|
- spec/lua_script_spec.rb
|
152
169
|
- spec/matchers_spec.rb
|
170
|
+
- spec/middleware_spec.rb
|
153
171
|
- spec/rate_limiter_spec.rb
|
154
172
|
- spec/riddle_spec.rb
|
173
|
+
- spec/static_limiter_spec.rb
|
155
174
|
- spec/test_mode_spec.rb
|
156
175
|
- spec/unlimiter_spec.rb
|
157
176
|
- spec/utils_spec.rb
|
@@ -174,7 +193,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
174
193
|
- !ruby/object:Gem::Version
|
175
194
|
version: '0'
|
176
195
|
requirements: []
|
177
|
-
rubygems_version: 3.
|
196
|
+
rubygems_version: 3.1.4
|
178
197
|
signing_key:
|
179
198
|
specification_version: 4
|
180
199
|
summary: Berater
|
@@ -183,12 +202,15 @@ test_files:
|
|
183
202
|
- spec/matchers_spec.rb
|
184
203
|
- spec/dsl_refinement_spec.rb
|
185
204
|
- spec/test_mode_spec.rb
|
205
|
+
- spec/middleware_spec.rb
|
186
206
|
- spec/dsl_spec.rb
|
187
207
|
- spec/lua_script_spec.rb
|
188
208
|
- spec/concurrency_limiter_spec.rb
|
189
209
|
- spec/riddle_spec.rb
|
210
|
+
- spec/limiter_set_spec.rb
|
190
211
|
- spec/utils_spec.rb
|
191
212
|
- spec/berater_spec.rb
|
192
213
|
- spec/limiter_spec.rb
|
214
|
+
- spec/static_limiter_spec.rb
|
193
215
|
- spec/inhibitor_spec.rb
|
194
216
|
- spec/unlimiter_spec.rb
|