rack-google-analytics 0.11.0 → 0.12.0
Sign up to get free protection for your applications and to get access to all the features.
- data/README.md +38 -0
- data/lib/google-analytics/instance_methods.rb +54 -0
- data/lib/rack-google-analytics.rb +10 -0
- data/lib/rack/google-analytics.rb +19 -1
- data/lib/rack/google-analytics/version.rb +1 -1
- data/lib/rack/templates/async.erb +14 -1
- data/lib/rack/templates/sync.erb +3 -0
- data/lib/rack/version.rb +1 -1
- data/lib/tracking/custom_var.rb +14 -0
- data/lib/tracking/event.rb +13 -0
- data/lib/tracking/push.rb +14 -0
- metadata +45 -3
data/README.md
CHANGED
@@ -34,11 +34,20 @@ config.gem 'rack-google-analytics', :lib => 'rack/google-analytics'
|
|
34
34
|
config.middleware.use Rack::GoogleAnalytics, :tracker => 'UA-xxxxxx-x'
|
35
35
|
```
|
36
36
|
|
37
|
+
#### Rails 3.X
|
38
|
+
|
39
|
+
```ruby
|
40
|
+
## application.rb:
|
41
|
+
config.middleware.use Rack::GoogleAnalytics, :tracker => 'UA-xxxxxx-x'
|
42
|
+
```
|
43
|
+
|
37
44
|
### Options
|
38
45
|
|
39
46
|
* `:async` - sets to use asynchronous tracker
|
40
47
|
* `:multiple` - sets track for multiple subdomains. (must also set :domain)
|
41
48
|
* `:top_level` - sets tracker for multiple top-level domains. (must also set :domain)
|
49
|
+
* `:anonymize_ip` - sets the tracker to remove the last octet from all IP addresses, see https://developers.google.com/analytics/devguides/collection/gajs/methods/gaJSApi_gat?hl=de#_gat._anonymizeIp for details.
|
50
|
+
* `:site_speed_sample_rate` - Defines a new sample set size for Site Speed data collection, see https://developers.google.com/analytics/devguides/collection/gajs/methods/gaJSApiBasicConfiguration?hl=de#_gat.GA_Tracker_._setSiteSpeedSampleRate
|
42
51
|
|
43
52
|
Note: since 0.2.0 this will use the asynchronous Google Analytics tracking code, for the traditional behaviour please use:
|
44
53
|
|
@@ -48,6 +57,35 @@ use Rack::GoogleAnalytics, :tracker => 'UA-xxxxxx-x', :async => false
|
|
48
57
|
|
49
58
|
If you are not sure what's best, go with the defaults, and read here if you should opt-out.
|
50
59
|
|
60
|
+
## Custom Variable Tracking
|
61
|
+
|
62
|
+
In your application controller, you may track a custom variable. For example:
|
63
|
+
|
64
|
+
```ruby
|
65
|
+
set_ga_custom_var(1, "LoggedIn", value, GoogleAnalytics::CustomVar::SESSION_LEVEL)
|
66
|
+
```
|
67
|
+
|
68
|
+
See https://developers.google.com/analytics/devguides/collection/gajs/gaTrackingCustomVariables for details.
|
69
|
+
|
70
|
+
## Event Tracking
|
71
|
+
|
72
|
+
In your application controller, you may track an event. For example:
|
73
|
+
|
74
|
+
```ruby
|
75
|
+
track_ga_event("Users", "Login", "Standard")
|
76
|
+
```
|
77
|
+
|
78
|
+
See https://developers.google.com/analytics/devguides/collection/gajs/eventTrackerGuide
|
79
|
+
|
80
|
+
## Custom Push
|
81
|
+
|
82
|
+
In your application controller, you may push arbritrary data. For example:
|
83
|
+
|
84
|
+
```ruby
|
85
|
+
ga_push("_addItem", "ID", "SKU")
|
86
|
+
```
|
87
|
+
|
88
|
+
|
51
89
|
## Thread Safety
|
52
90
|
|
53
91
|
This middleware *should* be thread safe. Although my experience in such areas is limited, having taken the advice of those with more experience; I defer the call to a shallow copy of the environment, if this is of consequence to you please review the implementation.
|
@@ -0,0 +1,54 @@
|
|
1
|
+
# This module holds all instance methods to be
|
2
|
+
# included into ActionController::Base class
|
3
|
+
# for enabling google analytics var tracking in a Rails app.
|
4
|
+
#
|
5
|
+
require "erb"
|
6
|
+
|
7
|
+
module GoogleAnalytics
|
8
|
+
module InstanceMethods
|
9
|
+
|
10
|
+
private
|
11
|
+
|
12
|
+
def ga_custom_vars
|
13
|
+
self.env["google_analytics.custom_vars"] ||= []
|
14
|
+
end
|
15
|
+
|
16
|
+
def ga_events
|
17
|
+
self.env["google_analytics.event_tracking"] ||= []
|
18
|
+
end
|
19
|
+
|
20
|
+
protected
|
21
|
+
|
22
|
+
# Sets a custom variable on a page load
|
23
|
+
#
|
24
|
+
# e.g. writes
|
25
|
+
# _gaq.push(['_setCustomVar',
|
26
|
+
# 2, // This custom var is set to slot #2. Required parameter.
|
27
|
+
# 'Shopping Attempts', // The name of the custom variable. Required parameter.
|
28
|
+
# 'Yes', // The value of the custom variable. Required parameter.
|
29
|
+
# // (you might set this value by default to No)
|
30
|
+
# 2 // Sets the scope to session-level. Optional parameter.
|
31
|
+
# ]);
|
32
|
+
def set_ga_custom_var(slot, name, value, scope = nil)
|
33
|
+
var = GoogleAnalytics::CustomVar.new(slot, name, value, scope)
|
34
|
+
|
35
|
+
ga_custom_vars.push(var)
|
36
|
+
end
|
37
|
+
|
38
|
+
# Tracks an event or goal on a page load
|
39
|
+
#
|
40
|
+
# e.g. writes
|
41
|
+
# _gaq.push(['_trackEvent', 'Videos', 'Play', 'Gone With the Wind']);
|
42
|
+
#
|
43
|
+
def track_ga_event(category, action, label = nil, value = nil, noninteraction = nil)
|
44
|
+
var = GoogleAnalytics::Event.new(category, action, label, value, noninteraction)
|
45
|
+
ga_events.push(var)
|
46
|
+
end
|
47
|
+
|
48
|
+
def ga_push(*attributes)
|
49
|
+
var = GoogleAnalytics::Push.new(attributes)
|
50
|
+
ga_events.push(var)
|
51
|
+
end
|
52
|
+
|
53
|
+
end
|
54
|
+
end
|
@@ -1 +1,11 @@
|
|
1
|
+
require "active_support/json"
|
2
|
+
|
1
3
|
require 'rack/google-analytics'
|
4
|
+
|
5
|
+
require "tracking/custom_var"
|
6
|
+
require "tracking/event"
|
7
|
+
require "tracking/push"
|
8
|
+
|
9
|
+
require "google-analytics/instance_methods"
|
10
|
+
|
11
|
+
ActionController::Base.send(:include, GoogleAnalytics::InstanceMethods) if defined?(ActionController::Base)
|
@@ -5,6 +5,8 @@ module Rack
|
|
5
5
|
|
6
6
|
class GoogleAnalytics
|
7
7
|
|
8
|
+
EVENT_TRACKING_KEY = "google_analytics.event_tracking"
|
9
|
+
|
8
10
|
DEFAULT = { :async => true }
|
9
11
|
|
10
12
|
def initialize(app, options = {})
|
@@ -18,9 +20,24 @@ module Rack
|
|
18
20
|
@status, @headers, @body = @app.call(env)
|
19
21
|
return [@status, @headers, @body] unless html?
|
20
22
|
response = Rack::Response.new([], @status, @headers)
|
23
|
+
@options[:tracker_vars] = env["google_analytics.custom_vars"] || []
|
24
|
+
|
25
|
+
if response.ok?
|
26
|
+
# Write out the events now
|
27
|
+
@options[:tracker_vars] += (env[EVENT_TRACKING_KEY]) unless env[EVENT_TRACKING_KEY].nil?
|
28
|
+
|
29
|
+
# Get any stored events from a redirection
|
30
|
+
session = env["rack.session"]
|
31
|
+
stored_events = session.delete(EVENT_TRACKING_KEY) if session
|
32
|
+
@options[:tracker_vars] += stored_events unless stored_events.nil?
|
33
|
+
elsif response.redirection?
|
34
|
+
# Store the events until next time
|
35
|
+
env["rack.session"][EVENT_TRACKING_KEY] = env[EVENT_TRACKING_KEY]
|
36
|
+
end
|
37
|
+
|
21
38
|
@body.each { |fragment| response.write inject(fragment) }
|
22
39
|
@body.close if @body.respond_to?(:close)
|
23
|
-
|
40
|
+
|
24
41
|
response.finish
|
25
42
|
end
|
26
43
|
|
@@ -30,6 +47,7 @@ module Rack
|
|
30
47
|
|
31
48
|
def inject(response)
|
32
49
|
file = @options[:async] ? 'async' : 'sync'
|
50
|
+
|
33
51
|
@template ||= ::ERB.new ::File.read ::File.expand_path("../templates/#{file}.erb",__FILE__)
|
34
52
|
if @options[:async]
|
35
53
|
response.gsub(%r{</head>}, @template.result(binding) + "</head>")
|
@@ -9,8 +9,21 @@
|
|
9
9
|
_gaq.push(['_setDomainName', 'none']);
|
10
10
|
_gaq.push(['_setAllowLinker', true]);
|
11
11
|
<% end %>
|
12
|
+
<% if @options[:anonymize_ip] %>
|
13
|
+
_gaq.push(['_gat._anonymizeIp']);
|
14
|
+
<% end %>
|
15
|
+
<% if @options[:site_speed_sample_rate] %>
|
16
|
+
_gaq.push(['_setSiteSpeedSampleRate', <%= @options[:site_speed_sample_rate].to_i %>]);
|
17
|
+
<% end %>
|
18
|
+
|
19
|
+
<% if @options[:tracker_vars]
|
20
|
+
@options[:tracker_vars].each do |var|
|
21
|
+
%>
|
22
|
+
_gaq.push(<%= var.write() %>);
|
23
|
+
<% end
|
24
|
+
end
|
25
|
+
%>
|
12
26
|
_gaq.push(['_trackPageview']);
|
13
|
-
_gaq.push(['_trackPageLoadTime']);
|
14
27
|
|
15
28
|
(function() {
|
16
29
|
var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
|
data/lib/rack/templates/sync.erb
CHANGED
@@ -5,5 +5,8 @@ document.write(unescape("%3Cscript src='" + gaJsHost + "google-analytics.com/ga.
|
|
5
5
|
<script type="text/javascript">
|
6
6
|
try{
|
7
7
|
var pageTracker = _gat._getTracker(<%= @options[:tracker].inspect %>);
|
8
|
+
<% if @options[:anonymize_ip] %>
|
9
|
+
_gat._anonymizeIp();
|
10
|
+
<% end %>
|
8
11
|
pageTracker._trackPageview();
|
9
12
|
} catch(err) {}</script>
|
data/lib/rack/version.rb
CHANGED
@@ -0,0 +1,14 @@
|
|
1
|
+
module GoogleAnalytics
|
2
|
+
|
3
|
+
# A Struct that mirrors the structure of a custom var defined in Google Analytics
|
4
|
+
# see https://developers.google.com/analytics/devguides/collection/gajs/gaTrackingCustomVariables
|
5
|
+
class CustomVar < Struct.new(:index, :name, :value, :opt_scope)
|
6
|
+
VISITOR_LEVEL = 1
|
7
|
+
SESSION_LEVEL = 2
|
8
|
+
PAGE_LEVEL = 3
|
9
|
+
|
10
|
+
def write
|
11
|
+
['_setCustomVar', self.index, self.name, self.value,self.opt_scope].to_json
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
require "active_support/json"
|
2
|
+
|
3
|
+
module GoogleAnalytics
|
4
|
+
|
5
|
+
# A Struct that mirrors the structure of a custom var defined in Google Analytics
|
6
|
+
# see https://developers.google.com/analytics/devguides/collection/gajs/eventTrackerGuide
|
7
|
+
class Event < Struct.new(:category, :action, :label, :value, :noninteraction)
|
8
|
+
|
9
|
+
def write
|
10
|
+
['_trackEvent', self.category, self.action, self.label,self.value, self.noninteraction].to_json
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rack-google-analytics
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.12.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2013-08-09 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: bundler
|
@@ -27,6 +27,38 @@ dependencies:
|
|
27
27
|
- - ! '>='
|
28
28
|
- !ruby/object:Gem::Version
|
29
29
|
version: '0'
|
30
|
+
- !ruby/object:Gem::Dependency
|
31
|
+
name: actionpack
|
32
|
+
requirement: !ruby/object:Gem::Requirement
|
33
|
+
none: false
|
34
|
+
requirements:
|
35
|
+
- - ! '>='
|
36
|
+
- !ruby/object:Gem::Version
|
37
|
+
version: '0'
|
38
|
+
type: :development
|
39
|
+
prerelease: false
|
40
|
+
version_requirements: !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - ! '>='
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: '0'
|
46
|
+
- !ruby/object:Gem::Dependency
|
47
|
+
name: activesupport
|
48
|
+
requirement: !ruby/object:Gem::Requirement
|
49
|
+
none: false
|
50
|
+
requirements:
|
51
|
+
- - ! '>='
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
version: '0'
|
54
|
+
type: :development
|
55
|
+
prerelease: false
|
56
|
+
version_requirements: !ruby/object:Gem::Requirement
|
57
|
+
none: false
|
58
|
+
requirements:
|
59
|
+
- - ! '>='
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
30
62
|
- !ruby/object:Gem::Dependency
|
31
63
|
name: test-unit
|
32
64
|
requirement: !ruby/object:Gem::Requirement
|
@@ -100,12 +132,16 @@ executables: []
|
|
100
132
|
extensions: []
|
101
133
|
extra_rdoc_files: []
|
102
134
|
files:
|
135
|
+
- lib/google-analytics/instance_methods.rb
|
103
136
|
- lib/rack/google-analytics/version.rb
|
104
137
|
- lib/rack/google-analytics.rb
|
105
138
|
- lib/rack/templates/async.erb
|
106
139
|
- lib/rack/templates/sync.erb
|
107
140
|
- lib/rack/version.rb
|
108
141
|
- lib/rack-google-analytics.rb
|
142
|
+
- lib/tracking/custom_var.rb
|
143
|
+
- lib/tracking/event.rb
|
144
|
+
- lib/tracking/push.rb
|
109
145
|
- README.md
|
110
146
|
- LICENSE
|
111
147
|
homepage: https://github.com/leehambley/rack-google-analytics
|
@@ -120,15 +156,21 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
120
156
|
- - ! '>='
|
121
157
|
- !ruby/object:Gem::Version
|
122
158
|
version: '0'
|
159
|
+
segments:
|
160
|
+
- 0
|
161
|
+
hash: 4292920950575174798
|
123
162
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
124
163
|
none: false
|
125
164
|
requirements:
|
126
165
|
- - ! '>='
|
127
166
|
- !ruby/object:Gem::Version
|
128
167
|
version: '0'
|
168
|
+
segments:
|
169
|
+
- 0
|
170
|
+
hash: 4292920950575174798
|
129
171
|
requirements: []
|
130
172
|
rubyforge_project:
|
131
|
-
rubygems_version: 1.8.
|
173
|
+
rubygems_version: 1.8.25
|
132
174
|
signing_key:
|
133
175
|
specification_version: 3
|
134
176
|
summary: Rack middleware to inject the Google Analytics tracking code into outgoing
|