user_trackers 0.0.1 → 0.0.10

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
  SHA1:
3
- metadata.gz: 45254bd500709a6f99312f7c71f347d032fae676
4
- data.tar.gz: daf9b64ed846830ee912a80ab06ef2370ec8de56
3
+ metadata.gz: bfe6207e035cb0d31d361fc360d07d94ec143547
4
+ data.tar.gz: a07c0bd5fa054535613897abf0d8c8328d209637
5
5
  SHA512:
6
- metadata.gz: f7ac6a9f98d9b621d100a0513a6a2455557ba1959ca87ebc36a82435e3de93a1be8c85d320461bcce8d89c2debda286400fc18efc9146a9b1c938cb0ede3d191
7
- data.tar.gz: 47809b292fe84f0d4e8c632ed7e5f17c1f0eff2fc7c1ee6025e18ffc9c9a1e461e33716209479283a25bb00acebf4755e67db900e0d025b3d5e05d0bc4754360
6
+ metadata.gz: 66cee611f10f450cf1b2f73259de9eb692f7887fbd8ab251dd3d6e4e4ecb93bdf1c30dbf6e90d09ef1ea2843b26b579fb78c3802b8f32dcfb748ee2e045b56c9
7
+ data.tar.gz: c06321d42df1a6514289e7478a0a960298e04f52b3f9cd5afcf968f6d0684327662876ce4c53ba00e05fc12d0e45e894b79943b9cf9bf362591f8142bad639af
@@ -0,0 +1,22 @@
1
+ UserTrackers.configure_intercom do |config|
2
+ def config.user_attributes(user_id, event_name, event_attributes = {}, anonymous_id)
3
+ user = User.find(user_id)
4
+ {
5
+ user_id: user_id,
6
+ email: user.email,
7
+ name: user.full_name,
8
+ phone: user.phone_number
9
+ }
10
+ end
11
+
12
+ def config.event_attributes(user_id, event_name, event_attributes = {}, anonymous_id)
13
+ user = User.find(user_id)
14
+ {
15
+ user_id: user_id,
16
+ event_name: event_name,
17
+ email: user.email,
18
+ created_at: Time.now.to_i,
19
+ metadata: event_attributes&.first(5).to_h || {}
20
+ }
21
+ end
22
+ end
@@ -0,0 +1,14 @@
1
+ UserTrackers.configure_mixpanel do |config|
2
+ def config.user_attributes(user_id, event_name, event_attributes = {}, anonymous_id)
3
+ user = User.find(user_id)
4
+ {
5
+ '$first_name': user.first_name,
6
+ '$last_name': user.last_name,
7
+ '$email': user.email,
8
+ }
9
+ end
10
+
11
+ def config.event_attributes(user_id, event_name, event_attributes = {}, anonymous_id)
12
+ event_attributes
13
+ end
14
+ end
@@ -0,0 +1,15 @@
1
+ UserTrackers.configure_slack do |config|
2
+ def config.message_for_event(user_id, event_name, event_attributes = {}, anonymous_id)
3
+ user = User.find(user_id) if user_id.present?
4
+ user_name = user.present? ? user.full_name : "An anonymous person with id #{anonymous_id || ''}"
5
+
6
+ case event_name
7
+ when event_name == 'user_registered' || event_name == 'user_updated_info'
8
+ messages = ["A user #{user.full_name} (#{user.email}) either registered or updated their info."]
9
+ messages << ["They are being connected with anonymous_id #{anonymous_id}."] if anonymous_id
10
+ messages.join(" ")
11
+ else
12
+ "*#{user_name}* performed event `#{event_name}`. Associated data: `#{event_attributes}`"
13
+ end
14
+ end
15
+ end
@@ -3,16 +3,18 @@ module UserTrackers
3
3
  source_root File.expand_path('../templates', __dir__)
4
4
 
5
5
  def create_configuration_files
6
- copy_file "user_trackers.rb", "config/initializers/user_trackers.rb"
6
+ UserTrackers.trackers.each do |tracker|
7
+ copy_file "configure_#{tracker}.rb", "config/initializers/user_trackers/configure_#{tracker}.rb"
8
+ end
7
9
  copy_file "user_trackers.yml", "config/user_trackers.yml"
8
10
  end
9
11
 
10
12
  def generate_model
11
13
  invoke "active_record:model", ['UserEvent', [
12
- "user_id:integer:index",
14
+ "user_id:string:index",
15
+ "anonymous_id:string",
13
16
  "event_name:string:index",
14
- "event_details:json",
15
- "anonymous_id:integer"
17
+ "event_attributes:json"
16
18
  ]], migration: true
17
19
  end
18
20
  end
@@ -1,54 +1,84 @@
1
+ require 'sidekiq'
2
+ require 'resque'
3
+ require 'mixpanel-ruby'
4
+ require 'intercom'
5
+ require 'uuid'
6
+ require 'slack-ruby-client'
7
+
1
8
  require "user_trackers/configuration"
2
9
  require "user_trackers/mixpanel_tracker"
3
10
  require "user_trackers/intercom_tracker"
4
11
  require "user_trackers/slack_tracker"
5
-
6
- require 'mixpanel-ruby'
7
- require 'intercom'
8
- require 'slack-ruby-client'
12
+ require "user_trackers/workers/sidekiq_worker"
13
+ require "user_trackers/workers/resque_worker"
9
14
 
10
15
  module UserTrackers
11
-
12
16
  class << self
13
17
  attr_accessor :options
14
18
  end
15
19
 
20
+ TRACKERS = ['mixpanel','intercom','slack']
21
+ def self.trackers
22
+ TRACKERS
23
+ end
24
+
16
25
  def self.options
17
26
  @options ||= Configuration.get_yml_options
18
27
  end
19
28
 
20
- def self.configure_mixpanel
21
- yield(MixpanelTracker)
22
- end
23
-
24
- def self.configure_slack
25
- yield(SlackTracker)
26
- end
27
-
28
- def self.configure_intercom
29
- yield(IntercomTracker)
30
- end
31
-
32
29
  def self.ignore_event?(event_name, tracker = nil)
33
- ignore_events = tracker ? options[Rails.env.to_sym][tracker][:ignore_events] : options[Rails.env.to_sym][:ignore_events]
30
+ ignore_events = tracker ? options[Rails.env.to_sym][tracker][:ignore_events] || [] : options[Rails.env.to_sym][:ignore_events] || []
34
31
  ignore_events.include?(event_name) || ignore_events.include?('*')
35
32
  end
36
33
 
37
- def self.track(user_id, event_name, event_attributes = {}, anonymous_id = nil)
38
- if(!ignore_event? (event_name))
39
- if(!ignore_event?(event_name, :db))
40
- UserEvent.create(user_id: user_id, event_name: event_name, event_details: event_attributes, anonymous_id: anonymous_id)
41
- end
42
- if(!ignore_event?(event_name, :mixpanel))
43
- MixpanelTracker.track(user_id, event_name, event_attributes, anonymous_id)
34
+ def self._track(params)
35
+ if !ignore_event? params['event_name']
36
+ if !options[Rails.env.to_sym][:db] || !ignore_event?(params['event_name'], :db)
37
+ UserEvent.create(
38
+ anonymous_id: params['anonymous_id'],
39
+ event_name:'logged_in_as',
40
+ event_attributes:{ user_id: params['user_id'] }
41
+ ) if params['user_logged_in']
42
+ UserEvent.create(params.except('user_logged_in'))
44
43
  end
45
- if(!ignore_event?(event_name, :intercom))
46
- IntercomTracker.track(user_id, event_name, event_attributes, anonymous_id)
44
+ trackers.each do |tracker|
45
+ if options[Rails.env.to_sym][tracker.to_sym]
46
+ if !ignore_event?(params['event_name'], tracker.to_sym)
47
+ eval("#{tracker.capitalize}Tracker.track(params)")
48
+ end
49
+ end
47
50
  end
48
- if(!ignore_event?(event_name, :slack))
49
- SlackTracker.track(user_id, event_name, event_attributes, anonymous_id)
51
+ end
52
+ end
53
+
54
+ def self.track(params, session = nil)
55
+ if session
56
+ if params[:user_id] && session['anonymous_id']
57
+ params[:user_logged_in] = true
58
+ params[:anonymous_id] = session['anonymous_id']
59
+ session.delete('anonymous_id')
60
+ elsif !params[:user_id]
61
+ session['anonymous_id'] ||= UUID.new.generate
62
+ params[:anonymous_id] = session['anonymous_id']
50
63
  end
51
64
  end
65
+ params[:anonymous_id] ||= UUID.new.generate
66
+
67
+ # for usage with sidekiq and resque
68
+ params = params.as_json
69
+
70
+ if options[Rails.env.to_sym][:queue_adapter] == 'sidekiq'
71
+ SidekiqWorker.perform_async(params)
72
+ elsif options[Rails.env.to_sym][:queue_adapter] == 'resque'
73
+ Resque.enqueue(RescueWorker, params)
74
+ else
75
+ _track(params)
76
+ end
52
77
  end
78
+ end
53
79
 
80
+ UserTrackers.trackers.each do |tracker|
81
+ UserTrackers.module_eval("def self.configure_#{tracker}
82
+ yield(#{tracker.capitalize}Tracker)
83
+ end")
54
84
  end
@@ -9,9 +9,36 @@ module UserTrackers
9
9
  @client ||= Intercom::Client.new(token: opts[Rails.env.to_sym][:intercom][:token])
10
10
  end
11
11
 
12
- def self.track(user_id, event_name, event_attributes = {}, anonymous_id = nil)
13
- client.users.create(user_attributes(user_id, event_name, event_attributes, anonymous_id))
14
- client.events.create(event_attributes(user_id, event_name, event_attributes, anonymous_id))
12
+ def self.track(params)
13
+ user_id, event_name, event_attributes, anonymous_id, user_logged_in = params.values_at('user_id', 'event_name', 'event_attributes', 'anonymous_id', 'user_logged_in')
14
+ user_id = user_id.to_s if user_id
15
+ if user_id
16
+ client.users.create(user_attributes(user_id, event_name, event_attributes, anonymous_id))
17
+ client.events.create(event_attributes(user_id, event_name, event_attributes, anonymous_id))
18
+ if user_logged_in
19
+ contact_list = client.contacts.find(email: anonymous_id)
20
+ if !contact_list.contacts.empty?
21
+ contact_list.contacts.each do |contact|
22
+ lead = client.contacts.find(id: contact['id'])
23
+ client.contacts.convert(lead, Intercom::User.new(user_id: user_id))
24
+ end
25
+ end
26
+ end
27
+ else
28
+ contact_list = client.contacts.find(email: anonymous_id)
29
+ if contact_list.contacts.empty?
30
+ contact = client.contacts.create(email: anonymous_id)
31
+ id = contact.id
32
+ else
33
+ id = contact_list.contacts.first['id']
34
+ end
35
+ client.events.create( {
36
+ id: id,
37
+ event_name: event_name || "undefined_event",
38
+ created_at: Time.now.to_i,
39
+ metadata: event_attributes&.first(5).to_h || {},
40
+ })
41
+ end
15
42
  end
16
43
  end
17
44
  end
@@ -9,13 +9,15 @@ module UserTrackers
9
9
  @client ||= Mixpanel::Tracker.new(opts[Rails.env.to_sym][:mixpanel][:token])
10
10
  end
11
11
 
12
- def self.track(user_id, event_name, event_attributes = {}, anonymous_id = nil)
13
- client.people.set(user_id, user_attributes(user_id, event_name, event_attributes, anonymous_id))
12
+ def self.track(params)
13
+ user_id, event_name, event_attributes, anonymous_id, user_logged_in = params.values_at('user_id', 'event_name', 'event_attributes', 'anonymous_id', 'user_logged_in')
14
+ client.alias(user_id, anonymous_id) if user_logged_in
15
+ client.people.set(user_id, user_attributes(user_id, event_name, event_attributes, anonymous_id)) if user_id
14
16
  client.track(
15
17
  user_id || anonymous_id,
16
- event_name || "",
18
+ event_name || "undefined_event",
17
19
  event_attributes(user_id, event_name, event_attributes, anonymous_id) || {}
18
- )
20
+ )
19
21
  end
20
22
  end
21
23
  end
@@ -17,7 +17,14 @@ module UserTrackers
17
17
  @client
18
18
  end
19
19
 
20
- def self.track(user_id, event_name, event_attributes = {}, anonymous_id = nil)
20
+ def self.track(params)
21
+ user_id, event_name, event_attributes, anonymous_id, user_logged_in = params.values_at('user_id', 'event_name', 'event_attributes', 'anonymous_id', 'user_logged_in')
22
+ if user_logged_in
23
+ client.chat_postMessage(
24
+ channel: @activity_channel,
25
+ text: "An anonymous person with id *#{anonymous_id}* `logged in as` user with id *#{user_id}*"
26
+ )
27
+ end
21
28
  client.chat_postMessage(
22
29
  channel: @activity_channel,
23
30
  text: message_for_event(user_id, event_name, event_attributes, anonymous_id)
@@ -0,0 +1,11 @@
1
+ module UserTrackers
2
+ class RescueWorker
3
+ @queue = :user_events_queue
4
+
5
+ def self.perform(params)
6
+ UserTrackers._track(params)
7
+ end
8
+ end
9
+ end
10
+
11
+
@@ -0,0 +1,9 @@
1
+ module UserTrackers
2
+ class SidekiqWorker
3
+ include Sidekiq::Worker
4
+
5
+ def perform(params)
6
+ UserTrackers._track(params)
7
+ end
8
+ end
9
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: user_trackers
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.0.10
5
5
  platform: ruby
6
6
  authors:
7
7
  - Camilo Barraza
@@ -24,6 +24,20 @@ dependencies:
24
24
  - - ">="
25
25
  - !ruby/object:Gem::Version
26
26
  version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: resque
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
27
41
  - !ruby/object:Gem::Dependency
28
42
  name: mixpanel-ruby
29
43
  requirement: !ruby/object:Gem::Requirement
@@ -66,6 +80,20 @@ dependencies:
66
80
  - - ">="
67
81
  - !ruby/object:Gem::Version
68
82
  version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: uuid
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :runtime
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
69
97
  - !ruby/object:Gem::Dependency
70
98
  name: rake
71
99
  requirement: !ruby/object:Gem::Requirement
@@ -94,6 +122,20 @@ dependencies:
94
122
  - - "~>"
95
123
  - !ruby/object:Gem::Version
96
124
  version: '5.0'
125
+ - !ruby/object:Gem::Dependency
126
+ name: rspec
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - ">="
130
+ - !ruby/object:Gem::Version
131
+ version: '0'
132
+ type: :development
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - ">="
137
+ - !ruby/object:Gem::Version
138
+ version: '0'
97
139
  description: user trackers gem
98
140
  email: cbarraza11@gmail.com
99
141
  executables: []
@@ -103,13 +145,17 @@ files:
103
145
  - README.md
104
146
  - bin/console
105
147
  - bin/setup
106
- - lib/generators/templates/user_trackers.rb
148
+ - lib/generators/templates/configure_intercom.rb
149
+ - lib/generators/templates/configure_mixpanel.rb
150
+ - lib/generators/templates/configure_slack.rb
107
151
  - lib/generators/user_trackers/install_generator.rb
108
152
  - lib/user_trackers.rb
109
153
  - lib/user_trackers/configuration.rb
110
154
  - lib/user_trackers/intercom_tracker.rb
111
155
  - lib/user_trackers/mixpanel_tracker.rb
112
156
  - lib/user_trackers/slack_tracker.rb
157
+ - lib/user_trackers/workers/resque_worker.rb
158
+ - lib/user_trackers/workers/sidekiq_worker.rb
113
159
  homepage: https://rubygems.org/gems/user_trackers
114
160
  licenses:
115
161
  - MIT
@@ -1,2 +0,0 @@
1
-
2
- #coletera mix