class GabbaGMP::GabbaGMP

Constants

BEACON_PATH
DIMENSION_MAX
ESCAPES
GOOGLE_HOST
USER_AGENT

Attributes

logger[RW]

Public Class Methods

new(ga_tracking_id, request, cookies, options = {}) click to toggle source

Public: Initialize Gabba Google Analytics Tracking Object.

ga_tracking_id - A String containing your Google Analytics account id. request - The request this tracker relates to. cookies - The cookies object for this request. Will be updated with the client_id cookie options - Allows for:

-client_id_cookie_expiry = Set the expiry of the visitor cookie manually
-client_id_cookie_sym = The symbol to store the visitor id cookie under

Example:

g = GabbaGMP::GabbaGMP.new("UT-1234", "mydomain.com")
# File lib/gabba-gmp/gabba_gmp.rb, line 50
def initialize(ga_tracking_id, request, cookies, options = {})
  client_id_cookie = options[:client_id_cookie_sym]
  client_id_cookie = :utm_visitor_uuid if client_id_cookie.nil? or !client_id_cookie.kind_of? Symbol
  
  if cookies[client_id_cookie].nil?
    cookie_expiry = options[:client_id_cookie_expiry] ? options[:client_id_cookie_expiry] : Time.now + (60*60*24*365)
    cookies[client_id_cookie] = { value: "#{SecureRandom.uuid}", expires: cookie_expiry}
  end
  
  @sessionopts = {protocol_version: 1, 
                  tracking_id: ga_tracking_id, 
                  document_host: request.host, 
                  client_id: cookies[client_id_cookie], 
                  user_ip_address: request.remote_ip, 
                  user_agent: request.user_agent,
                  user_language: preferred_language(request.accept_language)}
    
  @sessionopts[:document_referrer] = request.referrer if request.referrer and !request.referrer.start_with?("#{request.protocol}#{request.host_with_port}")
    
end

Public Instance Methods

add_options(options) click to toggle source

Public: Set the session’s parameters. This will be added to all actions that are sent to analytics.

See::  ParameterMap:GA_PARAMS
# File lib/gabba-gmp/gabba_gmp.rb, line 81
def add_options(options)
  options.keys.each do |key| 
    raise GoogleAnalyticsParameterNotFoundError, "Parameter '#{key}'" unless GA_PARAMS[key]
  end
  
  @sessionopts.merge!(options)
  self
end
campaign=(campaign) click to toggle source

Public: Set the campaign details from a campaign object. You can also use your own Campaign object so long

as they support the 5 methods (name, source, medium, keyword, content)
# File lib/gabba-gmp/gabba_gmp.rb, line 92
def campaign=(campaign)
  campaign ||= Campaign.new
  {}.tap do |campaign_params|
    if campaign.present?
      @sessionopts[:campaign_name] = parse_string(campaign.name)
      @sessionopts[:campaign_name] ||= "(direct)"
        
      @sessionopts[:campaign_source] = parse_string(campaign.source)
      @sessionopts[:campaign_source] ||= "(direct)"
        
      @sessionopts[:campaign_medium] = parse_string(campaign.medium)
      @sessionopts[:campaign_medium] ||= "(none)"
      
      @sessionopts.delete(:campaign_keyword)
      @sessionopts[:campaign_keyword] = campaign.keyword unless campaign.keyword.to_s.empty?
        
      @sessionopts.delete(:campaign_content)
      @sessionopts[:campaign_content] = campaign.content unless campaign.content.to_s.empty?
    end
  end
end
preferred_language(language) click to toggle source
# File lib/gabba-gmp/gabba_gmp.rb, line 71
def preferred_language(language)
  return "" unless language
  
  language_arr = language.split(",").map {|lang_pref| lang_pref.split(";")}
  language_arr[0][0].downcase.strip #just get the first language. Will probably be correct.
end

Private Instance Methods

escape(t) click to toggle source
# File lib/gabba-gmp/gabba_gmp.rb, line 153
def escape(t)
  return t if !t || (/\w/ !~ t.to_s)

  t.to_s.gsub(/[\*'!\)]/) do |m|
    "'#{ESCAPES.index(m)}"
  end
end
hey(params) click to toggle source

makes the tracking call to Google Analytics

# File lib/gabba-gmp/gabba_gmp.rb, line 133
def hey(params)
  validate_session_parameters(params)
  params_formatted = params.each_pair {|k,v| params[k] = "#{v}"}.keep_if {|k,v| !v.nil? and !v.empty?}
  params_formatted = params_formatted.map {|k,v| "#{GA_PARAMS[k]}=#{URI.escape(v, Regexp.new("[^#{URI::PATTERN::UNRESERVED}]"))}" }
  query = params_formatted.join('&')

  @http ||= Net::HTTP::Persistent.new 'GabbaGMP'

  @logger.info "GABBA_GMP: request params: #{query}" if @logger
  
  request = Net::HTTP::Get.new("#{BEACON_PATH}?#{query}")
  request["User-Agent"] = URI.escape(params[:user_agent]) if params[:user_agent] 
  request["Accept"] = "*/*"
  uri = URI "http://#{GOOGLE_HOST}/#{BEACON_PATH}"
  response = @http.request(uri, request)

  raise GoogleAnalyticsNetworkError unless response.code == "200"
  response
end
parse_string(value) click to toggle source
# File lib/gabba-gmp/gabba_gmp.rb, line 116
def parse_string(value)
  (value.to_s.empty? ? nil : value)
end
validate_session_parameters(params) click to toggle source

Sanity check that we have needed params to even call GA

# File lib/gabba-gmp/gabba_gmp.rb, line 121
def validate_session_parameters(params)
  raise GoogleAnalyticsRequiredParameterMissingError, "Protocol version is required" unless params[:protocol_version]
  raise GoogleAnalyticsRequiredParameterMissingError, "Tracking id is required" unless params[:tracking_id]
  raise GoogleAnalyticsRequiredParameterMissingError, "Client id is required" unless params[:client_id]
  raise GoogleAnalyticsRequiredParameterMissingError, "Hit type is required" unless params[:hit_type]
  
  params.keys.each do |param|
    raise GoogleAnalyticsInvalidParameterError, "The parameter '#{param}' is not currently recognised." unless GA_PARAMS[param]
  end
end