mixpanelable 0.1.0 → 0.1.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.
- data/lib/mixpanelable.rb +7 -22
- data/lib/mixpanelable/adapters/abstract_adapter.rb +11 -0
- data/lib/mixpanelable/adapters/resque_adapter.rb +23 -0
- data/lib/mixpanelable/bots.rb +1467 -0
- data/lib/mixpanelable/config.rb +23 -0
- data/lib/mixpanelable/controller_additions.rb +33 -0
- data/lib/mixpanelable/event.rb +20 -0
- data/lib/mixpanelable/event_builder.rb +47 -0
- data/lib/mixpanelable/tracker_methods.rb +39 -0
- metadata +35 -5
@@ -0,0 +1,23 @@
|
|
1
|
+
require 'mixpanelable/adapters/abstract_adapter'
|
2
|
+
require 'mixpanelable/adapters/resque_adapter'
|
3
|
+
|
4
|
+
module Mixpanelable
|
5
|
+
class Config
|
6
|
+
cattr_accessor :token
|
7
|
+
|
8
|
+
class << self
|
9
|
+
def adapter
|
10
|
+
@adapter || Adapters::ResqueAdapter
|
11
|
+
end
|
12
|
+
|
13
|
+
def adapter=(adapter_type)
|
14
|
+
@adapter = case adapter_type
|
15
|
+
when :resque
|
16
|
+
Adapters::ResqueAdapter
|
17
|
+
else
|
18
|
+
Adapters::ResqueAdapter
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
module Mixpanelable
|
2
|
+
module ControllerAdditions
|
3
|
+
include ActiveSupport::Concern
|
4
|
+
|
5
|
+
private
|
6
|
+
|
7
|
+
def set_mixpanelable_current_user
|
8
|
+
Thread.current[:mixpanelable_current_user] = current_user
|
9
|
+
yield
|
10
|
+
ensure
|
11
|
+
Thread.current[:mixpanelable_current_user] = nil
|
12
|
+
end
|
13
|
+
|
14
|
+
def set_mixpanelable_user_agent
|
15
|
+
Thread.current[:mixpanelable_user_agent] = request.env['HTTP_USER_AGENT']
|
16
|
+
yield
|
17
|
+
ensure
|
18
|
+
Thread.current[:mixpanelable_user_agent] = nil
|
19
|
+
end
|
20
|
+
|
21
|
+
def set_mixpanelable_guest_uuid
|
22
|
+
Thread.current[:mixpanelable_guest_uuid] = mixpanelable_guest_uuid
|
23
|
+
yield
|
24
|
+
ensure
|
25
|
+
Thread.current[:mixpanelable_guest_uuid] = nil
|
26
|
+
end
|
27
|
+
|
28
|
+
def mixpanelable_guest_uuid
|
29
|
+
cookies[:mixpanelable_guest_uuid] ||= { value: SecureRandom.uuid, expires: Time.now + (60*60*24*365) }
|
30
|
+
cookies[:mixpanelable_guest_uuid]
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
module Mixpanelable
|
2
|
+
class Event
|
3
|
+
attr_reader :name
|
4
|
+
|
5
|
+
def initialize(args)
|
6
|
+
@distinct_id = args[:distinct_id]
|
7
|
+
@token = args[:token]
|
8
|
+
@name = args[:name]
|
9
|
+
@properties = args[:properties]
|
10
|
+
end
|
11
|
+
|
12
|
+
def properties
|
13
|
+
{
|
14
|
+
'distinct_id' => @distinct_id,
|
15
|
+
'mp_name_tag' => @distinct_id,
|
16
|
+
'token' => @token
|
17
|
+
}.merge(@properties)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,47 @@
|
|
1
|
+
module Mixpanelable
|
2
|
+
class EventBuilder
|
3
|
+
attr_reader :active_record, :name, :properties
|
4
|
+
|
5
|
+
def initialize(args = {})
|
6
|
+
@active_record = args[:active_record]
|
7
|
+
@name = args[:name]
|
8
|
+
@properties = args[:properties]
|
9
|
+
self
|
10
|
+
end
|
11
|
+
|
12
|
+
def event
|
13
|
+
Event.new(distinct_id: distinct_id, token: token, name: name, properties: properties)
|
14
|
+
end
|
15
|
+
|
16
|
+
def distinct_id
|
17
|
+
case
|
18
|
+
when active_record.present?
|
19
|
+
distinct_id_for(active_record)
|
20
|
+
when current_user.present?
|
21
|
+
distinct_id_for(current_user)
|
22
|
+
else
|
23
|
+
guest_uuid
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
private
|
28
|
+
|
29
|
+
# There's no explicit requirement that `active_record` inherits from ActiveRecord::Base.
|
30
|
+
# The only real requirement is an id method.
|
31
|
+
def distinct_id_for(active_record)
|
32
|
+
"#{active_record.class.name} - #{active_record.id}"
|
33
|
+
end
|
34
|
+
|
35
|
+
def current_user
|
36
|
+
Thread.current[:mixpanelable_current_user]
|
37
|
+
end
|
38
|
+
|
39
|
+
def guest_uuid
|
40
|
+
Thread.current[:mixpanelable_guest_uuid]
|
41
|
+
end
|
42
|
+
|
43
|
+
def token
|
44
|
+
Config.token
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
module Mixpanelable
|
2
|
+
module TrackerMethods
|
3
|
+
extend ActiveSupport::Concern
|
4
|
+
|
5
|
+
module ClassMethods
|
6
|
+
def track_event(name, properties = {})
|
7
|
+
return if user_agent_is_bot?
|
8
|
+
|
9
|
+
event = EventBuilder.new(name: name, properties: properties).event
|
10
|
+
Mixpanelable::Config.adapter.send_event(event)
|
11
|
+
end
|
12
|
+
|
13
|
+
def track_event_for(active_record, name, properties = {})
|
14
|
+
return if user_agent_is_bot?
|
15
|
+
|
16
|
+
event = EventBuilder.new(active_record: active_record, name: name, properties: properties).event
|
17
|
+
Mixpanelable::Config.adapter.send_event(event)
|
18
|
+
end
|
19
|
+
|
20
|
+
def user_agent_is_bot?
|
21
|
+
Mixpanelable::Bots.bot?(user_agent)
|
22
|
+
end
|
23
|
+
|
24
|
+
def user_agent
|
25
|
+
Thread.current[:mixpanelable_user_agent]
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
def track_event(name, properties = {})
|
30
|
+
self.class.track_event(name, properties)
|
31
|
+
end
|
32
|
+
|
33
|
+
def track_event_for(active_record, name, properties = {})
|
34
|
+
self.class.track_event_for(active_record, name, properties)
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
Object.send(:include, Mixpanelable::TrackerMethods)
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: mixpanelable
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.1
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,11 +9,11 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-
|
12
|
+
date: 2012-11-28 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: resque
|
16
|
-
requirement: &
|
16
|
+
requirement: &70350868829560 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ! '>='
|
@@ -21,13 +21,43 @@ dependencies:
|
|
21
21
|
version: '0'
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
|
-
version_requirements: *
|
24
|
+
version_requirements: *70350868829560
|
25
|
+
- !ruby/object:Gem::Dependency
|
26
|
+
name: rails
|
27
|
+
requirement: &70350868829080 !ruby/object:Gem::Requirement
|
28
|
+
none: false
|
29
|
+
requirements:
|
30
|
+
- - ! '>='
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: '0'
|
33
|
+
type: :runtime
|
34
|
+
prerelease: false
|
35
|
+
version_requirements: *70350868829080
|
36
|
+
- !ruby/object:Gem::Dependency
|
37
|
+
name: rspec
|
38
|
+
requirement: &70350868828540 !ruby/object:Gem::Requirement
|
39
|
+
none: false
|
40
|
+
requirements:
|
41
|
+
- - ! '>='
|
42
|
+
- !ruby/object:Gem::Version
|
43
|
+
version: '0'
|
44
|
+
type: :development
|
45
|
+
prerelease: false
|
46
|
+
version_requirements: *70350868828540
|
25
47
|
description:
|
26
48
|
email: matt@developertown.com
|
27
49
|
executables: []
|
28
50
|
extensions: []
|
29
51
|
extra_rdoc_files: []
|
30
52
|
files:
|
53
|
+
- lib/mixpanelable/adapters/abstract_adapter.rb
|
54
|
+
- lib/mixpanelable/adapters/resque_adapter.rb
|
55
|
+
- lib/mixpanelable/bots.rb
|
56
|
+
- lib/mixpanelable/config.rb
|
57
|
+
- lib/mixpanelable/controller_additions.rb
|
58
|
+
- lib/mixpanelable/event.rb
|
59
|
+
- lib/mixpanelable/event_builder.rb
|
60
|
+
- lib/mixpanelable/tracker_methods.rb
|
31
61
|
- lib/mixpanelable.rb
|
32
62
|
homepage:
|
33
63
|
licenses: []
|
@@ -52,6 +82,6 @@ rubyforge_project:
|
|
52
82
|
rubygems_version: 1.8.10
|
53
83
|
signing_key:
|
54
84
|
specification_version: 3
|
55
|
-
summary: Track events from your backend easily with Mixpanelable.
|
85
|
+
summary: Track events from your Rails backend easily with Mixpanelable.
|
56
86
|
test_files: []
|
57
87
|
has_rdoc:
|