google-analytics-rails 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
data/.gitignore ADDED
@@ -0,0 +1,5 @@
1
+ *.gem
2
+ .bundle
3
+ Gemfile.lock
4
+ pkg/*
5
+ .yardoc
data/.yardopts ADDED
@@ -0,0 +1 @@
1
+ -m markdown --no-private --plugin rails
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source "http://rubygems.org"
2
+
3
+ # Specify your gem's dependencies in google-analytics-rails.gemspec
4
+ gemspec
data/README.markdown ADDED
@@ -0,0 +1,57 @@
1
+ Fast Google Analytics setup for Rails.
2
+
3
+ Installation
4
+ ============
5
+
6
+ Add the following to your `Gemfile`:
7
+
8
+ gem 'google-analytics-rails', :git => 'git://github.com/bgarret/google-analytics-rails.git'
9
+
10
+ Then run:
11
+
12
+ bundle install
13
+
14
+ Documentation
15
+ =============
16
+
17
+ http://rubydoc.info/github/bgarret/google-analytics-rails
18
+
19
+ Example configurations
20
+ ======================
21
+
22
+ Production only
23
+ ---------------
24
+
25
+ `config/environments/production.rb`:
26
+
27
+ # replace this with your tracker code
28
+ GA.tracker = "UA-xxxxxx-x"
29
+
30
+ `app/views/layout/application.html.erb`, in the `<head>` tag :
31
+
32
+ <%= analytics_init if Rails.env.production? %>
33
+
34
+
35
+ Different accounts for development and production
36
+ -------------------------------------------------
37
+
38
+ `config/environments/production.rb`:
39
+
40
+ # replace this with your production tracker code
41
+ GAR.tracker = "UA-xxxxxx-x"
42
+
43
+ `config/environments/development.rb`:
44
+
45
+ # replace this with your development tracker code
46
+ GAR.tracker = "UA-xxxxxx-x"
47
+
48
+ `app/views/layout/application.html.erb`, in the `<head>` tag :
49
+
50
+ <%= analytics_init :local => Rails.env.development? %>
51
+
52
+ License
53
+ =======
54
+
55
+ [google-analytics-rails](https://github.com/bgarret.google-analytics-rails) is released under the MIT license:
56
+
57
+ * http://www.opensource.org/licenses/MIT
data/Rakefile ADDED
@@ -0,0 +1,10 @@
1
+ require 'bundler'
2
+ Bundler::GemHelper.install_tasks
3
+
4
+ require 'rake/testtask'
5
+
6
+ Rake::TestTask.new do |t|
7
+ t.libs << "test"
8
+ t.test_files = FileList['test/**/*_test.rb']
9
+ t.verbose = true
10
+ end
@@ -0,0 +1,25 @@
1
+ # -*- encoding: utf-8 -*-
2
+ $:.push File.expand_path("../lib", __FILE__)
3
+ require "google-analytics/version"
4
+
5
+ Gem::Specification.new do |s|
6
+ s.name = "google-analytics-rails"
7
+ s.version = GoogleAnalytics::VERSION
8
+ s.platform = Gem::Platform::RUBY
9
+ s.authors = ["Benoit Garret"]
10
+ s.email = ["benoit.garret@gadz.org"]
11
+ s.homepage = "https://github.com/bgarret/google-analytics-rails"
12
+ s.summary = %q{Rails helpers to manage google analytics tracking}
13
+ s.description = %q{Rails helpers to manage google analytics tracking}
14
+
15
+ s.rubyforge_project = "google-analytics-rails"
16
+
17
+ s.add_development_dependency "yard"
18
+ s.add_development_dependency "redcarpet"
19
+ s.add_development_dependency "activesupport", "~>3.0"
20
+
21
+ s.files = `git ls-files`.split("\n")
22
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
23
+ s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
24
+ s.require_paths = ["lib"]
25
+ end
@@ -0,0 +1,34 @@
1
+ require 'google-analytics/async_tracking_queue'
2
+ require 'google-analytics/events'
3
+
4
+ module GoogleAnalytics
5
+ # @private
6
+ PLACEHOLDER_TRACKER = "UA-xxxxxx-x"
7
+
8
+ # Get the current tracker id (*UA-xxxxxx-x*).
9
+ # @return [String]
10
+ def self.tracker
11
+ @@tracker ||= PLACEHOLDER_TRACKER
12
+ end
13
+
14
+ # Set the current tracker id.
15
+ # @param [String] tracker The tracker id (ie. "*UA-xxxxxx-x*").
16
+ def self.tracker=(tracker)
17
+ @@tracker = tracker
18
+ end
19
+
20
+ # @return [Boolean]
21
+ def self.valid_tracker?
22
+ tracker.nil? || tracker == "" || tracker == PLACEHOLDER_TRACKER ? false : true
23
+ end
24
+ end
25
+
26
+ # Alias for {GoogleAnalytics}
27
+ GA = GoogleAnalytics
28
+
29
+ if defined?(Rails)
30
+ require 'google-analytics/rails/railtie'
31
+
32
+ # Alias for {GoogleAnalytics::Rails}
33
+ GAR = GoogleAnalytics::Rails
34
+ end
@@ -0,0 +1,41 @@
1
+ module GoogleAnalytics
2
+ class AsyncTrackingQueue
3
+ def initialize
4
+ @events = []
5
+ end
6
+
7
+ def <<(event)
8
+ push(event)
9
+ end
10
+
11
+ def push(event, tracker_id = nil)
12
+ @events << renderer_for_event(event, tracker_id)
13
+ end
14
+
15
+ def to_s
16
+ <<-JAVASCRIPT
17
+ <script type="text/javascript">
18
+ var _gaq = _gaq || [];
19
+ #{@events.map { |event| event.to_s }.join("\n")}
20
+ (function() {
21
+ var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
22
+ ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
23
+ var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
24
+ })();
25
+ </script>
26
+ JAVASCRIPT
27
+ end
28
+
29
+ private
30
+
31
+ def renderer_for_event(event, tracker_id)
32
+ case event
33
+ when Event then EventRenderer.new(event, tracker_id)
34
+ when EventCollection then EventCollectionRenderer.new(event, tracker_id)
35
+ end
36
+ end
37
+ end
38
+ end
39
+
40
+ # Alias for {GoogleAnalytics::AsyncTrackingQueue}
41
+ GAQ = GoogleAnalytics::AsyncTrackingQueue
@@ -0,0 +1,7 @@
1
+ module GoogleAnalytics
2
+ autoload :Events, 'google-analytics/events/events'
3
+ autoload :Event, 'google-analytics/events/event'
4
+ autoload :EventRenderer, 'google-analytics/events/event_renderer'
5
+ autoload :EventCollection, 'google-analytics/events/event_collection'
6
+ autoload :EventCollectionRenderer, 'google-analytics/events/event_collection_renderer'
7
+ end
@@ -0,0 +1,10 @@
1
+ module GoogleAnalytics
2
+ class Event
3
+ attr_reader :name, :params
4
+
5
+ def initialize(name, *params)
6
+ @name = name
7
+ @params = params
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,25 @@
1
+ module GoogleAnalytics
2
+ class EventCollection
3
+ include Enumerable
4
+
5
+ class InvalidEventError < StandardError
6
+ def initialize(non_event)
7
+ super("EventCollection#<< expects instances of Event, you passed #{non_event}")
8
+ end
9
+ end
10
+
11
+ def initialize
12
+ @events = []
13
+ end
14
+
15
+ def <<(event)
16
+ raise InvalidEventError.new(event) unless event.is_a?(Event)
17
+
18
+ @events << event
19
+ end
20
+
21
+ def each
22
+ @events.each { |e| yield e }
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,12 @@
1
+ module GoogleAnalytics
2
+ class EventCollectionRenderer
3
+ def initialize(event_collection, tracker_id)
4
+ @event_collection = event_collection
5
+ @tracker_id = tracker_id
6
+ end
7
+
8
+ def to_s
9
+ @event_collection.map { |event| EventRenderer.new(event, @tracker_id).to_s }.join("\n")
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,25 @@
1
+ require 'json'
2
+
3
+ module GoogleAnalytics
4
+ class EventRenderer
5
+ def initialize(event, tracker_id)
6
+ @event = event
7
+ @tracker_id = tracker_id
8
+ end
9
+
10
+ def to_s
11
+ "_gaq.push(#{array_to_json([@tracker_id ? "#{@tracker_id}.#{@event.name}" : @event.name, *@event.params])});"
12
+ end
13
+
14
+ private
15
+
16
+ def array_to_json(array)
17
+ "[" << array.map {|string| string_to_json(string) } .join(',') << "]"
18
+ end
19
+
20
+ def string_to_json(string)
21
+ # replace double quotes with single ones
22
+ string.to_json.gsub(/^"/, "'").gsub(/"$/, "'")
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,82 @@
1
+ module GoogleAnalytics
2
+ module Events
3
+ class SetAccount < Event
4
+ def initialize(account_id)
5
+ super('_setAccount', account_id)
6
+ end
7
+ end
8
+
9
+ class SetDomainName < Event
10
+ def initialize(domain_name)
11
+ super('_setDomainName', domain_name)
12
+ end
13
+ end
14
+
15
+ class SetAllowLinker < Event
16
+ def initialize(allow)
17
+ super('_setAllowLinker', allow)
18
+ end
19
+ end
20
+
21
+ class TrackPageview < Event
22
+ # @param page [String] optional virtual pageview tracking (see http://code.google.com/apis/analytics/docs/tracking/asyncMigrationExamples.html#VirtualPageviews)
23
+ def initialize(page = nil)
24
+ page && page != '' ? super('_trackPageview', page) : super('_trackPageview')
25
+ end
26
+ end
27
+
28
+ class TrackEvent < Event
29
+ def initialize(category, action, label = nil, value = nil)
30
+ if label || value
31
+ super('_trackEvent', category.to_s, action.to_s, label ? label.to_s : nil, value ? value.to_i : nil)
32
+ else
33
+ super('_trackEvent', category.to_s, action.to_s)
34
+ end
35
+ end
36
+ end
37
+
38
+ module Ecommerce
39
+ class AddTransaction < Event
40
+
41
+ # _gaq.push(['_addTrans',
42
+ # '1234', // order ID - required
43
+ # 'Acme Clothing', // affiliation or store name
44
+ # '11.99', // total - required
45
+ # '1.29', // tax
46
+ # '5', // shipping
47
+ # 'San Jose', // city
48
+ # 'California', // state or province
49
+ # 'USA' // country
50
+ # ]);
51
+ #
52
+ def initialize(order_id, store_name, total, tax, shipping, city, state_or_province, country)
53
+ super('_addTrans', order_id.to_s, store_name.to_s, total.to_s, tax.to_s, shipping.to_s, city.to_s, state_or_province.to_s, country.to_s)
54
+ end
55
+ end
56
+
57
+ class AddItem < Event
58
+
59
+ # _gaq.push(['_addItem',
60
+ # '1234', // order ID - required
61
+ # 'DD44', // SKU/code - required
62
+ # 'T-Shirt', // product name
63
+ # 'Green Medium', // category or variation
64
+ # '11.99', // unit price - required
65
+ # '1' // quantity - required
66
+ # ]);
67
+ #
68
+ def initialize(order_id, product_id, product_name, product_variation, unit_price, quantity)
69
+ super('_addItem', order_id.to_s, product_id.to_s, product_name.to_s, product_variation.to_s, unit_price.to_s, quantity.to_s)
70
+ end
71
+
72
+ end
73
+
74
+ class TrackTransaction < Event
75
+ # _gaq.push(['_trackTrans']); // submits transaction to the Analytics servers
76
+ def initialize
77
+ super('_trackTrans')
78
+ end
79
+ end
80
+ end
81
+ end
82
+ end
@@ -0,0 +1,10 @@
1
+ require 'google-analytics/rails/view_helpers'
2
+
3
+ module GoogleAnalytics::Rails
4
+ # @private
5
+ class Railtie < ::Rails::Railtie
6
+ initializer "google-analytics-rails" do
7
+ ActionView::Base.send :include, ViewHelpers
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,133 @@
1
+ require 'active_support/core_ext/string/output_safety'
2
+ require 'active_support/core_ext/object/blank'
3
+
4
+ module GoogleAnalytics::Rails
5
+ # All the helper methods output raw javascript with single quoted strings. This allows more flexbility in choosing when the event gets sent (on page load, on user action, etc).
6
+ #
7
+ # The only exception is {#analytics_init}, which is wrapped in a `<script>` tag.
8
+ #
9
+ # @example This event is always sent on page load
10
+ #
11
+ # <script>
12
+ # <%= analytics_track_event "Videos", "Play", "Gone With the Wind" %>
13
+ # </script>
14
+ #
15
+ # @example This event is sent when the visitor clicks on the link
16
+ #
17
+ # # note the double quotes around the onclick attribute,
18
+ # # they are necessary because the javascript is single quoted
19
+ # <a href="my_url" onclick="<%= analytics_track_event "Videos", "Play", "Gone With the Wind" %>">Link</a>
20
+ #
21
+ # @example Full ecommerce example
22
+ #
23
+ # # create a new transaction
24
+ # analytics_add_transaction(
25
+ # '1234', # order ID - required
26
+ # 'Acme Clothing', # affiliation or store name
27
+ # '11.99', # total - required
28
+ # '1.29', # tax
29
+ # '5', # shipping
30
+ # 'San Jose', # city
31
+ # 'California', # state or province
32
+ # 'USA' # country
33
+ # )
34
+ #
35
+ # # add an item to the transaction
36
+ # analytics_add_item(
37
+ # '1234', # order ID - required
38
+ # 'DD44', # SKU/code - required
39
+ # 'T-Shirt', # product name
40
+ # 'Green Medium', # category or variation
41
+ # '11.99', # unit price - required
42
+ # '1' # quantity - required
43
+ # )
44
+ #
45
+ # # submit the transaction
46
+ # analytics_track_transaction
47
+ #
48
+ module ViewHelpers
49
+ # Initializes the Analytics javascript. Put it in the `<head>` tag.
50
+ #
51
+ # @param options [Hash]
52
+ # @option options [Boolean] :local (false) Sets the local development mode.
53
+ # See http://www.google.com/support/forum/p/Google%20Analytics/thread?tid=741739888e14c07a&hl=en
54
+ # @option options [Array, GoogleAnalytics::Event] :add_events ([])
55
+ # The page views are tracked by default, additional events can be added here.
56
+ # @options options [String] :page
57
+ # The optional virtual page view to track through {GA::Events::TrackPageview.new}
58
+ # @options options [String] :tracker
59
+ # The tracker to use instead of the default {GoogleAnalytics.tracker}
60
+ #
61
+ # @example Set the local bit in development mode
62
+ # analytics_init :local => Rails.env.development?
63
+ #
64
+ # @example Allow links across domains
65
+ # analytics_init :add_events => Events::SetAllowLinker.new(true)
66
+ #
67
+ # @return [String] a `<script>` tag, containing the analytics initialization sequence.
68
+ #
69
+ def analytics_init(options = {})
70
+ unless tracker = options.delete(:tracker).presence
71
+ tracker = GA.tracker
72
+ raise ArgumentError, "Tracker must be set! Did you set GA.tracker ?" unless tracker
73
+ end
74
+
75
+ local = options.delete(:local) || false
76
+ events = options.delete(:add_events) || []
77
+ events = [events] unless events.is_a?(Array)
78
+
79
+ queue = GAQ.new
80
+
81
+ # unshift => reverse order
82
+ events.unshift GA::Events::TrackPageview.new(options[:page])
83
+ events.unshift GA::Events::SetAccount.new(tracker)
84
+
85
+ if local
86
+ events.push GA::Events::SetDomainName.new('none')
87
+ events.push GA::Events::SetAllowLinker.new(true)
88
+ end
89
+
90
+ events.each do |event|
91
+ queue << event
92
+ end
93
+
94
+ queue.to_s.html_safe
95
+ end
96
+
97
+ # Track a custom event
98
+ # @see http://code.google.com/apis/analytics/docs/tracking/eventTrackerGuide.html
99
+ #
100
+ # @example
101
+ #
102
+ # analytics_track_event "Videos", "Play", "Gone With the Wind"
103
+ #
104
+ def analytics_track_event(category, action, label = nil, value = nil)
105
+ analytics_render_event(GA::Events::TrackEvent.new(category, action, label, value))
106
+ end
107
+
108
+ # Track an ecommerce transaction
109
+ # @see http://code.google.com/apis/analytics/docs/tracking/gaTrackingEcommerce.html
110
+ def analytics_add_transaction(order_id, store_name, total, tax, shipping, city, state_or_province, country)
111
+ analytics_render_event(GA::Events::Ecommerce::AddTransaction.new(order_id, store_name, total, tax, shipping, city, state_or_province, country))
112
+ end
113
+
114
+ # Add an item to the current transaction
115
+ # @see http://code.google.com/apis/analytics/docs/tracking/gaTrackingEcommerce.html
116
+ def analytics_add_item(order_id, product_id, product_name, product_variation, unit_price, quantity)
117
+ analytics_render_event(GA::Events::Ecommerce::AddItem.new(order_id, product_id, product_name, product_variation, unit_price, quantity))
118
+ end
119
+
120
+ # Flush the current transaction
121
+ # @see http://code.google.com/apis/analytics/docs/tracking/gaTrackingEcommerce.html
122
+ def analytics_track_transaction
123
+ analytics_render_event(GA::Events::Ecommerce::TrackTransaction.new)
124
+ end
125
+
126
+ private
127
+
128
+ def analytics_render_event(event)
129
+ raise ArgumentError, "Tracker must be set! Did you set GA.tracker ?" unless GA.valid_tracker?
130
+ GA::EventRenderer.new(event, nil).to_s.html_safe
131
+ end
132
+ end
133
+ end
@@ -0,0 +1,4 @@
1
+ module GoogleAnalytics
2
+ # Gem version
3
+ VERSION = "0.0.1"
4
+ end
@@ -0,0 +1,32 @@
1
+ require 'test_helper'
2
+
3
+ class AsyncTrackingQueueTest < Test::Unit::TestCase
4
+ VALID_SNIPPET = <<-JAVASCRIPT
5
+ <script type="text/javascript">
6
+ var _gaq = _gaq || [];
7
+ _gaq.push(['event1',1]);
8
+ _gaq.push(['event2',2]);
9
+ _gaq.push(['t2.event1',1]);
10
+ _gaq.push(['t2.event2',2]);
11
+ (function() {
12
+ var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
13
+ ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
14
+ var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
15
+ })();
16
+ </script>
17
+ JAVASCRIPT
18
+
19
+ def test_queue_renders_valid_javascript_snippit
20
+ gaq = GAQ.new
21
+
22
+ # Add 2 events to the default tracker
23
+ gaq << GA::Event.new('event1', 1)
24
+ gaq << GA::Event.new('event2', 2)
25
+
26
+ # Add 2 events for an alternate tracker
27
+ gaq.push(GA::Event.new('event1', 1), 't2')
28
+ gaq.push(GA::Event.new('event2', 2), 't2')
29
+
30
+ assert_equal(VALID_SNIPPET, gaq.to_s)
31
+ end
32
+ end
@@ -0,0 +1,23 @@
1
+ require 'test_helper'
2
+
3
+ class EventCollectionRendererTest < Test::Unit::TestCase
4
+ def test_event_collection_renderer_yield_proper_javascript_snippit_for_default_tracker
5
+ event_collection = GA::EventCollection.new
6
+ event_collection << GA::Event.new('event1', 1)
7
+ event_collection << GA::Event.new('event2', 2)
8
+ event_collection << GA::Event.new('event3', 3)
9
+
10
+ ecr = GA::EventCollectionRenderer.new(event_collection, nil)
11
+ assert_equal("_gaq.push(['event1',1]);\n_gaq.push(['event2',2]);\n_gaq.push(['event3',3]);", ecr.to_s)
12
+ end
13
+
14
+ def test_event_collection_renderer_yield_proper_javascript_snippit_for_custom_tracker
15
+ event_collection = GA::EventCollection.new
16
+ event_collection << GA::Event.new('event1', 1)
17
+ event_collection << GA::Event.new('event2', 2)
18
+ event_collection << GA::Event.new('event3', 3)
19
+
20
+ ecr = GA::EventCollectionRenderer.new(event_collection, 't2')
21
+ assert_equal("_gaq.push(['t2.event1',1]);\n_gaq.push(['t2.event2',2]);\n_gaq.push(['t2.event3',3]);", ecr.to_s)
22
+ end
23
+ end
@@ -0,0 +1,24 @@
1
+ require 'test_helper'
2
+
3
+ class EventCollectionTest < Test::Unit::TestCase
4
+ def test_event_collection_raises_on_non_event_insertion
5
+ ec = GA::EventCollection.new
6
+ assert_raise(GA::EventCollection::InvalidEventError) { ec << "This is invalid" }
7
+ end
8
+
9
+ def test_event_collection_is_enumerable_and_iterates_in_insertion_order
10
+ ec = GA::EventCollection.new
11
+
12
+ assert(ec.respond_to?(:each))
13
+
14
+ ec << (event0 = GA::Event.new('sample', 'test'))
15
+ ec << (event1 = GA::Event.new('sample2', 'test2'))
16
+ ec << (event3 = GA::Event.new('sample3', 'test3'))
17
+
18
+ items = ec.map { |e| e }
19
+
20
+ assert_equal(event0, items[0])
21
+ assert_equal(event1, items[1])
22
+ assert_equal(event3, items[2])
23
+ end
24
+ end
@@ -0,0 +1,13 @@
1
+ require 'test_helper'
2
+
3
+ class EventRendererTest < Test::Unit::TestCase
4
+ def test_event_renderer_yield_proper_javascript_snippit_for_default_tracker
5
+ er = GA::EventRenderer.new(GA::Event.new('_someEvent', 1, 2, 3), nil)
6
+ assert_equal("_gaq.push(['_someEvent',1,2,3]);", er.to_s)
7
+ end
8
+
9
+ def test_event_renderer_yield_proper_javascript_snippit_for_custom_tracker
10
+ er = GA::EventRenderer.new(GA::Event.new('_someEvent', 1, 2, 3), 't2')
11
+ assert_equal("_gaq.push(['t2._someEvent',1,2,3]);", er.to_s)
12
+ end
13
+ end
@@ -0,0 +1,69 @@
1
+ require 'test_helper'
2
+
3
+ class GAEventsTest < Test::Unit::TestCase
4
+ def test_set_account_event
5
+ event = GA::Events::SetAccount.new('ABC123')
6
+ assert_equal('_setAccount', event.name)
7
+ assert_equal(['ABC123'], event.params)
8
+ end
9
+
10
+ def test_set_domain_name_event
11
+ event = GA::Events::SetDomainName.new('foo.com')
12
+ assert_equal('_setDomainName', event.name)
13
+ assert_equal(['foo.com'], event.params)
14
+ end
15
+
16
+ def test_track_pageview_event
17
+ event = GA::Events::TrackPageview.new
18
+ assert_equal('_trackPageview', event.name)
19
+ assert_equal([], event.params)
20
+ end
21
+
22
+ def test_track_pageview_event_with_virtual_page
23
+ event = GA::Events::TrackPageview.new('/foo/bar')
24
+ assert_equal('_trackPageview', event.name)
25
+ assert_equal(['/foo/bar'], event.params)
26
+ end
27
+
28
+ def test_track_event_without_category_or_label
29
+ event = GA::Events::TrackEvent.new('Search', 'Executed')
30
+ assert_equal('_trackEvent', event.name)
31
+ assert_equal(['Search', 'Executed'], event.params)
32
+ end
33
+
34
+ def test_track_event_with_label
35
+ event = GA::Events::TrackEvent.new('Search', 'Executed', 'Son of Sam')
36
+ assert_equal('_trackEvent', event.name)
37
+ assert_equal(['Search', 'Executed', 'Son of Sam', nil], event.params)
38
+ end
39
+
40
+ def test_track_event_with_value
41
+ event = GA::Events::TrackEvent.new('Search', 'Executed', nil, 1)
42
+ assert_equal('_trackEvent', event.name)
43
+ assert_equal(['Search', 'Executed', nil, 1], event.params)
44
+ end
45
+
46
+ def test_track_event_with_label_and_value
47
+ event = GA::Events::TrackEvent.new('Search', 'Executed', 'Son of Sam', 1)
48
+ assert_equal('_trackEvent', event.name)
49
+ assert_equal(['Search', 'Executed', 'Son of Sam', 1], event.params)
50
+ end
51
+
52
+ def test_ecommerce_add_transaction_event
53
+ event = GA::Events::Ecommerce::AddTransaction.new(1, 'ACME', 123.45, 13.27, 75.35, 'Dallas', 'TX', 'USA')
54
+ assert_equal('_addTrans', event.name)
55
+ assert_equal(['1', 'ACME', '123.45', '13.27', '75.35', 'Dallas', 'TX', 'USA'], event.params)
56
+ end
57
+
58
+ def test_ecommerce_add_item_event
59
+ event = GA::Events::Ecommerce::AddItem.new(1, 123, 'Bacon', 'Chunky', 5.00, 42)
60
+ assert_equal('_addItem', event.name)
61
+ assert_equal(['1', '123', 'Bacon', 'Chunky', '5.0', '42'], event.params)
62
+ end
63
+
64
+ def test_ecommerce_track_trans_event
65
+ event = GA::Events::Ecommerce::TrackTransaction.new
66
+ assert_equal('_trackTrans', event.name)
67
+ assert_equal([], event.params)
68
+ end
69
+ end
@@ -0,0 +1,101 @@
1
+ require 'test_helper'
2
+ require 'google-analytics/rails/view_helpers'
3
+
4
+ class ViewHelpersTest < Test::Unit::TestCase
5
+ include GoogleAnalytics::Rails::ViewHelpers
6
+
7
+ VALID_INIT = <<-JAVASCRIPT
8
+ <script type="text/javascript">
9
+ var _gaq = _gaq || [];
10
+ _gaq.push(['_setAccount','TEST']);
11
+ _gaq.push(['_trackPageview']);
12
+ (function() {
13
+ var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
14
+ ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
15
+ var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
16
+ })();
17
+ </script>
18
+ JAVASCRIPT
19
+
20
+ def test_analytics_init
21
+ assert_equal(VALID_INIT, analytics_init)
22
+ end
23
+
24
+ VALID_INIT_WITH_VIRTUAL_PAGEVIEW = <<-JAVASCRIPT
25
+ <script type="text/javascript">
26
+ var _gaq = _gaq || [];
27
+ _gaq.push(['_setAccount','TEST']);
28
+ _gaq.push(['_trackPageview','/some/virtual/url']);
29
+ (function() {
30
+ var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
31
+ ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
32
+ var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
33
+ })();
34
+ </script>
35
+ JAVASCRIPT
36
+
37
+ def test_analytics_init_with_virtual_pageview
38
+ assert_equal(VALID_INIT_WITH_VIRTUAL_PAGEVIEW, analytics_init(:page => '/some/virtual/url'))
39
+ end
40
+
41
+ VALID_INIT_WITH_CUSTOM_TRACKER = <<-JAVASCRIPT
42
+ <script type="text/javascript">
43
+ var _gaq = _gaq || [];
44
+ _gaq.push(['_setAccount','UA-CUSTOM-XX']);
45
+ _gaq.push(['_trackPageview']);
46
+ (function() {
47
+ var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
48
+ ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
49
+ var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
50
+ })();
51
+ </script>
52
+ JAVASCRIPT
53
+
54
+ def test_analytics_init_with_custom_tracker
55
+ assert_equal(VALID_INIT_WITH_CUSTOM_TRACKER, analytics_init(:tracker => 'UA-CUSTOM-XX'))
56
+ end
57
+
58
+ VALID_LOCAL_INIT = <<-JAVASCRIPT
59
+ <script type="text/javascript">
60
+ var _gaq = _gaq || [];
61
+ _gaq.push(['_setAccount','TEST']);
62
+ _gaq.push(['_trackPageview']);
63
+ _gaq.push(['_setDomainName','none']);
64
+ _gaq.push(['_setAllowLinker',true]);
65
+ (function() {
66
+ var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
67
+ ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
68
+ var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
69
+ })();
70
+ </script>
71
+ JAVASCRIPT
72
+
73
+ def test_local_analytics_init
74
+ assert_equal(VALID_LOCAL_INIT, analytics_init(:local => true))
75
+ end
76
+
77
+ VALID_EVENT_INIT = <<-JAVASCRIPT
78
+ <script type="text/javascript">
79
+ var _gaq = _gaq || [];
80
+ _gaq.push(['_setAccount','TEST']);
81
+ _gaq.push(['_trackPageview']);
82
+ _gaq.push(['_setAllowLinker',true]);
83
+ (function() {
84
+ var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
85
+ ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
86
+ var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
87
+ })();
88
+ </script>
89
+ JAVASCRIPT
90
+
91
+ def test_analytics_init_with_events
92
+ assert_equal(VALID_EVENT_INIT, analytics_init(:add_events => GA::Events::SetAllowLinker.new(true)))
93
+ end
94
+
95
+ VALID_TRACK_EVENT = "_gaq.push(['_trackEvent','Videos','Play','Gone With the Wind',null]);"
96
+
97
+ def test_analytics_track_event
98
+ event = analytics_track_event("Videos", "Play", "Gone With the Wind")
99
+ assert_equal(VALID_TRACK_EVENT, event)
100
+ end
101
+ end
@@ -0,0 +1,5 @@
1
+ require "rubygems"
2
+ require "google-analytics-rails"
3
+ require "test/unit"
4
+
5
+ GA.tracker = "TEST"
metadata ADDED
@@ -0,0 +1,110 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: google-analytics-rails
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Benoit Garret
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2012-01-09 00:00:00.000000000Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: yard
16
+ requirement: &80528650 !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: '0'
22
+ type: :development
23
+ prerelease: false
24
+ version_requirements: *80528650
25
+ - !ruby/object:Gem::Dependency
26
+ name: redcarpet
27
+ requirement: &80528440 !ruby/object:Gem::Requirement
28
+ none: false
29
+ requirements:
30
+ - - ! '>='
31
+ - !ruby/object:Gem::Version
32
+ version: '0'
33
+ type: :development
34
+ prerelease: false
35
+ version_requirements: *80528440
36
+ - !ruby/object:Gem::Dependency
37
+ name: activesupport
38
+ requirement: &80528190 !ruby/object:Gem::Requirement
39
+ none: false
40
+ requirements:
41
+ - - ~>
42
+ - !ruby/object:Gem::Version
43
+ version: '3.0'
44
+ type: :development
45
+ prerelease: false
46
+ version_requirements: *80528190
47
+ description: Rails helpers to manage google analytics tracking
48
+ email:
49
+ - benoit.garret@gadz.org
50
+ executables: []
51
+ extensions: []
52
+ extra_rdoc_files: []
53
+ files:
54
+ - .gitignore
55
+ - .yardopts
56
+ - Gemfile
57
+ - README.markdown
58
+ - Rakefile
59
+ - google-analytics-rails.gemspec
60
+ - lib/google-analytics-rails.rb
61
+ - lib/google-analytics/async_tracking_queue.rb
62
+ - lib/google-analytics/events.rb
63
+ - lib/google-analytics/events/event.rb
64
+ - lib/google-analytics/events/event_collection.rb
65
+ - lib/google-analytics/events/event_collection_renderer.rb
66
+ - lib/google-analytics/events/event_renderer.rb
67
+ - lib/google-analytics/events/events.rb
68
+ - lib/google-analytics/rails/railtie.rb
69
+ - lib/google-analytics/rails/view_helpers.rb
70
+ - lib/google-analytics/version.rb
71
+ - test/async_tracking_queue_test.rb
72
+ - test/event_collection_renderer_test.rb
73
+ - test/event_collection_test.rb
74
+ - test/event_renderer_test.rb
75
+ - test/gaq_events_test.rb
76
+ - test/rails/views_helper_test.rb
77
+ - test/test_helper.rb
78
+ homepage: https://github.com/bgarret/google-analytics-rails
79
+ licenses: []
80
+ post_install_message:
81
+ rdoc_options: []
82
+ require_paths:
83
+ - lib
84
+ required_ruby_version: !ruby/object:Gem::Requirement
85
+ none: false
86
+ requirements:
87
+ - - ! '>='
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ required_rubygems_version: !ruby/object:Gem::Requirement
91
+ none: false
92
+ requirements:
93
+ - - ! '>='
94
+ - !ruby/object:Gem::Version
95
+ version: '0'
96
+ requirements: []
97
+ rubyforge_project: google-analytics-rails
98
+ rubygems_version: 1.8.10
99
+ signing_key:
100
+ specification_version: 3
101
+ summary: Rails helpers to manage google analytics tracking
102
+ test_files:
103
+ - test/async_tracking_queue_test.rb
104
+ - test/event_collection_renderer_test.rb
105
+ - test/event_collection_test.rb
106
+ - test/event_renderer_test.rb
107
+ - test/gaq_events_test.rb
108
+ - test/rails/views_helper_test.rb
109
+ - test/test_helper.rb
110
+ has_rdoc: