ruby_rate_limiter 2.0.2 → 2.0.4

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
  SHA256:
3
- metadata.gz: c941d7875c4fabbe2df0861b89e8b7d18af0e001ac3f3e1425e51f59590a300c
4
- data.tar.gz: a1a1f7431b4797271fb5db464e771257505ec5b403adc5813aa38b477b223228
3
+ metadata.gz: fac1847e631354a2a9afe2bf545b46799580d0eb5504afe0a487acb34fb7e9cd
4
+ data.tar.gz: e1759f509fd0bd3ae66f4f40cdd1380816ae874ff96ac9988e97cf0a55cd74ce
5
5
  SHA512:
6
- metadata.gz: ef02828da1412884377e4eac4687672be0757ec13409e6bdb31df93b3dfdd3bcab0ffd3786180ddbb172f7c006d99aa0ab14ac933b03730904ee107140f65626
7
- data.tar.gz: 652883cc2da93a8eb07b10958f8120d3f57d900338d3d5b43a4fdba8e2d4c8ea5b0a613db0fbba9681997866b30c825f521737b1fa576dff8eaf7b021942ed5e
6
+ metadata.gz: f4d956f68015d77952ace49a10cf4268775d4152d3a7710fba49b9b7e4c715941548a0d8c5a4e097abd7871ab8239f865ca2ad30afbad3f475e65fdeb0914616
7
+ data.tar.gz: 71c1ea5ab146f05962b467a159c6fb317482dc75b4c583d4f3fab2cbdb2bc757db2b2270fe1797a0c339d4c5f48015ce53b782710adde9d4fd9e8568a169c695
data/README.md CHANGED
@@ -44,57 +44,63 @@ require 'ruby_rate_limiter'
44
44
  require 'redis'
45
45
 
46
46
  module RateLimiter
47
- def self.bucket
48
- @bucket ||= RubyRateLimiter::TokenBucket.new(
49
- 'user123',
47
+ DEFAULT_BUCKET_SIZE = 10
48
+ DEFAULT_REFILL_RATE = 1
49
+ DEFAULT_TIME_UNIT = :minute
50
+
51
+ def self.for(user_identifier:, bucket_size: DEFAULT_BUCKET_SIZE, refill_rate: DEFAULT_REFILL_RATE, time_unit: DEFAULT_TIME_UNIT)
52
+ RubyRateLimiter::TokenBucket.new(
53
+ user_identifier: user_identifier,
50
54
  storage: RubyRateLimiter::Storage::RedisStorage.new(redis_client),
51
- bucket_size: 10, # Optional: specify bucket size
52
- refill_rate: 2 # Optional: specify refill rate (tokens per second)
55
+ bucket_size: bucket_size,
56
+ refill_rate: refill_rate,
57
+ time_unit: time_unit
53
58
  )
54
59
  end
55
60
 
56
61
  private
57
62
 
58
63
  def self.redis_client
59
- @redis_client ||= Redis.new(url: 'redis://localhost:6379/1')
64
+ @redis_client ||= Redis.new(url: ENV['REDIS_URL'])
60
65
  end
61
66
  end
62
67
 
68
+
69
+
63
70
  ```
64
71
 
65
72
  ### Usage somewhere, in the controller or better still in a service
66
73
 
74
+ Maybe have some service
75
+
67
76
  ```ruby
68
- class SomeController < ApplicationController
69
- def some_action
70
- if RateLimiter.bucket.allow_request?
71
- # Process the request
72
- render json: { message: 'Request processed' }
73
- else
74
- # Rate limit exceeded
75
- render status: 429, json: { error: 'Too many requests' }
76
- end
77
+ class RateLimiterService
78
+ def self.rate_limit_exceeded?(user_identifier)
79
+ rate_limiter = RateLimiter.for(user_identifier: user_identifier)
80
+ !rate_limiter.allow_request?
77
81
  end
78
82
  end
83
+
79
84
  ```
80
85
 
86
+ Usage in the controller
87
+
81
88
  ```ruby
82
- class SomeService
83
- def perform
84
- if RateLimiter.bucket.allow_request?
85
- # Process the request
86
- # Perform the service logic here
89
+ class SomeController < ApplicationController
90
+ def some_action
91
+ user_identifier = current_user ? "user:#{current_user.id}" : "ip:#{request.remote_ip}"
92
+ if RateLimiterService.rate_limit_exceeded?(user_identifier)
93
+ render status: 429, json: { error: 'Too many requests' }
87
94
  else
88
- # Rate limit exceeded
89
- raise 'Too many requests'
95
+ # Process the request
96
+ render json: { message: 'Request processed' }
90
97
  end
91
98
  end
92
99
  end
93
100
 
94
- ```
95
-
96
101
  Contributing
97
102
  Bug reports and pull requests are welcome on GitHub at https://github.com/Mutuba/ruby-rate-limiter.
98
103
 
99
104
  License
100
105
  The gem is available as open source under the terms of the MIT License.
106
+ ```
@@ -1,8 +1,3 @@
1
- # lib/ruby_rate_limiter/token_bucket.rb
2
- require 'forwardable'
3
- require_relative 'storage/abstract_storage'
4
- require_relative 'storage/redis_storage'
5
-
6
1
  module RubyRateLimiter
7
2
  class TokenBucket
8
3
  extend Forwardable
@@ -34,20 +29,27 @@ module RubyRateLimiter
34
29
  def allow_request?
35
30
  refill_tokens
36
31
  tokens = get_bucket_size
32
+ puts "Allow request: tokens before = #{tokens}" # Debugging line
33
+
37
34
  return false if tokens < 1
38
35
 
39
36
  update_bucket_size(tokens - 1)
37
+ puts "Allow request: tokens after = #{get_bucket_size}" # Debugging line
40
38
  true
41
39
  end
42
40
 
43
41
  private
44
42
 
45
43
  def get_bucket_size
46
- (@storage.get("#{@user_id}_tokens") || @bucket_size).to_i
44
+ size = (@storage.get("#{@user_id}_tokens") || @bucket_size).to_i
45
+ puts "get_bucket_size: #{@user_id}_tokens = #{size}" # Debugging line
46
+ size
47
47
  end
48
48
 
49
49
  def get_last_refill_time
50
- (@storage.get("#{@user_id}_last_refill") || Time.now.to_f).to_f
50
+ last_refill = (@storage.get("#{@user_id}_last_refill") || Time.now.to_f).to_f
51
+ puts "get_last_refill_time: #{@user_id}_last_refill = #{last_refill}" # Debugging line
52
+ last_refill
51
53
  end
52
54
 
53
55
  def update_bucket_size(tokens)
@@ -62,13 +64,15 @@ module RubyRateLimiter
62
64
  current_time = Time.now.to_f
63
65
  last_refill_time = get_last_refill_time
64
66
  elapsed_time = current_time - last_refill_time
65
-
66
67
  new_tokens = (elapsed_time * @refill_rate_per_second).to_i
68
+ puts "Refill tokens: current_time = #{current_time}, last_refill_time = #{last_refill_time}, elapsed_time = #{elapsed_time}, new_tokens = #{new_tokens}" # Debugging line
69
+
67
70
  return if new_tokens <= 0
68
71
 
69
72
  tokens = [get_bucket_size + new_tokens, @bucket_size].min
70
73
  update_bucket_size(tokens)
71
74
  update_last_refill_time(current_time)
75
+ puts "Refill tokens: updated tokens = #{tokens}, current_time = #{current_time}" # Debugging line
72
76
  end
73
77
  end
74
78
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module RateLimiter
4
- VERSION = "2.0.2"
4
+ VERSION = "2.0.4"
5
5
  end
@@ -5,7 +5,6 @@ require 'ruby_rate_limiter/token_bucket'
5
5
  require 'ruby_rate_limiter/storage/abstract_storage'
6
6
  require 'ruby_rate_limiter/storage/redis_storage'
7
7
 
8
-
9
8
  module RubyRateLimiter
10
9
  class Error < StandardError; end
11
10
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ruby_rate_limiter
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.0.2
4
+ version: 2.0.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Mutuba
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2024-07-15 00:00:00.000000000 Z
11
+ date: 2024-07-19 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: redis