simple-throttle 0.0.1 → 0.0.11
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile +1 -1
- data/bin/console +1 -1
- data/lib/simple_throttle.rb +22 -0
- data/lib/simple_throttle/manual/runner.rb +33 -0
- data/lib/{throttle → simple_throttle}/time_window/runner.rb +24 -10
- data/lib/simple_throttle/version.rb +3 -0
- data/simple-throttle.gemspec +3 -3
- metadata +7 -6
- data/lib/throttle.rb +0 -17
- data/lib/throttle/version.rb +0 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 240699b699a121b5e2c61603da086dc0783fee5a
|
4
|
+
data.tar.gz: eb41f346aabdeae4e649b62beda29cea99c1ca3d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5375d65514aaca8c347576add62c8507e37769557e2fd485a5644c0d1b0cb78d4121a22f1aec99fc838c00533e8e01d99ddf418efad630e722b4ab80375b2ac5
|
7
|
+
data.tar.gz: 172875d5289072f07404a1bdfdee50c695517e6a12be2309fc17dc50f3e067c1fc1c2ad92a5720711e5fe52f7c9055f483544a3c2cabf4b226ce1ba43a6ec8b3
|
data/Gemfile
CHANGED
data/bin/console
CHANGED
@@ -0,0 +1,22 @@
|
|
1
|
+
require "simple_throttle/version"
|
2
|
+
require "simple_throttle/time_window/runner"
|
3
|
+
require "simple_throttle/manual/runner"
|
4
|
+
|
5
|
+
module SimpleThrottle
|
6
|
+
|
7
|
+
HOUR_SECONDS = 3600
|
8
|
+
DAYS_SECONDS = 24 * HOUR_SECONDS
|
9
|
+
|
10
|
+
def self.per_hour(count)
|
11
|
+
TimeWindow::Runner.new(HOUR_SECONDS, count.to_i)
|
12
|
+
end
|
13
|
+
|
14
|
+
def self.per_day(count)
|
15
|
+
TimeWindow::Runner.new(DAYS_SECONDS, count.to_i)
|
16
|
+
end
|
17
|
+
|
18
|
+
def self.hourly_manual(count)
|
19
|
+
Manual::Runner.new(HOUR_SECONDS, count.to_i)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
@@ -0,0 +1,33 @@
|
|
1
|
+
module SimpleThrottle
|
2
|
+
module Manual
|
3
|
+
class Runner
|
4
|
+
#client can manually override the remaining count.
|
5
|
+
attr_accessor :remaining
|
6
|
+
|
7
|
+
# Parameters:
|
8
|
+
# +wait_s+: minimum number os seconds between +count+ block invocations
|
9
|
+
# +count+: maximum number of times block may be called between +wait_s+ seconds
|
10
|
+
def initialize(wait_s, count, sleep = ->(seconds) { sleep seconds })
|
11
|
+
@max = count
|
12
|
+
@remaining = @max
|
13
|
+
@wait_s = wait_s.to_f
|
14
|
+
@sleep = sleep
|
15
|
+
end
|
16
|
+
|
17
|
+
# Run given +block+ either immediately (if allowed) or after sleep.
|
18
|
+
def run(&block)
|
19
|
+
if @remaining < 1
|
20
|
+
@sleep.call @wait_s
|
21
|
+
@remaining = @max
|
22
|
+
end
|
23
|
+
|
24
|
+
@remaining -= 1
|
25
|
+
yield
|
26
|
+
end
|
27
|
+
|
28
|
+
def within_limit?
|
29
|
+
@remaining > 0
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -1,4 +1,4 @@
|
|
1
|
-
module
|
1
|
+
module SimpleThrottle
|
2
2
|
module TimeWindow
|
3
3
|
##
|
4
4
|
# Executes at most a number of times within given time window.
|
@@ -18,17 +18,12 @@ module Throttle
|
|
18
18
|
# Run given +block+ either immediately (if allowed) or after sleep.
|
19
19
|
def run(&block)
|
20
20
|
#puts "count: #{@count}, delta: #{Time.now.to_f - @last}"
|
21
|
-
now = Time.now.to_f
|
22
|
-
delta = now - @last
|
23
|
-
if delta >= @wait_s
|
24
|
-
#puts "resetting"
|
25
|
-
@last = now
|
26
|
-
@count = 0
|
27
|
-
end
|
28
21
|
|
29
|
-
|
22
|
+
restart_window_if_needed
|
23
|
+
|
24
|
+
if !within_limit?
|
30
25
|
sleep_interval = @wait_s - delta
|
31
|
-
#puts "
|
26
|
+
#puts "simple_throttle forced sleep for #{sleep_interval}"
|
32
27
|
@sleep.call sleep_interval
|
33
28
|
end
|
34
29
|
|
@@ -36,6 +31,25 @@ module Throttle
|
|
36
31
|
#puts "running "
|
37
32
|
yield
|
38
33
|
end
|
34
|
+
|
35
|
+
def within_limit?
|
36
|
+
restart_window_if_needed
|
37
|
+
@count < @max
|
38
|
+
end
|
39
|
+
|
40
|
+
def delta
|
41
|
+
now = Time.now.to_f
|
42
|
+
now - @last
|
43
|
+
end
|
44
|
+
|
45
|
+
def restart_window_if_needed
|
46
|
+
if delta >= @wait_s
|
47
|
+
#puts "resetting"
|
48
|
+
@last = Time.now.to_f
|
49
|
+
@count = 0
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
39
53
|
end
|
40
54
|
end
|
41
55
|
end
|
data/simple-throttle.gemspec
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
# coding: utf-8
|
2
2
|
lib = File.expand_path('../lib', __FILE__)
|
3
3
|
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
-
require '
|
4
|
+
require 'simple_throttle/version'
|
5
5
|
|
6
6
|
Gem::Specification.new do |spec|
|
7
7
|
spec.name = "simple-throttle"
|
8
|
-
spec.version =
|
8
|
+
spec.version = SimpleThrottle::VERSION
|
9
9
|
spec.authors = ["Alexandre Maia"]
|
10
10
|
spec.email = ["alexandre.maia@gmail.com"]
|
11
11
|
spec.summary = %q{Limit amount of executions with time windows.}
|
12
|
-
spec.homepage = "https://www.github.com/cxz/simple-
|
12
|
+
spec.homepage = "https://www.github.com/cxz/simple-simple_throttle"
|
13
13
|
spec.license = %q{MIT}
|
14
14
|
|
15
15
|
# Prevent pushing this gem to RubyGems.org. To allow pushes either set the 'allowed_push_host'
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: simple-throttle
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.11
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Alexandre Maia
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-
|
11
|
+
date: 2016-09-05 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -81,11 +81,12 @@ files:
|
|
81
81
|
- Rakefile
|
82
82
|
- bin/console
|
83
83
|
- bin/setup
|
84
|
-
- lib/
|
85
|
-
- lib/
|
86
|
-
- lib/
|
84
|
+
- lib/simple_throttle.rb
|
85
|
+
- lib/simple_throttle/manual/runner.rb
|
86
|
+
- lib/simple_throttle/time_window/runner.rb
|
87
|
+
- lib/simple_throttle/version.rb
|
87
88
|
- simple-throttle.gemspec
|
88
|
-
homepage: https://www.github.com/cxz/simple-
|
89
|
+
homepage: https://www.github.com/cxz/simple-simple_throttle
|
89
90
|
licenses:
|
90
91
|
- MIT
|
91
92
|
metadata: {}
|
data/lib/throttle.rb
DELETED
@@ -1,17 +0,0 @@
|
|
1
|
-
require "throttle/version"
|
2
|
-
require "throttle/time_window/runner"
|
3
|
-
|
4
|
-
module Throttle
|
5
|
-
|
6
|
-
HOUR_SECONDS = 3600
|
7
|
-
DAYS_SECONDS = 24 * HOUR_SECONDS
|
8
|
-
|
9
|
-
def self.per_hour(count)
|
10
|
-
TimeWindow::Runner.new(HOUR_SECONDS, count)
|
11
|
-
end
|
12
|
-
|
13
|
-
def self.per_day(count)
|
14
|
-
TimeWindow::Runner.new(DAYS_SECONDS, count)
|
15
|
-
end
|
16
|
-
end
|
17
|
-
|
data/lib/throttle/version.rb
DELETED