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.
@@ -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.0
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-10-19 00:00:00.000000000 Z
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: &70095290824520 !ruby/object:Gem::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: *70095290824520
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: