class RequestMyTurn

Constants

VERSION

Attributes

id[RW]
locked[RW]

Public Class Methods

configure() { |settings| ... } click to toggle source
# File lib/request_my_turn.rb, line 33
def configure
  block_given? ? yield(settings) : settings
end
new(queue_name, **options) click to toggle source
# File lib/request_my_turn.rb, line 59
def initialize(queue_name, **options)
  @queue_name = queue_name

  @url = options[:url]
  @after = options[:after]
  @before = options[:before]
  @switch = options[:switch]
  @timeout = options[:timeout]
  @lock_seconds = options[:lock_seconds] || 60
  @headers = options[:headers]
  @ignore_timeout_error = options[:ignore_timeout_error]
end
settings() click to toggle source
# File lib/request_my_turn.rb, line 37
def settings
  @settings ||= OpenStruct.new(
    url: nil,
    after: nil,
    before: nil,
    switch: true,
    timeout: nil,
    lock_seconds: nil,
    headers: nil,
    ignore_timeout_error: nil
  )
end

Public Instance Methods

perform() { || ... } click to toggle source
# File lib/request_my_turn.rb, line 72
def perform(&block)
  raise WithoutBlock unless block
  return yield unless switched_on?

  self.id = take_my_turn
  before.call(id) if valid_callback? before

  result = yield
  return result unless present? id

  self.locked = leave_my_turn(id)
  after.call(locked) if valid_callback? after
  result
end

Private Instance Methods

build_url() click to toggle source
# File lib/request_my_turn.rb, line 109
def build_url
  current_url = url
  raise InvalidUrl, current_url unless current_url =~ URI::DEFAULT_PARSER.make_regexp

  current_url
end
current_headers() click to toggle source
# File lib/request_my_turn.rb, line 126
def current_headers
  @current_headers ||= headers
end
current_url() click to toggle source
# File lib/request_my_turn.rb, line 105
def current_url
  @current_url ||= build_url
end
leave_my_turn(id) click to toggle source
# File lib/request_my_turn.rb, line 130
def leave_my_turn(id)
  response = request "#{current_url}/#{@queue_name}/#{id}", method: :delete
  read_response(response, :locked)
end
present?(value) click to toggle source
# File lib/request_my_turn.rb, line 144
def present?(value)
  if value.nil?
    false
  elsif value.is_a?(Numeric) || value.length.positive?
    true
  else
    false
  end
rescue StandardError
  false
end
read_response(response, key) click to toggle source
# File lib/request_my_turn.rb, line 135
def read_response(response, key)
  hash = JSON.parse response.body
  hash[key.to_s]
end
request(url, method: :get) click to toggle source
# File lib/request_my_turn.rb, line 116
def request(url, method: :get)
  uri = URI(url)
  https = Net::HTTP.new(uri.host, uri.port)
  https.use_ssl = url.start_with? 'https'

  request = method == :delete ? Net::HTTP::Delete.new(uri) : Net::HTTP::Get.new(uri)
  current_headers.each { |key, value| request[key] = value } if current_headers.is_a?(Hash)
  https.request(request)
end
switched_on?() click to toggle source
# File lib/request_my_turn.rb, line 89
def switched_on?
  switch
end
take_my_turn() click to toggle source
# File lib/request_my_turn.rb, line 93
def take_my_turn
  timeout = self.timeout
  response = Timeout.timeout(timeout.to_f) do
    request "#{current_url}/#{@queue_name}?seconds=#{lock_seconds}"
  rescue Timeout::Error
    return false if ignore_timeout_error

    raise TimeoutError, timeout
  end
  read_response(response, :id)
end
valid_callback?(callback) click to toggle source
# File lib/request_my_turn.rb, line 140
def valid_callback?(callback)
  callback.is_a?(Proc) || callback.is_a?(Method)
end