raterr 0.1.1 → 0.1.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 17ba66bcb168f7edde054062b22e260a53655635
4
- data.tar.gz: e74e650451a183e4ff1e051807e5c69e29c1af9a
3
+ metadata.gz: 4d5f9e1d3c31745498e3887068c22635036e518b
4
+ data.tar.gz: 2942ba9149a80c66c3eac4ed1de69ebc7a920205
5
5
  SHA512:
6
- metadata.gz: f16f4bb8cafbc3f99fc2c5356842276244e53c3780561d1df0a2e38e27565bb11671bb34aa7711c30125bfedb96717f8860519e5be893b3645f36332e61caea0
7
- data.tar.gz: 8c7cc518d9bc683211cce1aae4bc7865b854da9b4b81360b7f561fb98f28f20d0074448214c5c32bea7078323e5e07f21bf056fbcccbda99fb39c5be19f47759
6
+ metadata.gz: 16af8babc16f23a439a014af9b2246b3eb25da816c1898ef35ae7a8b3c6bc175e8939d1c4ccae7d2abdd5f87f41d5d5928b9a561a132db4f5cbf181d7333dac9
7
+ data.tar.gz: 2eff125149940a708537a9dfb0027cdb2154a77c5084fb356960062509d59adcc923a00be1479b2f0c18466f351ff8d00ede717b2c5aaa4165152488ca557d6c
data/.travis.yml CHANGED
@@ -3,3 +3,6 @@ language: ruby
3
3
  rvm:
4
4
  - 2.4.0
5
5
  before_install: gem install bundler -v 1.14.3
6
+ services:
7
+ - redis-server
8
+ script: RATERR_TEST_HASH=1 rake && RATERR_TEST_REDIS=1 rake
data/Gemfile CHANGED
@@ -2,5 +2,6 @@ source 'https://rubygems.org'
2
2
 
3
3
  # Specify your gem's dependencies in raterr.gemspec
4
4
  gemspec
5
+ gem 'redis', '~> 4.0.0'
5
6
  gem 'byebug', require: false
6
7
  gem 'codecov', require: false, group: :test
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 a `ActiveSupport::Cache::MemoryStore`
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?(::ActiveSupport::Cache::MemoryStore)
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[:attempts] <= max_per_period
20
+ fetch_cache['attempts'] <= max_per_period
21
21
  end
22
22
 
23
23
  def proceed
24
- attempts = fetch_cache[:attempts] + 1
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
- cache.fetch(identifier) { { attempts: 1, start_time: Time.now } }
41
+ container.resolve(:get)
42
42
  end
43
43
 
44
44
  def set_cache(value)
45
45
  cache_attributes = {}.tap do |cache|
46
- cache[:attempts] = value
47
- cache[:start_time] = start_time
46
+ cache['attempts'] = value
47
+ cache['start_time'] = start_time
48
48
  end
49
- cache.is_a?(Hash) ? cache[identifier] = cache_attributes :
50
- cache.write(identifier, cache_attributes)
49
+
50
+ container.resolve(:set, cache_attributes)
51
51
  end
52
52
 
53
53
  def reset_cache
54
- cache.delete(identifier)
54
+ container.resolve(:delete, identifier)
55
55
  end
56
56
 
57
- def cache
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[:start_time]
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
@@ -1,3 +1,3 @@
1
1
  module Raterr
2
- VERSION = "0.1.1"
2
+ VERSION = "0.1.2"
3
3
  end
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 "activesupport", "~> 5.0"
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.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-03 00:00:00.000000000 Z
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: activesupport
56
+ name: timecop
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
59
  - - "~>"
60
60
  - !ruby/object:Gem::Version
61
- version: '5.0'
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: '5.0'
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