universal-track-manager 0.6.1.alpha → 0.7.2

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: 6fead14dddac86eb0047bc7beb1db6a28581147f7f43e107365aa32185fbbcba
4
- data.tar.gz: 69f8eaf957d1fb86c7a6c292afba6df115607334eeada1ac5a63be4437187932
3
+ metadata.gz: b14612eb9b74067e03470869a18741fde4da4cdc9568e5386959d0d70dd040fc
4
+ data.tar.gz: ef65a2a872240dfbd777c0b2e79d23fb5e648d464c7401507e44b5b38a3f254b
5
5
  SHA512:
6
- metadata.gz: 1b50650f86698f0b48a0d586bf97889bb4f1dc80a5ea034cfcb3a24cd59783da3a4016609115e9b4d04161b8c7152034426ee360c32d14bc1711b0d80220625c
7
- data.tar.gz: 77a25d36fb0dab94d0a3071636614183aee70d90f01253c4d3015250f00f25442c9da350617298d36c40f849436c63c34c19cf430439e60b6714f1640c9190f8
6
+ metadata.gz: ef11115f228a22643f38dcfde49c8c1d7403a062a3c3113c9217bbf9e32e29bd43f4a72e481772ca4194d86315a6ccaf6d825ca93e8b1956d947dc9ecfb7fa30
7
+ data.tar.gz: c0c4537dd8e38e3d827294781dc3357efe28260545130f240b3a05fb69c7817fcc56789a8b095bc22c6b215b8233a83eab12b103054cfd805f0f99910a41d2c3
@@ -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
@@ -10,6 +13,13 @@ module UniversalTrackManager
10
13
 
11
14
  class_option :orm, type: 'boolean'
12
15
 
16
+ class_option :param_list, type: :string, default: nil # DEPRECATED --- DO NOT USE
17
+
18
+
19
+
20
+ class_option :add, type: :string, default: nil
21
+ class_option :only, type: :string, default: nil
22
+
13
23
 
14
24
  def self.next_migration_number(path)
15
25
  Time.now.utc.strftime("%Y%m%d%H%M%S")
@@ -17,11 +27,53 @@ module UniversalTrackManager
17
27
 
18
28
  desc "Creates an initializer for Universal Track Manager and copy files to your application."
19
29
  def create_universal_track_manager_migration
20
- migration_template "create_universal_track_manager_tables.rb", "db/migrate/create_universal_track_manager_tables.rb"
30
+ # guard against pre-0.7.3 sytnax
31
+ if options['param_list']
32
+ puts "Oops (FATAL): param_list is removed; use 'add' to augment the default list of fields or use 'only' to replace it"
33
+ exit
34
+ end
35
+
36
+ # guard against using both 'add' and 'only'
37
+ if options['add'] && options['only']
38
+ puts "Oops (FATAL): You specified both 'add' and 'only'; use 'add' to augment the default list of fields OR use 'only' to replace it"
39
+ exit
40
+ end
41
+
42
+ @default_params = %w{utm_source utm_medium utm_campaign utm_content utm_term}
43
+
44
+ if options['add']
45
+ options['add'].split(",").each do |p|
46
+ if !@default_params.include?(p)
47
+ @default_params << p
48
+ end
49
+ end
50
+ end
51
+
52
+
53
+ if options['only']
54
+ @default_params = []
55
+ options['only'].split(",").each do |p|
56
+ @default_params << p
57
+ end
58
+ end
59
+
60
+ column_defs = ""
61
+ @default_params.each do |p|
62
+ column_defs += " t.string :#{p}, limit:256\n"
63
+ end
64
+ copy_file "create_universal_track_manager_tables.rb", "#{self.class.source_root}/create_universal_track_manager_tables.rb-staged"
65
+ gsub_file "#{self.class.source_root}/create_universal_track_manager_tables.rb-staged", "#GENERATOR INSERTS CAMPAIGN COLUMNS HERE", column_defs
66
+ migration_template "create_universal_track_manager_tables.rb-staged", "db/migrate/create_universal_track_manager_tables.rb"
67
+
68
+ remove_file "#{self.class.source_root}/create_universal_track_manager_tables.rb-staged"
21
69
  end
22
70
 
23
71
  def create_universal_track_manager_initializer
24
- copy_file 'universal_track_manager.rb', 'config/initializers/universal_track_manager.rb'
72
+ column_config = "config.campaign_columns = '#{options.param_list}'"
73
+ copy_file "universal_track_manager.rb", "#{self.class.source_root}/universal_track_manager.rb-staged"
74
+ gsub_file "#{self.class.source_root}/universal_track_manager.rb-staged", "#GENERATOR INSERTS CAMPAIGN COLUMN CONFIG HERE", column_config
75
+ copy_file 'universal_track_manager.rb-staged', 'config/initializers/universal_track_manager.rb'
76
+ remove_file "#{self.class.source_root}/universal_track_manager.rb-staged"
25
77
  end
26
78
 
27
79
  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
 
@@ -21,32 +30,6 @@ module UniversalTrackManagerConcern
21
30
  request.user_agent[0..255]
22
31
  end
23
32
 
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]
48
- end
49
-
50
33
  def now
51
34
  @now ||= Time.now
52
35
  end
@@ -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.1.alpha"
2
+ VERSION = "0.7.2"
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.1.alpha
4
+ version: 0.7.2
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-02-27 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
39
  - !ruby/object:Gem::Version
40
- version: '0.17'
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
+ - - ">="
53
+ - !ruby/object:Gem::Version
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
@@ -92,12 +108,12 @@ required_ruby_version: !ruby/object:Gem::Requirement
92
108
  version: '0'
93
109
  required_rubygems_version: !ruby/object:Gem::Requirement
94
110
  requirements:
95
- - - ">"
111
+ - - ">="
96
112
  - !ruby/object:Gem::Version
97
- version: 1.3.1
113
+ version: '0'
98
114
  requirements: []
99
- rubygems_version: 3.0.8
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: []