module RateLimiter::Request

Manages configuration and state for the current HTTP request such as `source`.

It is recommended you don't use `RateLimiter::Request` directly. Instead use `RateLimiter.request`.

Public Class Methods

disable_model(model_class) click to toggle source

Turn off RateLimiter for the given model for this request.

# File lib/rate_limiter/request.rb, line 16
def disable_model(model_class)
  enabled_for_model(model_class, false)
end
enable_model(model_class) click to toggle source

Turn on RateLimiter for the given model for this request.

# File lib/rate_limiter/request.rb, line 21
def enable_model(model_class)
  enabled_for_model(model_class, true)
end
enabled=(value) click to toggle source

Sets whether RateLimiter is enabled or disabled for the current request.

# File lib/rate_limiter/request.rb, line 32
def enabled=(value)
  store[:enabled] = value
end
enabled?() click to toggle source

Returns `true` if RateLimiter is enabled for the current request, `false` otherwise.

# File lib/rate_limiter/request.rb, line 27
def enabled?
  !!store[:enabled]
end
enabled_for_model(model, value) click to toggle source

Sets wheterh RateLimiter is enabled or disabled for this model for the current request.

# File lib/rate_limiter/request.rb, line 38
def enabled_for_model(model, value)
  store[:"enabled_for_#{model}"] = value
end
enabled_for_model?(model) click to toggle source

Returns `true` if RateLimiter is enabled for this model for the current request, `false` otherwise.

# File lib/rate_limiter/request.rb, line 44
def enabled_for_model?(model)
  model.include?(Model::InstanceMethods) && !!store.fetch(:"enabled_for_#{model}", true)
end
merge(options) click to toggle source
# File lib/rate_limiter/request.rb, line 48
def merge(options)
  options.to_h.each do |k, v|
    store[k] = v
  end
end
set(options) click to toggle source
# File lib/rate_limiter/request.rb, line 54
def set(options)
  store.clear
  merge(options)
end
source() click to toggle source

Returns who is responsible for attempting to create a new record.

# File lib/rate_limiter/request.rb, line 60
def source
  who = store[:source]
  who.respond_to?(:call) ? who.call : who
end
source=(value) click to toggle source

Sets who is responsible for attempting to create a new record.

# File lib/rate_limiter/request.rb, line 66
def source=(value)
  store[:source] = value
end
to_h() click to toggle source

Returns a deep copy of the RequestStore.

# File lib/rate_limiter/request.rb, line 71
def to_h
  store.deep_dup
end
with(options) { || ... } click to toggle source

Temporarily set options and execute a block.

# File lib/rate_limiter/request.rb, line 76
def with(options)
  return unless block_given?

  before = to_h
  validate_public_options(options)
  merge(options)
  yield
ensure
  set(before)
end

Private Class Methods

store() click to toggle source

Internal store for the options for this request.

# File lib/rate_limiter/request.rb, line 90
def store
  RequestStore.store[:rate_limiter] ||= {
    enabled: true
  }
end
validate_public_options(options) click to toggle source

Double checks that the options passed are known. Does not validate the values of the options.

# File lib/rate_limiter/request.rb, line 98
def validate_public_options(options)
  options.each do |k, _v|
    case k
    when /enabled_for_/,
        :enabled,
        :source
      next
    else
      raise InvalidOption, "Invalid option: #{k}"
    end
  end
end