class StatsMix

Constants

BASE_URI
GEM_VERSION
HOST
UDP_PORT

Public Class Methods

api_from_env() click to toggle source
# File lib/statsmix.rb, line 350
def self.api_from_env
  return nil if ENV['STATSMIX_URL'].nil?
  url = ENV['STATSMIX_URL']
  pieces = url.gsub('http://','').gsub('https://','').split('/')
  @api_key = pieces[2]
end
api_key() click to toggle source

Returns: string

# File lib/statsmix.rb, line 297
def self.api_key
  @api_key
end
api_key=(string) click to toggle source
# File lib/statsmix.rb, line 292
def self.api_key=(string)
  @api_key = string
end
create_metric(name, params = {}) click to toggle source

Create metric

Required: name Optional: params[:profile_id, :sharing, :include_in_email] Returns: Net::HTTP object

# File lib/statsmix.rb, line 159
def self.create_metric(name, params = {})
  if params.respond_to?('with_indifferent_access')
    params = params.with_indifferent_access
  end
  connect('metrics')
  @params.merge!(params)
  @params[:name] = name
  @request_uri = @url.path + '.' + @format
  @request = Net::HTTP::Post.new(@request_uri, {"User-Agent" => @user_agent})
  return do_request
end
create_stat(metric_id, value = nil, params = {}) click to toggle source

Create stat

Required: metric_id Optional: value, params[:generated_at, :meta] Returns: Net::HTTP object

# File lib/statsmix.rb, line 80
def self.create_stat(metric_id, value = nil, params = {})
  if params.respond_to?('with_indifferent_access')
    params = params.with_indifferent_access
  end
  connect('stats')
  @request_uri = @url.path + '.' + @format
  @request = Net::HTTP::Post.new(@request_uri, {"User-Agent" => @user_agent})
  @params[:metric_id] = metric_id
  @params[:value] = value if value
  @params.merge!(params)
  self.check_meta
  return do_request
end
create_user(params = {}) click to toggle source

Create user

Required: {:email => 'user@example.com'} - if the email already exists in our system, we will return the existing user Optional: :email,:name,:plan,:company,:url, :metrics[] Returns: Net::HTTP object

# File lib/statsmix.rb, line 232
def self.create_user(params = {})
  connect('partners/users')
  @request_uri = @url.path + '.' + @format
  @request = Net::HTTP::Post.new(@request_uri, {"User-Agent" => @user_agent})
  @params.merge!(params)
  result = do_request
  unless self.error
    @user_api_key = result.scan(/<api_key>[0-9a-zA-Z]*<\/api_key>/)[0].gsub(/<\/?api_key>/,'')
  end
  return result
end
debugging() click to toggle source

Returns: boolean

# File lib/statsmix.rb, line 336
def self.debugging
  @debugging
end
debugging=(value) click to toggle source

Expects: boolean

# File lib/statsmix.rb, line 331
def self.debugging=(value)
  @debugging = value
end
delete_metric(metric_id) click to toggle source

Delete metric

Required: metric_id Optional: none Returns: Net::HTTP object

# File lib/statsmix.rb, line 194
def self.delete_metric(metric_id)    
  connect('metrics')
  @request_uri = @url.path + '/' + metric_id.to_s + '.' + @format
  @request = Net::HTTP::Delete.new(@request_uri, {"User-Agent" => @user_agent})
  return do_request
end
delete_stat(stat_id) click to toggle source

Delete stat

Required: stat_id Optional: none Returns: Net::HTTP object

# File lib/statsmix.rb, line 117
def self.delete_stat(stat_id)    
  connect('stats')
  @request_uri = @url.path + '/' + stat_id.to_s + '.' + @format
  @request = Net::HTTP::Delete.new(@request_uri, {"User-Agent" => @user_agent})
  return do_request
end
delete_user(id_or_api_key) click to toggle source

Delete user

Required: id_or_api_key - id or api key of the user to get Optional: none Returns: Net::HTTP object

# File lib/statsmix.rb, line 266
def self.delete_user(id_or_api_key)    
  connect('partners/users')
  @request_uri = @url.path + '/' + id_or_api_key.to_s + '.' + @format
  @request = Net::HTTP::Delete.new(@request_uri, {"User-Agent" => @user_agent})
  result = do_request
  unless self.error
    @user_api_key = result.scan(/<api_key>[0-9a-zA-Z]*<\/api_key>/)[0].gsub(/<\/?api_key>/,'')
  end
  return result
end
error() click to toggle source

Returns: string or boolean false

# File lib/statsmix.rb, line 283
def self.error
  @error
end
format() click to toggle source

Returns: string

# File lib/statsmix.rb, line 366
def self.format
  @format
end
format=(string) click to toggle source
# File lib/statsmix.rb, line 357
def self.format=(string)
  string.downcase!
  if string != 'json' && string != 'xml'
    raise "format MUST be either xml or json"
  end
  @format = string
end
get_metric(metric_id) click to toggle source

Get metric

Required: metric_id Optional: none Returns: Net::HTTP object

# File lib/statsmix.rb, line 147
def self.get_metric(metric_id)
  connect('metrics')
  @request_uri = @url.path + '/' + metric_id.to_s + '.' + @format
  @request = Net::HTTP::Get.new(@request_uri, {"User-Agent" => @user_agent})
  return do_request
end
get_stat(stat_id) click to toggle source

Get stat

Required: stat_id Optional: none Returns: Net::HTTP object

# File lib/statsmix.rb, line 68
def self.get_stat(stat_id)
  connect('stats')
  @request_uri = @url.path + '/' + stat_id.to_s + '.' + @format
  @request = Net::HTTP::Get.new(@request_uri, {"User-Agent" => @user_agent})
  return do_request
end
get_user(id_or_api_key) click to toggle source

Get user

Required: id_or_api_key - id or api key of the user to get Optional: none Returns: Net::HTTP object

# File lib/statsmix.rb, line 220
def self.get_user(id_or_api_key)
  connect('partners/users')
  @request_uri = @url.path + '/' + id_or_api_key.to_s + '.' + @format
  @request = Net::HTTP::Get.new(@request_uri, {"User-Agent" => @user_agent})
  return do_request
end
ignore() click to toggle source

Returns: boolean

# File lib/statsmix.rb, line 306
def self.ignore
  @ignore
end
ignore=(boolean) click to toggle source
# File lib/statsmix.rb, line 301
def self.ignore=(boolean)
  @ignore = boolean ? true : false
end
list_metrics(profile_id = nil, limit = nil) click to toggle source

List metrics

Required: none Optional: profile_id, limit Returns: Net::HTTP object

# File lib/statsmix.rb, line 131
def self.list_metrics(profile_id = nil, limit = nil)
  connect('metrics')
  @request_uri = @url.path + '.' + @format
  @request = Net::HTTP::Get.new(@request_uri, {"User-Agent" => @user_agent})

  @params[:profile_id] = profile_id if profile_id  != nil
  @params[:limit] = limit if limit != nil
  
  return do_request
end
list_stats(metric_id, limit = nil, options = {}) click to toggle source

List stats (index)

Required: metric_id Optional: limit, {:startdate => nil, :end_date => nil} Use start_date and end_date as has keys in the third param to scope the date range of stats based on the generated_at timestamp of a stat Returns: Net::HTTP object

# File lib/statsmix.rb, line 44
def self.list_stats(metric_id, limit = nil, options = {})
  if options.respond_to?('with_indifferent_access')
    options = options.with_indifferent_access
  end
  self.connect('stats')
  @request_uri = @url.path + '.' + @format
  @request = Net::HTTP::Get.new(@request_uri, {"User-Agent" => @user_agent})
  
  @params[:metric_id] = metric_id
  @params.merge!(options)
  if @params[:start_date] && @params[:start_date].is_a?(ActiveSupport::TimeWithZone)
    @params[:start_date] = @params[:start_date].utc.strftime('%Y-%m-%d %H:%M:%S')
  end
  if @params[:end_date] && @params[:end_date].is_a?(ActiveSupport::TimeWithZone)
    @params[:end_date] = @params[:end_date].utc.strftime('%Y-%m-%d %H:%M:%S')
  end
  return do_request
end
list_users() click to toggle source

list users

Optional: none Returns: Net::HTTP object

# File lib/statsmix.rb, line 208
def self.list_users
  connect('partners/users')
  @request_uri = @url.path
  @request = Net::HTTP::Get.new(@request_uri, {"User-Agent" => @user_agent})
  return do_request
end
params() click to toggle source

Returns: hash

# File lib/statsmix.rb, line 288
def self.params
  @params
end
request_uri() click to toggle source

Returns: string

# File lib/statsmix.rb, line 371
def self.request_uri
  @request_uri
end
response() click to toggle source

Returns: Net::HTTP object

# File lib/statsmix.rb, line 278
def self.response
  @response
end
test_metric_name() click to toggle source

Returns: string or nil

# File lib/statsmix.rb, line 320
def self.test_metric_name
  @test_metric_name
end
test_metric_name=(name) click to toggle source
# File lib/statsmix.rb, line 315
def self.test_metric_name=(name)
  @test_metric_name = name
end
track(name, value = nil, options = {}) click to toggle source

Track an event

Required: name of metric Optional: value, options {:generated_at} Returns: Net::HTTP object

# File lib/statsmix.rb, line 19
def self.track(name, value = nil, options = {})
  if options.respond_to?('with_indifferent_access')
    options = options.with_indifferent_access
  end

  self.connect('track')
  @request_uri = @url.path + '.' + @format
  @request = Net::HTTP::Get.new(@request_uri, {"User-Agent" => @user_agent})
  @params[:name] = name
  if @test_metric_name
    @params[:name] = @test_metric_name
  end
  @params[:value] = Float(value) unless value.nil?
  @params.merge!(options)
  self.check_meta
  return do_request
end
update_metric(metric_id, params = {}) click to toggle source

Update metric

Required: metric_id Optional: params[:profile_id, :sharing, :include_in_email] Returns: Net::HTTP object

# File lib/statsmix.rb, line 176
def self.update_metric(metric_id, params = {})
  if params.respond_to?('with_indifferent_access')
    params = params.with_indifferent_access
  end
  connect('metrics')
  @params = [] if @params.nil?
  @params.merge!(params)
  @request_uri = @url.path + '/' + metric_id.to_s + '.' + @format
  @request = Net::HTTP::Put.new(@request_uri, {"User-Agent" => @user_agent})

  return do_request
end
update_stat(stat_id, value = nil, params = {}) click to toggle source

Update stat

Required: stat_id Optional: value, params[:generated_at, :meta] Returns: Net::HTTP object

# File lib/statsmix.rb, line 99
def self.update_stat(stat_id, value = nil, params = {})  
  if params.respond_to?('with_indifferent_access')
    params = params.with_indifferent_access
  end
  connect('stats')
  @request_uri = @url.path + '/' + stat_id.to_s + '.' + @format
  @request = Net::HTTP::Put.new(@request_uri, {"User-Agent" => @user_agent})
  @params[:value] = value if value
  @params.merge!(params)
  self.check_meta
  return do_request
end
update_user(id_or_api_key, params = {}) click to toggle source

Update user

Required: id_or_api_key - id or api key of the user to get Optional: params with keys :email,:name,:plan,:company,:url Returns: Net::HTTP object

# File lib/statsmix.rb, line 249
def self.update_user(id_or_api_key, params = {})  
  connect('partners/users')
  @request_uri = @url.path + '/' + id_or_api_key.to_s + '.' + @format
  @request = Net::HTTP::Put.new(@request_uri, {"User-Agent" => @user_agent})
  @params.merge!(params)
  result = do_request
  unless self.error
    @user_api_key = result.scan(/<api_key>[0-9a-zA-Z]*<\/api_key>/)[0].gsub(/<\/?api_key>/,'')
  end
  return result
end
use_udp() click to toggle source

Returns: boolean

# File lib/statsmix.rb, line 346
def self.use_udp
  @use_udp
end
use_udp=(value) click to toggle source

Expects: boolean

# File lib/statsmix.rb, line 341
def self.use_udp=(value)
  @use_udp = value
end
user_api_key() click to toggle source

Return: string

# File lib/statsmix.rb, line 311
def self.user_api_key
  @user_api_key
end

Private Class Methods

check_meta() click to toggle source
# File lib/statsmix.rb, line 465
def self.check_meta
  if @params[:meta] && !@params[:meta].is_a?(String) && !@params[:meta].is_a?(Hash)
    raise "Invalid data . :meta should be a hash or a json-encoded string. You passed an object of type: #{@params[:meta].type}"
  end
  if @params[:meta].nil? && @params['meta'] 
    @params[:meta] = @params['meta']
    @params.delete('meta')
  end
  return if @use_udp
  if @params[:meta] && !@params[:meta].is_a?(String)
    if @params[:meta].respond_to?('to_json')
      @params[:meta] = @params[:meta].to_json
    end
  end
end
connect(resource) click to toggle source
# File lib/statsmix.rb, line 388
def self.connect(resource)
  self.setup
  if @api_key.nil?
    raise "API key not set. You must set it first with StatsMix.api_key = [your api key]"
  end
  
  # Resources available: stats, metrics, TODO: profiles
  @url = URI.parse(BASE_URI + resource)
  @connection = Net::HTTP.new(@url.host, @url.port)
  @connection.use_ssl = (@url.scheme == 'https')

  @connection.verify_mode = OpenSSL::SSL::VERIFY_NONE

  @connection.use_ssl = (@url.scheme == 'https')
  @connection.verify_mode = OpenSSL::SSL::VERIFY_NONE

  @request = Hash.new
  @request["User-Agent"] = @user_agent
  @params = Hash.new
  if @params.respond_to?('with_indifferent_access')
    @params = @params.with_indifferent_access
  end
  @params[:api_key] = @api_key
end
do_request() click to toggle source
# File lib/statsmix.rb, line 417
def self.do_request
  @error = false
  return if @ignore
  return self.do_udp_request if @use_udp
  #had to add code to support properly encoding array values.  See http://blog.assimov.net/post/653645115/post-put-arrays-with-ruby-net-http-set-form-data
  p @params
  self.set_form_data(@params)
  @response = @connection.request(@request)
  if @response.is_a?(Net::HTTPClientError)
    if 'xml' == @format
      begin
        @error = @response.body.match('<error>(.)+</error>')[0].gsub('<error>','').gsub('</error>','')
      rescue
        @error = 'Unable to parse error message. Check StatsMix.response for more information'
      end
    else
      @error = JSON.parse(@response.body)['errors']['error']
    end
  end
  @response.body
end
do_udp_request() click to toggle source
# File lib/statsmix.rb, line 439
def self.do_udp_request
  data = @params.to_json.inspect
  @socket ||= UDPSocket.new
  @socket.send(data, 0, HOST, UDP_PORT)
  if @debugging
    text, sender = @socket.recvfrom(2048)
    p "SENT #{data}"
    p text
  end
end
set_form_data(params, sep = '&') click to toggle source

based on blog.assimov.net/post/653645115/post-put-arrays-with-ruby-net-http-set-form-data

# File lib/statsmix.rb, line 450
def self.set_form_data(params, sep = '&')
  @request.body = params.map {|k,v|
    if v.instance_of?(Array)
      v.map {|e| "#{self.urlencode(k.to_s)}[]=#{urlencode(e.to_s)}"}.join(sep)
    else
      "#{self.urlencode(k.to_s)}=#{self.urlencode(v.to_s)}"
    end
  }.join(sep)
  @request.content_type = 'application/x-www-form-urlencoded'
end
setup(api_key = nil) click to toggle source
# File lib/statsmix.rb, line 376
def self.setup(api_key = nil)
  return if @initiliazed
  if !api_key.nil?
    @api_key = api_key
  end
  @format = 'xml' if @format.nil?
  @ignore = false if @ignore.nil?
  @user_agent = "StatsMix Ruby Gem " + GEM_VERSION
  @initiliazed = true
  @error = false
end
urlencode(str) click to toggle source
# File lib/statsmix.rb, line 461
def self.urlencode(str)
  URI.encode(str, /[^a-zA-Z0-9_\{\}:, \"\.\-]/n)
end
user_agent() click to toggle source
# File lib/statsmix.rb, line 413
def self.user_agent
  return @user_agent
end