universal-track-manager 0.6.2 → 0.7.3

Sign up to get free protection for your applications and to get access to all the features.
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: []