ahoy_matey 0.1.0 → 0.1.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +11 -15
- data/app/controllers/ahoy/visits_controller.rb +5 -5
- data/lib/ahoy/model.rb +52 -43
- data/lib/ahoy/version.rb +1 -1
- data/lib/ahoy_matey.rb +6 -0
- data/lib/generators/ahoy/templates/install.rb +4 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 93699ebff0f9bfc35b50d48e7ff477963114b1b2
|
4
|
+
data.tar.gz: 848e8110b3cedef57143e54d8415e23a5e650c66
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: fbd26a7a790231a5b8e8b3dfa2d9b7b99b9e87cd862cffbd15d53ae4a003d1e18afea1f4f46c34576c3a5d6a5f25f4f9f39cfdbb94ab9e58a24488df85c18119
|
7
|
+
data.tar.gz: b4046b11ece28d61d46f852bf3b0a699f52d24d34faffad687dce093260fcc564d8a5aee29e3583ec3f354fa3fb17d1e68721e7c2419551ab7e0f0e006e46ee3
|
data/README.md
CHANGED
@@ -2,6 +2,8 @@
|
|
2
2
|
|
3
3
|
:fire: Simple, powerful visit tracking for Rails
|
4
4
|
|
5
|
+
Visits are stored in **your database** so you can easily combine them with other data.
|
6
|
+
|
5
7
|
You get:
|
6
8
|
|
7
9
|
- traffic source - referrer, referring domain, landing page, search keyword
|
@@ -9,23 +11,23 @@ You get:
|
|
9
11
|
- technology - browser, OS, and device type
|
10
12
|
- utm parameters - source, medium, term, content, campaign
|
11
13
|
|
12
|
-
It’s all stored in **your database** so you can easily combine it with other data.
|
13
|
-
|
14
14
|
See which campaigns generate the most revenue effortlessly.
|
15
15
|
|
16
16
|
```ruby
|
17
17
|
Order.joins(:visit).group("utm_campaign").sum(:revenue)
|
18
18
|
```
|
19
19
|
|
20
|
+
Goes great with services like [Google Analytics](http://www.google.com/analytics/)
|
21
|
+
|
20
22
|
## Ready, Set, Go
|
21
23
|
|
22
24
|
Add this line to your application’s Gemfile:
|
23
25
|
|
24
26
|
```ruby
|
25
|
-
gem
|
27
|
+
gem 'ahoy_matey'
|
26
28
|
```
|
27
29
|
|
28
|
-
And run the generator. This creates a
|
30
|
+
And run the generator. This creates a model to store visits.
|
29
31
|
|
30
32
|
```sh
|
31
33
|
rails generate ahoy:install
|
@@ -71,22 +73,16 @@ class Order < ActiveRecord::Base
|
|
71
73
|
end
|
72
74
|
```
|
73
75
|
|
74
|
-
When a visitor places an order, the `visit_id` column
|
76
|
+
When a visitor places an order, the `visit_id` column is automatically set.
|
75
77
|
|
76
|
-
|
77
|
-
|
78
|
-
```ruby
|
79
|
-
class Order < ActiveRecord::Base
|
80
|
-
belongs_to :visit
|
81
|
-
end
|
82
|
-
```
|
78
|
+
:tada: Magic!
|
83
79
|
|
84
|
-
|
80
|
+
To see where your orders are coming from, use:
|
85
81
|
|
86
82
|
```ruby
|
87
83
|
Order.joins(:visit).group("referring_domain").count
|
88
|
-
Order.joins(:visit).group("device_type").count
|
89
84
|
Order.joins(:visit).group("city").count
|
85
|
+
Order.joins(:visit).group("device_type").count
|
90
86
|
```
|
91
87
|
|
92
88
|
## Users
|
@@ -128,7 +124,7 @@ or
|
|
128
124
|
http://datakick.org/?utm_medium=twitter&utm_campaign=social&utm_source=tweet123
|
129
125
|
```
|
130
126
|
|
131
|
-
## Features
|
127
|
+
## More Features
|
132
128
|
|
133
129
|
- Excludes bots
|
134
130
|
- Degrades gracefully when cookies are disabled
|
@@ -7,11 +7,11 @@ module Ahoy
|
|
7
7
|
Ahoy.visit_model.new do |v|
|
8
8
|
v.visit_token = params[:visit_token]
|
9
9
|
v.visitor_token = params[:visitor_token]
|
10
|
-
v.ip = request.remote_ip
|
11
|
-
v.user_agent = request.user_agent
|
12
|
-
v.referrer = params[:referrer]
|
13
|
-
v.landing_page = params[:landing_page]
|
14
|
-
v.user = current_user if respond_to?(:current_user)
|
10
|
+
v.ip = request.remote_ip if v.respond_to?(:ip=)
|
11
|
+
v.user_agent = request.user_agent if v.respond_to?(:user_agent=)
|
12
|
+
v.referrer = params[:referrer] if v.respond_to?(:referrer=)
|
13
|
+
v.landing_page = params[:landing_page] if v.respond_to?(:landing_page=)
|
14
|
+
v.user = current_user if respond_to?(:current_user) and v.respond_to?(:user=)
|
15
15
|
end
|
16
16
|
|
17
17
|
visit.save!
|
data/lib/ahoy/model.rb
CHANGED
@@ -12,10 +12,12 @@ module Ahoy
|
|
12
12
|
before_create :set_location
|
13
13
|
|
14
14
|
def set_traffic_source
|
15
|
-
|
16
|
-
self.referring_domain =
|
17
|
-
|
18
|
-
|
15
|
+
referring_domain = Addressable::URI.parse(referrer).host.first(255) rescue nil
|
16
|
+
self.referring_domain = referring_domain if respond_to?(:referring_domain=)
|
17
|
+
# performance hack for referer-parser
|
18
|
+
search_keyword = Ahoy.referrer_parser.parse(referrer)[1].first(255) rescue nil
|
19
|
+
self.search_keyword = search_keyword.presence if respond_to?(:search_keyword=)
|
20
|
+
true
|
19
21
|
end
|
20
22
|
|
21
23
|
def set_utm_parameters
|
@@ -23,57 +25,64 @@ module Ahoy
|
|
23
25
|
if landing_uri
|
24
26
|
query_values = landing_uri.query_values || {}
|
25
27
|
%w[utm_source utm_medium utm_term utm_content utm_campaign].each do |name|
|
26
|
-
self[name] = query_values[name]
|
28
|
+
self[name] = query_values[name] if respond_to?(:"#{name}=")
|
27
29
|
end
|
28
30
|
end
|
31
|
+
true
|
29
32
|
end
|
30
33
|
|
31
34
|
def set_technology
|
32
|
-
|
35
|
+
if respond_to?(:user_agent)
|
36
|
+
browser = Browser.new(ua: user_agent)
|
33
37
|
|
34
|
-
|
38
|
+
self.browser = browser.name if respond_to?(:browser=)
|
35
39
|
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
40
|
+
# TODO add more
|
41
|
+
self.os =
|
42
|
+
if browser.android?
|
43
|
+
"Android"
|
44
|
+
elsif browser.ios?
|
45
|
+
"iOS"
|
46
|
+
elsif browser.windows_phone?
|
47
|
+
"Windows Phone"
|
48
|
+
elsif browser.blackberry?
|
49
|
+
"Blackberry"
|
50
|
+
elsif browser.chrome_os?
|
51
|
+
"Chrome OS"
|
52
|
+
elsif browser.mac?
|
53
|
+
"Mac"
|
54
|
+
elsif browser.windows?
|
55
|
+
"Windows"
|
56
|
+
elsif browser.linux?
|
57
|
+
"Linux"
|
58
|
+
end if respond_to?(:os=)
|
55
59
|
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
60
|
+
self.device_type =
|
61
|
+
if browser.tv?
|
62
|
+
"TV"
|
63
|
+
elsif browser.console?
|
64
|
+
"Console"
|
65
|
+
elsif browser.tablet?
|
66
|
+
"Tablet"
|
67
|
+
elsif browser.mobile?
|
68
|
+
"Mobile"
|
69
|
+
else
|
70
|
+
"Desktop"
|
71
|
+
end if respond_to?(:device_type=)
|
72
|
+
end
|
73
|
+
true
|
68
74
|
end
|
69
75
|
|
70
76
|
def set_location
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
77
|
+
if respond_to?(:ip) and [:country=, :region=, :city=].any?{|method| respond_to?(method) }
|
78
|
+
location = Geocoder.search(ip).first rescue nil
|
79
|
+
if location
|
80
|
+
self.country = location.country.presence if respond_to?(:country=)
|
81
|
+
self.region = location.state.presence if respond_to?(:region=)
|
82
|
+
self.city = location.city.presence if respond_to?(:city=)
|
83
|
+
end
|
76
84
|
end
|
85
|
+
true
|
77
86
|
end
|
78
87
|
|
79
88
|
end # end class_eval
|
data/lib/ahoy/version.rb
CHANGED
data/lib/ahoy_matey.rb
CHANGED
@@ -14,6 +14,12 @@ module Ahoy
|
|
14
14
|
::Visit
|
15
15
|
end
|
16
16
|
|
17
|
+
# TODO private
|
18
|
+
# performance hack for referer-parser
|
19
|
+
def self.referrer_parser
|
20
|
+
@referrer_parser ||= RefererParser::Referer.new("https://github.com/ankane/ahoy")
|
21
|
+
end
|
22
|
+
|
17
23
|
end
|
18
24
|
|
19
25
|
ActionController::Base.send :include, Ahoy::Controller
|
@@ -1,10 +1,13 @@
|
|
1
1
|
class <%= migration_class_name %> < ActiveRecord::Migration
|
2
2
|
def change
|
3
3
|
create_table :visits do |t|
|
4
|
-
# cookies
|
4
|
+
# cookies *required*
|
5
5
|
t.string :visit_token
|
6
6
|
t.string :visitor_token
|
7
7
|
|
8
|
+
# the rest are recommended but optional
|
9
|
+
# simply remove the columns you don't want
|
10
|
+
|
8
11
|
# standard
|
9
12
|
t.string :ip
|
10
13
|
t.text :user_agent
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ahoy_matey
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Andrew Kane
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-03-
|
11
|
+
date: 2014-03-20 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: addressable
|