raterr 0.1.1 → 0.1.2
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/.travis.yml +3 -0
- data/Gemfile +1 -0
- data/README.md +3 -3
- data/lib/raterr.rb +3 -2
- data/lib/raterr/mixin.rb +15 -11
- data/lib/raterr/store_container.rb +33 -0
- data/lib/raterr/version.rb +1 -1
- data/raterr.gemspec +1 -1
- metadata +6 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 4d5f9e1d3c31745498e3887068c22635036e518b
|
4
|
+
data.tar.gz: 2942ba9149a80c66c3eac4ed1de69ebc7a920205
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 16af8babc16f23a439a014af9b2246b3eb25da816c1898ef35ae7a8b3c6bc175e8939d1c4ccae7d2abdd5f87f41d5d5928b9a561a132db4f5cbf181d7333dac9
|
7
|
+
data.tar.gz: 2eff125149940a708537a9dfb0027cdb2154a77c5084fb356960062509d59adcc923a00be1479b2f0c18466f351ff8d00ede717b2c5aaa4165152488ca557d6c
|
data/.travis.yml
CHANGED
data/Gemfile
CHANGED
data/README.md
CHANGED
@@ -23,14 +23,14 @@ Or install it yourself as:
|
|
23
23
|
|
24
24
|
## Usage
|
25
25
|
For Ruby based application you need to tell `Raterr` what store to use.
|
26
|
-
Currently it supports a simple hash or
|
26
|
+
Currently it supports a simple hash, or `Redis`
|
27
27
|
It is best to load the store in an initializer of any other kind of file
|
28
28
|
that is loaded initially.
|
29
29
|
```ruby
|
30
30
|
# Use either
|
31
|
-
Raterr::Cache.store = ActiveSupport::Cache::MemoryStore.new
|
32
|
-
# Or
|
33
31
|
Raterr::Cache.store = Hash.new
|
32
|
+
# Or
|
33
|
+
Raterr::Cache.store = Redis.new
|
34
34
|
```
|
35
35
|
To enforce rate limiting use:
|
36
36
|
```ruby
|
data/lib/raterr.rb
CHANGED
@@ -1,10 +1,11 @@
|
|
1
|
-
require 'active_support'
|
2
1
|
require 'raterr/version'
|
2
|
+
require 'raterr/store_container'
|
3
3
|
require 'raterr/period_builder'
|
4
4
|
require 'raterr/mixin'
|
5
5
|
require 'raterr/hour'
|
6
6
|
require 'raterr/day'
|
7
7
|
require 'raterr/minute'
|
8
|
+
require 'redis'
|
8
9
|
|
9
10
|
module Raterr
|
10
11
|
|
@@ -23,7 +24,7 @@ module Raterr
|
|
23
24
|
attr_accessor :store
|
24
25
|
|
25
26
|
def enforce(request, **options)
|
26
|
-
unless store.is_a?(Hash) || store.is_a?(::
|
27
|
+
unless store.is_a?(Hash) || store.is_a?(::Redis)
|
27
28
|
raise InvalidStore.new('Store is not valid, please refer to the documentation')
|
28
29
|
end
|
29
30
|
|
data/lib/raterr/mixin.rb
CHANGED
@@ -17,11 +17,11 @@ module Raterr
|
|
17
17
|
|
18
18
|
def allowed?
|
19
19
|
reset_cache if Time.now > rate_period
|
20
|
-
fetch_cache[
|
20
|
+
fetch_cache['attempts'] <= max_per_period
|
21
21
|
end
|
22
22
|
|
23
23
|
def proceed
|
24
|
-
attempts = fetch_cache[
|
24
|
+
attempts = fetch_cache['attempts'] + 1
|
25
25
|
set_cache(attempts)
|
26
26
|
|
27
27
|
{
|
@@ -38,28 +38,32 @@ module Raterr
|
|
38
38
|
end
|
39
39
|
|
40
40
|
def fetch_cache
|
41
|
-
|
41
|
+
container.resolve(:get)
|
42
42
|
end
|
43
43
|
|
44
44
|
def set_cache(value)
|
45
45
|
cache_attributes = {}.tap do |cache|
|
46
|
-
cache[
|
47
|
-
cache[
|
46
|
+
cache['attempts'] = value
|
47
|
+
cache['start_time'] = start_time
|
48
48
|
end
|
49
|
-
|
50
|
-
|
49
|
+
|
50
|
+
container.resolve(:set, cache_attributes)
|
51
51
|
end
|
52
52
|
|
53
53
|
def reset_cache
|
54
|
-
|
54
|
+
container.resolve(:delete, identifier)
|
55
55
|
end
|
56
56
|
|
57
|
-
def
|
58
|
-
Raterr.store
|
57
|
+
def container
|
58
|
+
@container ||= StoreContainer.new(store: Raterr.store, identifier: identifier)
|
59
59
|
end
|
60
60
|
|
61
61
|
def start_time
|
62
|
-
fetch_cache[
|
62
|
+
start_time = fetch_cache['start_time']
|
63
|
+
# Depending on the storage option start_time can be
|
64
|
+
# either a Time object or a string
|
65
|
+
return Time.parse(start_time) if start_time.is_a?(String)
|
66
|
+
start_time
|
63
67
|
end
|
64
68
|
end
|
65
69
|
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
module Raterr
|
2
|
+
class StoreContainer
|
3
|
+
|
4
|
+
attr_reader :store, :store_type, :identifier
|
5
|
+
|
6
|
+
def initialize(store:, identifier:)
|
7
|
+
@store = store
|
8
|
+
@identifier = identifier
|
9
|
+
end
|
10
|
+
|
11
|
+
def resolve(method, attrs = nil)
|
12
|
+
store_type = store.class.to_s.downcase.to_sym
|
13
|
+
resolvers[method][store_type].call(attrs)
|
14
|
+
end
|
15
|
+
|
16
|
+
def resolvers
|
17
|
+
{
|
18
|
+
get: {
|
19
|
+
hash: -> (attributes) { store.fetch(identifier) { { 'attempts' => 1, 'start_time' => Time.now } } },
|
20
|
+
redis: -> (attributes) { JSON.parse(store.get(identifier) || { 'attempts' => 1, 'start_time' => Time.now }.to_json) }
|
21
|
+
},
|
22
|
+
set: {
|
23
|
+
hash: -> (attributes) { store[identifier] = attributes },
|
24
|
+
redis: -> (attributes) { store.set(identifier, attributes.to_json) }
|
25
|
+
},
|
26
|
+
delete: {
|
27
|
+
hash: -> (identifier) { store.delete(identifier) },
|
28
|
+
redis: -> (identifier) { store.del(identifier) }
|
29
|
+
}
|
30
|
+
}
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
data/lib/raterr/version.rb
CHANGED
data/raterr.gemspec
CHANGED
@@ -24,5 +24,5 @@ Gem::Specification.new do |spec|
|
|
24
24
|
spec.add_development_dependency "bundler", "~> 1.14"
|
25
25
|
spec.add_development_dependency "rake", "~> 10.0"
|
26
26
|
spec.add_development_dependency "rspec", "~> 3.0"
|
27
|
-
spec.add_development_dependency "
|
27
|
+
spec.add_development_dependency "timecop", "~> 0.9.1"
|
28
28
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: raterr
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Stefan Slaveykov
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-10-
|
11
|
+
date: 2017-10-27 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -53,19 +53,19 @@ dependencies:
|
|
53
53
|
- !ruby/object:Gem::Version
|
54
54
|
version: '3.0'
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
|
-
name:
|
56
|
+
name: timecop
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
58
58
|
requirements:
|
59
59
|
- - "~>"
|
60
60
|
- !ruby/object:Gem::Version
|
61
|
-
version:
|
61
|
+
version: 0.9.1
|
62
62
|
type: :development
|
63
63
|
prerelease: false
|
64
64
|
version_requirements: !ruby/object:Gem::Requirement
|
65
65
|
requirements:
|
66
66
|
- - "~>"
|
67
67
|
- !ruby/object:Gem::Version
|
68
|
-
version:
|
68
|
+
version: 0.9.1
|
69
69
|
description: A gem allowing you to set rate limiting on your application
|
70
70
|
email:
|
71
71
|
- wizard.oneandonly@gmail.com
|
@@ -89,6 +89,7 @@ files:
|
|
89
89
|
- lib/raterr/minute.rb
|
90
90
|
- lib/raterr/mixin.rb
|
91
91
|
- lib/raterr/period_builder.rb
|
92
|
+
- lib/raterr/store_container.rb
|
92
93
|
- lib/raterr/version.rb
|
93
94
|
- raterr.gemspec
|
94
95
|
homepage: https://github.com/wizardone/raterr
|