user_trackers 0.0.1 → 0.0.10

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
  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