mixpanel 3.5.1 → 3.5.2

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/README.md CHANGED
@@ -346,6 +346,12 @@ Occasionally you may need to send a request for HTML that you don't want the mid
346
346
  });
347
347
  ```
348
348
 
349
+ Alternatively, you can add this line of code to your controller to temporarily disable the middleware:
350
+
351
+ ```ruby
352
+ Mixpanel::Middleware.skip_this_request
353
+ ```
354
+
349
355
  ## Examples
350
356
 
351
357
  ### How to use it from Rails controllers?
@@ -415,6 +421,61 @@ end
415
421
  end
416
422
  ```
417
423
 
424
+ ## How to track events using Delayed Job and Rails
425
+ Below is an example of implementing async even tracking with Delayed Job
426
+
427
+ **Create a new worker**
428
+ ```ruby
429
+ class MixpanelWorker < Struct.new(:name, :properties, :request_env)
430
+ def perform
431
+ if defined?(MIXPANEL_TOKEN)
432
+ @mixpanel = Mixpanel::Tracker.new(MIXPANEL_TOKEN, { :env => request_env })
433
+ else
434
+ @mixpanel = DummyMixpanel.new
435
+ end
436
+
437
+ @mixpanel.track(name, properties)
438
+ end
439
+ end
440
+ ```
441
+
442
+ **Add the following to your Application controller**
443
+ ```ruby
444
+ class ApplicationController < ActionController::Base
445
+ before_filter :initialize_env
446
+
447
+ private
448
+ ##
449
+ # Initialize env for mixpanel
450
+ def initialize_env
451
+ # Similar to the Resque problem above, we need to help DJ serialize the
452
+ # request object.
453
+ @request_env = {
454
+ 'REMOTE_ADDR' => request.env['REMOTE_ADDR'],
455
+ 'HTTP_X_FORWARDED_FOR' => request.env['HTTP_X_FORWARDED_FOR'],
456
+ 'rack.session' => request.env['rack.session'].to_hash,
457
+ 'mixpanel_events' => request.env['mixpanel_events']
458
+ }
459
+ end
460
+ ```
461
+ **You can optionally create a nice model wrapper to tidy things up**
462
+ ```ruby
463
+ #app/models/mix_panel.rb
464
+ class MixPanel
465
+ def self.track(name, properties, env)
466
+ # Notice we are using the 'mixpanel' queue
467
+ Delayed::Job.enqueue MixpanelWorker.new(name, properties, env), queue: 'mixpanel'
468
+ end
469
+ end
470
+ ```
471
+ **Sample Usage**
472
+ ```ruby
473
+ MixPanel.track("Front Page Load", {
474
+ url_type: short_url.uid_type,
475
+ page_name: short_url.page.name,
476
+ distinct_id: @client_uid }, @request_env)
477
+ ```
478
+
418
479
  ## Supported Ruby Platforms
419
480
 
420
481
  - 1.8.7
@@ -444,3 +505,6 @@ end
444
505
  * [Jon Pospischil] (https://github.com/pospischil)
445
506
  * [Tom Brown] (https://github.com/nottombrown)
446
507
  * [Murilo Pereira] (https://github.com/mpereira)
508
+ * [Marko Vasiljevic] (https://github.com/marmarko)
509
+ * [Joel] (https://github.com/jclay)
510
+ * [adimichele] (https://github.com/adimichele)
@@ -3,6 +3,15 @@ require 'json'
3
3
 
4
4
  module Mixpanel
5
5
  class Middleware
6
+ class << self
7
+ attr_accessor :skip_request
8
+ def skip_this_request
9
+ @skip_request = true
10
+ end
11
+ end
12
+
13
+ @skip_request = false
14
+
6
15
  def initialize(app, mixpanel_token, options={})
7
16
  @app = app
8
17
  @token = mixpanel_token
@@ -18,14 +27,16 @@ module Mixpanel
18
27
  @env = env
19
28
 
20
29
  @status, @headers, @response = @app.call(env)
21
-
22
- if is_trackable_response?
30
+
31
+ if is_trackable_response? && !Mixpanel::Middleware.skip_request
23
32
  merge_queue! if @options[:persist]
24
33
  update_response!
25
34
  update_content_length!
26
35
  delete_event_queue!
27
36
  end
28
37
 
38
+ Mixpanel::Middleware.skip_request = false
39
+
29
40
  [@status, @headers, @response]
30
41
  end
31
42
 
@@ -7,6 +7,10 @@ module Mixpanel::Person
7
7
  engage :set, distinct_id, properties, options
8
8
  end
9
9
 
10
+ def unset(distinct_id, property, options={})
11
+ engage :unset, distinct_id, property, options
12
+ end
13
+
10
14
  def increment(distinct_id, properties={}, options={})
11
15
  engage :add, distinct_id, properties, options
12
16
  end
@@ -53,7 +57,12 @@ module Mixpanel::Person
53
57
 
54
58
  request_properties = person_request_properties(request_properties_or_distinct_id)
55
59
 
56
- data = build_person action, request_properties, properties
60
+ if action == :unset
61
+ data = build_person_unset request_properties, properties
62
+ else
63
+ data = build_person action, request_properties, properties
64
+ end
65
+
57
66
  url = "#{options[:url]}?data=#{encoded_data(data)}"
58
67
  parse_response request(url, options[:async])
59
68
  end
@@ -70,4 +79,8 @@ module Mixpanel::Person
70
79
  def build_person(action, request_properties, person_properties)
71
80
  properties_hash(request_properties, PERSON_REQUEST_PROPERTIES).merge({ "$#{action}".to_sym => properties_hash(person_properties, PERSON_PROPERTIES) })
72
81
  end
82
+
83
+ def build_person_unset(request_properties, property)
84
+ properties_hash(request_properties, PERSON_REQUEST_PROPERTIES).merge({ "$unset".to_sym => [property] })
85
+ end
73
86
  end
@@ -2,7 +2,7 @@ files = ['README.md', 'LICENSE', 'Rakefile', 'mixpanel.gemspec', '{spec,lib}/**/
2
2
 
3
3
  spec = Gem::Specification.new do |s|
4
4
  s.name = "mixpanel"
5
- s.version = "3.5.1"
5
+ s.version = "3.5.2"
6
6
  s.rubyforge_project = "mixpanel"
7
7
  s.description = "Simple lib to track events in Mixpanel service. It can be used in any rack based framework."
8
8
  s.author = "Alvaro Gil"
@@ -47,6 +47,18 @@ describe Mixpanel::Middleware do
47
47
  get "/"
48
48
  Nokogiri::HTML(last_response.body).search('script').size.should == 1
49
49
  end
50
+
51
+ context "when disabling with #skip_this_request" do
52
+ before{ Mixpanel::Middleware.skip_this_request }
53
+
54
+ it "should skip this request but not the next request" do
55
+ get "/"
56
+ Nokogiri::HTML(last_response.body).search('script').should be_empty
57
+ get "/"
58
+ Nokogiri::HTML(last_response.body).search('script').size.should == 1
59
+ end
60
+
61
+ end
50
62
  end
51
63
 
52
64
  describe "Appending async mixpanel scripts" do
@@ -71,6 +71,10 @@ describe Mixpanel::Tracker do
71
71
  it "should reset charges" do
72
72
  @mixpanel.reset_charges('person-a').should == true
73
73
  end
74
+
75
+ it "should unset property" do
76
+ @mixpanel.unset('person-a', 'property').should == true
77
+ end
74
78
  end
75
79
  end
76
80
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mixpanel
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.5.1
4
+ version: 3.5.2
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: 2013-01-28 00:00:00.000000000Z
12
+ date: 2013-02-24 00:00:00.000000000Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: json
16
- requirement: &2152815840 !ruby/object:Gem::Requirement
16
+ requirement: &2153291720 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ! '>='
@@ -21,10 +21,10 @@ dependencies:
21
21
  version: '0'
22
22
  type: :runtime
23
23
  prerelease: false
24
- version_requirements: *2152815840
24
+ version_requirements: *2153291720
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: rack
27
- requirement: &2152815400 !ruby/object:Gem::Requirement
27
+ requirement: &2153291280 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
30
  - - ! '>='
@@ -32,10 +32,10 @@ dependencies:
32
32
  version: '0'
33
33
  type: :runtime
34
34
  prerelease: false
35
- version_requirements: *2152815400
35
+ version_requirements: *2153291280
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: escape
38
- requirement: &2152814980 !ruby/object:Gem::Requirement
38
+ requirement: &2153290860 !ruby/object:Gem::Requirement
39
39
  none: false
40
40
  requirements:
41
41
  - - ! '>='
@@ -43,10 +43,10 @@ dependencies:
43
43
  version: '0'
44
44
  type: :runtime
45
45
  prerelease: false
46
- version_requirements: *2152814980
46
+ version_requirements: *2153290860
47
47
  - !ruby/object:Gem::Dependency
48
48
  name: rspec
49
- requirement: &2152814560 !ruby/object:Gem::Requirement
49
+ requirement: &2153290440 !ruby/object:Gem::Requirement
50
50
  none: false
51
51
  requirements:
52
52
  - - ! '>='
@@ -54,10 +54,10 @@ dependencies:
54
54
  version: '0'
55
55
  type: :development
56
56
  prerelease: false
57
- version_requirements: *2152814560
57
+ version_requirements: *2153290440
58
58
  - !ruby/object:Gem::Dependency
59
59
  name: rack-test
60
- requirement: &2152814140 !ruby/object:Gem::Requirement
60
+ requirement: &2153290020 !ruby/object:Gem::Requirement
61
61
  none: false
62
62
  requirements:
63
63
  - - ! '>='
@@ -65,10 +65,10 @@ dependencies:
65
65
  version: '0'
66
66
  type: :development
67
67
  prerelease: false
68
- version_requirements: *2152814140
68
+ version_requirements: *2153290020
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: fakeweb
71
- requirement: &2152813720 !ruby/object:Gem::Requirement
71
+ requirement: &2153289600 !ruby/object:Gem::Requirement
72
72
  none: false
73
73
  requirements:
74
74
  - - ! '>='
@@ -76,10 +76,10 @@ dependencies:
76
76
  version: '0'
77
77
  type: :development
78
78
  prerelease: false
79
- version_requirements: *2152813720
79
+ version_requirements: *2153289600
80
80
  - !ruby/object:Gem::Dependency
81
81
  name: nokogiri
82
- requirement: &2152813300 !ruby/object:Gem::Requirement
82
+ requirement: &2153289180 !ruby/object:Gem::Requirement
83
83
  none: false
84
84
  requirements:
85
85
  - - ! '>='
@@ -87,10 +87,10 @@ dependencies:
87
87
  version: '0'
88
88
  type: :development
89
89
  prerelease: false
90
- version_requirements: *2152813300
90
+ version_requirements: *2153289180
91
91
  - !ruby/object:Gem::Dependency
92
92
  name: rake
93
- requirement: &2152812880 !ruby/object:Gem::Requirement
93
+ requirement: &2153288760 !ruby/object:Gem::Requirement
94
94
  none: false
95
95
  requirements:
96
96
  - - ! '>='
@@ -98,7 +98,7 @@ dependencies:
98
98
  version: '0'
99
99
  type: :development
100
100
  prerelease: false
101
- version_requirements: *2152812880
101
+ version_requirements: *2153288760
102
102
  description: Simple lib to track events in Mixpanel service. It can be used in any
103
103
  rack based framework.
104
104
  email: zevarito@gmail.com