prop 0.3.6 → 0.4.1

Sign up to get free protection for your applications and to get access to all the features.
data/README.rdoc CHANGED
@@ -54,6 +54,15 @@ If you wish to reset a specific throttle, you can do that like so:
54
54
 
55
55
  When the threshold are invoked without argument, the key is nil and as such a scope of its own.
56
56
 
57
+ The default (and smallest possible) increment is 1, you can of course set that to any integer value using :increment
58
+
59
+ Prop.setup(:execution_time_ms, :threshold => 1000, :interval => 1.minute)
60
+ Prop.throttle_execution_time_ms!(:increment => (Benchmark.realtime { execute } * 1000).to_i)
61
+
62
+ You can gauge the current value of a throttle using count:
63
+
64
+ Prop.count_mails_per_hour!(mail.from)
65
+
57
66
  Lastly you can use Prop without registering the thresholds up front:
58
67
 
59
68
  Prop.throttle!(:key => 'nuisance@example.com', :threshold => 100, :interval -> 1.hour)
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.3.6
1
+ 0.4.1
data/lib/prop.rb CHANGED
@@ -65,7 +65,7 @@ class Prop
65
65
  end
66
66
  raise Prop::RateLimitExceededError.create(options[:key], options[:threshold], options[:message])
67
67
  else
68
- writer.call(sanitized_prop_key(options), counter + 1)
68
+ writer.call(sanitized_prop_key(options), counter + [ 1, options[:increment].to_i ].max)
69
69
  end
70
70
  end
71
71
 
@@ -93,7 +93,7 @@ class Prop
93
93
  options = args.last.is_a?(Hash) ? args.pop : {}
94
94
  return {
95
95
  :key => normalize_cache_key(args), :message => defaults[:message], :progressive => defaults[:progressive],
96
- :threshold => defaults[:threshold].to_i, :interval => defaults[:interval].to_i
96
+ :threshold => defaults[:threshold].to_i, :interval => defaults[:interval].to_i, :increment => defaults[:increment]
97
97
  }.merge(options)
98
98
  end
99
99
 
data/prop.gemspec CHANGED
@@ -1,41 +1,39 @@
1
1
  # Generated by jeweler
2
2
  # DO NOT EDIT THIS FILE DIRECTLY
3
- # Instead, edit Jeweler::Tasks in rakefile, and run the gemspec command
3
+ # Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
4
4
  # -*- encoding: utf-8 -*-
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{prop}
8
- s.version = "0.3.6"
8
+ s.version = "0.4.1"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Morten Primdahl"]
12
- s.date = %q{2010-08-03}
12
+ s.date = %q{2010-12-08}
13
13
  s.description = %q{A gem for implementing rate limiting}
14
14
  s.email = %q{morten@zendesk.com}
15
15
  s.extra_rdoc_files = [
16
16
  "LICENSE",
17
- "README.rdoc"
17
+ "README.rdoc"
18
18
  ]
19
19
  s.files = [
20
20
  ".document",
21
- ".gitignore",
22
- "LICENSE",
23
- "README.rdoc",
24
- "Rakefile",
25
- "VERSION",
26
- "lib/prop.rb",
27
- "prop.gemspec",
28
- "test/helper.rb",
29
- "test/test_prop.rb"
21
+ "LICENSE",
22
+ "README.rdoc",
23
+ "Rakefile",
24
+ "VERSION",
25
+ "lib/prop.rb",
26
+ "prop.gemspec",
27
+ "test/helper.rb",
28
+ "test/test_prop.rb"
30
29
  ]
31
30
  s.homepage = %q{http://github.com/morten/prop}
32
- s.rdoc_options = ["--charset=UTF-8"]
33
31
  s.require_paths = ["lib"]
34
32
  s.rubygems_version = %q{1.3.7}
35
33
  s.summary = %q{Puts a cork in their requests}
36
34
  s.test_files = [
37
35
  "test/helper.rb",
38
- "test/test_prop.rb"
36
+ "test/test_prop.rb"
39
37
  ]
40
38
 
41
39
  if s.respond_to? :specification_version then
data/test/helper.rb CHANGED
@@ -2,6 +2,7 @@ require 'rubygems'
2
2
  require 'test/unit'
3
3
  require 'shoulda'
4
4
  require 'mocha'
5
+ require 'time'
5
6
 
6
7
  $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
7
8
  $LOAD_PATH.unshift(File.dirname(__FILE__))
data/test/test_prop.rb CHANGED
@@ -140,7 +140,7 @@ class TestProp < Test::Unit::TestCase
140
140
  assert_raises(Prop::RateLimitExceededError) { Prop.throttle_progressive! }
141
141
  end
142
142
 
143
- should "not increment the counter beyon the threshold" do
143
+ should "not increment the counter beyond the threshold" do
144
144
  10.times do |i|
145
145
  Prop.throttle!(:key => 'hello', :threshold => 5, :interval => 10) rescue nil
146
146
  end
@@ -148,6 +148,17 @@ class TestProp < Test::Unit::TestCase
148
148
  assert_equal 5, Prop.count(:key => 'hello', :threshold => 5, :interval => 10)
149
149
  end
150
150
 
151
+ should "support custom increments" do
152
+ Prop.throttle!(:key => 'hello', :threshold => 100, :interval => 10)
153
+ Prop.throttle!(:key => 'hello', :threshold => 100, :interval => 10)
154
+
155
+ assert_equal 2, Prop.count(:key => 'hello', :threshold => 100, :interval => 10)
156
+
157
+ Prop.throttle!(:key => 'hello', :threshold => 100, :interval => 10, :increment => 48)
158
+
159
+ assert_equal 50, Prop.count(:key => 'hello', :threshold => 100, :interval => 10)
160
+ end
161
+
151
162
  should "raise Prop::RateLimitExceededError when the threshold is exceeded" do
152
163
  5.times do |i|
153
164
  Prop.throttle!(:key => 'hello', :threshold => 5, :interval => 10)
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: prop
3
3
  version: !ruby/object:Gem::Version
4
- hash: 31
4
+ hash: 13
5
5
  prerelease: false
6
6
  segments:
7
7
  - 0
8
- - 3
9
- - 6
10
- version: 0.3.6
8
+ - 4
9
+ - 1
10
+ version: 0.4.1
11
11
  platform: ruby
12
12
  authors:
13
13
  - Morten Primdahl
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2010-08-03 00:00:00 -07:00
18
+ date: 2010-12-08 00:00:00 -08:00
19
19
  default_executable:
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency
@@ -59,7 +59,6 @@ extra_rdoc_files:
59
59
  - README.rdoc
60
60
  files:
61
61
  - .document
62
- - .gitignore
63
62
  - LICENSE
64
63
  - README.rdoc
65
64
  - Rakefile
@@ -73,8 +72,8 @@ homepage: http://github.com/morten/prop
73
72
  licenses: []
74
73
 
75
74
  post_install_message:
76
- rdoc_options:
77
- - --charset=UTF-8
75
+ rdoc_options: []
76
+
78
77
  require_paths:
79
78
  - lib
80
79
  required_ruby_version: !ruby/object:Gem::Requirement
data/.gitignore DELETED
@@ -1,21 +0,0 @@
1
- ## MAC OS
2
- .DS_Store
3
-
4
- ## TEXTMATE
5
- *.tmproj
6
- tmtags
7
-
8
- ## EMACS
9
- *~
10
- \#*
11
- .\#*
12
-
13
- ## VIM
14
- *.swp
15
-
16
- ## PROJECT::GENERAL
17
- coverage
18
- rdoc
19
- pkg
20
-
21
- ## PROJECT::SPECIFIC