gabba 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,3 @@
1
+ pkg/*
2
+ *.gem
3
+ .bundle
data/Gemfile ADDED
@@ -0,0 +1,6 @@
1
+ source "http://rubygems.org"
2
+
3
+ # Specify your gem's dependencies in gabba.gemspec
4
+ gemspec
5
+
6
+ gem 'minitest'
@@ -0,0 +1,16 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ gabba (0.0.1)
5
+
6
+ GEM
7
+ remote: http://rubygems.org/
8
+ specs:
9
+ minitest (2.0.0)
10
+
11
+ PLATFORMS
12
+ ruby
13
+
14
+ DEPENDENCIES
15
+ gabba!
16
+ minitest
data/README ADDED
@@ -0,0 +1,12 @@
1
+ == Simple class to send custom server-side events to Google Analytics
2
+
3
+ Heavily influenced by the http://code.google.com/p/serversidegoogleanalytics
4
+
5
+ HOW TO USE:
6
+
7
+ - Track page views
8
+ Gabba::Gabba.new("UT-1234", "mydomain.com").page_view("something", "track/me")
9
+
10
+ - Track custom events
11
+ Gabba::Gabba.new("UT-1234", "mydomain.com").event("Videos", "Play", "ID", "123")
12
+
@@ -0,0 +1,8 @@
1
+ require 'bundler'
2
+ Bundler::GemHelper.install_tasks
3
+
4
+ task :default => :spec
5
+
6
+ task :spec do
7
+ ruby "spec/gabba_spec.rb"
8
+ end
@@ -0,0 +1,21 @@
1
+ # -*- encoding: utf-8 -*-
2
+ $:.push File.expand_path("../lib", __FILE__)
3
+ require "gabba/version"
4
+
5
+ Gem::Specification.new do |s|
6
+ s.name = "gabba"
7
+ s.version = Gabba::VERSION
8
+ s.platform = Gem::Platform::RUBY
9
+ s.authors = ["Ron Evans"]
10
+ s.email = ["ron dot evans at gmail dot com"]
11
+ s.homepage = ""
12
+ s.summary = %q{Easy server-side tracking for Google Analytics}
13
+ s.description = %q{Easy server-side tracking for Google Analytics}
14
+
15
+ s.rubyforge_project = "gabba"
16
+
17
+ s.files = `git ls-files`.split("\n")
18
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
19
+ s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
20
+ s.require_paths = ["lib"]
21
+ end
@@ -0,0 +1 @@
1
+ require File.dirname(__FILE__) + '/gabba/gabba.rb'
@@ -0,0 +1,108 @@
1
+ # yo, easy server-side tracking for Google Analytics... hey!
2
+ require "uri"
3
+ require "net/http"
4
+ require 'cgi'
5
+ require File.dirname(__FILE__) + '/version'
6
+
7
+ module Gabba
8
+
9
+ class NoGoogleAnalyticsAccountError < RuntimeError; end
10
+ class NoGoogleAnalyticsDomainError < RuntimeError; end
11
+ class GoogleAnalyticsNetworkError < RuntimeError; end
12
+
13
+ class Gabba
14
+ GOOGLE_URL = "http://www.google-analytics.com"
15
+ TRACKING_URL = "/ga.js"
16
+ BEACON_URL = "/__utm.gif"
17
+ USER_AGENT = "Gabba #{VERSION} Agent"
18
+
19
+ attr_accessor :utmwv, :utmn, :utmhn, :utmcs, :utmul, :utmdt, :utmp, :utmac, :utmt, :utmcc, :user_agent
20
+
21
+ def initialize(ga_acct, domain, agent = Gabba::USER_AGENT)
22
+ @utmwv = "4.4sh" # GA version
23
+ @utmcs = "UTF-8" # charset
24
+ @utmul = "en-us" # language
25
+
26
+ @utmn = rand(8999999999) + 1000000000
27
+ @utmhid = rand(8999999999) + 1000000000
28
+
29
+ @utmac = ga_acct
30
+ @utmhn = domain
31
+ @user_agent = agent
32
+ end
33
+
34
+ def page_view(title, page, utmhid = rand(8999999999) + 1000000000)
35
+ check_account_params
36
+ hey(page_view_params(title, page, utmhid))
37
+ end
38
+
39
+ def event(category, action, label = nil, value = nil)
40
+ check_account_params
41
+ hey(event_params(category, action, label, value))
42
+ end
43
+
44
+ def page_view_params(title, page, utmhid = rand(8999999999) + 1000000000)
45
+ {
46
+ :utmwv => @utmwv,
47
+ :utmn => @utmn,
48
+ :utmhn => @utmhn,
49
+ :utmcs => @utmcs,
50
+ :utmul => @utmul,
51
+ :utmdt => title,
52
+ :utmhid => utmhid,
53
+ :utmp => page,
54
+ :utmac => @utmac,
55
+ :utmcc => cookie_params
56
+ }
57
+ end
58
+
59
+ def event_params(category, action, label = nil, value = nil, utmhid = rand(8999999999) + 1000000000)
60
+ {
61
+ :utmwv => @utmwv,
62
+ :utmn => @utmn,
63
+ :utmhn => @utmhn,
64
+ :utmt => 'event',
65
+ :utme => event_data(category, action, label, value),
66
+ :utmcs => @utmcs,
67
+ :utmul => @utmul,
68
+ :utmhid => utmhid,
69
+ :utmac => @utmac,
70
+ :utmcc => cookie_params
71
+ }
72
+ end
73
+
74
+ def event_data(category, action, label = nil, value = nil)
75
+ data = "5(#{category}*action" + (label ? "*#{label})" : ")")
76
+ data += "(#{value})" if value
77
+ end
78
+
79
+ # create magical cookie params used by GA for its own nefarious purposes
80
+ def cookie_params(utma1 = rand(89999999) + 10000000, utma2 = rand(1147483647) + 1000000000, today = Time.now)
81
+ "__utma=1.#{utma1}00145214523.#{utma2}.#{today.to_i}.#{today.to_i}.15;+__utmz=1.#{today.to_i}.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none);"
82
+ end
83
+
84
+ # sanity check that we have needed params to even call GA
85
+ def check_account_params
86
+ raise NoGoogleAnalyticsAccountError unless @utmac
87
+ raise NoGoogleAnalyticsDomainError unless @utmhn
88
+ end
89
+
90
+ # makes the tracking call to Google Analytics
91
+ def hey(params, referer = "-")
92
+ uri = URI.parse("#{GOOGLE_URL}#{BEACON_URL}?#{hash_to_querystring(params)}")
93
+ req = Net::HTTP::Get.new(uri.path, {"User-Agent" => URI.escape(user_agent)})
94
+ res = Net::HTTP.start(uri.host, uri.port) do |http|
95
+ http.request(req)
96
+ end
97
+ raise GoogleAnalyticsNetworkError unless res.code == "200"
98
+ end
99
+
100
+ # convert params hash to query string
101
+ def hash_to_querystring(hash = {})
102
+ hash.keys.inject('') do |query_string, key|
103
+ query_string << '&' unless key == hash.keys.first
104
+ query_string << "#{URI.encode(key.to_s)}=#{URI.encode(hash[key].to_s)}"
105
+ end
106
+ end
107
+ end
108
+ end
@@ -0,0 +1,3 @@
1
+ module Gabba
2
+ VERSION = "0.0.1"
3
+ end
@@ -0,0 +1,46 @@
1
+ require File.dirname(__FILE__) + '/spec_helper'
2
+
3
+ describe Gabba::Gabba do
4
+
5
+ describe "when tracking page views" do
6
+ before do
7
+ @gabba = Gabba::Gabba.new("abc", "123")
8
+ end
9
+
10
+ it "must require GA account" do
11
+ lambda {Gabba::Gabba.new(nil, nil).page_view("thing", "thing")}.must_raise(Gabba::NoGoogleAnalyticsAccountError)
12
+ end
13
+
14
+ it "must require GA domain" do
15
+ lambda {Gabba::Gabba.new("abs", nil).page_view("thing", "thing")}.must_raise(Gabba::NoGoogleAnalyticsDomainError)
16
+ end
17
+
18
+ it "must be able to create page_view_params" do
19
+ @gabba.page_view_params("hiya", "/tracker/page")[:utmdt].must_equal("hiya")
20
+ end
21
+
22
+ it "must be able to create hash of page_view_params" do
23
+ @gabba.hash_to_querystring(@gabba.page_view_params("hiya", "/tracker/page")).wont_be_nil
24
+ end
25
+ end
26
+
27
+ describe "when tracking custom events" do
28
+ before do
29
+ @gabba = Gabba::Gabba.new("abc", "123")
30
+ end
31
+
32
+ it "must require GA account" do
33
+ lambda {Gabba::Gabba.new(nil, nil).event("cat1", "act1", "lab1", "val1")}.must_raise(Gabba::NoGoogleAnalyticsAccountError)
34
+ end
35
+
36
+ it "must require GA domain" do
37
+ lambda {Gabba::Gabba.new("abs", nil).event("cat1", "act1", "lab1", "val1")}.must_raise(Gabba::NoGoogleAnalyticsDomainError)
38
+ end
39
+
40
+ it "must be able to create event data" do
41
+ @gabba.event_data("cat1", "act1", "lab1", "val1").wont_be_nil
42
+ end
43
+
44
+ end
45
+
46
+ end
@@ -0,0 +1,6 @@
1
+ require 'rubygems'
2
+ gem 'minitest'
3
+ require 'minitest/autorun'
4
+ require 'minitest/pride'
5
+
6
+ require File.dirname(__FILE__) + '/../lib/gabba/gabba'
metadata ADDED
@@ -0,0 +1,79 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: gabba
3
+ version: !ruby/object:Gem::Version
4
+ hash: 29
5
+ prerelease: false
6
+ segments:
7
+ - 0
8
+ - 0
9
+ - 1
10
+ version: 0.0.1
11
+ platform: ruby
12
+ authors:
13
+ - Ron Evans
14
+ autorequire:
15
+ bindir: bin
16
+ cert_chain: []
17
+
18
+ date: 2010-11-28 00:00:00 -08:00
19
+ default_executable:
20
+ dependencies: []
21
+
22
+ description: Easy server-side tracking for Google Analytics
23
+ email:
24
+ - ron dot evans at gmail dot com
25
+ executables: []
26
+
27
+ extensions: []
28
+
29
+ extra_rdoc_files: []
30
+
31
+ files:
32
+ - .gitignore
33
+ - Gemfile
34
+ - Gemfile.lock
35
+ - README
36
+ - Rakefile
37
+ - gabba.gemspec
38
+ - lib/gabba.rb
39
+ - lib/gabba/gabba.rb
40
+ - lib/gabba/version.rb
41
+ - spec/gabba_spec.rb
42
+ - spec/spec_helper.rb
43
+ has_rdoc: true
44
+ homepage: ""
45
+ licenses: []
46
+
47
+ post_install_message:
48
+ rdoc_options: []
49
+
50
+ require_paths:
51
+ - lib
52
+ required_ruby_version: !ruby/object:Gem::Requirement
53
+ none: false
54
+ requirements:
55
+ - - ">="
56
+ - !ruby/object:Gem::Version
57
+ hash: 3
58
+ segments:
59
+ - 0
60
+ version: "0"
61
+ required_rubygems_version: !ruby/object:Gem::Requirement
62
+ none: false
63
+ requirements:
64
+ - - ">="
65
+ - !ruby/object:Gem::Version
66
+ hash: 3
67
+ segments:
68
+ - 0
69
+ version: "0"
70
+ requirements: []
71
+
72
+ rubyforge_project: gabba
73
+ rubygems_version: 1.3.7
74
+ signing_key:
75
+ specification_version: 3
76
+ summary: Easy server-side tracking for Google Analytics
77
+ test_files:
78
+ - spec/gabba_spec.rb
79
+ - spec/spec_helper.rb