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 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