class Ravelin::Client

Constants

API_BASE

Public Class Methods

new(api_key:, api_version: 2, include_rule_output: false) click to toggle source
# File lib/ravelin/client.rb, line 14
def initialize(api_key:, api_version: 2, include_rule_output: false)
  @api_key = api_key
  @url_prefix = ''
  @include_rule_output = include_rule_output

  raise ArgumentError.new("api_version must be 2 or 3") unless [2,3].include? api_version
  @api_version = api_version

  @connection = Faraday.new(API_BASE, faraday_options) do |conn|
    conn.response :json, context_type: /\bjson$/
    conn.adapter Ravelin.faraday_adapter
  end
end

Public Instance Methods

delete_tag(**args) click to toggle source
# File lib/ravelin/client.rb, line 54
def delete_tag(**args)
  tag = Tag.new(**args).serializable_hash
  customer_id = tag["customerId"]
  tags = tag["tagNames"].join(",")

  delete("#{@url_prefix}/v#{@api_version}/tag/customer?customerId=#{customer_id}&tagName=#{tags}")
end
get_tag(**args) click to toggle source
# File lib/ravelin/client.rb, line 62
def get_tag(**args)
  tag = Tag.new(**args).serializable_hash
  customer_id = tag["customerId"]

  get("#{@url_prefix}/v#{@api_version}/tag/customer/#{customer_id}")
end
send_backfill_event(**args) click to toggle source
# File lib/ravelin/client.rb, line 38
def send_backfill_event(**args)
  unless args.has_key?(:timestamp)
    raise ArgumentError.new('missing parameters: timestamp')
  end

  event = Event.new(**args)

  post("#{@url_prefix}/v#{@api_version}/backfill/#{event.name}", event.serializable_hash)
end
send_event(**args) click to toggle source
# File lib/ravelin/client.rb, line 28
def send_event(**args)
  score = args.delete(:score)
  headers = args.delete(:headers)
  event = Event.new(**args)

  score_param = score ? "?score=true" : nil

  post("#{@url_prefix}/v#{@api_version}/#{event.name}#{score_param}", event.serializable_hash, headers)
end
send_tag(**args) click to toggle source
# File lib/ravelin/client.rb, line 48
def send_tag(**args)
  tag = Tag.new(**args)

  post("#{@url_prefix}/v#{@api_version}/tag/customer", tag.serializable_hash)
end

Private Instance Methods

delete(url) click to toggle source
# File lib/ravelin/client.rb, line 85
def delete(url)
  response = @connection.delete(url)

  if response.success?
    Response.new(response)
  else
    handle_error_response(response)
  end
end
faraday_options() click to toggle source
# File lib/ravelin/client.rb, line 118
def faraday_options
  options = {
    request: { timeout: Ravelin.faraday_timeout },
    headers: {
      'Authorization' => "token #{@api_key}",
      'Content-Type'  => 'application/json; charset=utf-8'.freeze,
      'User-Agent'    => "Ravelin RubyGem/#{Ravelin::VERSION}".freeze
    }
  }

  if @include_rule_output
    options[:headers]['Accept'] = 'application/vnd.ravelin.score.v2+json'
  end

  options
end
get(url) click to toggle source
# File lib/ravelin/client.rb, line 95
def get(url)
  response = @connection.get(url)

  if response.success?
    Response.new(response)
  else
    handle_error_response(response)
  end
end
handle_error_response(response) click to toggle source
# File lib/ravelin/client.rb, line 105
def handle_error_response(response)
  case response.status
  when 400, 403, 404, 405, 406
    raise InvalidRequestError.new(response)
  when 401
    raise AuthenticationError.new(response)
  when 429
    raise RateLimitError.new(response)
  else
    raise ApiError.new(response)
  end
end
post(url, payload, headers = {}) click to toggle source
# File lib/ravelin/client.rb, line 71
def post(url, payload, headers = {})
  response = @connection.post(url, payload.to_json) do |request|
    headers&.each { |key, value|
      request.headers[key] = value
    }
  end

  if response.success?
    Response.new(response)
  else
    handle_error_response(response)
  end
end