berater 0.1.4 → 0.6.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 +33 -35
- data/lib/berater/concurrency_limiter.rb +68 -110
- data/lib/berater/dsl.rb +68 -0
- data/lib/berater/inhibitor.rb +9 -10
- data/lib/berater/limiter.rb +80 -0
- data/lib/berater/lock.rb +26 -0
- data/lib/berater/lua_script.rb +55 -0
- data/lib/berater/rate_limiter.rb +77 -54
- data/lib/berater/rspec.rb +14 -0
- data/lib/berater/rspec/matchers.rb +83 -0
- data/lib/berater/test_mode.rb +52 -0
- data/lib/berater/unlimiter.rb +11 -9
- data/lib/berater/utils.rb +46 -0
- data/lib/berater/version.rb +1 -1
- data/spec/berater_spec.rb +43 -101
- data/spec/concurrency_limiter_spec.rb +168 -100
- data/spec/dsl_refinement_spec.rb +46 -0
- data/spec/dsl_spec.rb +72 -0
- data/spec/inhibitor_spec.rb +4 -18
- data/spec/limiter_spec.rb +71 -0
- data/spec/lua_script_spec.rb +97 -0
- data/spec/{matcher_spec.rb → matchers_spec.rb} +73 -5
- data/spec/rate_limiter_spec.rb +162 -99
- data/spec/riddle_spec.rb +102 -0
- data/spec/test_mode_spec.rb +206 -0
- data/spec/unlimiter_spec.rb +6 -37
- data/spec/utils_spec.rb +78 -0
- metadata +41 -8
- data/lib/berater/base_limiter.rb +0 -32
- data/spec/concurrency_lock_spec.rb +0 -92
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.6.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-
|
11
|
+
date: 2021-03-07 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: redis
|
@@ -24,6 +24,20 @@ dependencies:
|
|
24
24
|
- - ">="
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: '0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: benchmark
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ">="
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
27
41
|
- !ruby/object:Gem::Dependency
|
28
42
|
name: byebug
|
29
43
|
requirement: !ruby/object:Gem::Requirement
|
@@ -108,26 +122,39 @@ dependencies:
|
|
108
122
|
- - ">="
|
109
123
|
- !ruby/object:Gem::Version
|
110
124
|
version: '0'
|
111
|
-
description:
|
125
|
+
description: work...within limits
|
112
126
|
email:
|
113
127
|
executables: []
|
114
128
|
extensions: []
|
115
129
|
extra_rdoc_files: []
|
116
130
|
files:
|
117
131
|
- lib/berater.rb
|
118
|
-
- lib/berater/base_limiter.rb
|
119
132
|
- lib/berater/concurrency_limiter.rb
|
133
|
+
- lib/berater/dsl.rb
|
120
134
|
- lib/berater/inhibitor.rb
|
135
|
+
- lib/berater/limiter.rb
|
136
|
+
- lib/berater/lock.rb
|
137
|
+
- lib/berater/lua_script.rb
|
121
138
|
- lib/berater/rate_limiter.rb
|
139
|
+
- lib/berater/rspec.rb
|
140
|
+
- lib/berater/rspec/matchers.rb
|
141
|
+
- lib/berater/test_mode.rb
|
122
142
|
- lib/berater/unlimiter.rb
|
143
|
+
- lib/berater/utils.rb
|
123
144
|
- lib/berater/version.rb
|
124
145
|
- spec/berater_spec.rb
|
125
146
|
- spec/concurrency_limiter_spec.rb
|
126
|
-
- spec/
|
147
|
+
- spec/dsl_refinement_spec.rb
|
148
|
+
- spec/dsl_spec.rb
|
127
149
|
- spec/inhibitor_spec.rb
|
128
|
-
- spec/
|
150
|
+
- spec/limiter_spec.rb
|
151
|
+
- spec/lua_script_spec.rb
|
152
|
+
- spec/matchers_spec.rb
|
129
153
|
- spec/rate_limiter_spec.rb
|
154
|
+
- spec/riddle_spec.rb
|
155
|
+
- spec/test_mode_spec.rb
|
130
156
|
- spec/unlimiter_spec.rb
|
157
|
+
- spec/utils_spec.rb
|
131
158
|
homepage: https://github.com/dpep/berater_rb
|
132
159
|
licenses:
|
133
160
|
- MIT
|
@@ -153,9 +180,15 @@ specification_version: 4
|
|
153
180
|
summary: Berater
|
154
181
|
test_files:
|
155
182
|
- spec/rate_limiter_spec.rb
|
156
|
-
- spec/
|
183
|
+
- spec/matchers_spec.rb
|
184
|
+
- spec/dsl_refinement_spec.rb
|
185
|
+
- spec/test_mode_spec.rb
|
186
|
+
- spec/dsl_spec.rb
|
187
|
+
- spec/lua_script_spec.rb
|
157
188
|
- spec/concurrency_limiter_spec.rb
|
158
|
-
- spec/
|
189
|
+
- spec/riddle_spec.rb
|
190
|
+
- spec/utils_spec.rb
|
159
191
|
- spec/berater_spec.rb
|
192
|
+
- spec/limiter_spec.rb
|
160
193
|
- spec/inhibitor_spec.rb
|
161
194
|
- spec/unlimiter_spec.rb
|
data/lib/berater/base_limiter.rb
DELETED
@@ -1,32 +0,0 @@
|
|
1
|
-
module Berater
|
2
|
-
class BaseLimiter
|
3
|
-
|
4
|
-
attr_reader :options
|
5
|
-
|
6
|
-
def initialize(**opts)
|
7
|
-
@options = opts
|
8
|
-
end
|
9
|
-
|
10
|
-
def key
|
11
|
-
if options[:key]
|
12
|
-
"#{self.class}:#{options[:key]}"
|
13
|
-
else
|
14
|
-
# default value
|
15
|
-
self.class.to_s
|
16
|
-
end
|
17
|
-
end
|
18
|
-
|
19
|
-
def redis
|
20
|
-
options[:redis] || Berater.redis
|
21
|
-
end
|
22
|
-
|
23
|
-
def limit(**opts)
|
24
|
-
raise NotImplementedError
|
25
|
-
end
|
26
|
-
|
27
|
-
def self.limit(*args, **opts, &block)
|
28
|
-
self.new(*args, **opts).limit(&block)
|
29
|
-
end
|
30
|
-
|
31
|
-
end
|
32
|
-
end
|
@@ -1,92 +0,0 @@
|
|
1
|
-
describe Berater::ConcurrencyLimiter::Lock do
|
2
|
-
before { Berater.mode = :concurrency }
|
3
|
-
|
4
|
-
let(:limiter) { Berater.new(:concurrency, 3) }
|
5
|
-
|
6
|
-
describe '#contention' do
|
7
|
-
it 'tracks contention' do
|
8
|
-
lock_1 = limiter.limit
|
9
|
-
expect(lock_1.contention).to eq 1
|
10
|
-
|
11
|
-
lock_2 = limiter.limit
|
12
|
-
expect(lock_2.contention).to eq 2
|
13
|
-
|
14
|
-
limiter.limit do |lock_3|
|
15
|
-
expect(lock_3.contention).to eq 3
|
16
|
-
end
|
17
|
-
end
|
18
|
-
|
19
|
-
it 'works in block mode' do
|
20
|
-
lock_1 = limiter.limit
|
21
|
-
|
22
|
-
limiter.limit do |lock_2|
|
23
|
-
expect(lock_1.contention).to eq 1
|
24
|
-
expect(lock_2.contention).to eq 2
|
25
|
-
end
|
26
|
-
end
|
27
|
-
end
|
28
|
-
|
29
|
-
describe '#release' do
|
30
|
-
it 'can not be released twice' do
|
31
|
-
lock = limiter.limit
|
32
|
-
expect(lock.release).to be true
|
33
|
-
expect { lock.release }.to raise_error(RuntimeError, /already/)
|
34
|
-
end
|
35
|
-
|
36
|
-
it 'does not work in block mode' do
|
37
|
-
expect do
|
38
|
-
limiter.limit do |lock|
|
39
|
-
lock.release
|
40
|
-
end
|
41
|
-
end.to raise_error(RuntimeError, /already/)
|
42
|
-
end
|
43
|
-
end
|
44
|
-
|
45
|
-
describe '#released?' do
|
46
|
-
it 'works' do
|
47
|
-
lock = limiter.limit
|
48
|
-
expect(lock.released?).to be false
|
49
|
-
|
50
|
-
lock.release
|
51
|
-
expect(lock.released?).to be true
|
52
|
-
end
|
53
|
-
|
54
|
-
it 'works in block mode' do
|
55
|
-
limiter.limit do |lock|
|
56
|
-
expect(lock.released?).to be false
|
57
|
-
end
|
58
|
-
end
|
59
|
-
end
|
60
|
-
|
61
|
-
describe '#expired?' do
|
62
|
-
let!(:lock) { limiter.limit }
|
63
|
-
|
64
|
-
context 'when timeout is not set' do
|
65
|
-
it { expect(limiter.timeout).to eq 0 }
|
66
|
-
|
67
|
-
it 'never expires' do
|
68
|
-
expect(lock.expired?).to be false
|
69
|
-
|
70
|
-
Timecop.travel(1_000)
|
71
|
-
|
72
|
-
expect(lock.expired?).to be false
|
73
|
-
end
|
74
|
-
end
|
75
|
-
|
76
|
-
context 'when timeout is set and exceeded' do
|
77
|
-
before { Timecop.travel(1) }
|
78
|
-
|
79
|
-
let(:limiter) { Berater.new(:concurrency, 3, timeout: 1) }
|
80
|
-
|
81
|
-
it 'expires' do
|
82
|
-
expect(lock.expired?).to be true
|
83
|
-
end
|
84
|
-
|
85
|
-
it 'fails to release' do
|
86
|
-
expect(lock.released?).to be false
|
87
|
-
expect { lock.release }.to raise_error(RuntimeError, /expired/)
|
88
|
-
end
|
89
|
-
end
|
90
|
-
end
|
91
|
-
|
92
|
-
end
|