universal-track-manager 0.6.1.alpha → 0.7.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/generators/templates/create_universal_track_manager_tables.rb +7 -8
- data/lib/generators/templates/universal_track_manager.rb +2 -2
- data/lib/generators/universal_track_manager/install_generator.rb +55 -3
- data/lib/universal_track_manager.rb +10 -2
- data/lib/universal_track_manager/controllers/concerns/universal_track_manager_concern.rb +22 -40
- data/lib/universal_track_manager/models/visit.rb +7 -6
- data/lib/version.rb +1 -1
- metadata +30 -14
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b14612eb9b74067e03470869a18741fde4da4cdc9568e5386959d0d70dd040fc
|
4
|
+
data.tar.gz: ef65a2a872240dfbd777c0b2e79d23fb5e648d464c7401507e44b5b38a3f254b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ef11115f228a22643f38dcfde49c8c1d7403a062a3c3113c9217bbf9e32e29bd43f4a72e481772ca4194d86315a6ccaf6d825ca93e8b1956d947dc9ecfb7fa30
|
7
|
+
data.tar.gz: c0c4537dd8e38e3d827294781dc3357efe28260545130f240b3a05fb69c7817fcc56789a8b095bc22c6b215b8233a83eab12b103054cfd805f0f99910a41d2c3
|
@@ -4,22 +4,20 @@ class CreateUniversalTrackManagerTables < ActiveRecord::Migration<%= migration_v
|
|
4
4
|
|
5
5
|
create_table :browsers do |t|
|
6
6
|
# this table gets automatically populated by inbound traffic
|
7
|
-
t.string :name,
|
7
|
+
t.string :name, limit: 255
|
8
|
+
t.timestamps
|
8
9
|
end
|
9
10
|
|
10
11
|
add_index :browsers, :name
|
11
12
|
|
12
13
|
create_table :campaigns do |t|
|
13
14
|
# this table gets automatically populated by inbound traffic
|
14
|
-
|
15
|
-
t.string :
|
16
|
-
t.string :utm_campaign, limit: 50
|
17
|
-
t.string :utm_content, limit: 50
|
18
|
-
t.string :utm_term, limit: 50
|
15
|
+
#GENERATOR INSERTS CAMPAIGN COLUMNS HERE
|
16
|
+
t.string :sha1, limit: 40
|
19
17
|
t.timestamps
|
20
18
|
end
|
21
19
|
|
22
|
-
add_index :campaigns,
|
20
|
+
add_index :campaigns, :sha1
|
23
21
|
|
24
22
|
create_table :visits do |t|
|
25
23
|
t.datetime :first_pageload
|
@@ -27,10 +25,11 @@ class CreateUniversalTrackManagerTables < ActiveRecord::Migration<%= migration_v
|
|
27
25
|
t.integer :original_visit_id
|
28
26
|
t.integer :campaign_id
|
29
27
|
t.integer :browser_id
|
30
|
-
t.string :ip_v4_address,
|
28
|
+
t.string :ip_v4_address, limit: 15
|
31
29
|
|
32
30
|
t.integer :viewport_width
|
33
31
|
t.integer :viewport_height
|
32
|
+
t.timestamps
|
34
33
|
end
|
35
34
|
end
|
36
35
|
end
|
@@ -1,4 +1,7 @@
|
|
1
|
-
|
1
|
+
|
2
|
+
require 'rails/generators'
|
3
|
+
|
4
|
+
require 'byebug'
|
2
5
|
|
3
6
|
module UniversalTrackManager
|
4
7
|
class InstallGenerator < Rails::Generators::Base
|
@@ -10,6 +13,13 @@ module UniversalTrackManager
|
|
10
13
|
|
11
14
|
class_option :orm, type: 'boolean'
|
12
15
|
|
16
|
+
class_option :param_list, type: :string, default: nil # DEPRECATED --- DO NOT USE
|
17
|
+
|
18
|
+
|
19
|
+
|
20
|
+
class_option :add, type: :string, default: nil
|
21
|
+
class_option :only, type: :string, default: nil
|
22
|
+
|
13
23
|
|
14
24
|
def self.next_migration_number(path)
|
15
25
|
Time.now.utc.strftime("%Y%m%d%H%M%S")
|
@@ -17,11 +27,53 @@ module UniversalTrackManager
|
|
17
27
|
|
18
28
|
desc "Creates an initializer for Universal Track Manager and copy files to your application."
|
19
29
|
def create_universal_track_manager_migration
|
20
|
-
|
30
|
+
# guard against pre-0.7.3 sytnax
|
31
|
+
if options['param_list']
|
32
|
+
puts "Oops (FATAL): param_list is removed; use 'add' to augment the default list of fields or use 'only' to replace it"
|
33
|
+
exit
|
34
|
+
end
|
35
|
+
|
36
|
+
# guard against using both 'add' and 'only'
|
37
|
+
if options['add'] && options['only']
|
38
|
+
puts "Oops (FATAL): You specified both 'add' and 'only'; use 'add' to augment the default list of fields OR use 'only' to replace it"
|
39
|
+
exit
|
40
|
+
end
|
41
|
+
|
42
|
+
@default_params = %w{utm_source utm_medium utm_campaign utm_content utm_term}
|
43
|
+
|
44
|
+
if options['add']
|
45
|
+
options['add'].split(",").each do |p|
|
46
|
+
if !@default_params.include?(p)
|
47
|
+
@default_params << p
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
|
53
|
+
if options['only']
|
54
|
+
@default_params = []
|
55
|
+
options['only'].split(",").each do |p|
|
56
|
+
@default_params << p
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
column_defs = ""
|
61
|
+
@default_params.each do |p|
|
62
|
+
column_defs += " t.string :#{p}, limit:256\n"
|
63
|
+
end
|
64
|
+
copy_file "create_universal_track_manager_tables.rb", "#{self.class.source_root}/create_universal_track_manager_tables.rb-staged"
|
65
|
+
gsub_file "#{self.class.source_root}/create_universal_track_manager_tables.rb-staged", "#GENERATOR INSERTS CAMPAIGN COLUMNS HERE", column_defs
|
66
|
+
migration_template "create_universal_track_manager_tables.rb-staged", "db/migrate/create_universal_track_manager_tables.rb"
|
67
|
+
|
68
|
+
remove_file "#{self.class.source_root}/create_universal_track_manager_tables.rb-staged"
|
21
69
|
end
|
22
70
|
|
23
71
|
def create_universal_track_manager_initializer
|
24
|
-
|
72
|
+
column_config = "config.campaign_columns = '#{options.param_list}'"
|
73
|
+
copy_file "universal_track_manager.rb", "#{self.class.source_root}/universal_track_manager.rb-staged"
|
74
|
+
gsub_file "#{self.class.source_root}/universal_track_manager.rb-staged", "#GENERATOR INSERTS CAMPAIGN COLUMN CONFIG HERE", column_config
|
75
|
+
copy_file 'universal_track_manager.rb-staged', 'config/initializers/universal_track_manager.rb'
|
76
|
+
remove_file "#{self.class.source_root}/universal_track_manager.rb-staged"
|
25
77
|
end
|
26
78
|
|
27
79
|
def migration_version
|
@@ -4,7 +4,7 @@ module UniversalTrackManager
|
|
4
4
|
require "railtie.rb" if defined?(Rails)
|
5
5
|
|
6
6
|
class Settings
|
7
|
-
attr_accessor :track_ips, :track_utms, :track_user_agent, :track_http_referrer
|
7
|
+
attr_accessor :track_ips, :track_utms, :track_user_agent, :track_http_referrer, :campaign_columns
|
8
8
|
end
|
9
9
|
|
10
10
|
def self.configure(&block)
|
@@ -13,7 +13,6 @@ module UniversalTrackManager
|
|
13
13
|
block.call(@_settings)
|
14
14
|
end
|
15
15
|
|
16
|
-
|
17
16
|
def self.track_ips?
|
18
17
|
@_settings.track_ips
|
19
18
|
end
|
@@ -29,6 +28,15 @@ module UniversalTrackManager
|
|
29
28
|
def self.track_http_referrer?
|
30
29
|
@_settings.track_http_referrer
|
31
30
|
end
|
31
|
+
|
32
|
+
def self.campaign_column_names
|
33
|
+
@campaign_column_names ||= @_settings.campaign_columns.split(',')
|
34
|
+
end
|
35
|
+
|
36
|
+
def self.campaign_column_symbols
|
37
|
+
@campaign_column_symbols ||= @_settings.campaign_columns.split(',').map{|c| c.to_sym}
|
38
|
+
end
|
39
|
+
|
32
40
|
end
|
33
41
|
|
34
42
|
|
@@ -2,12 +2,21 @@ module UniversalTrackManagerConcern
|
|
2
2
|
extend ActiveSupport::Concern
|
3
3
|
attr_accessor :visit_evicted
|
4
4
|
|
5
|
+
|
6
|
+
|
5
7
|
included do
|
6
8
|
before_action :track_visitor
|
9
|
+
|
10
|
+
UniversalTrackManager.campaign_column_symbols.each do |s|
|
11
|
+
define_method(s) do
|
12
|
+
return nil if ! UniversalTrackManager.track_utms?
|
13
|
+
permitted_utm_params[s]
|
14
|
+
end
|
15
|
+
end
|
7
16
|
end
|
8
17
|
|
9
18
|
def permitted_utm_params
|
10
|
-
params.permit(
|
19
|
+
params.permit(*(UniversalTrackManager.campaign_column_symbols))
|
11
20
|
end
|
12
21
|
|
13
22
|
|
@@ -21,32 +30,6 @@ module UniversalTrackManagerConcern
|
|
21
30
|
request.user_agent[0..255]
|
22
31
|
end
|
23
32
|
|
24
|
-
|
25
|
-
def utm_campaign
|
26
|
-
return nil if ! UniversalTrackManager.track_utms?
|
27
|
-
permitted_utm_params[:utm_campaign]
|
28
|
-
end
|
29
|
-
|
30
|
-
def utm_source
|
31
|
-
return nil if ! UniversalTrackManager.track_utms?
|
32
|
-
permitted_utm_params[:utm_source]
|
33
|
-
end
|
34
|
-
|
35
|
-
def utm_term
|
36
|
-
return nil if ! UniversalTrackManager.track_utms?
|
37
|
-
permitted_utm_params[:utm_term]
|
38
|
-
end
|
39
|
-
|
40
|
-
def utm_content
|
41
|
-
return nil if ! UniversalTrackManager.track_utms?
|
42
|
-
permitted_utm_params[:utm_content]
|
43
|
-
end
|
44
|
-
|
45
|
-
def utm_medium
|
46
|
-
return nil if ! UniversalTrackManager.track_utms?
|
47
|
-
permitted_utm_params[:utm_medium]
|
48
|
-
end
|
49
|
-
|
50
33
|
def now
|
51
34
|
@now ||= Time.now
|
52
35
|
end
|
@@ -71,11 +54,7 @@ module UniversalTrackManagerConcern
|
|
71
54
|
begin
|
72
55
|
existing_visit = UniversalTrackManager::Visit.find(session['visit_id'])
|
73
56
|
|
74
|
-
evict_visit!(existing_visit) if any_utm_params? && !existing_visit.matches_all_utms?(
|
75
|
-
utm_source: utm_source,
|
76
|
-
utm_term: utm_term,
|
77
|
-
utm_content: utm_content,
|
78
|
-
utm_medium: utm_medium})
|
57
|
+
evict_visit!(existing_visit) if any_utm_params? && !existing_visit.matches_all_utms?(permitted_utm_params)
|
79
58
|
|
80
59
|
evict_visit!(existing_visit) if existing_visit.ip_v4_address != ip_address
|
81
60
|
evict_visit!(existing_visit) if existing_visit.browser && existing_visit.browser.name != user_agent
|
@@ -92,7 +71,7 @@ module UniversalTrackManagerConcern
|
|
92
71
|
|
93
72
|
def any_utm_params?
|
94
73
|
return false if ! UniversalTrackManager.track_utms?
|
95
|
-
|
74
|
+
UniversalTrackManager.campaign_column_symbols.any? do |key|
|
96
75
|
params[key].present?
|
97
76
|
end
|
98
77
|
end
|
@@ -104,13 +83,16 @@ module UniversalTrackManagerConcern
|
|
104
83
|
|
105
84
|
def find_or_create_campaign_by_current
|
106
85
|
return nil if ! UniversalTrackManager.track_utms?
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
86
|
+
gen_sha1 = gen_campaign_key(permitted_utm_params)
|
87
|
+
|
88
|
+
# find_or_create_by finding only by sha1 would be nice here, but how to do so with a dynamic set of columns?
|
89
|
+
# we've got a small chance of dups here due to the non-atomic find/create and sha1, but that's ok for this application.
|
90
|
+
c = UniversalTrackManager::Campaign.find_by(sha1: gen_sha1)
|
91
|
+
c ||= UniversalTrackManager::Campaign.create(*(permitted_utm_params.merge({"sha1": gen_sha1})))
|
92
|
+
end
|
93
|
+
|
94
|
+
def gen_campaign_key(params)
|
95
|
+
Digest::SHA1.hexdigest(params.keys.map{|k| k.downcase()}.sort.map{|k| {"#{k}": params[k]}}.to_s)
|
114
96
|
end
|
115
97
|
|
116
98
|
def evict_visit!(old_visit)
|
@@ -9,16 +9,17 @@ class UniversalTrackManager::Visit < ActiveRecord::Base
|
|
9
9
|
if !campaign
|
10
10
|
# this visit has no campaign, which means all UTMs = null
|
11
11
|
# if any of the UTMs are present, return false (they don't match null)
|
12
|
-
return !
|
12
|
+
return ! UniversalTrackManager.campaign_column_symbols.any? do |key|
|
13
13
|
params[key].present?
|
14
14
|
end
|
15
15
|
end
|
16
16
|
|
17
17
|
# note params are allowed to be missing
|
18
|
-
|
19
|
-
campaign
|
20
|
-
|
21
|
-
|
22
|
-
|
18
|
+
UniversalTrackManager.campaign_column_symbols.each do |c|
|
19
|
+
if (campaign[c] && (campaign[c] != params[c])) || (!campaign[c] && params[c])
|
20
|
+
return false
|
21
|
+
end
|
22
|
+
end
|
23
|
+
return true
|
23
24
|
end
|
24
25
|
end
|
data/lib/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: universal-track-manager
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.7.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jason Fleetwood-Boldt
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2021-02-27 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|
@@ -28,16 +28,30 @@ dependencies:
|
|
28
28
|
name: simplecov
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
|
-
- - "
|
31
|
+
- - ">="
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version: '0
|
33
|
+
version: '0'
|
34
34
|
type: :development
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
|
-
- - "
|
38
|
+
- - ">="
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version: '0
|
40
|
+
version: '0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: simplecov-rcov
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ">="
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ">="
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
41
55
|
- !ruby/object:Gem::Dependency
|
42
56
|
name: appraisal
|
43
57
|
requirement: !ruby/object:Gem::Requirement
|
@@ -54,7 +68,7 @@ dependencies:
|
|
54
68
|
version: '2.2'
|
55
69
|
description: Simple, plug & play visitor tracking by user agent (browser), IP address,
|
56
70
|
referrer, and UTM parameters.
|
57
|
-
email:
|
71
|
+
email: tech@datatravels.com
|
58
72
|
executables: []
|
59
73
|
extensions: []
|
60
74
|
extra_rdoc_files: []
|
@@ -70,11 +84,13 @@ files:
|
|
70
84
|
- lib/universal_track_manager/models/campaign.rb
|
71
85
|
- lib/universal_track_manager/models/visit.rb
|
72
86
|
- lib/version.rb
|
73
|
-
homepage:
|
87
|
+
homepage: https://blog.jasonfleetwoodboldt.com/my-open-source-projects/universal-track-manager/
|
74
88
|
licenses:
|
75
89
|
- MIT
|
76
90
|
metadata:
|
77
91
|
source_code_uri: https://github.com/jasonfb/universal_track_manager
|
92
|
+
documentation_uri: https://jfb.teachable.com/p/gems-by-jason
|
93
|
+
homepage_uri: https://blog.jasonfleetwoodboldt.com/my-open-source-projects/universal-track-manager/
|
78
94
|
post_install_message: |
|
79
95
|
---------------------------------------------
|
80
96
|
Welcome to Universal Track Manager
|
@@ -92,12 +108,12 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
92
108
|
version: '0'
|
93
109
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
94
110
|
requirements:
|
95
|
-
- - "
|
111
|
+
- - ">="
|
96
112
|
- !ruby/object:Gem::Version
|
97
|
-
version:
|
113
|
+
version: '0'
|
98
114
|
requirements: []
|
99
|
-
rubygems_version: 3.
|
100
|
-
signing_key:
|
115
|
+
rubygems_version: 3.2.7
|
116
|
+
signing_key:
|
101
117
|
specification_version: 4
|
102
|
-
summary: A gem to track visitors to your website.
|
118
|
+
summary: A gem to track visitors and their UTMs to your website.
|
103
119
|
test_files: []
|