Exception: Poodle::RateLimitError
- Defined in:
- lib/poodle/errors/rate_limit_error.rb
Overview
Exception raised when API rate limits are exceeded (429 Too Many Requests)
Instance Attribute Summary collapse
-
#limit ⇒ Integer?
readonly
The rate limit.
-
#remaining ⇒ Integer?
readonly
Remaining requests.
-
#reset_time ⇒ Integer?
readonly
Time when the rate limit resets.
-
#retry_after ⇒ Integer?
readonly
Seconds to wait before retrying.
Attributes inherited from Error
Class Method Summary collapse
-
.build_context(limit, remaining, reset_time) ⇒ Hash
private
Build context hash.
-
.build_message(retry_after) ⇒ String
private
Build error message.
-
.extract_limit(headers) ⇒ String?
private
Extract rate limit from headers.
-
.extract_remaining(headers) ⇒ String?
private
Extract remaining requests from headers.
-
.extract_reset_time(headers) ⇒ String?
private
Extract reset time from headers.
-
.extract_retry_after(headers) ⇒ Integer?
private
Extract retry-after value from headers.
-
.from_headers(headers) ⇒ RateLimitError
Create a RateLimitError from response headers.
Instance Method Summary collapse
-
#initialize(message = "Rate limit exceeded", **options) ⇒ RateLimitError
constructor
Initialize a new RateLimitError.
-
#reset_at ⇒ Time?
Get the time when the rate limit resets as a Time object.
Methods inherited from Error
Constructor Details
#initialize(message = "Rate limit exceeded", **options) ⇒ RateLimitError
Initialize a new RateLimitError
37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 |
# File 'lib/poodle/errors/rate_limit_error.rb', line 37 def initialize( = "Rate limit exceeded", **) @retry_after = [:retry_after] @limit = [:limit] @remaining = [:remaining] @reset_time = [:reset_time] context = .fetch(:context, {}) rate_context = { error_type: "rate_limit_exceeded", retry_after: @retry_after, limit: @limit, remaining: @remaining, reset_time: @reset_time }.compact super(, context: context.merge(rate_context), status_code: 429) end |
Instance Attribute Details
#limit ⇒ Integer? (readonly)
Returns the rate limit.
21 22 23 |
# File 'lib/poodle/errors/rate_limit_error.rb', line 21 def limit @limit end |
#remaining ⇒ Integer? (readonly)
Returns remaining requests.
24 25 26 |
# File 'lib/poodle/errors/rate_limit_error.rb', line 24 def remaining @remaining end |
#reset_time ⇒ Integer? (readonly)
Returns time when the rate limit resets.
27 28 29 |
# File 'lib/poodle/errors/rate_limit_error.rb', line 27 def reset_time @reset_time end |
#retry_after ⇒ Integer? (readonly)
Returns seconds to wait before retrying.
18 19 20 |
# File 'lib/poodle/errors/rate_limit_error.rb', line 18 def retry_after @retry_after end |
Class Method Details
.build_context(limit, remaining, reset_time) ⇒ Hash (private)
Build context hash
126 127 128 129 130 131 132 |
# File 'lib/poodle/errors/rate_limit_error.rb', line 126 def self.build_context(limit, remaining, reset_time) { limit: limit, remaining: remaining, reset_at: reset_time }.compact end |
.build_message(retry_after) ⇒ String (private)
Build error message
114 115 116 117 118 |
# File 'lib/poodle/errors/rate_limit_error.rb', line 114 def self.(retry_after) = "Rate limit exceeded." += " Retry after #{retry_after} seconds." if retry_after end |
.extract_limit(headers) ⇒ String? (private)
Extract rate limit from headers
90 91 92 |
# File 'lib/poodle/errors/rate_limit_error.rb', line 90 def self.extract_limit(headers) headers["X-RateLimit-Limit"] || headers["ratelimit-limit"] end |
.extract_remaining(headers) ⇒ String? (private)
Extract remaining requests from headers
98 99 100 |
# File 'lib/poodle/errors/rate_limit_error.rb', line 98 def self.extract_remaining(headers) headers["X-RateLimit-Remaining"] || headers["ratelimit-remaining"] end |
.extract_reset_time(headers) ⇒ String? (private)
Extract reset time from headers
106 107 108 |
# File 'lib/poodle/errors/rate_limit_error.rb', line 106 def self.extract_reset_time(headers) headers["X-RateLimit-Reset"] || headers["ratelimit-reset"] end |
.extract_retry_after(headers) ⇒ Integer? (private)
Extract retry-after value from headers
82 83 84 |
# File 'lib/poodle/errors/rate_limit_error.rb', line 82 def self.extract_retry_after(headers) headers["retry-after"]&.to_i end |
.from_headers(headers) ⇒ RateLimitError
Create a RateLimitError from response headers
59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 |
# File 'lib/poodle/errors/rate_limit_error.rb', line 59 def self.from_headers(headers) retry_after = extract_retry_after(headers) limit = extract_limit(headers) remaining = extract_remaining(headers) reset_time = extract_reset_time(headers) = (retry_after) context = build_context(limit, remaining, reset_time) new( , retry_after: retry_after, limit: limit&.to_i, remaining: remaining&.to_i, reset_time: reset_time&.to_i, context: context ) end |
Instance Method Details
#reset_at ⇒ Time?
Get the time when the rate limit resets as a Time object
140 141 142 143 144 |
# File 'lib/poodle/errors/rate_limit_error.rb', line 140 def reset_at return nil unless @reset_time Time.at(@reset_time) end |