universal-track-manager 0.6.2 → 0.7.3
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.
- 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 +53 -3
- data/lib/universal_track_manager.rb +10 -2
- data/lib/universal_track_manager/controllers/concerns/universal_track_manager_concern.rb +23 -41
- data/lib/universal_track_manager/models/visit.rb +7 -6
- data/lib/version.rb +1 -1
- metadata +28 -12
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: effef80c0b51a369cb052778fd2302cbbc1d539eeaf4d784ad72957c3e457ffb
|
4
|
+
data.tar.gz: 1a9d7c3be57907198257122951066fec7174070722259c02d160b4fa05f84eb3
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d867d446f49b6fb992028a386ff14923c2bd119f0ccd15094e8dd29711c425c7da8e693ee92ca096c9957a5e98695c6887f62e61763e73f3f183df05419c9e8e
|
7
|
+
data.tar.gz: 90d080c638b06defa502d1e04b81dfe88ca42f7c9d33311b0db01fd39420c5bb3a1d9d993471ff12ccf2a7b93ba0a6b78ea6119af41b0f0a2edd446fa041ade4
|
@@ -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,5 @@
|
|
1
|
-
|
1
|
+
|
2
|
+
require 'rails/generators'
|
2
3
|
|
3
4
|
module UniversalTrackManager
|
4
5
|
class InstallGenerator < Rails::Generators::Base
|
@@ -10,6 +11,13 @@ module UniversalTrackManager
|
|
10
11
|
|
11
12
|
class_option :orm, type: 'boolean'
|
12
13
|
|
14
|
+
class_option :param_list, type: :string, default: nil # DEPRECATED --- DO NOT USE
|
15
|
+
|
16
|
+
|
17
|
+
|
18
|
+
class_option :add, type: :string, default: nil
|
19
|
+
class_option :only, type: :string, default: nil
|
20
|
+
|
13
21
|
|
14
22
|
def self.next_migration_number(path)
|
15
23
|
Time.now.utc.strftime("%Y%m%d%H%M%S")
|
@@ -17,11 +25,53 @@ module UniversalTrackManager
|
|
17
25
|
|
18
26
|
desc "Creates an initializer for Universal Track Manager and copy files to your application."
|
19
27
|
def create_universal_track_manager_migration
|
20
|
-
|
28
|
+
# guard against pre-0.7.3 sytnax
|
29
|
+
if options['param_list']
|
30
|
+
puts "Oops (FATAL): param_list is removed; use 'add' to augment the default list of fields or use 'only' to replace it"
|
31
|
+
exit
|
32
|
+
end
|
33
|
+
|
34
|
+
# guard against using both 'add' and 'only'
|
35
|
+
if options['add'] && options['only']
|
36
|
+
puts "Oops (FATAL): You specified both 'add' and 'only'; use 'add' to augment the default list of fields OR use 'only' to replace it"
|
37
|
+
exit
|
38
|
+
end
|
39
|
+
|
40
|
+
@default_params = %w{utm_source utm_medium utm_campaign utm_content utm_term}
|
41
|
+
|
42
|
+
if options['add']
|
43
|
+
options['add'].split(",").each do |p|
|
44
|
+
if !@default_params.include?(p)
|
45
|
+
@default_params << p
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
|
51
|
+
if options['only']
|
52
|
+
@default_params = []
|
53
|
+
options['only'].split(",").each do |p|
|
54
|
+
@default_params << p
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
column_defs = ""
|
59
|
+
@default_params.each do |p|
|
60
|
+
column_defs += " t.string :#{p}, limit:256\n"
|
61
|
+
end
|
62
|
+
copy_file "create_universal_track_manager_tables.rb", "#{self.class.source_root}/create_universal_track_manager_tables.rb-staged"
|
63
|
+
gsub_file "#{self.class.source_root}/create_universal_track_manager_tables.rb-staged", "#GENERATOR INSERTS CAMPAIGN COLUMNS HERE", column_defs
|
64
|
+
migration_template "create_universal_track_manager_tables.rb-staged", "db/migrate/create_universal_track_manager_tables.rb"
|
65
|
+
|
66
|
+
remove_file "#{self.class.source_root}/create_universal_track_manager_tables.rb-staged"
|
21
67
|
end
|
22
68
|
|
23
69
|
def create_universal_track_manager_initializer
|
24
|
-
|
70
|
+
column_config = "config.campaign_columns = '#{options.param_list}'"
|
71
|
+
copy_file "universal_track_manager.rb", "#{self.class.source_root}/universal_track_manager.rb-staged"
|
72
|
+
gsub_file "#{self.class.source_root}/universal_track_manager.rb-staged", "#GENERATOR INSERTS CAMPAIGN COLUMN CONFIG HERE", column_config
|
73
|
+
copy_file 'universal_track_manager.rb-staged', 'config/initializers/universal_track_manager.rb'
|
74
|
+
remove_file "#{self.class.source_root}/universal_track_manager.rb-staged"
|
25
75
|
end
|
26
76
|
|
27
77
|
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
|
|
@@ -18,33 +27,7 @@ module UniversalTrackManagerConcern
|
|
18
27
|
|
19
28
|
def user_agent
|
20
29
|
return nil if ! UniversalTrackManager.track_user_agent?
|
21
|
-
request.user_agent[0..
|
22
|
-
end
|
23
|
-
|
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]
|
30
|
+
request.user_agent[0..254]
|
48
31
|
end
|
49
32
|
|
50
33
|
def now
|
@@ -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.3
|
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-03-19 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
|
+
- !ruby/object:Gem::Version
|
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
|
+
- - ">="
|
39
53
|
- !ruby/object:Gem::Version
|
40
|
-
version: '0
|
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
|
@@ -96,8 +112,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
96
112
|
- !ruby/object:Gem::Version
|
97
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: []
|