throttling 0.3.0 → 0.3.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.
- data/CHANGELOG.md +11 -0
- data/lib/throttling/base.rb +4 -4
- data/lib/throttling/version.rb +1 -1
- data/spec/base_spec.rb +18 -5
- data/spec/spec_helper.rb +3 -2
- metadata +13 -13
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,14 @@
|
|
1
|
+
## 0.3.1 (April 13, 2012)
|
2
|
+
|
3
|
+
Features:
|
4
|
+
|
5
|
+
- When limit is omitted, no limits will be enforced (`check` always returns true)
|
6
|
+
|
7
|
+
Bugfixes:
|
8
|
+
|
9
|
+
- Fixed bug when action was allowed `limit + 1` times
|
10
|
+
- When limit is 0, `check` should always return `false`
|
11
|
+
|
1
12
|
## 0.3.0 (April 13, 2012)
|
2
13
|
|
3
14
|
Features:
|
data/lib/throttling/base.rb
CHANGED
@@ -35,11 +35,11 @@ module Throttling
|
|
35
35
|
|
36
36
|
limits.each do |period_name, params|
|
37
37
|
period = params[:period].to_i
|
38
|
-
limit = params[:limit].to_i
|
38
|
+
limit = params[:limit].nil? ? nil : params[:limit].to_i
|
39
39
|
values = params[:values]
|
40
40
|
|
41
|
-
raise ArgumentError, "Invalid or no 'period' parameter in the limits[#{period_name}] config" if period < 1
|
42
|
-
raise ArgumentError, "Invalid
|
41
|
+
raise ArgumentError, "Invalid or no 'period' parameter in the limits[#{action}][#{period_name}] config: #{limit.inspect}" if period < 1
|
42
|
+
raise ArgumentError, "Invalid 'limit' parameter in the limits[#{action}][#{period_name}] config: #{limit.inspect}" if !limit.nil? && limit < 0
|
43
43
|
|
44
44
|
key = hits_store_key(check_type, check_value, period_name, period)
|
45
45
|
|
@@ -56,7 +56,7 @@ module Throttling
|
|
56
56
|
end
|
57
57
|
else
|
58
58
|
# Over limit?
|
59
|
-
return false if hits
|
59
|
+
return false if !limit.nil? && hits >= limit
|
60
60
|
end
|
61
61
|
|
62
62
|
Throttling.storage.increment(key) if auto_increment
|
data/lib/throttling/version.rb
CHANGED
data/spec/base_spec.rb
CHANGED
@@ -18,9 +18,16 @@ describe Throttling do
|
|
18
18
|
@t.send(check_method, nil).should be_true
|
19
19
|
end
|
20
20
|
|
21
|
-
it 'should
|
21
|
+
it 'should return true if no limit specified in configs' do
|
22
22
|
Throttling.limits['foo']['limit'] = nil
|
23
|
-
|
23
|
+
@storage.should_receive(:fetch).and_return(1000)
|
24
|
+
@t.send(check_method, valid_value).should be_true
|
25
|
+
end
|
26
|
+
|
27
|
+
it 'should return false if limit is 0' do
|
28
|
+
Throttling.limits['foo']['limit'] = 0
|
29
|
+
@storage.should_receive(:fetch).and_return(0)
|
30
|
+
@t.send(check_method, valid_value).should be_false
|
24
31
|
end
|
25
32
|
|
26
33
|
it 'should raise an exception if no period specified in configs' do
|
@@ -53,17 +60,23 @@ describe Throttling do
|
|
53
60
|
@t.send(check_method, valid_value)
|
54
61
|
end
|
55
62
|
|
56
|
-
it 'should increase hit counter when values equals to limit' do
|
63
|
+
it 'should not increase hit counter when values equals to limit' do
|
57
64
|
@storage.should_receive(:fetch).and_return(Throttling.limits['foo']['limit'])
|
58
|
-
@storage.
|
65
|
+
@storage.should_not_receive(:increment)
|
59
66
|
@t.send(check_method, valid_value)
|
60
67
|
end
|
61
68
|
|
62
|
-
it 'should increase hit counter when values equals to limit + 1' do
|
69
|
+
it 'should not increase hit counter when values equals to limit + 1' do
|
63
70
|
@storage.should_receive(:fetch).and_return(Throttling.limits['foo']['limit'] + 1)
|
64
71
|
@storage.should_not_receive(:increment)
|
65
72
|
@t.send(check_method, valid_value)
|
66
73
|
end
|
74
|
+
|
75
|
+
it 'should allow exactly limit actions' do
|
76
|
+
5.times { @t.send(check_method, valid_value).should be_true }
|
77
|
+
@storage.should_not_receive(:increment)
|
78
|
+
@t.send(check_method, valid_value).should be_false
|
79
|
+
end
|
67
80
|
end
|
68
81
|
end
|
69
82
|
end
|
data/spec/spec_helper.rb
CHANGED
@@ -8,8 +8,9 @@ class TestStorage
|
|
8
8
|
def fetch(key, options = {}, &block)
|
9
9
|
@values ||= {}
|
10
10
|
value = @values.fetch(key, &block)
|
11
|
-
|
12
|
-
value
|
11
|
+
value = { :value => value.to_s } unless Hash === value
|
12
|
+
@values[key] = value.merge(options)
|
13
|
+
value[:value]
|
13
14
|
end
|
14
15
|
|
15
16
|
def increment(key)
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: throttling
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.3.
|
4
|
+
version: 0.3.1
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -14,7 +14,7 @@ date: 2012-04-13 00:00:00.000000000 Z
|
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: rake
|
17
|
-
requirement: &
|
17
|
+
requirement: &70097466944080 !ruby/object:Gem::Requirement
|
18
18
|
none: false
|
19
19
|
requirements:
|
20
20
|
- - ! '>='
|
@@ -22,10 +22,10 @@ dependencies:
|
|
22
22
|
version: '0'
|
23
23
|
type: :development
|
24
24
|
prerelease: false
|
25
|
-
version_requirements: *
|
25
|
+
version_requirements: *70097466944080
|
26
26
|
- !ruby/object:Gem::Dependency
|
27
27
|
name: rspec
|
28
|
-
requirement: &
|
28
|
+
requirement: &70097466943660 !ruby/object:Gem::Requirement
|
29
29
|
none: false
|
30
30
|
requirements:
|
31
31
|
- - ! '>='
|
@@ -33,10 +33,10 @@ dependencies:
|
|
33
33
|
version: '0'
|
34
34
|
type: :development
|
35
35
|
prerelease: false
|
36
|
-
version_requirements: *
|
36
|
+
version_requirements: *70097466943660
|
37
37
|
- !ruby/object:Gem::Dependency
|
38
38
|
name: timecop
|
39
|
-
requirement: &
|
39
|
+
requirement: &70097466943240 !ruby/object:Gem::Requirement
|
40
40
|
none: false
|
41
41
|
requirements:
|
42
42
|
- - ! '>='
|
@@ -44,10 +44,10 @@ dependencies:
|
|
44
44
|
version: '0'
|
45
45
|
type: :development
|
46
46
|
prerelease: false
|
47
|
-
version_requirements: *
|
47
|
+
version_requirements: *70097466943240
|
48
48
|
- !ruby/object:Gem::Dependency
|
49
49
|
name: guard-rspec
|
50
|
-
requirement: &
|
50
|
+
requirement: &70097466942820 !ruby/object:Gem::Requirement
|
51
51
|
none: false
|
52
52
|
requirements:
|
53
53
|
- - ! '>='
|
@@ -55,10 +55,10 @@ dependencies:
|
|
55
55
|
version: '0'
|
56
56
|
type: :development
|
57
57
|
prerelease: false
|
58
|
-
version_requirements: *
|
58
|
+
version_requirements: *70097466942820
|
59
59
|
- !ruby/object:Gem::Dependency
|
60
60
|
name: rb-fsevent
|
61
|
-
requirement: &
|
61
|
+
requirement: &70097466942400 !ruby/object:Gem::Requirement
|
62
62
|
none: false
|
63
63
|
requirements:
|
64
64
|
- - ! '>='
|
@@ -66,10 +66,10 @@ dependencies:
|
|
66
66
|
version: '0'
|
67
67
|
type: :development
|
68
68
|
prerelease: false
|
69
|
-
version_requirements: *
|
69
|
+
version_requirements: *70097466942400
|
70
70
|
- !ruby/object:Gem::Dependency
|
71
71
|
name: growl
|
72
|
-
requirement: &
|
72
|
+
requirement: &70097466941980 !ruby/object:Gem::Requirement
|
73
73
|
none: false
|
74
74
|
requirements:
|
75
75
|
- - ! '>='
|
@@ -77,7 +77,7 @@ dependencies:
|
|
77
77
|
version: '0'
|
78
78
|
type: :development
|
79
79
|
prerelease: false
|
80
|
-
version_requirements: *
|
80
|
+
version_requirements: *70097466941980
|
81
81
|
description: Throttling gem provides basic, but very powerful way to throttle various
|
82
82
|
user actions in your application
|
83
83
|
email:
|