class CoinMarketPro::Client::Base

Constants

API_DOMAIN
API_URL
API_VERSION
DEFAULT_TIMEOUT
PRO_SUBDOMAIN
SANDBOX_SUBDOMAIN

Attributes

api_key[R]
cryptocurrency[R]
exchange[R]
global_metrics[R]
host[R]
logger[R]
sandbox[R]
tools[R]

Public Class Methods

new(api_key: ENV.fetch('CMC_PRO_API_KEY'), sandbox: false, logger: Logger.new(STDOUT), timeout: DEFAULT_TIMEOUT) click to toggle source

@param api_key [String] Required. Defaults to CMC_PRO_API_KEY @param sandbox [Boolean] Defaults to false @param logger [Logger] @param timeout [Integer] Defaults to DEFAULT_TIMEOUT

# File lib/coin_market_pro/client/base.rb, line 36
def initialize(api_key: ENV.fetch('CMC_PRO_API_KEY'), sandbox: false,
               logger: Logger.new(STDOUT), timeout: DEFAULT_TIMEOUT)
  @sandbox = sandbox
  @host = @sandbox ? API_URL.gsub('SUBDOMAIN', SANDBOX_SUBDOMAIN) : API_URL.gsub('SUBDOMAIN', PRO_SUBDOMAIN)
  @api_key = api_key
  @logger = logger
  @timeout = timeout

  # services
  @cryptocurrency = Endpoint::Cryptocurrency.new(client: self, logger: @logger)
  @exchange = Endpoint::Exchange.new(client: self, logger: @logger)
  @global_metrics = Endpoint::GlobalMetrics.new(client: self, logger: @logger)
  @tools = Endpoint::Tools.new(client: self, logger: @logger)
end

Public Instance Methods

default_headers() click to toggle source

@return [Hash]

# File lib/coin_market_pro/client/base.rb, line 107
def default_headers
  {
    'Content-Type' => 'application/json',
    'Accept' => 'application/json',
    'User-Agent' => "coin_market_pro/#{CoinMarketPro::VERSION}",
    'Accept-Encoding' => 'deflate, gzip',
    'X-CMC_PRO_API_KEY' => api_key
  }
end
get(uri, options: {}, headers: {}) click to toggle source

GET request

@param uri [String] @param options [Hash] @param headers [Hash] @return [Result]

# File lib/coin_market_pro/client/base.rb, line 57
def get(uri, options: {}, headers: {})
  request do
    url = host + uri
    options ||= {}
    headers ||= {}

    query_params = CGI.unescape(options.to_query)
    url += '?' + query_params unless query_params.blank?

    response = RestClient::Request.execute(method: :get,
                                           url: url,
                                           headers: default_headers.merge(headers),
                                           open_timeout: open_timeout,
                                           timeout: timeout)

    logger.debug(message: 'GET Request', url: url, options: options, status: response.code)
    success?(response.code) ? Result.success(response) : Result.failed(response)
  end
end
handle_error(error) click to toggle source

Handle errors @param error [Error] @return [Result]

# File lib/coin_market_pro/client/base.rb, line 99
def handle_error(error)
  response = error.response
  message = error.message
  logger.error(error: 'Request Error', code: response.code, message: message)
  Result.failed(response)
end
open_timeout() click to toggle source

@return [Integer]

# File lib/coin_market_pro/client/base.rb, line 123
def open_timeout
  @open_timeout || DEFAULT_TIMEOUT
end
request() { || ... } click to toggle source

@yield [Result]

# File lib/coin_market_pro/client/base.rb, line 78
def request
  result = yield

  if result.success?
    logger.debug(status: result.code, body: result.body)
  else
    logger.warn(error: 'Request Error', status: result.code, body: result.body)
  end

  result
rescue ::RestClient::GatewayTimeout
  raise Error.new('Gateway timeout')
rescue ::RestClient::RequestTimeout
  raise Error.new('Request timeout')
rescue ::RestClient::Exception => e
  handle_error(e)
end
sandbox?() click to toggle source

@return [Boolean]

# File lib/coin_market_pro/client/base.rb, line 128
def sandbox?
  sandbox
end
timeout() click to toggle source

@return [Integer]

# File lib/coin_market_pro/client/base.rb, line 118
def timeout
  @timeout || DEFAULT_TIMEOUT
end

Private Instance Methods

success?(status_code = 0) click to toggle source

@return [Boolean]

# File lib/coin_market_pro/client/base.rb, line 135
def success?(status_code = 0)
  return true if status_code.in?(200..299)

  false
end