isc_analytics 0.5.4 → 0.6.0
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 +34 -14
- data/lib/isc_analytics.rb +5 -0
- data/lib/isc_analytics/bootstrap.rb +26 -17
- data/lib/isc_analytics/client_api.rb +17 -1
- data/lib/isc_analytics/config.rb +8 -8
- data/lib/isc_analytics/controller_support.rb +4 -0
- data/lib/isc_analytics/engine.rb +1 -1
- data/lib/isc_analytics/mail/config/routes.rb +3 -0
- data/lib/isc_analytics/mail/controllers/mail_analytics_controller.rb +16 -0
- data/lib/isc_analytics/mail/mail.rb +7 -0
- data/lib/isc_analytics/server.rb +33 -0
- data/lib/isc_analytics/server_apis/kissmetrics.rb +33 -0
- data/lib/isc_analytics/services.rb +8 -8
- metadata +35 -14
data/README.md
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
A simple client-side & server-side analytics library for Rails. It currently supports only KISSmetrics for more advanced
|
3
3
|
analytics features (trackEvent / setProperties) and Google Analytics just for tracking pageviews.
|
4
4
|
|
5
|
-
## Installation
|
5
|
+
## Installation
|
6
6
|
|
7
7
|
Just add the `isc_analytics` gem into your Gemfile
|
8
8
|
|
@@ -18,20 +18,26 @@ ISC Analytics currently supports the following configuration options:
|
|
18
18
|
|
19
19
|
|
20
20
|
```ruby
|
21
|
-
IscAnalytics.config.
|
22
|
-
IscAnalytics.config.namespace = 'App' # an alias which will gain all the analytics
|
21
|
+
IscAnalytics.config.providers = ANALYTIC_PROVIDERS # a providers object (preferably using ConfigReader)
|
22
|
+
IscAnalytics.config.namespace = 'App' # an alias which will gain all the analytics behaviour in the clientside.
|
23
23
|
```
|
24
24
|
|
25
|
-
We highly recommend you to use our other gem
|
25
|
+
We highly recommend you to use our other gem
|
26
|
+
[ConfigReader](https://github.com/TheGiftsProject/configreader) to load the analytics_providers data from YML.
|
26
27
|
|
27
|
-
The
|
28
|
+
The providers hash / EnvConfigReader should contain the following sub keys:
|
28
29
|
|
29
30
|
```yml
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
31
|
+
kissmetrics:
|
32
|
+
key: "KEY"
|
33
|
+
dryrun: false # see http://support.kissmetrics.com/apis/ruby for more details
|
34
|
+
google_analytics:
|
35
|
+
key: "KEY"
|
36
|
+
ipinfodb:
|
37
|
+
key: "KEY"
|
38
|
+
optimizely:
|
39
|
+
key: "KEY"
|
40
|
+
```
|
35
41
|
|
36
42
|
Currently only the KISSMetrics and Google Analytics keys are mandatory although the gem isn't fully tested without the ipinfodb and optimizely options.
|
37
43
|
|
@@ -84,11 +90,25 @@ For example if I set my namespace as `App` then I'll be able to access the track
|
|
84
90
|
|
85
91
|
## Server Side
|
86
92
|
|
87
|
-
All the **client side event tracking is available from the server side** as well. Once you've included isc_analytics you can access the `analytics` object which will have methods identical to the client-side analytics methods.
|
93
|
+
All the **client side event tracking is available from the server side** as well. Once you've included isc_analytics you can access the `analytics` object which will have methods identical to the client-side analytics methods.
|
88
94
|
For example you can call `analytics.trackEvent('user-visit')` and it will be persisted in the current user session and flushed into the user's browser next time he visits a page (via add_analytics). This mechanism is similar in behaviour to Rails' flash object.
|
89
|
-
|
95
|
+
|
96
|
+
There is also support for purely server-side analytics (currently only for KISSMetrics) that send the data directly to KM, without going through the user's browser.
|
97
|
+
It is accessible through `IscAnalytics.server` with the following interface:
|
98
|
+
```ruby
|
99
|
+
IscAnalytics.server.track_event(identity, name, properties={})
|
100
|
+
IscAnalytics.server.set_properties(identity, properties)
|
101
|
+
IscAnalytics.server.alias(identity, new_identity)
|
102
|
+
```
|
103
|
+
|
90
104
|
### Opt out
|
91
105
|
|
92
|
-
One very cool feature **isc_analytics** has is a built in opt_out feature to be used when testing the system or when doing admin actions.
|
93
|
-
To enter opt_out for the current browsing session just call `analytics.opt_out!` from the controller.
|
106
|
+
One very cool feature **isc_analytics** has is a built in opt_out feature to be used when testing the system or when doing admin actions.
|
107
|
+
To enter opt_out for the current browsing session just call `analytics.opt_out!` from the controller.
|
94
108
|
Once opt-ted out, a dummy implementation of the analytics js will be sent to the client meaning that no calls will actually be sent to the analytics service.
|
109
|
+
|
110
|
+
## Notes
|
111
|
+
### KISSMetrics URL api
|
112
|
+
After including IscAnalytics::ControllerSupport into your controller, you can override the [KISSMetrics URL api](http://support.kissmetrics.com/apis/url) by adding `before_filter keep_km_url_event` to your controller.
|
113
|
+
This records the url events manually as soon as the request comes in and allows you to use `redirect_to` without worrying about losing analytics data.
|
114
|
+
If you intend to use this, you should disable the URL api in your kissmetrics settings in order to avoid duplicate events.
|
data/lib/isc_analytics.rb
CHANGED
@@ -4,6 +4,7 @@ require "#{File.dirname(__FILE__)}/isc_analytics/client_api"
|
|
4
4
|
require "#{File.dirname(__FILE__)}/isc_analytics/exceptions"
|
5
5
|
require "#{File.dirname(__FILE__)}/isc_analytics/bootstrap"
|
6
6
|
require "#{File.dirname(__FILE__)}/isc_analytics/controller_support"
|
7
|
+
require "#{File.dirname(__FILE__)}/isc_analytics/server"
|
7
8
|
|
8
9
|
module IscAnalytics
|
9
10
|
|
@@ -13,5 +14,9 @@ module IscAnalytics
|
|
13
14
|
@configuration ||= IscAnalytics::Config.default
|
14
15
|
end
|
15
16
|
|
17
|
+
def self.server
|
18
|
+
@server ||= IscAnalytics::Server.new(config.providers)
|
19
|
+
end
|
20
|
+
|
16
21
|
end
|
17
22
|
|
@@ -6,7 +6,7 @@ module IscAnalytics
|
|
6
6
|
include KISSMetricsClientAPI
|
7
7
|
|
8
8
|
def initialize(options = {})
|
9
|
-
|
9
|
+
validate_providers_config
|
10
10
|
@session = options[:session] || {}
|
11
11
|
@opt_out = false
|
12
12
|
end
|
@@ -23,35 +23,44 @@ module IscAnalytics
|
|
23
23
|
Tags.scripts(analytics_scripts)
|
24
24
|
end
|
25
25
|
|
26
|
+
def provider_script_tags
|
27
|
+
Tags.scripts(provider_scripts)
|
28
|
+
end
|
29
|
+
|
30
|
+
def queued_events
|
31
|
+
return nil if opt_out?
|
32
|
+
generate_queue_js
|
33
|
+
end
|
34
|
+
|
26
35
|
private
|
27
36
|
|
28
37
|
def analytics_scripts
|
29
38
|
scripts = []
|
30
|
-
scripts.concat
|
39
|
+
scripts.concat provider_scripts
|
31
40
|
scripts << isc_analytics_tag
|
32
41
|
scripts << extend_analytics(config.namespace)
|
33
|
-
scripts << queued_events unless
|
34
|
-
scripts
|
42
|
+
scripts << Tags.script_tag(queued_events) unless queued_events.blank?
|
43
|
+
scripts.compact
|
44
|
+
end
|
45
|
+
|
46
|
+
def provider_scripts
|
47
|
+
opt_out? ? [] : Services.scripts(config.providers)
|
35
48
|
end
|
36
49
|
|
37
50
|
def config
|
38
51
|
IscAnalytics.config
|
39
52
|
end
|
40
53
|
|
41
|
-
def
|
42
|
-
|
43
|
-
|
44
|
-
if config.accounts.kissmetrics_key.nil?
|
45
|
-
raise IscAnalytics::MissingConfigParams.new('KISSMetrics configuration key isn\'t specified in your config.')
|
46
|
-
elsif config.accounts.google_analytics_key.nil?
|
47
|
-
raise IscAnalytics::MissingConfigParams.new('Google Analytics configuration key isn\'t specified in your config.')
|
54
|
+
def validate_providers_config
|
55
|
+
if config.providers.nil?
|
56
|
+
raise IscAnalytics::NoConfigSpecified.new('You have specified a nil config, you must specify an EnvConfigReader of your Analytics providers keys')
|
48
57
|
end
|
49
|
-
end
|
50
58
|
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
59
|
+
if config.providers.kissmetrics.nil?
|
60
|
+
raise IscAnalytics::MissingConfigParams.new('KISSMetrics configuration isn\'t specified in your config.')
|
61
|
+
elsif config.providers.google_analytics.nil?
|
62
|
+
raise IscAnalytics::MissingConfigParams.new('Google Analytics configuration isn\'t specified in your config.')
|
63
|
+
end
|
55
64
|
end
|
56
65
|
|
57
66
|
def extend_analytics(namespace)
|
@@ -80,4 +89,4 @@ module IscAnalytics
|
|
80
89
|
end
|
81
90
|
|
82
91
|
end
|
83
|
-
end
|
92
|
+
end
|
@@ -43,6 +43,22 @@ module IscAnalytics
|
|
43
43
|
buffer
|
44
44
|
end
|
45
45
|
|
46
|
+
def keep_km_url_event(params)
|
47
|
+
kme = params["kme"]
|
48
|
+
|
49
|
+
if kme
|
50
|
+
props = {}
|
51
|
+
params.each do |key, value|
|
52
|
+
if key.to_s.start_with?("km_")
|
53
|
+
prop_name = key[3..-1]
|
54
|
+
props[prop_name] = value
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
track_event(kme, props)
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
46
62
|
private
|
47
63
|
|
48
64
|
def enqueue(name, *args)
|
@@ -76,4 +92,4 @@ module IscAnalytics
|
|
76
92
|
end
|
77
93
|
|
78
94
|
end
|
79
|
-
end
|
95
|
+
end
|
data/lib/isc_analytics/config.rb
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
module IscAnalytics
|
2
2
|
class Config
|
3
3
|
|
4
|
-
attr_accessor :
|
4
|
+
attr_accessor :providers, :namespace
|
5
5
|
|
6
|
-
def
|
7
|
-
|
8
|
-
|
9
|
-
|
6
|
+
def initialize(providers, namespace, amd=false)
|
7
|
+
@providers = providers
|
8
|
+
@namespace = namespace
|
9
|
+
end
|
10
10
|
|
11
|
-
|
12
|
-
|
11
|
+
def self.default
|
12
|
+
new(nil, nil)
|
13
13
|
end
|
14
14
|
end
|
15
|
-
end
|
15
|
+
end
|
data/lib/isc_analytics/engine.rb
CHANGED
@@ -0,0 +1,16 @@
|
|
1
|
+
module IscAnalytics
|
2
|
+
class MailAnalyticsController < ActionController::Base
|
3
|
+
def track
|
4
|
+
strategy = IscAnalytics::Mail.strategy
|
5
|
+
begin
|
6
|
+
if strategy.should_record_analytics?(params)
|
7
|
+
strategy.track(params[:identity], params[:kme], params[:props])
|
8
|
+
end
|
9
|
+
rescue => e
|
10
|
+
strategy.on_failure(e)
|
11
|
+
ensure
|
12
|
+
redirect_to params[:url]
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
require "isc_analytics/server_apis/kissmetrics"
|
2
|
+
|
3
|
+
module IscAnalytics
|
4
|
+
class Server
|
5
|
+
def initialize(providers_config)
|
6
|
+
@providers = []
|
7
|
+
@providers << init_kissmetrics(providers_config.kissmetrics)
|
8
|
+
end
|
9
|
+
|
10
|
+
def track_event(identity, name, properties={})
|
11
|
+
@providers.each do |provider|
|
12
|
+
provider.track_event(identity, name, properties)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
def set_properties(identity, properties)
|
17
|
+
@providers.each do |provider|
|
18
|
+
provider.set_properties(identity, properties)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
def alias(identity, new_identity)
|
23
|
+
@providers.each do |provider|
|
24
|
+
provider.alias(identity, new_identity)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
private
|
29
|
+
def init_kissmetrics(config)
|
30
|
+
IscAnalytics::ServerApis::Kissmetrics.new(config["key"], config["dryrun"])
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
require 'km'
|
2
|
+
|
3
|
+
module IscAnalytics
|
4
|
+
module ServerApis
|
5
|
+
class Kissmetrics
|
6
|
+
def initialize(key, dryrun=false)
|
7
|
+
raise ArgumentError.new("IscAnalytics::ServerApis::Kissmetrics requires a key") if key.blank?
|
8
|
+
KM.init(key, { :dryrun => dryrun })
|
9
|
+
end
|
10
|
+
|
11
|
+
def track_event(identity, event_name, properties={})
|
12
|
+
identify(identity)
|
13
|
+
KM.record(event_name, properties)
|
14
|
+
end
|
15
|
+
|
16
|
+
def set_properties(identity, properties)
|
17
|
+
identify(identity)
|
18
|
+
KM.set(properties)
|
19
|
+
end
|
20
|
+
|
21
|
+
def alias(original_identity, alias_identity)
|
22
|
+
identify(original_identity)
|
23
|
+
KM.alias(original_identity, alias_identity)
|
24
|
+
end
|
25
|
+
|
26
|
+
private
|
27
|
+
def identify(identity)
|
28
|
+
raise ArgumentError.new("identity must be provided") if identity.blank?
|
29
|
+
KM.identify(identity)
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -4,13 +4,13 @@ require 'active_support/core_ext/object/blank'
|
|
4
4
|
module IscAnalytics
|
5
5
|
class Services
|
6
6
|
|
7
|
-
def self.scripts(
|
8
|
-
[
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
7
|
+
def self.scripts(providers_config)
|
8
|
+
scripts = []
|
9
|
+
scripts << kissmetrics_tag(providers_config.kissmetrics["key"]) if providers_config.kissmetrics
|
10
|
+
scripts << google_tag(providers_config.google_analytics["key"]) if providers_config.google_analytics
|
11
|
+
scripts << optimizely_tag(providers_config.optimizely["key"]) if providers_config.optimizely
|
12
|
+
scripts << ipinfodb_tag(providers_config.ipinfodb["key"]) if providers_config.ipinfodb
|
13
|
+
scripts
|
14
14
|
end
|
15
15
|
|
16
16
|
def self.kissmetrics_tag(key)
|
@@ -57,4 +57,4 @@ module IscAnalytics
|
|
57
57
|
end
|
58
58
|
|
59
59
|
end
|
60
|
-
end
|
60
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: isc_analytics
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.6.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -10,7 +10,7 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date: 2013-
|
13
|
+
date: 2013-02-20 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: controller_support
|
@@ -60,6 +60,22 @@ dependencies:
|
|
60
60
|
- - ! '>='
|
61
61
|
- !ruby/object:Gem::Version
|
62
62
|
version: '0'
|
63
|
+
- !ruby/object:Gem::Dependency
|
64
|
+
name: km
|
65
|
+
requirement: !ruby/object:Gem::Requirement
|
66
|
+
none: false
|
67
|
+
requirements:
|
68
|
+
- - ! '>='
|
69
|
+
- !ruby/object:Gem::Version
|
70
|
+
version: '0'
|
71
|
+
type: :runtime
|
72
|
+
prerelease: false
|
73
|
+
version_requirements: !ruby/object:Gem::Requirement
|
74
|
+
none: false
|
75
|
+
requirements:
|
76
|
+
- - ! '>='
|
77
|
+
- !ruby/object:Gem::Version
|
78
|
+
version: '0'
|
63
79
|
description: A simple client-side & server-side analytics library
|
64
80
|
email:
|
65
81
|
- itayadler@gmail.com
|
@@ -68,26 +84,31 @@ executables: []
|
|
68
84
|
extensions: []
|
69
85
|
extra_rdoc_files: []
|
70
86
|
files:
|
71
|
-
- lib/assets/javascripts/isc_analytics
|
87
|
+
- lib/assets/javascripts/isc_analytics.js
|
72
88
|
- lib/assets/javascripts/isc_analytics/isc_analytics.js.coffee
|
73
|
-
- lib/assets/javascripts/isc_analytics/opt_out_analytics.js.coffee
|
74
89
|
- lib/assets/javascripts/isc_analytics/visitor_analytics.coffee.erb
|
75
|
-
- lib/assets/javascripts/isc_analytics.js
|
76
|
-
- lib/isc_analytics/
|
77
|
-
- lib/isc_analytics
|
90
|
+
- lib/assets/javascripts/isc_analytics/opt_out_analytics.js.coffee
|
91
|
+
- lib/assets/javascripts/isc_analytics/index.js.coffee
|
92
|
+
- lib/isc_analytics.rb
|
78
93
|
- lib/isc_analytics/config.rb
|
79
|
-
- lib/isc_analytics/controller_support.rb
|
80
|
-
- lib/isc_analytics/engine.rb
|
81
94
|
- lib/isc_analytics/exceptions.rb
|
82
|
-
- lib/isc_analytics/services.rb
|
83
95
|
- lib/isc_analytics/tags.rb
|
84
|
-
- lib/isc_analytics.rb
|
85
|
-
-
|
86
|
-
-
|
96
|
+
- lib/isc_analytics/mail/config/routes.rb
|
97
|
+
- lib/isc_analytics/mail/controllers/mail_analytics_controller.rb
|
98
|
+
- lib/isc_analytics/mail/mail.rb
|
99
|
+
- lib/isc_analytics/services.rb
|
100
|
+
- lib/isc_analytics/bootstrap.rb
|
101
|
+
- lib/isc_analytics/server.rb
|
102
|
+
- lib/isc_analytics/server_apis/kissmetrics.rb
|
103
|
+
- lib/isc_analytics/engine.rb
|
104
|
+
- lib/isc_analytics/client_api.rb
|
105
|
+
- lib/isc_analytics/controller_support.rb
|
87
106
|
- vendor/assets/javascripts/isc_analytics/session.js
|
88
|
-
- vendor/assets/javascripts/isc_analytics/yepnope/css_prefix.js
|
89
107
|
- vendor/assets/javascripts/isc_analytics/yepnope/index.js
|
90
108
|
- vendor/assets/javascripts/isc_analytics/yepnope/yepnope.js
|
109
|
+
- vendor/assets/javascripts/isc_analytics/yepnope/css_prefix.js
|
110
|
+
- vendor/assets/javascripts/isc_analytics/session/index.js
|
111
|
+
- vendor/assets/javascripts/isc_analytics/session/session-0.4.js
|
91
112
|
- Rakefile
|
92
113
|
- Gemfile
|
93
114
|
- README.md
|