universal-track-manager 0.5 → 0.7.1

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: 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: []