class Ja::API

Constants

LOG_LINE

Attributes

client[R]
log_line[R]
logger[R]
url[R]

Public Class Methods

new(client: HTTP, url: nil, logger: Ja.logger, log_line: LOG_LINE) click to toggle source
# File lib/ja/api.rb, line 10
def initialize(client:   HTTP,
               url:      nil,
               logger:   Ja.logger,
               log_line: LOG_LINE)

  @client = client
  @logger = logger
  @log_line = log_line
  @url = url
  if url
    uri = URI.parse(url)
    if uri.user || uri.password
      @client = @client.basic_auth(user: uri.user, pass: uri.password)
      uri.user = nil
      uri.password = nil
      @url = uri.to_s
    end
  end
  @semantic_logging = Ja.enable_semantic_logging? || (defined?(SemanticLogger) && logger.is_a?(SemanticLogger::Logger))
end

Public Instance Methods

full_url(path) click to toggle source
# File lib/ja/api.rb, line 51
def full_url(path)
  if url
    File.join(url, path)
  else
    path
  end
end
request(verb, uri, options = {}) click to toggle source
# File lib/ja/api.rb, line 33
def request(verb, uri, options = {})
  full_uri = full_url(uri)
  start_time = now
  client_with_request_id = client.headers("X-Request-Id" => Thread.current[:request_id])
  response = client_with_request_id.request(verb, full_uri, options)
  log_response(response, start_time, verb, full_uri, options)
  response
end
request!(verb, uri, options = {}) click to toggle source
# File lib/ja/api.rb, line 42
def request!(verb, uri, options = {})
  response = request(verb, uri, options)
  if (100..399).cover?(response.status)
    response
  else
    fail Error.to_exception(verb, full_url(uri), response)
  end
end

Private Instance Methods

log_response(response, start_time, verb, uri, _options) click to toggle source
# File lib/ja/api.rb, line 61
def log_response(response, start_time, verb, uri, _options)
  duration = ((now - start_time) * 1000.0).round(3)

  log_level = case response.status
              when 100..299
                :info
              when 300..399
                :warn
              else
                :error
              end

  payload = {
    verb:    verb.to_s.upcase,
    url:     uri.to_s,
    status:  response.status.to_i,
    reason:  response.status.reason.to_s,
  }

  message = log_line % payload

  if @semantic_logging
    logger.public_send(log_level, message: message, duration: duration, payload: payload)
  else
    logger.public_send(log_level, "(%.2fms) %s" % [ duration, message ])
  end
end
now() click to toggle source
# File lib/ja/api.rb, line 89
def now
  Process.clock_gettime(Process::CLOCK_MONOTONIC)
end