panmind-bigbro 0.8.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/README.md ADDED
@@ -0,0 +1,67 @@
1
+ BigBro: A Google Analytics plugin for Rails
2
+ ===========================================
3
+
4
+ Installation
5
+ ------------
6
+
7
+ Via RubyGems:
8
+
9
+ gem install panmind-bigbro
10
+
11
+ Or via Rails Plugin:
12
+
13
+ script/plugin install git://github.com/Panmind/bigbro.git
14
+
15
+ Usage
16
+ -----
17
+
18
+ After the plugin has been loaded, you'll have an `analytics` helper to use
19
+ in your views. It generates an optimized version of the Google Analytics
20
+ code, and a `<noscript>` tag containing the direct path to the `__utm.gif`
21
+ image, to track JS-disabled browsers as well.
22
+
23
+ The `analytics` helper tracks the current page load by default, you can
24
+ disable this behaviour by passing the `:track => false` option.
25
+
26
+ Configuration
27
+ -------------
28
+
29
+ You must set your analytics account via the `Panmind::BigBro.set()` method
30
+ in your `config/environment.rb`:
31
+
32
+ Panmind::BigBro.set(:account => 'UA-12345-67')
33
+
34
+ In production mode, the `.set()` method will raise an `ArgumentError` if
35
+ no account is provided, unless the `:disabled` option is set to `true`.
36
+
37
+ We use these switches to allow the developer to run the application in
38
+ production mode on `localhost` while not sending requests to Analytics.
39
+
40
+ We know that the ga.js is empty if the `Referer` is `localhost`, but on
41
+ Panmind there are situations in which the referer is reset, thus a
42
+ complete disable is necessary
43
+
44
+ In development mode the plugin is always disabled.
45
+
46
+ Testing
47
+ -------
48
+
49
+ A simple `assert_analytics()` helper is included in to aid verifying
50
+ that the layouts include the `analytics` helper. Its usage is super
51
+ simple:
52
+
53
+ class FooControllerTest < ActionController::TestCase
54
+ context "An user" do
55
+ should "be tracked by analytics" do
56
+ get :index
57
+ assert_analytics
58
+ end
59
+ end
60
+ end
61
+
62
+
63
+ Compatibility
64
+ -------------
65
+
66
+ Tested with Rails 2.3.8 with the `rails_xss` plugin installed,
67
+ running under Ruby 1.9.1-p378.
data/Rakefile ADDED
@@ -0,0 +1,49 @@
1
+ require 'rake'
2
+ require 'rake/rdoctask'
3
+
4
+ require 'lib/panmind/bigbro'
5
+
6
+ begin
7
+ require 'jeweler'
8
+ Jeweler::Tasks.new do |gemspec|
9
+ gemspec.name = 'panmind-bigbro'
10
+
11
+ gemspec.summary = 'A Google Analytics plugin for Rails'
12
+ gemspec.description = 'BigBro provides view helpers to generate Analytics code ' \
13
+ '(with the noscript counterpart), test helpers to assert your ' \
14
+ 'page contains the tracking code and a configuration method to '\
15
+ 'set your GA account from environment.rb'
16
+
17
+ gemspec.authors = ['Marcello Barnaba']
18
+ gemspec.email = 'vjt@openssl.it'
19
+ gemspec.homepage = 'http://github.com/Panmind/bigbro'
20
+
21
+ gemspec.files = %w( README.md Rakefile rails/init.rb ) + Dir['lib/**/*']
22
+ gemspec.extra_rdoc_files = %w( README.md )
23
+ gemspec.has_rdoc = true
24
+
25
+ gemspec.version = Panmind::BigBro::Version
26
+ gemspec.date = '2010-07-25'
27
+
28
+ gemspec.require_path = 'lib'
29
+
30
+ gemspec.add_dependency('rails', '>= 2.3.8')
31
+ end
32
+ rescue LoadError
33
+ puts 'Jeweler not available. Install it with: gem install jeweler'
34
+ end
35
+
36
+ desc 'Generate the rdoc'
37
+ Rake::RDocTask.new do |rdoc|
38
+ rdoc.rdoc_files.add %w( README.md lib/**/*.rb )
39
+
40
+ rdoc.main = 'README.md'
41
+ rdoc.title = 'BigBro: A Google Analytics plugin for Rails'
42
+ end
43
+
44
+ desc 'Will someone help write tests?'
45
+ task :default do
46
+ puts
47
+ puts 'Can you help in writing tests? Please do :-)'
48
+ puts
49
+ end
@@ -0,0 +1,155 @@
1
+ require 'panmind/bigbro/railtie'
2
+
3
+ module Panmind
4
+ module BigBro
5
+ Version = '0.8.1'
6
+
7
+ module Helpers
8
+ # Embeds the optimized Analytics code and the noscript tag with
9
+ # the direct path to the __utm.gif image into the current page.
10
+ #
11
+ # If the `:track` option is set to false, the current page load
12
+ # is *not* automatically tracked: you should track it later via
13
+ # the JS API.
14
+ #
15
+ def analytics(options = {})
16
+ return if BigBro.disabled?
17
+
18
+ track = options.has_key?(:track) ? options[:track] : true
19
+
20
+ ga_host = BigBro.host_for(request)
21
+ ga_cmds = [['_setAccount', BigBro.account]]
22
+ ga_cmds.push(['_trackPageview']) if track
23
+
24
+ code = ''
25
+ code.concat javascript_tag(%(
26
+ var _gaq = #{ga_cmds.to_json};
27
+ $(document).ready (function () { // Because of Opera and FF <= 3.5
28
+ try {
29
+ (function(d, t, a) {
30
+ var g=d.createElement(t),s=d.getElementsByTagName(t)[0];
31
+ g[a]=a;g.src='#{ga_host}/ga.js';s.parentNode.insertBefore(g,s);
32
+ }) (document, 'script', 'async');
33
+ } catch (err) {}
34
+ });
35
+ ))
36
+
37
+ code.concat(content_tag(:noscript,
38
+ image_tag(BigBro.noscript_image_path_for(request, ga_host),
39
+ :border => '0', :alt => '').html_safe
40
+ ))
41
+
42
+ return code.html_safe
43
+ end
44
+ end
45
+
46
+ class << self
47
+ attr_accessor :account
48
+ attr_accessor :disabled
49
+
50
+ # Sets the Analytics account and *enforces* it to be set
51
+ # in production mode.
52
+ #
53
+ # If you're developing and want to run your local copy
54
+ # in production mode, you can either pass an invalid
55
+ # account (e.g. to check how the JS code is generated)
56
+ # or pass the :disabled option set to true.
57
+ #
58
+ # In test mode, the account is always set to the dummy
59
+ # "UA-420-THEBRAIN" string.
60
+ #
61
+ # Sets the 'UA-12345-67' account:
62
+ #
63
+ # Panmind::BigBro.set(:account => 'UA-12345-67')
64
+ #
65
+ # Disables analytics code generation:
66
+ #
67
+ # Panmind::BigBro.set(:disabled => true)
68
+ #
69
+ def set(options = {})
70
+ self.account = options[:account]
71
+ self.disabled = options[:disabled]
72
+
73
+ if Rails.env.production?
74
+ if self.account.blank? && !self.disabled
75
+ raise ArgumentError, 'BigBro: analytics configuration missing'
76
+ end
77
+ elsif Rails.env.test?
78
+ self.account = 'UA-420-THEBRAIN'
79
+ end
80
+ end
81
+
82
+ # In development mode the Analytics code is always disabled,
83
+ # or it can be disabled manually via the configuration.
84
+ #
85
+ # If no account is set, the code disables itself. Maybe the
86
+ # check in the set() method should be moved here, we'll see.
87
+ #
88
+ def disabled?
89
+ self.disabled || self.account.blank? || Rails.env.development?
90
+ end
91
+
92
+ # Returns the analytics host for the given request (SSL or not)
93
+ #
94
+ def host_for(request)
95
+ (request.ssl? ? 'https://ssl' : 'http://www') + '.google-analytics.com'
96
+ end
97
+
98
+ # Returns the noscript image path for the given request and GA Host
99
+ #
100
+ def noscript_image_path_for(request, ga_host)
101
+ cookie = rand( 89_999_999) + 10_000_000
102
+ req_no = rand(8_999_999_999) + 1_000_000_000
103
+ random = rand(1_147_483_647) + 1_000_000_000
104
+ now = Time.now.to_i
105
+
106
+ referer = request.referer.blank? ? '-' : CGI.escape(request.referer)
107
+ path = request.path.blank? ? '/' : CGI.escape(request.path)
108
+
109
+ utmcc =
110
+ "__utma%3D#{cookie}.#{random}.#{now}.#{now}.#{now}.2%3B%2B" \
111
+ "__utmz%3D#{cookie}.#{now}.2.2." \
112
+ "utmccn%3D(direct)%7C" \
113
+ "utmcsr%3D(direct)%7C" \
114
+ "utmcmd%3D(none)%3B%2B" \
115
+ "__utmv%3D#{cookie}.noscript%3B"
116
+
117
+ "#{ga_host}/__utm.gif?" \
118
+ "utmn=#{req_no}&" \
119
+ "utmac=#{account}&" \
120
+ "utmhn=#{request.host}&" \
121
+ "utmr=#{referer}&" \
122
+ "utmp=#{path}&" \
123
+ "utmcc=#{utmcc}&" \
124
+ 'utmwv=1&' \
125
+ 'utmje=0&' \
126
+ 'utmsr=-&' \
127
+ 'utmsc=-&' \
128
+ 'utmul=-&' \
129
+ 'utmfl=-&' \
130
+ 'utmdt=-'
131
+ end
132
+ end
133
+
134
+ module TestHelpers
135
+ # Asserts the GA <script> tag, with not much effort;
136
+ # Asserts the noscript tag with the descendant img.
137
+ #
138
+ def assert_analytics
139
+ host = BigBro.host_for(@request)
140
+
141
+ assert_tag :tag => 'script', :content => /#{host}\/ga.js/
142
+
143
+ assert_tag :tag => 'noscript',
144
+ :descendant => {
145
+ :tag => 'img',
146
+ :attributes => {
147
+ :src => /#{host}\/__utm.gif\?/,
148
+ :border => '0',
149
+ :alt => ''
150
+ }
151
+ }
152
+ end
153
+ end
154
+ end
155
+ end
@@ -0,0 +1,23 @@
1
+ module Panmind
2
+ module BigBro
3
+
4
+ if defined? Rails::Railtie
5
+ require 'rails'
6
+ class Railtie < Rails::Railtie
7
+ initializer 'panmind-bigbro.insert_into_action_view' do
8
+ ActiveSupport.on_load :action_view do
9
+ Panmind::BigBro::Railtie.insert
10
+ end
11
+ end
12
+ end
13
+ end
14
+
15
+ class Railtie
16
+ def self.insert
17
+ ActionView::Base.instance_eval { include Panmind::BigBro::Helpers }
18
+ ActiveSupport::TestCase.instance_eval { include Panmind::BigBro::TestHelpers } if Rails.env.test?
19
+ end
20
+ end
21
+
22
+ end
23
+ end
data/rails/init.rb ADDED
@@ -0,0 +1,2 @@
1
+ require 'panmind/bigbro/railtie'
2
+ Panmind::BigBro::Railtie.insert
metadata ADDED
@@ -0,0 +1,79 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: panmind-bigbro
3
+ version: !ruby/object:Gem::Version
4
+ prerelease: false
5
+ segments:
6
+ - 0
7
+ - 8
8
+ - 1
9
+ version: 0.8.1
10
+ platform: ruby
11
+ authors:
12
+ - Marcello Barnaba
13
+ autorequire:
14
+ bindir: bin
15
+ cert_chain: []
16
+
17
+ date: 2010-07-25 00:00:00 +02:00
18
+ default_executable:
19
+ dependencies:
20
+ - !ruby/object:Gem::Dependency
21
+ name: rails
22
+ prerelease: false
23
+ requirement: &id001 !ruby/object:Gem::Requirement
24
+ requirements:
25
+ - - ">="
26
+ - !ruby/object:Gem::Version
27
+ segments:
28
+ - 2
29
+ - 3
30
+ - 8
31
+ version: 2.3.8
32
+ type: :runtime
33
+ version_requirements: *id001
34
+ description: BigBro provides view helpers to generate Analytics code (with the noscript counterpart), test helpers to assert your page contains the tracking code and a configuration method to set your GA account from environment.rb
35
+ email: vjt@openssl.it
36
+ executables: []
37
+
38
+ extensions: []
39
+
40
+ extra_rdoc_files:
41
+ - README.md
42
+ files:
43
+ - README.md
44
+ - Rakefile
45
+ - lib/panmind/bigbro.rb
46
+ - lib/panmind/bigbro/railtie.rb
47
+ - rails/init.rb
48
+ has_rdoc: true
49
+ homepage: http://github.com/Panmind/bigbro
50
+ licenses: []
51
+
52
+ post_install_message:
53
+ rdoc_options:
54
+ - --charset=UTF-8
55
+ require_paths:
56
+ - lib
57
+ required_ruby_version: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ segments:
62
+ - 0
63
+ version: "0"
64
+ required_rubygems_version: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ segments:
69
+ - 0
70
+ version: "0"
71
+ requirements: []
72
+
73
+ rubyforge_project:
74
+ rubygems_version: 1.3.6
75
+ signing_key:
76
+ specification_version: 3
77
+ summary: A Google Analytics plugin for Rails
78
+ test_files: []
79
+