ruby_rate_limiter 2.0.2 → 2.0.3

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: b60324c24d3fc51e14f066637e25ff4ac9b4ada858e58847faf3038412071228
4
+ data.tar.gz: f93cf75cb76aa970caa2d09c49899ebbb13a637fad485d4bf8e4e804a0af6ff4
5
5
  SHA512:
6
- metadata.gz: ef02828da1412884377e4eac4687672be0757ec13409e6bdb31df93b3dfdd3bcab0ffd3786180ddbb172f7c006d99aa0ab14ac933b03730904ee107140f65626
7
- data.tar.gz: 652883cc2da93a8eb07b10958f8120d3f57d900338d3d5b43a4fdba8e2d4c8ea5b0a613db0fbba9681997866b30c825f521737b1fa576dff8eaf7b021942ed5e
6
+ metadata.gz: eeeaca8c796fd0431016764af4c6c6d7a4535bbac91a93d616fa7e4dbc196d21b13667fa5e1f612d0226b47431925dad7b7dbc642e7312122123d56a4a971ed7
7
+ data.tar.gz: 6d18b90e23f0b6b0597cd27a62b3ce7e05c8d5aa01fce90c00d6a96df939bf9d2b7fbc63496343bb3382a84760a71d4a0c44ad8eb59fd85e22feaf168f5e6aa3
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
+ ```
@@ -34,28 +34,36 @@ module RubyRateLimiter
34
34
  def allow_request?
35
35
  refill_tokens
36
36
  tokens = get_bucket_size
37
+ puts "Allow request: tokens before = #{tokens}" # Debugging line
37
38
  return false if tokens < 1
38
39
 
39
40
  update_bucket_size(tokens - 1)
41
+ puts "Allow request: tokens after = #{get_bucket_size}" # Debugging line
40
42
  true
41
43
  end
42
44
 
43
45
  private
44
46
 
45
47
  def get_bucket_size
46
- (@storage.get("#{@user_id}_tokens") || @bucket_size).to_i
48
+ size = (@storage.get("#{@user_id}_tokens") || @bucket_size).to_i
49
+ puts "get_bucket_size: #{@user_id}_tokens = #{size}"
50
+ size
47
51
  end
48
52
 
49
53
  def get_last_refill_time
50
- (@storage.get("#{@user_id}_last_refill") || Time.now.to_f).to_f
54
+ time = (@storage.get("#{@user_id}_last_refill") || Time.now.to_f).to_f
55
+ puts "get_last_refill_time: #{@user_id}_last_refill = #{time}"
56
+ time
51
57
  end
52
58
 
53
59
  def update_bucket_size(tokens)
60
+ puts "update_bucket_size: #{@user_id}_tokens = #{tokens}"
54
61
  @storage.set("#{@user_id}_tokens", tokens)
55
62
  end
56
63
 
57
64
  def update_last_refill_time(timestamp)
58
65
  @storage.set("#{@user_id}_last_refill", timestamp)
66
+ puts "update_last_refill_time: #{@user_id}_last_refill = #{timestamp}"
59
67
  end
60
68
 
61
69
  def refill_tokens
@@ -64,11 +72,14 @@ module RubyRateLimiter
64
72
  elapsed_time = current_time - last_refill_time
65
73
 
66
74
  new_tokens = (elapsed_time * @refill_rate_per_second).to_i
75
+ puts "Refill tokens: elapsed_time = #{elapsed_time}, new_tokens = #{new_tokens}" # Debugging line
76
+
67
77
  return if new_tokens <= 0
68
78
 
69
79
  tokens = [get_bucket_size + new_tokens, @bucket_size].min
70
80
  update_bucket_size(tokens)
71
81
  update_last_refill_time(current_time)
82
+ puts "Refill tokens: updated tokens = #{tokens}, current_time = #{current_time}" # Debugging line
72
83
  end
73
84
  end
74
85
  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.3"
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.3
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