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.
@@ -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
@@ -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(described_class)
17
- expect(Berater::Inhibitor.ancestors).to include(described_class)
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
@@ -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
- expect(described_class.new).to be_a described_class
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(described_class.new.key).to be :unlimiter
15
- expect(described_class.new.redis).to be Berater.redis
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.7.1
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-03-15 00:00:00.000000000 Z
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: '0'
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: '0'
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.0.8
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