class TheCaptain::CaptainClient

Constants

REQUEST_METHODS

Attributes

conn[RW]
response[R]

Public Class Methods

active_client() click to toggle source
# File lib/the_captain/captain_client.rb, line 10
def self.active_client
  Thread.current[:captain_client] || default_client
end
default_client() click to toggle source
# File lib/the_captain/captain_client.rb, line 14
def self.default_client
  Thread.current[:captain_default_client] ||= CaptainClient.new(default_conn)
end
default_conn() click to toggle source
# File lib/the_captain/captain_client.rb, line 18
def self.default_conn
  Thread.current[:captain_default_conn] ||= begin
    HTTP.headers("X-API-KEY" => TheCaptain.api_key)
        .accept("application/json")
        .timeout(
          read:    TheCaptain.read_timeout,
          write:   TheCaptain.write_timeout,
          connect: TheCaptain.connect_timeout,
        )
  end
end
new(conn = nil) click to toggle source
# File lib/the_captain/captain_client.rb, line 30
def initialize(conn = nil)
  @conn        = conn || self.class.default_conn
  @captain_url = TheCaptain.api_url
end

Public Instance Methods

decode_response() click to toggle source
# File lib/the_captain/captain_client.rb, line 43
def decode_response
  raise Error::ClientError.missing_response_object unless @response
  Response::CaptainVessel.new(@response)
end
request(verb_method, path, params = {}) click to toggle source
# File lib/the_captain/captain_client.rb, line 35
def request(verb_method, path, params = {})
  verify_api_key_header!
  verify_request_method!(verb_method)
  capture_response! { send(verb_method.to_sym, destination_url(path), params) }
  raise_status_error! unless @response.status.success?
  self
end

Protected Instance Methods

capture_response!(retry_count = TheCaptain.retry_attempts) { || ... } click to toggle source
# File lib/the_captain/captain_client.rb, line 50
def capture_response!(retry_count = TheCaptain.retry_attempts)
  @response = yield
rescue StandardError
  retry_count ||= 0
  (retry_count -= 1).positive? ? retry : raise
end
get(url, params = {}) click to toggle source
# File lib/the_captain/captain_client.rb, line 57
def get(url, params = {})
  @conn.get(url, params: params)
end
post(url, params = {}) click to toggle source
# File lib/the_captain/captain_client.rb, line 61
def post(url, params = {})
  @conn.post(url, json: params)
end

Private Instance Methods

destination_url(path) click to toggle source
# File lib/the_captain/captain_client.rb, line 90
def destination_url(path)
  path = path.start_with?("/") || path.empty? ? path : "/#{path}"
  "#{@captain_url}#{path}"
end
raise_status_error!() click to toggle source
# File lib/the_captain/captain_client.rb, line 67
def raise_status_error!
  return unless TheCaptain.raise_http_errors?

  case @response.status.code
  when 401
    raise Error::APIAuthorizationError.new("Authorization Error", @response)
  when 500..502
    raise Error::APIConnectionError.new("Problem with server response", @response)
  else
    false
  end
end
verify_api_key_header!() click to toggle source
# File lib/the_captain/captain_client.rb, line 80
def verify_api_key_header!
  api_key = @conn.default_options.headers["X-API-KEY"]
  return unless api_key.nil? || api_key.empty?
  raise Error::ClientAuthenticationError.no_key_provided
end
verify_request_method!(verb_method) click to toggle source
# File lib/the_captain/captain_client.rb, line 86
def verify_request_method!(verb_method)
  raise Error::ClientInvalidRequestError unless REQUEST_METHODS.include?(verb_method.to_sym)
end