simple-throttle 0.0.1 → 0.0.11
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/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