universal-track-manager 0.5 → 0.7.1

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: 4312fd929dea85d8ab47c55a838559798b283ff744bccc41fdc520ed70b87f64
4
- data.tar.gz: ca80c8c79dfe048917d9bdbb9e18dd6eec77ff3fb4aed584a7e7bf4fc52cd634
3
+ metadata.gz: 8712d19c21825899298ab6fb39d7d1d97299261003898e730db82e6b72fe44bf
4
+ data.tar.gz: c215ac7ba9ef0ce32bc9abf0c9d3742ed68e108103725b3b1ef74b71635336d1
5
5
  SHA512:
6
- metadata.gz: 4b78e693a629d239e00344c42d518e77610376bd458c2d3e90bb07e387e1f0d6f3e7701200ec2cc923d07e49f9d7a647db4c1df2acab7d73decfdfffa511c967
7
- data.tar.gz: c9e25b5b7bd96755ed6a889647662efa8c2c4d7ff723ace67783b4073b5b3c00c4395f8c5c6e4273bce81f85b23f53819a6df5cc9f27b6266a6047a5e4975934
6
+ metadata.gz: 513b88940fbd32c3e535c4b8e4eb4e43ffc797bbb5df8f8dd90b4b2faa94075557d44975c1a44714eaca871476095ff02ee73bc9f4790e937c4cb93d336e258a
7
+ data.tar.gz: 42a4c1af1fb267ca4280b3e25028d7a130ca76c0fbd79f4f0ad947eb1d167e5ce6c3f78211763ec7e652fecc09d9b5be6d645a0719606ec0f735aa1b179f5814
@@ -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,7 @@
1
- require 'rails/generators/active_record'
1
+
2
+ require 'rails/generators'
3
+
4
+ require 'byebug'
2
5
 
3
6
  module UniversalTrackManager
4
7
  class InstallGenerator < Rails::Generators::Base
@@ -9,6 +12,7 @@ module UniversalTrackManager
9
12
  source_root File.expand_path('../templates', __dir__)
10
13
 
11
14
  class_option :orm, type: 'boolean'
15
+ class_option :param_list, type: :string, default: 'utm_source,utm_medium,utm_campaign,utm_content,utm_term'
12
16
 
13
17
 
14
18
  def self.next_migration_number(path)
@@ -17,11 +21,21 @@ module UniversalTrackManager
17
21
 
18
22
  desc "Creates an initializer for Universal Track Manager and copy files to your application."
19
23
  def create_universal_track_manager_migration
20
- migration_template "create_universal_track_manager_tables.rb", "db/migrate/create_universal_track_manager_tables.rb"
24
+ @params = options['param_list']
25
+ column_defs = ""
26
+ @params.split(',').each do |p|
27
+ column_defs += " t.string :#{p}, limit:256\n"
28
+ end
29
+ copy_file "create_universal_track_manager_tables.rb", "#{self.class.source_root}/create_universal_track_manager_tables.rb-staged"
30
+ gsub_file "#{self.class.source_root}/create_universal_track_manager_tables.rb-staged", "#GENERATOR INSERTS CAMPAIGN COLUMNS HERE", column_defs
31
+ migration_template "create_universal_track_manager_tables.rb-staged", "db/migrate/create_universal_track_manager_tables.rb"
21
32
  end
22
33
 
23
34
  def create_universal_track_manager_initializer
24
- copy_file 'universal_track_manager.rb', 'config/initializers/universal_track_manager.rb'
35
+ column_config = "config.campaign_columns = '#{options.param_list}'"
36
+ copy_file "universal_track_manager.rb", "#{self.class.source_root}/universal_track_manager.rb-staged"
37
+ gsub_file "#{self.class.source_root}/universal_track_manager.rb-staged", "#GENERATOR INSERTS CAMPAIGN COLUMN CONFIG HERE", column_config
38
+ copy_file 'universal_track_manager.rb-staged', 'config/initializers/universal_track_manager.rb'
25
39
  end
26
40
 
27
41
  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
 
@@ -1,14 +1,22 @@
1
1
  module UniversalTrackManagerConcern
2
2
  extend ActiveSupport::Concern
3
-
4
3
  attr_accessor :visit_evicted
5
4
 
5
+
6
+
6
7
  included do
7
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
8
16
  end
9
17
 
10
18
  def permitted_utm_params
11
- params.permit(:utm_campaign, :utm_source, :utm_term, :utm_content, :utm_medium)
19
+ params.permit(*(UniversalTrackManager.campaign_column_symbols))
12
20
  end
13
21
 
14
22
 
@@ -22,43 +30,19 @@ module UniversalTrackManagerConcern
22
30
  request.user_agent[0..255]
23
31
  end
24
32
 
25
-
26
- def utm_campaign
27
- return nil if ! UniversalTrackManager.track_utms?
28
- permitted_utm_params[:utm_campaign]
29
- end
30
-
31
- def utm_source
32
- return nil if ! UniversalTrackManager.track_utms?
33
- permitted_utm_params[:utm_source]
34
- end
35
-
36
- def utm_term
37
- return nil if ! UniversalTrackManager.track_utms?
38
- permitted_utm_params[:utm_term]
39
- end
40
-
41
- def utm_content
42
- return nil if ! UniversalTrackManager.track_utms?
43
- permitted_utm_params[:utm_content]
44
- end
45
-
46
- def utm_medium
47
- return nil if ! UniversalTrackManager.track_utms?
48
- permitted_utm_params[:utm_medium]
49
- end
50
-
51
33
  def now
52
34
  @now ||= Time.now
53
35
  end
54
36
 
55
37
  def new_visitor
56
- visit = UniversalTrackManager::Visit.create!(
38
+ params = {
57
39
  first_pageload: now,
58
40
  last_pageload: now,
59
41
  ip_v4_address: ip_address,
60
- browser: find_or_create_browser_by_current,
61
- campaign: find_or_create_campaign_by_current)
42
+ campaign: find_or_create_campaign_by_current
43
+ }
44
+ params[:browser] = find_or_create_browser_by_current if request.user_agent
45
+ visit = UniversalTrackManager::Visit.create!(params)
62
46
  session[:visit_id] = visit.id
63
47
  end
64
48
 
@@ -70,11 +54,7 @@ module UniversalTrackManagerConcern
70
54
  begin
71
55
  existing_visit = UniversalTrackManager::Visit.find(session['visit_id'])
72
56
 
73
- evict_visit!(existing_visit) if any_utm_params? && !existing_visit.matches_all_utms?({utm_campaign: utm_campaign,
74
- utm_source: utm_source,
75
- utm_term: utm_term,
76
- utm_content: utm_content,
77
- utm_medium: utm_medium})
57
+ evict_visit!(existing_visit) if any_utm_params? && !existing_visit.matches_all_utms?(permitted_utm_params)
78
58
 
79
59
  evict_visit!(existing_visit) if existing_visit.ip_v4_address != ip_address
80
60
  evict_visit!(existing_visit) if existing_visit.browser && existing_visit.browser.name != user_agent
@@ -91,7 +71,7 @@ module UniversalTrackManagerConcern
91
71
 
92
72
  def any_utm_params?
93
73
  return false if ! UniversalTrackManager.track_utms?
94
- [:utm_campaign, :utm_source, :utm_medium, :utm_term, :utm_content].any? do |key|
74
+ UniversalTrackManager.campaign_column_symbols.any? do |key|
95
75
  params[key].present?
96
76
  end
97
77
  end
@@ -103,25 +83,32 @@ module UniversalTrackManagerConcern
103
83
 
104
84
  def find_or_create_campaign_by_current
105
85
  return nil if ! UniversalTrackManager.track_utms?
106
- campaign = UniversalTrackManager::Campaign.find_or_create_by(
107
- utm_campaign: utm_campaign,
108
- utm_source: utm_source,
109
- utm_term: utm_term,
110
- utm_content: utm_content,
111
- utm_medium: utm_medium
112
- )
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)
113
96
  end
114
97
 
115
98
  def evict_visit!(old_visit)
116
99
  @visit_evicted = true
117
- visit = UniversalTrackManager::Visit.create!(
118
- first_pageload: now,
119
- last_pageload: now,
120
- original_visit_id: old_visit.original_visit_id.nil? ? old_visit.id : old_visit.original_visit_id,
121
- ip_v4_address: ip_address,
122
- browser: find_or_create_browser_by_current,
123
- campaign: find_or_create_campaign_by_current)
100
+ params = {
101
+ first_pageload: now,
102
+ last_pageload: now,
103
+ original_visit_id: old_visit.original_visit_id.nil? ? old_visit.id : old_visit.original_visit_id,
104
+ ip_v4_address: ip_address,
105
+ campaign: find_or_create_campaign_by_current
106
+ }
107
+
108
+ # fail silently if there is no user agent
109
+ params[:browser] = find_or_create_browser_by_current if request.user_agent
110
+ visit = UniversalTrackManager::Visit.create!(params)
124
111
 
125
112
  session[:visit_id] = visit.id
126
113
  end
127
- end
114
+ end
@@ -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.5"
3
- end
2
+ VERSION = "0.7.1"
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.5'
4
+ version: 0.7.1
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: 2020-10-29 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
@@ -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.0.3
100
- signing_key:
115
+ rubygems_version: 3.2.7
116
+ signing_key:
101
117
  specification_version: 4
102
118
  summary: A gem to track visitors to your website.
103
119
  test_files: []