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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 3906b1056d94f2c92bdf86c2e3899d463a77a94a76a3fbd45e0afd751f9e7945
4
- data.tar.gz: 36f420592997d79741c34e063ac4fe57899745cf38c8dce0316e8e334e6a7142
3
+ metadata.gz: effef80c0b51a369cb052778fd2302cbbc1d539eeaf4d784ad72957c3e457ffb
4
+ data.tar.gz: 1a9d7c3be57907198257122951066fec7174070722259c02d160b4fa05f84eb3
5
5
  SHA512:
6
- metadata.gz: 106a32e556cb93a3654d4b0efe240fb265405065e00248383eb034101ed2699077fb537fe2404db0d4087235ffbe91be2ba0b5361aad3b95b811d07258af5d7f
7
- data.tar.gz: 8d926fb725317451e5a94a76a2509196c5abfcfd280ce1dc20cd34a645bbcc82887fe08e27f5e08549a2b3fb5d5b1bc9aa30e3ab492e559265a173b9316315a9
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, size: 255
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
- t.string :utm_source, limit: 50
15
- t.string :utm_medium, limit: 50
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, [:utm_source, :utm_medium, :utm_campaign, :utm_content, :utm_term], name: "utm_all_combined"
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, length: 15
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
@@ -2,8 +2,8 @@ UniversalTrackManager.configure do |config|
2
2
  config.track_ips = true
3
3
  config.track_utms = true
4
4
  config.track_user_agent = true
5
-
5
+ #GENERATOR INSERTS CAMPAIGN COLUMN CONFIG HERE
6
6
 
7
7
  # config.track_referrer = false
8
8
 
9
- end
9
+ end
@@ -1,4 +1,5 @@
1
- require 'rails/generators/active_record'
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
- migration_template "create_universal_track_manager_tables.rb", "db/migrate/create_universal_track_manager_tables.rb"
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
- copy_file 'universal_track_manager.rb', 'config/initializers/universal_track_manager.rb'
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(:utm_campaign, :utm_source, :utm_term, :utm_content, :utm_medium)
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..255]
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?({utm_campaign: utm_campaign,
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
- [:utm_campaign, :utm_source, :utm_medium, :utm_term, :utm_content].any? do |key|
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
- campaign = UniversalTrackManager::Campaign.find_or_create_by(
108
- utm_campaign: utm_campaign,
109
- utm_source: utm_source,
110
- utm_term: utm_term,
111
- utm_content: utm_content,
112
- utm_medium: utm_medium
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 ! [:utm_campaign, :utm_source, :utm_medium, :utm_term, :utm_content].any? do |key|
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
- return campaign.utm_campaign == params[:utm_campaign] &&
19
- campaign.utm_source == params[:utm_source] &&
20
- campaign.utm_medium == params[:utm_medium] &&
21
- campaign.utm_term == params[:utm_term] &&
22
- campaign.utm_content == params[:utm_content]
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
@@ -1,3 +1,3 @@
1
1
  module UniversalTrackManager
2
- VERSION = "0.6.2"
2
+ VERSION = "0.7.3"
3
3
  end
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.6.2
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: 2020-01-01 00:00:00.000000000 Z
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.17'
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.17'
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: jason.fb@datatravels.com
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: http://rubygems.org/gems/unverisal-track-manager
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.1.4
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: []