better_rate_limit 0.1.4 → 0.1.7

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
  SHA256:
3
- metadata.gz: 1ffd49df2965a97b61d730cbb292bf827c1e67efd36578a04b4832b65b6a23a9
4
- data.tar.gz: 96b221bcb3b9328097cc4ba11fb7d8b9c514d0b19654f1e723933139f4725938
3
+ metadata.gz: 05720aabc13993c0e8fc708415d4464b6db86b9cdcffab16e9f32b6dabfaa935
4
+ data.tar.gz: 4e2c18b7928c45e3276e92d87eb080d977bcde352abe3f55c482afa815806808
5
5
  SHA512:
6
- metadata.gz: 5be3857423b38f9f56211922c084bc9ba4717f665b6571882c760d169b8b93e0d90959d9758ebb01153ab39ed7079ab47c05d32324fef347bb8a06889d2613d9
7
- data.tar.gz: 68e6449f5bd8b32ce388f437c07b16af85bcd41b16ff84509d2cb15c4db74fd73c671d89df00919c78717b1b5e7a1a63e5e568c34dc983f27f1f70f50350356a
6
+ metadata.gz: a081b16c393cc95387701e41eba68c5109aa8fcb574324042f55830828879d06f14c87a859f667b90b3df56108cb92b2e5d5954272e4169aa2e35d1517da69f8
7
+ data.tar.gz: 0db7a65a4135753ebe34fc6c0f34126ede4f41360fb4a3cab4999b2934c244423f9d46cd23c2b31cd18412826399462d256ddc9d41abc89d0feaf64541a64f0c
data/.travis.yml CHANGED
@@ -2,5 +2,5 @@
2
2
  language: ruby
3
3
  cache: bundler
4
4
  rvm:
5
- - 2.6.5
5
+ - 2.6.6
6
6
  before_install: gem install bundler -v 2.1.4
data/Gemfile.lock CHANGED
@@ -1,44 +1,44 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- better_rate_limit (0.1.3)
4
+ better_rate_limit (0.1.6)
5
5
  actionpack (>= 5.0)
6
6
  redis (>= 3.3)
7
7
 
8
8
  GEM
9
9
  remote: https://rubygems.org/
10
10
  specs:
11
- actionpack (5.2.4.3)
12
- actionview (= 5.2.4.3)
13
- activesupport (= 5.2.4.3)
11
+ actionpack (5.2.6.2)
12
+ actionview (= 5.2.6.2)
13
+ activesupport (= 5.2.6.2)
14
14
  rack (~> 2.0, >= 2.0.8)
15
15
  rack-test (>= 0.6.3)
16
16
  rails-dom-testing (~> 2.0)
17
17
  rails-html-sanitizer (~> 1.0, >= 1.0.2)
18
- actionview (5.2.4.3)
19
- activesupport (= 5.2.4.3)
18
+ actionview (5.2.6.2)
19
+ activesupport (= 5.2.6.2)
20
20
  builder (~> 3.1)
21
21
  erubi (~> 1.4)
22
22
  rails-dom-testing (~> 2.0)
23
23
  rails-html-sanitizer (~> 1.0, >= 1.0.3)
24
- activesupport (5.2.4.3)
24
+ activesupport (5.2.6.2)
25
25
  concurrent-ruby (~> 1.0, >= 1.0.2)
26
26
  i18n (>= 0.7, < 2)
27
27
  minitest (~> 5.1)
28
28
  tzinfo (~> 1.1)
29
29
  builder (3.2.4)
30
30
  coderay (1.1.3)
31
- concurrent-ruby (1.1.6)
31
+ concurrent-ruby (1.1.9)
32
32
  crass (1.0.6)
33
- erubi (1.9.0)
34
- i18n (1.8.5)
33
+ erubi (1.10.0)
34
+ i18n (1.9.1)
35
35
  concurrent-ruby (~> 1.0)
36
- loofah (2.6.0)
36
+ loofah (2.14.0)
37
37
  crass (~> 1.0.2)
38
38
  nokogiri (>= 1.5.9)
39
39
  method_source (1.0.0)
40
40
  mini_portile2 (2.4.0)
41
- minitest (5.14.1)
41
+ minitest (5.15.0)
42
42
  mocha (1.11.2)
43
43
  mock_redis (0.25.0)
44
44
  nokogiri (1.10.10)
@@ -47,8 +47,8 @@ GEM
47
47
  coderay (~> 1.1)
48
48
  method_source (~> 1.0)
49
49
  rack (2.2.3)
50
- rack-test (0.6.3)
51
- rack (>= 1.0)
50
+ rack-test (1.1.0)
51
+ rack (>= 1.0, < 3)
52
52
  rails-controller-testing (1.0.5)
53
53
  actionpack (>= 5.0.1.rc1)
54
54
  actionview (>= 5.0.1.rc1)
@@ -56,13 +56,13 @@ GEM
56
56
  rails-dom-testing (2.0.3)
57
57
  activesupport (>= 4.2.0)
58
58
  nokogiri (>= 1.6)
59
- rails-html-sanitizer (1.3.0)
59
+ rails-html-sanitizer (1.4.2)
60
60
  loofah (~> 2.3)
61
61
  rake (12.3.3)
62
- redis (4.2.1)
62
+ redis (4.3.1)
63
63
  thread_safe (0.3.6)
64
64
  timecop (0.9.1)
65
- tzinfo (1.2.7)
65
+ tzinfo (1.2.9)
66
66
  thread_safe (~> 0.1)
67
67
 
68
68
  PLATFORMS
data/README.md CHANGED
@@ -41,6 +41,15 @@ ActiveSupport::Notifications.subscribe /rate_limit/ do |_name, _start, _finish,
41
41
  end
42
42
  ```
43
43
 
44
+ ### Configuration
45
+ You can ignore the throttle by using the following configuration
46
+ ```ruby
47
+ BetterRateLimit.configure do |config|
48
+ config.ignore = true
49
+ end
50
+ ```
51
+ Useful to ignore the throttle on tests.
52
+
44
53
  ## Development
45
54
 
46
55
  After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake test` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ module BetterRateLimit
4
+ class Configuration
5
+ attr_accessor :ignore, :redis_client
6
+
7
+ def initialize
8
+ @ignore = false
9
+ end
10
+ end
11
+ end
@@ -2,6 +2,12 @@
2
2
 
3
3
  require 'redis'
4
4
 
5
+ class MissingRedisConfigError < StandardError
6
+ def initialize
7
+ super 'Redis client not set'
8
+ end
9
+ end
10
+
5
11
  module BetterRateLimit
6
12
  module RedisConnection
7
13
  def self.included(host)
@@ -10,7 +16,7 @@ module BetterRateLimit
10
16
 
11
17
  module ClassMethods
12
18
  def redis_client
13
- @redis_client ||= Redis.new(url: ENV.fetch('REDIS_URL', 'redis://localhost:6379'))
19
+ @redis_client ||= BetterRateLimit.configuration.redis_client
14
20
  end
15
21
  end
16
22
  end
@@ -10,22 +10,28 @@ module BetterRateLimit
10
10
 
11
11
  class << self
12
12
  def throttle(key, limit:, time_window:)
13
+ raise MissingRedisConfigError unless redis_client
14
+ return true if BetterRateLimit.configuration.ignore
15
+
13
16
  now = Time.now.utc
14
17
  timestamps_count = redis_client.llen key
15
18
 
16
19
  if timestamps_count < limit
17
- redis_client.multi do
18
- redis_client.rpush key, now
19
- redis_client.expire key, time_window.to_i
20
+ redis_client.multi do |pipeline|
21
+ pipeline.rpush key, now
22
+ pipeline.expire key, time_window.to_i
20
23
  end
21
24
  true
22
25
  else
23
26
  first = redis_client.lpop(key)
24
- redis_client.multi do
25
- redis_client.rpush key, now
26
- redis_client.expire key, time_window.to_i
27
+
28
+ redis_client.multi do |pipeline|
29
+ pipeline.rpush key, now
30
+ pipeline.expire key, time_window.to_i
27
31
  end
28
32
 
33
+ return false unless first
34
+
29
35
  passing = first.to_time(:utc) < time_window.ago
30
36
 
31
37
  unless passing
@@ -1,3 +1,3 @@
1
1
  module BetterRateLimit
2
- VERSION = "0.1.4"
2
+ VERSION = "0.1.7"
3
3
  end
@@ -1,4 +1,21 @@
1
1
  require 'action_controller'
2
+ require 'better_rate_limit/configuration'
3
+
4
+ module BetterRateLimit
5
+ class << self
6
+ def configuration
7
+ @configuration ||= Configuration.new
8
+ end
9
+
10
+ def configure
11
+ yield configuration
12
+ end
13
+
14
+ def reset_configuration
15
+ @configuration = Configuration.new
16
+ end
17
+ end
18
+ end
2
19
 
3
20
  module ActionController
4
21
  autoload :BetterRateLimit, 'action_controller/better_rate_limit'
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: better_rate_limit
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.4
4
+ version: 0.1.7
5
5
  platform: ruby
6
6
  authors:
7
7
  - Pablo Fonseca
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: exe
11
11
  cert_chain: []
12
- date: 2021-02-18 00:00:00.000000000 Z
12
+ date: 2022-07-15 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: redis
@@ -58,6 +58,7 @@ files:
58
58
  - bin/setup
59
59
  - lib/action_controller/better_rate_limit.rb
60
60
  - lib/better_rate_limit.rb
61
+ - lib/better_rate_limit/configuration.rb
61
62
  - lib/better_rate_limit/limit.rb
62
63
  - lib/better_rate_limit/redis_connection.rb
63
64
  - lib/better_rate_limit/throttle.rb
@@ -83,7 +84,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
83
84
  - !ruby/object:Gem::Version
84
85
  version: '0'
85
86
  requirements: []
86
- rubygems_version: 3.0.8
87
+ rubygems_version: 3.2.22
87
88
  signing_key:
88
89
  specification_version: 4
89
90
  summary: Rate limit requests