garails 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.
- data/Gemfile +5 -0
- data/Gemfile.lock +20 -0
- data/README.rdoc +45 -0
- data/Rakefile +23 -0
- data/app/controllers/garails/google_analytics_controller.rb +43 -0
- data/app/helpers/garails/javascript_helper.rb +6 -0
- data/app/helpers/garails/mobile_helper.rb +19 -0
- data/app/views/garails/google_analytics.html.erb +15 -0
- data/config/initializers/mime_types.rb +1 -0
- data/config/routes.rb +3 -0
- data/garails.gemspec +21 -0
- data/lib/garails/engine.rb +9 -0
- data/lib/garails/version.rb +3 -0
- data/lib/garails.rb +38 -0
- metadata +95 -0
data/Gemfile
ADDED
data/Gemfile.lock
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
PATH
|
|
2
|
+
remote: .
|
|
3
|
+
specs:
|
|
4
|
+
garails (0.0.1)
|
|
5
|
+
gabbara (~> 0.0.2)
|
|
6
|
+
|
|
7
|
+
GEM
|
|
8
|
+
remote: http://rubygems.org/
|
|
9
|
+
specs:
|
|
10
|
+
activesupport (3.0.3)
|
|
11
|
+
gabbara (0.0.2)
|
|
12
|
+
activesupport
|
|
13
|
+
|
|
14
|
+
PLATFORMS
|
|
15
|
+
ruby
|
|
16
|
+
|
|
17
|
+
DEPENDENCIES
|
|
18
|
+
activesupport
|
|
19
|
+
gabbara (~> 0.0.2)
|
|
20
|
+
garails!
|
data/README.rdoc
ADDED
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
== Google Analytics for Rails
|
|
2
|
+
|
|
3
|
+
Complete package to use google analytics in your rails application. It supports recording to google analytics:
|
|
4
|
+
|
|
5
|
+
* for normal web browsers (javascript)
|
|
6
|
+
* for mobile handsets (gif)
|
|
7
|
+
* programmatically (events)
|
|
8
|
+
|
|
9
|
+
== Installation
|
|
10
|
+
|
|
11
|
+
Add to your Gemfile:
|
|
12
|
+
|
|
13
|
+
gem 'garails'
|
|
14
|
+
|
|
15
|
+
and run 'bundle install'.
|
|
16
|
+
|
|
17
|
+
Then create a config/initializers/garails.rb with the following content:
|
|
18
|
+
|
|
19
|
+
Garails.ga_account = 'UA-12345678-9'
|
|
20
|
+
# Garails.ga_domain = '.mydomain.com'
|
|
21
|
+
|
|
22
|
+
== Usage
|
|
23
|
+
|
|
24
|
+
=== for normal web browsers
|
|
25
|
+
|
|
26
|
+
Add to your layout (usually app/views/layouts/application.html.erb) in the head section:
|
|
27
|
+
|
|
28
|
+
<html>
|
|
29
|
+
<head>
|
|
30
|
+
<title>My App</title>
|
|
31
|
+
...
|
|
32
|
+
<%= google_analytics_tracking_javascript %>
|
|
33
|
+
</head>
|
|
34
|
+
<body>
|
|
35
|
+
...
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
=== for mobile handsets (non-Javascript)
|
|
39
|
+
|
|
40
|
+
In your layout for mobile handsets without Javascript support, add at the very bottom of the body the following:
|
|
41
|
+
|
|
42
|
+
<%= utm_tag %>
|
|
43
|
+
|
|
44
|
+
=== programmatically
|
|
45
|
+
|
data/Rakefile
ADDED
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
require 'rake/testtask'
|
|
2
|
+
require 'rake/rdoctask'
|
|
3
|
+
require 'bundler'
|
|
4
|
+
Bundler::GemHelper.install_tasks
|
|
5
|
+
|
|
6
|
+
task :default => :test
|
|
7
|
+
|
|
8
|
+
desc 'Run unit tests.'
|
|
9
|
+
Rake::TestTask.new(:test) do |t|
|
|
10
|
+
t.libs << 'lib'
|
|
11
|
+
t.libs << 'test'
|
|
12
|
+
t.pattern = 'test/**/*_test.rb'
|
|
13
|
+
t.verbose = true
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
desc 'Generate documentation.'
|
|
17
|
+
Rake::RDocTask.new(:rdoc) do |rdoc|
|
|
18
|
+
rdoc.rdoc_dir = 'rdoc'
|
|
19
|
+
rdoc.title = 'Google Analytics for Rails'
|
|
20
|
+
rdoc.options << '--line-numbers' << '--inline-source'
|
|
21
|
+
rdoc.rdoc_files.include('README.rdoc')
|
|
22
|
+
rdoc.rdoc_files.include('lib/**/*.rb')
|
|
23
|
+
end
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
require 'gabbara'
|
|
2
|
+
require 'digest'
|
|
3
|
+
|
|
4
|
+
class Garails::GoogleAnalyticsController < ApplicationController
|
|
5
|
+
unloadable
|
|
6
|
+
before_filter :extract_visitor_id
|
|
7
|
+
|
|
8
|
+
UTM_HEADERS = {
|
|
9
|
+
"Content-Type" => "image/gif",
|
|
10
|
+
"Cache-Control" => "private, no-cache, no-cache=Set-Cookie, proxy-revalidate",
|
|
11
|
+
"Pragma" => "no-cache",
|
|
12
|
+
"Expires" => "Wed, 17 Sep 1975 21:32:10 GMT" }
|
|
13
|
+
UTM_GIF_DATA = [
|
|
14
|
+
0x47, 0x49, 0x46, 0x38, 0x39, 0x61, 0x01, 0x00, 0x01, 0x00, 0x80, 0xff,
|
|
15
|
+
0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x2c, 0x00, 0x00, 0x00, 0x00,
|
|
16
|
+
0x01, 0x00, 0x01, 0x00, 0x00, 0x02, 0x02, 0x44, 0x01, 0x00, 0x3b ].map{|i| i.chr }.join
|
|
17
|
+
UTM_COOKIE_NAME = "__utmmobile"
|
|
18
|
+
|
|
19
|
+
def utm
|
|
20
|
+
if Garails.ga_setup?
|
|
21
|
+
g = Garails.mobile_gabba(request, :utmn => params[:utmn])
|
|
22
|
+
g.page_view('', :utmvid => @visitor_id)
|
|
23
|
+
end
|
|
24
|
+
response.headers.merge(UTM_HEADERS)
|
|
25
|
+
respond_to do |format|
|
|
26
|
+
format.gif { send_data UTM_GIF_DATA, :type => :gif, :disposition => "inline" }
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
private
|
|
31
|
+
|
|
32
|
+
def extract_visitor_id
|
|
33
|
+
@visitor_id = cookies[UTM_COOKIE_NAME] || construct_new_visitor_id
|
|
34
|
+
cookies[UTM_COOKIE_NAME] = {:value => @visitor_id, :expires => Time.now + 2.years, :path => '/'}
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
def construct_new_visitor_id
|
|
38
|
+
raw_visitor_id = request.env["HTTP_X_DCMGUID"].blank? ?
|
|
39
|
+
((request.env["HTTP_USER_AGENT"] || "") + rand(0x7fffffff).to_s) :
|
|
40
|
+
(request.env["HTTP_X_DCMGUID"] + (Garails.ga_account || 'unknown'))
|
|
41
|
+
"0x" + Digest::MD5.hexdigest(raw_visitor_id)[0, 16]
|
|
42
|
+
end
|
|
43
|
+
end
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
module Garails::MobileHelper
|
|
2
|
+
|
|
3
|
+
def utm_tag
|
|
4
|
+
image_tag utm_url, :alt => "", :size => "1x1"
|
|
5
|
+
end
|
|
6
|
+
|
|
7
|
+
def utm_url
|
|
8
|
+
referer = request.env['HTTP_REFERER']
|
|
9
|
+
params = {
|
|
10
|
+
:utmn => rand(0x7fffffff).to_s,
|
|
11
|
+
:utmr => referer.blank? ? "-" : referer,
|
|
12
|
+
:utmp => request.env['REQUEST_URI'],
|
|
13
|
+
:guid => "ON",
|
|
14
|
+
:format => :gif
|
|
15
|
+
}
|
|
16
|
+
super(params)
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
end
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
<script type='text/javascript'>
|
|
2
|
+
//<![CDATA[
|
|
3
|
+
var _gaq = _gaq || [];
|
|
4
|
+
_gaq.push(['_setAccount', '<%= Garails.ga_account %>']);
|
|
5
|
+
<% unless Garails.ga_domain.blank? -%>
|
|
6
|
+
_gaq.push(['_setDomainName', '<%= Garails.ga_domain %>']);
|
|
7
|
+
<% end -%>
|
|
8
|
+
_gaq.push(['_trackPageview']);
|
|
9
|
+
(function() {
|
|
10
|
+
var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
|
|
11
|
+
ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
|
|
12
|
+
var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
|
|
13
|
+
})();
|
|
14
|
+
//]]>
|
|
15
|
+
</script>
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
Mime::Type.register "image/gif", :gif
|
data/config/routes.rb
ADDED
data/garails.gemspec
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
|
2
|
+
$:.push File.expand_path("../lib", __FILE__)
|
|
3
|
+
require "garails/version"
|
|
4
|
+
|
|
5
|
+
Gem::Specification.new do |s|
|
|
6
|
+
s.name = "garails"
|
|
7
|
+
s.version = Garails::VERSION
|
|
8
|
+
s.platform = Gem::Platform::RUBY
|
|
9
|
+
s.authors = 'Michael Reinsch'
|
|
10
|
+
s.email = "michael@mobalean.com"
|
|
11
|
+
s.homepage = ""
|
|
12
|
+
s.description = "Google Analytics for Rails"
|
|
13
|
+
s.summary = "Google Analytics for Rails"
|
|
14
|
+
|
|
15
|
+
s.files = `git ls-files`.split("\n")
|
|
16
|
+
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
|
17
|
+
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
|
18
|
+
s.require_paths = ["lib"]
|
|
19
|
+
|
|
20
|
+
s.add_dependency("gabbara", "~> 0.0.2")
|
|
21
|
+
end
|
data/lib/garails.rb
ADDED
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
module Garails
|
|
2
|
+
|
|
3
|
+
# account identifier as issued by google analytics
|
|
4
|
+
mattr_accessor :ga_account
|
|
5
|
+
@@ga_account = nil
|
|
6
|
+
|
|
7
|
+
# domain setting. Only set this if you need to (e.g. for subdomain tracking).
|
|
8
|
+
# Corresponds to "_setDomainName".
|
|
9
|
+
mattr_accessor :ga_domain
|
|
10
|
+
@@ga_domain = nil
|
|
11
|
+
|
|
12
|
+
def self.ga_setup?
|
|
13
|
+
! Garails.ga_account.blank?
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def self.ga_mobile_account
|
|
17
|
+
ga_account.sub(/^UA-/, 'MO-')
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def self.gabba(request, opts = {})
|
|
21
|
+
create_gabba(Garails.ga_account, request, opts)
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def self.mobile_gabba(request, opts = {})
|
|
25
|
+
create_gabba(Garails.ga_mobile_account, request, opts)
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
def self.create_gabba(account, request, opts = {})
|
|
29
|
+
Gabbara::Gabba.new(account, Garails.ga_domain, opts).tap do |g|
|
|
30
|
+
g.logger = Rails.logger
|
|
31
|
+
g.request = request
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
require 'garails/version'
|
|
37
|
+
require 'garails/engine'
|
|
38
|
+
|
metadata
ADDED
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
|
2
|
+
name: garails
|
|
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
|
+
- Michael Reinsch
|
|
14
|
+
autorequire:
|
|
15
|
+
bindir: bin
|
|
16
|
+
cert_chain: []
|
|
17
|
+
|
|
18
|
+
date: 2010-12-20 00:00:00 +09:00
|
|
19
|
+
default_executable:
|
|
20
|
+
dependencies:
|
|
21
|
+
- !ruby/object:Gem::Dependency
|
|
22
|
+
name: gabbara
|
|
23
|
+
prerelease: false
|
|
24
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
|
25
|
+
none: false
|
|
26
|
+
requirements:
|
|
27
|
+
- - ~>
|
|
28
|
+
- !ruby/object:Gem::Version
|
|
29
|
+
hash: 27
|
|
30
|
+
segments:
|
|
31
|
+
- 0
|
|
32
|
+
- 0
|
|
33
|
+
- 2
|
|
34
|
+
version: 0.0.2
|
|
35
|
+
type: :runtime
|
|
36
|
+
version_requirements: *id001
|
|
37
|
+
description: Google Analytics for Rails
|
|
38
|
+
email: michael@mobalean.com
|
|
39
|
+
executables: []
|
|
40
|
+
|
|
41
|
+
extensions: []
|
|
42
|
+
|
|
43
|
+
extra_rdoc_files: []
|
|
44
|
+
|
|
45
|
+
files:
|
|
46
|
+
- Gemfile
|
|
47
|
+
- Gemfile.lock
|
|
48
|
+
- README.rdoc
|
|
49
|
+
- Rakefile
|
|
50
|
+
- app/controllers/garails/google_analytics_controller.rb
|
|
51
|
+
- app/helpers/garails/javascript_helper.rb
|
|
52
|
+
- app/helpers/garails/mobile_helper.rb
|
|
53
|
+
- app/views/garails/google_analytics.html.erb
|
|
54
|
+
- config/initializers/mime_types.rb
|
|
55
|
+
- config/routes.rb
|
|
56
|
+
- garails.gemspec
|
|
57
|
+
- lib/garails.rb
|
|
58
|
+
- lib/garails/engine.rb
|
|
59
|
+
- lib/garails/version.rb
|
|
60
|
+
has_rdoc: true
|
|
61
|
+
homepage: ""
|
|
62
|
+
licenses: []
|
|
63
|
+
|
|
64
|
+
post_install_message:
|
|
65
|
+
rdoc_options: []
|
|
66
|
+
|
|
67
|
+
require_paths:
|
|
68
|
+
- lib
|
|
69
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
|
70
|
+
none: false
|
|
71
|
+
requirements:
|
|
72
|
+
- - ">="
|
|
73
|
+
- !ruby/object:Gem::Version
|
|
74
|
+
hash: 3
|
|
75
|
+
segments:
|
|
76
|
+
- 0
|
|
77
|
+
version: "0"
|
|
78
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
79
|
+
none: false
|
|
80
|
+
requirements:
|
|
81
|
+
- - ">="
|
|
82
|
+
- !ruby/object:Gem::Version
|
|
83
|
+
hash: 3
|
|
84
|
+
segments:
|
|
85
|
+
- 0
|
|
86
|
+
version: "0"
|
|
87
|
+
requirements: []
|
|
88
|
+
|
|
89
|
+
rubyforge_project:
|
|
90
|
+
rubygems_version: 1.3.7
|
|
91
|
+
signing_key:
|
|
92
|
+
specification_version: 3
|
|
93
|
+
summary: Google Analytics for Rails
|
|
94
|
+
test_files: []
|
|
95
|
+
|