class MLBStatsAPI::Client

Constants

DEFAULT_VERSION

Attributes

cache[RW]
logger[RW]

Public Class Methods

new(logger: IO::NULL, cache: nil) click to toggle source
# File lib/mlb_stats_api/client.rb, line 39
def initialize(logger: IO::NULL, cache: nil)
  @cache = if cache
             Moneta.new(cache.class.to_s.to_sym, backend: cache)
           else
             Moneta.new(:Null)
           end

  @logger = logger.is_a?(::Logger) ? logger : ::Logger.new(logger)
end

Public Instance Methods

get(endpoint, query = {}) click to toggle source
# File lib/mlb_stats_api/client.rb, line 49
def get(endpoint, query = {})
  url = "/api/v#{query.delete(:version) || DEFAULT_VERSION}#{endpoint}"

  args = normalize_query_args(query)

  @logger.info "Fetching URL: #{url} Query: #{args.inspect}"

  response = self.class.get url, query: args.merge(t: Time.now.to_i)

  raise_exception(response) unless response.code == 200

  response.parsed_response
end
load(key, options = {}) { || ... } click to toggle source
# File lib/mlb_stats_api/client.rb, line 70
def load(key, options = {})
  value = @cache.load(key)

  return value if value

  value = yield

  @cache.store(key, value, options)

  value
end
normalize_query_args(query) click to toggle source
# File lib/mlb_stats_api/client.rb, line 63
def normalize_query_args(query)
  query
    .reject { |_, v| v.nil? }
    .map { |key, val| [key, val.is_a?(Array) ? val.join(',') : val] }
    .to_h
end

Protected Instance Methods

raise_exception(response) click to toggle source
# File lib/mlb_stats_api/client.rb, line 84
def raise_exception(response)
  case response.code
  when 401
    raise MLBStatsAPI::UnauthorizedError, response
  when 403
    raise MLBStatsAPI::ForbiddenError, response
  when 404
    raise MLBStatsAPI::NotFoundError, response
  else
    raise MLBStatsAPI::Error, response
  end
end