class Trend::Client

Constants

HEADERS

Public Class Methods

new(url: nil, api_key: nil, timeout: 30) click to toggle source
# File lib/trend/client.rb, line 11
def initialize(url: nil, api_key: nil, timeout: 30)
  @api_key = api_key || Trend.api_key
  @uri = URI.parse(url || Trend.url)
  @http = Net::HTTP.new(@uri.host, @uri.port)
  @http.use_ssl = true if @uri.scheme == "https"
  @http.open_timeout = timeout
  @http.read_timeout = timeout
end

Public Instance Methods

anomalies(series, params = {}) click to toggle source
# File lib/trend/client.rb, line 20
def anomalies(series, params = {})
  resp = make_request("anomalies", series, params)
  resp["anomalies"].map { |v| parse_time(v) }
end
correlation(series, series2, params = {}) click to toggle source
# File lib/trend/client.rb, line 30
def correlation(series, series2, params = {})
  resp = make_request("correlation", series, params.merge(series2: series2))
  resp["correlation"]
end
forecast(series, params = {}) click to toggle source
# File lib/trend/client.rb, line 25
def forecast(series, params = {})
  resp = make_request("forecast", series, params)
  Hash[resp["forecast"].map { |k, v| [parse_time(k), v] }]
end

Private Instance Methods

make_request(path, series, params) click to toggle source
# File lib/trend/client.rb, line 37
def make_request(path, series, params)
  post_data = {
    series: series
  }.merge(params)

  path = "#{path}?#{URI.encode_www_form(api_key: @api_key)}" if @api_key

  begin
    response = @http.post("/#{path}", post_data.to_json, HEADERS)
  rescue Errno::ECONNREFUSED, Timeout::Error => e
    raise Trend::Error, e.message
  end

  parsed_body = JSON.parse(response.body) rescue {}

  if !response.is_a?(Net::HTTPSuccess)
    raise Trend::Error, parsed_body["error"] || "Server returned #{response.code} response"
  end

  parsed_body
end
parse_time(v) click to toggle source
# File lib/trend/client.rb, line 59
def parse_time(v)
  v.size == 10 ? Date.parse(v) : Time.parse(v)
end