rack-google-analytics 0.14.0 → 1.0.0.pre1

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.
checksums.yaml CHANGED
@@ -1,15 +1,15 @@
1
1
  ---
2
2
  !binary "U0hBMQ==":
3
3
  metadata.gz: !binary |-
4
- OTVmMWNmY2UxNjEzMzhiOTEyMjY1NzA1NWY2MDg4MjdjZDhlNDM0Mg==
4
+ OTMwMGRkYjg3MzcwMTFmZGRiZmJlMjMyZTM4OTdjNGE5N2UzOGRhZQ==
5
5
  data.tar.gz: !binary |-
6
- ZTlhZmVkNGJmNWMyZjc5ODMwNzkyN2JlODc3NDdhYzMwOGU4NDlmOQ==
6
+ ZGZmMjU0YTg5MjFiM2Q1MWRmZjkxZjYwYmVkNTg5ZmE5YmMzOTQ0Mg==
7
7
  SHA512:
8
8
  metadata.gz: !binary |-
9
- NDdiNDFmMTg5NDYxZjY0YzU0OTczMDZiMGNlOWJhYjI0OGE3ZWY4ZjYzOTc2
10
- NjIwYTdmODIzZjcyOWVhN2ViZDdjOGM2NmVkMzlkYjIzZjYxZDNhN2Q2ZjE4
11
- ZTgyYzRkZDljODg5MGViNjdiMGJiYWE4ODcwNDg5ZDdlNTY4MmM=
9
+ NjEyMjI2YjMxYTdiMTZmNGQ3ODdlZTQ2YjU0OGFmMmNmNTEwZGM1MjZiY2Zj
10
+ YTYwM2E0MTg0MGRjYWVjMDU3OWM3NDFkYzRjMTc1NDEzMmE3NTBmNGJmZDBl
11
+ ZjVmMzFlMzBkNTRjM2ZkNzZhMjFkZGY2ZWVlZWM3YmRkNzZiM2U=
12
12
  data.tar.gz: !binary |-
13
- NzllNjIxZTEyNmE3OTYyNjBiMmYyZDc0MjMwOTQzMzZjMmI4OGI2ZDdjMmFi
14
- OGUyM2JjZjE4N2UxNjUzNzExNjZkOGQzNGQ3N2MwOWJlZTA1MjZlOGVhODQz
15
- M2JhZmQ0ZTI4NDAzMmI2Mjg0Y2RiNTI5MTJmMzc5OWQ1NDkzNWM=
13
+ YmFhNjg0YTA1YTk5YjQ0MDFlZGZjZDQ4NmJlNTNjMDhhMDBhODljMmMwZjlm
14
+ MDhhM2M3YjU2ODJmMDI5ZTYzMDNkNjBmNGY0NzYwMzFkYmM3YWNjN2Q3OGEw
15
+ ZTMxZmVhZGY5NzBlMmY5ZDg5YWMxMzRhOGM0ZDk5YmQxMjdmMDI=
data/README.md CHANGED
@@ -1,10 +1,10 @@
1
1
  # Rack google Analytics
2
2
 
3
- [![Build Status](https://travis-ci.org/kangguru/rack-google-analytics.png?branch=master)](https://travis-ci.org/kangguru/rack-google-analytics)
3
+ [![Build Status](https://travis-ci.org/kangguru/rack-google-analytics.png?branch=analytics-js)](https://travis-ci.org/kangguru/rack-google-analytics)
4
4
 
5
5
  Simple Rack middleware to help injecting the Google Analytics tracking code in your website.
6
6
 
7
- This middleware injects either the synchronous or asynchronous Google Analytics tracking code into the correct place of any request only when the response's `Content-Type` header contains `html` (therefore `text/html` and similar).
7
+ This middleware injects the Google Analytics tracking code into the correct place of any request only when the response's `Content-Type` header contains `html` (therefore `text/html` and similar).
8
8
 
9
9
  ## Usage
10
10
 
@@ -28,15 +28,7 @@ use Rack::GoogleAnalytics, :tracker => 'UA-xxxxxx-x'
28
28
  use Rack::GoogleAnalytics, :tracker => 'UA-xxxxxx-x'
29
29
  ```
30
30
 
31
- #### Rails 2.X
32
-
33
- ```ruby
34
- ## environment.rb:
35
- config.gem 'rack-google-analytics', :lib => 'rack/google-analytics'
36
- config.middleware.use Rack::GoogleAnalytics, :tracker => 'UA-xxxxxx-x'
37
- ```
38
-
39
- #### Rails 3.X and 4.X
31
+ #### Rails 3.X and Rails 4.X
40
32
 
41
33
  ```ruby
42
34
  ## application.rb:
@@ -45,42 +37,23 @@ config.middleware.use Rack::GoogleAnalytics, :tracker => 'UA-xxxxxx-x'
45
37
 
46
38
  ### Options
47
39
 
48
- * `:async` - sets to use asynchronous tracker
49
- * `:multiple` - sets track for multiple subdomains. (must also set :domain)
50
- * `:domain` - sets the domain name for the GATC cookies. Defaults to `auto`. (must also set :multiple)
51
- * `:top_level` - sets tracker for multiple top-level domains. (must also set :domain)
52
40
  * `: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.
41
+ * `:domain` - sets the domain name for the GATC cookies. Defaults to `auto`. (must also set :multiple)
53
42
  * `: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
54
- * `:adjusted_bounce_rate_timeouts` - An array of times in seconds that the tracker will use to set
55
- timeouts for adjusted bounce rate tracking. See http://analytics.blogspot.ca/2012/07/tracking-adjusted-bounce-rate-in-google.html for details.
56
-
57
- Note: since 0.2.0 this will use the asynchronous Google Analytics tracking code, for the traditional behaviour please use:
58
-
59
- ```ruby
60
- use Rack::GoogleAnalytics, :tracker => 'UA-xxxxxx-x', :async => false
61
- ```
43
+ * `:enhanced_link_attribution` - Enable enhanced link attribution, see https://support.google.com/analytics/answer/2558867?hl=en
44
+ * `:adjusted_bounce_rate_timeouts` - An array of times in seconds that the tracker will use to set timeouts for adjusted bounce rate tracking. See http://analytics.blogspot.ca/2012/07/tracking-adjusted-bounce-rate-in-google.html for details.
62
45
 
63
46
  If you are not sure what's best, go with the defaults, and read here if you should opt-out.
64
47
 
65
- ## Custom Variable Tracking
66
-
67
- In your application controller, you may track a custom variable. For example:
68
-
69
- ```ruby
70
- set_ga_custom_var(1, "LoggedIn", value, GoogleAnalytics::CustomVar::SESSION_LEVEL)
71
- ```
72
-
73
- See https://developers.google.com/analytics/devguides/collection/gajs/gaTrackingCustomVariables for details.
74
-
75
48
  ## Event Tracking
76
49
 
77
50
  In your application controller, you may track an event. For example:
78
51
 
79
52
  ```ruby
80
- track_ga_event("Users", "Login", "Standard")
53
+ ga_track_event("Users", "Login", "Standard")
81
54
  ```
82
55
 
83
- See https://developers.google.com/analytics/devguides/collection/gajs/eventTrackerGuide
56
+ See https://developers.google.com/analytics/devguides/collection/analyticsjs/events
84
57
 
85
58
  ## Custom Push
86
59
 
@@ -101,6 +74,12 @@ config.middleware.use Rack::GoogleAnalytics, :tracker => lambda { |env|
101
74
  }
102
75
  ```
103
76
 
77
+ ## Special use case: Event tracking only
78
+
79
+ If you already set up your Google Analytics `analytics.js` tracker object with pageview tracking in your templates/frontend (inside the `<head>`), the only thing you might want to use the `rack-google-analytics` middleware for is to track server-side events which you can't properly track in the forntend. In that case simply use the middleware without specifying the `:tracker` option, then it will only render the event tracking code (`ga('send', hitType: 'event', ..)`) and nothing else.
80
+
81
+ config.middleware.use Rack::GoogleAnalytics
82
+
104
83
 
105
84
  ## Thread Safety
106
85
 
@@ -19,30 +19,13 @@ module GoogleAnalytics
19
19
 
20
20
  protected
21
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
22
  # Tracks an event or goal on a page load
39
23
  #
40
24
  # e.g. writes
41
- # _gaq.push(['_trackEvent', 'Videos', 'Play', 'Gone With the Wind']);
25
+ # ga.('send', 'event', 'Videos', 'Play', 'Gone With the Wind');
42
26
  #
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)
27
+ def ga_track_event(category, action, label = nil, value = nil)
28
+ ga_events.push(GoogleAnalytics::Event.new(category, action, label, value))
46
29
  end
47
30
 
48
31
  def ga_push(*attributes)
@@ -1,8 +1,8 @@
1
1
  require "active_support/json"
2
+ require "active_support/ordered_hash"
2
3
 
3
4
  require 'rack/google-analytics'
4
5
 
5
- require "tracking/custom_var"
6
6
  require "tracking/event"
7
7
  require "tracking/push"
8
8
 
@@ -6,11 +6,9 @@ module Rack
6
6
  class GoogleAnalytics
7
7
 
8
8
  EVENT_TRACKING_KEY = "google_analytics.event_tracking"
9
-
10
- DEFAULT = { :async => true, :advertising => false, :inpage_pageid => false }
9
+ DEFAULT = { async: true, enhanced_link_attribution: false }
11
10
 
12
11
  def initialize(app, options = {})
13
- raise ArgumentError, "Tracker must be set!" unless valid_tracker?(options[:tracker])
14
12
  @app, @options = app, DEFAULT.merge(options)
15
13
  end
16
14
 
@@ -34,7 +32,8 @@ module Rack
34
32
  # Store the events until next time
35
33
  env["rack.session"][EVENT_TRACKING_KEY] = env[EVENT_TRACKING_KEY]
36
34
  end
37
- @tracker = tracker(env, @options[:tracker])
35
+
36
+ @options[:tracker] = expand_tracker(env, @options[:tracker])
38
37
 
39
38
  @body.each { |fragment| response.write inject(fragment) }
40
39
  @body.close if @body.respond_to?(:close)
@@ -44,29 +43,17 @@ module Rack
44
43
 
45
44
  private
46
45
 
47
- # tracker should be non-nil, non-empty string or a lambda
48
- def valid_tracker?(tracker)
49
- return false unless tracker
50
- return (tracker.respond_to?(:call) && tracker.lambda?) || !tracker.empty?
51
- end
52
-
53
46
  def html?; @headers['Content-Type'] =~ /html/; end
54
47
 
55
48
  def inject(response)
56
- file = @options[:async] ? 'async' : 'sync'
49
+ @tracker_options = { cookieDomain: @options[:domain] }.select{|k,v| v }.to_json
50
+ @template ||= ::ERB.new ::File.read ::File.expand_path("../templates/async.erb",__FILE__)
57
51
 
58
- @template ||= ::ERB.new ::File.read ::File.expand_path("../templates/#{file}.erb",__FILE__)
59
- if @options[:async]
60
- response.gsub(%r{</head>}, @template.result(binding) + "</head>")
61
- else
62
- response.gsub(%r{</body>}, @template.result(binding) + "</body>")
63
- end
52
+ response.gsub(%r{</head>}, @template.result(binding) + "</head>")
64
53
  end
65
54
 
66
- # obtain tracking code dynamically if it's a lambda, use the string directly otherwise
67
- def tracker(env, tracker)
68
- return tracker unless tracker.respond_to?(:call)
69
- return tracker.call(env)
55
+ def expand_tracker(env, tracker)
56
+ tracker.respond_to?(:call) ? tracker.call(env) : tracker
70
57
  end
71
58
 
72
59
  end
@@ -1,5 +1,5 @@
1
1
  module Rack
2
2
  class GoogleAnalytics
3
- VERSION = '0.14.0'
3
+ VERSION = '1.0.0.pre1'
4
4
  end
5
5
  end
@@ -1,46 +1,38 @@
1
1
  <script type="text/javascript">
2
2
 
3
- var _gaq = _gaq || [];
4
- <% if @options[:inpage_pageid] %>
5
- var pluginUrl = '//www.google-analytics.com/plugins/ga/inpage_linkid.js';
6
- _gaq.push(['_require', 'inpage_linkid', pluginUrl]);
3
+ <% if @options[:tracker] %>
4
+ (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
5
+ (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
6
+ m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
7
+ })(window,document,'script','//www.google-analytics.com/analytics.js','ga');
8
+
9
+ ga('create', '<%= @options[:tracker] %>', <%= @tracker_options %>);
10
+
11
+ <% if @options[:enhanced_link_attribution] %>
12
+ ga('require', 'linkid', 'linkid.js');
7
13
  <% end %>
8
- _gaq.push(['_setAccount', <%= @tracker.inspect %>]);
9
- <% if @options[:multiple] %>
10
- _gaq.push(['_setDomainName', <%= @options[:domain].inspect %>]);
14
+
15
+ <% if @options[:anonymize_ip] %>
16
+ ga('set', 'anonymizeIp', true);
11
17
  <% end %>
12
- <% if @options[:top_level] %>
13
- _gaq.push(['_setDomainName', 'none']);
14
- _gaq.push(['_setAllowLinker', true]);
18
+
19
+ <% if @options[:adjusted_bounce_rate_timeouts] %>
20
+ <% @options[:adjusted_bounce_rate_timeouts].each do |timeout| %>
21
+ setTimeout(ga('send', 'event', '<%= "#{timeout.to_s}_seconds" %>', 'read'),<%= timeout*1000 %>);
15
22
  <% end %>
16
- <% if @options[:anonymize_ip] %>
17
- _gaq.push(['_gat._anonymizeIp']);
18
23
  <% end %>
19
- <% if @options[:site_speed_sample_rate] %>
20
- _gaq.push(['_setSiteSpeedSampleRate', <%= @options[:site_speed_sample_rate].to_i %>]);
24
+
21
25
  <% end %>
22
26
 
23
27
  <% if @options[:tracker_vars]
24
28
  @options[:tracker_vars].each do |var|
25
29
  %>
26
- _gaq.push(<%= var.write() %>);
30
+ ga('send', <%= var.write() %>);
27
31
  <% end
28
32
  end
29
33
  %>
30
- <% if @options[:adjusted_bounce_rate_timeouts] %>
31
- <% @options[:adjusted_bounce_rate_timeouts].each do |timeout| %>
32
- setTimeout("_gaq.push(['_trackEvent', <%= "#{timeout.to_s}_seconds" %>, 'read'])",<%= timeout*1000 %>);
34
+ <% if @options[:tracker] %>
35
+ ga('send', 'pageview');
33
36
  <% end %>
34
- <% end %>
35
- _gaq.push(['_trackPageview']);
36
-
37
- (function() {
38
- var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
39
- <% if @options[:advertising] %>
40
- ga.src = ('https:' == document.location.protocol ? 'https://' : 'http://') + 'stats.g.doubleclick.net/dc.js';
41
- <% else %>
42
- ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
43
- <% end %>
44
- var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
45
- })();
37
+
46
38
  </script>
@@ -1,13 +1,15 @@
1
1
  require "active_support/json"
2
+ require "active_support/ordered_hash"
2
3
 
3
4
  module GoogleAnalytics
4
5
 
5
6
  # A Struct that mirrors the structure of a custom var defined in Google Analytics
6
7
  # see https://developers.google.com/analytics/devguides/collection/gajs/eventTrackerGuide
7
- class Event < Struct.new(:category, :action, :label, :value, :noninteraction)
8
+ class Event < Struct.new(:category, :action, :label, :value)
8
9
 
9
10
  def write
10
- ['_trackEvent', self.category, self.action, self.label,self.value, self.noninteraction].to_json
11
+ { hitType: 'event', eventCategory: self.category, eventAction: self.action, eventLabel: self.label, eventValue: self.value }.select{|k,v| v }.to_json
11
12
  end
13
+
12
14
  end
13
15
  end
metadata CHANGED
@@ -1,10 +1,11 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rack-google-analytics
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.14.0
4
+ version: 1.0.0.pre1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Lee Hambley
8
+ - Lars Brillert
8
9
  autorequire:
9
10
  bindir: bin
10
11
  cert_chain: []
@@ -113,6 +114,7 @@ description: Simple Rack middleware for implementing google analytics tracking i
113
114
  configurable load options.
114
115
  email:
115
116
  - lee.hambley@gmail.com
117
+ - lars@railslove.com
116
118
  executables: []
117
119
  extensions: []
118
120
  extra_rdoc_files: []
@@ -121,14 +123,12 @@ files:
121
123
  - lib/rack/google-analytics/version.rb
122
124
  - lib/rack/google-analytics.rb
123
125
  - lib/rack/templates/async.erb
124
- - lib/rack/templates/sync.erb
125
126
  - lib/rack-google-analytics.rb
126
- - lib/tracking/custom_var.rb
127
127
  - lib/tracking/event.rb
128
128
  - lib/tracking/push.rb
129
129
  - README.md
130
130
  - LICENSE
131
- homepage: https://github.com/leehambley/rack-google-analytics
131
+ homepage: https://github.com/kangguru/rack-google-analytics
132
132
  licenses:
133
133
  - MIT
134
134
  metadata: {}
@@ -143,9 +143,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
143
143
  version: '0'
144
144
  required_rubygems_version: !ruby/object:Gem::Requirement
145
145
  requirements:
146
- - - ! '>='
146
+ - - ! '>'
147
147
  - !ruby/object:Gem::Version
148
- version: '0'
148
+ version: 1.3.1
149
149
  requirements: []
150
150
  rubyforge_project:
151
151
  rubygems_version: 2.1.5
@@ -1,12 +0,0 @@
1
- <script type="text/javascript">
2
- var gaJsHost = (("https:" == document.location.protocol) ? "https://ssl." : "http://www.");
3
- document.write(unescape("%3Cscript src='" + gaJsHost + "google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E"));
4
- </script>
5
- <script type="text/javascript">
6
- try{
7
- var pageTracker = _gat._getTracker(<%= @tracker.inspect %>);
8
- <% if @options[:anonymize_ip] %>
9
- _gat._anonymizeIp();
10
- <% end %>
11
- pageTracker._trackPageview();
12
- } catch(err) {}</script>
@@ -1,14 +0,0 @@
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