mixpal 0.2.1 → 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.rubocop.yml +0 -3
- data/README.md +32 -0
- data/lib/mixpal.rb +1 -0
- data/lib/mixpal/revenue.rb +32 -0
- data/lib/mixpal/tracker.rb +14 -2
- data/lib/mixpal/version.rb +1 -1
- data/spec/lib/mixpal/revenue_spec.rb +60 -0
- data/spec/lib/mixpal/tracker_spec.rb +38 -0
- metadata +5 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: fb233388194e4bb65920f2397f440b69c0e84d3e
|
4
|
+
data.tar.gz: 83af8a3d7aca41e8cbbb049175847f3e74d0be81
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 576d25b01395d3f4e2dda4dfa00df0b93660bb358d914117d596dd472aea60d7caa90828daed689e752716caf0532574f2c78e41b9253e11444eb3c3c9759b51
|
7
|
+
data.tar.gz: fb5c7d9aacc19f111d8a82fdfdd5b36677542cd9d86a2ff79ccd5fc08415d05306f5d6d861a2ac44be53677718f33a81d88c2f42ff58de127a7ee5901a2b9930
|
data/.rubocop.yml
CHANGED
data/README.md
CHANGED
@@ -78,6 +78,38 @@ mixpanel.update_user email: "mynewemail@example.com"
|
|
78
78
|
|
79
79
|
As with `register_user`, this method will also identify "special properties".
|
80
80
|
|
81
|
+
### Custom Events
|
82
|
+
|
83
|
+
Mixpal allows you to define custom mixpal methods to use in your controllers/views
|
84
|
+
|
85
|
+
1. create a custom module and define your mixpal events
|
86
|
+
```ruby
|
87
|
+
module YourCustomEventsModule
|
88
|
+
def sign_up(user)
|
89
|
+
register_user user.attributes.slice('name', 'email')
|
90
|
+
track 'User signed up'
|
91
|
+
end
|
92
|
+
end
|
93
|
+
```
|
94
|
+
|
95
|
+
2. create a mixpal.rb initializer and configure mixpal to use your module
|
96
|
+
```ruby
|
97
|
+
Mixpal.configure do |config|
|
98
|
+
config.helper_module = YourCustomEventsModule
|
99
|
+
end
|
100
|
+
```
|
101
|
+
|
102
|
+
3. use in controllers/views
|
103
|
+
```ruby
|
104
|
+
class UserController < ActionController::Base
|
105
|
+
def create
|
106
|
+
# ... do cool stuff ...
|
107
|
+
mixpal.sign_up(user)
|
108
|
+
redirect_to root_path
|
109
|
+
end
|
110
|
+
end
|
111
|
+
```
|
112
|
+
|
81
113
|
### Persistance Across Redirects
|
82
114
|
|
83
115
|
Mixpal stores any tracked events or user data in the session when
|
data/lib/mixpal.rb
CHANGED
@@ -0,0 +1,32 @@
|
|
1
|
+
module Mixpal
|
2
|
+
class Revenue
|
3
|
+
attr_reader :amount, :properties
|
4
|
+
|
5
|
+
def initialize(amount, properties)
|
6
|
+
@amount = amount
|
7
|
+
@properties = properties
|
8
|
+
end
|
9
|
+
|
10
|
+
def render
|
11
|
+
args = "#{amount}, #{properties_as_js_object_for_mixpanel}"
|
12
|
+
"mixpanel.people.track_charge(#{args});".html_safe
|
13
|
+
end
|
14
|
+
|
15
|
+
def to_store
|
16
|
+
{
|
17
|
+
'amount' => amount,
|
18
|
+
'properties' => properties
|
19
|
+
}
|
20
|
+
end
|
21
|
+
|
22
|
+
def self.from_store(data)
|
23
|
+
new(data['amount'], data['properties'])
|
24
|
+
end
|
25
|
+
|
26
|
+
private
|
27
|
+
|
28
|
+
def properties_as_js_object_for_mixpanel
|
29
|
+
Mixpal::Util.hash_to_js_object_string(properties)
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
data/lib/mixpal/tracker.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
module Mixpal
|
2
2
|
class Tracker
|
3
|
-
attr_reader :events, :user_updates, :identity, :alias_user
|
3
|
+
attr_reader :events, :user_updates, :revenue_updates, :identity, :alias_user
|
4
4
|
|
5
5
|
STORAGE_KEY = 'mixpal'
|
6
6
|
|
@@ -9,6 +9,7 @@ module Mixpal
|
|
9
9
|
|
10
10
|
@events = []
|
11
11
|
@user_updates = []
|
12
|
+
@revenue_updates = []
|
12
13
|
|
13
14
|
@identity = args[:identity]
|
14
15
|
end
|
@@ -26,6 +27,10 @@ module Mixpal
|
|
26
27
|
events << Mixpal::Event.new(name, properties)
|
27
28
|
end
|
28
29
|
|
30
|
+
def track_charge(amount, properties = {})
|
31
|
+
revenue_updates << Mixpal::Revenue.new(amount, properties)
|
32
|
+
end
|
33
|
+
|
29
34
|
def render
|
30
35
|
''.tap do |html|
|
31
36
|
html << '<script type="text/javascript">'
|
@@ -33,6 +38,7 @@ module Mixpal
|
|
33
38
|
html << "mixpanel.identify(\"#{identity}\");" if identity
|
34
39
|
html << events.map(&:render).join('')
|
35
40
|
html << user_updates.map(&:render).join('')
|
41
|
+
html << revenue_updates.map(&:render).join('')
|
36
42
|
html << '</script>'
|
37
43
|
end.html_safe
|
38
44
|
end
|
@@ -56,6 +62,11 @@ module Mixpal
|
|
56
62
|
data['user_updates'].map { |u| Mixpal::User.from_store(u) }
|
57
63
|
end
|
58
64
|
|
65
|
+
if data['revenue_updates']
|
66
|
+
@revenue_updates =
|
67
|
+
data['revenue_updates'].map { |u| Mixpal::Revenue.from_store(u) }
|
68
|
+
end
|
69
|
+
|
59
70
|
session.delete(STORAGE_KEY)
|
60
71
|
end
|
61
72
|
|
@@ -66,7 +77,8 @@ module Mixpal
|
|
66
77
|
'alias_user' => alias_user,
|
67
78
|
'identity' => identity,
|
68
79
|
'events' => events.map(&:to_store),
|
69
|
-
'user_updates' => user_updates.map(&:to_store)
|
80
|
+
'user_updates' => user_updates.map(&:to_store),
|
81
|
+
'revenue_updates' => revenue_updates.map(&:to_store)
|
70
82
|
}
|
71
83
|
end
|
72
84
|
end
|
data/lib/mixpal/version.rb
CHANGED
@@ -0,0 +1,60 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Mixpal::Revenue do
|
4
|
+
let(:properties) do
|
5
|
+
{
|
6
|
+
sku: 'SKU-1010'
|
7
|
+
}
|
8
|
+
end
|
9
|
+
|
10
|
+
let(:amount) { 50 }
|
11
|
+
|
12
|
+
let(:subject) { described_class.new(amount, properties) }
|
13
|
+
|
14
|
+
describe '#render' do
|
15
|
+
it 'delegates to Util for js_object composition' do
|
16
|
+
Mixpal::Util.should_receive(:hash_to_js_object_string).with(properties)
|
17
|
+
subject.render
|
18
|
+
end
|
19
|
+
|
20
|
+
it 'outputs a call to people.track_charge' do
|
21
|
+
js_object = Mixpal::Util.hash_to_js_object_string(properties)
|
22
|
+
expect(subject.render)
|
23
|
+
.to eq "mixpanel.people.track_charge(#{amount}, #{js_object});"
|
24
|
+
end
|
25
|
+
|
26
|
+
it 'outputs an html safe string' do
|
27
|
+
expect(subject.render).to be_html_safe
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
describe '#to_store' do
|
32
|
+
it 'returns a hash with its data' do
|
33
|
+
expect(subject.to_store).to eq(
|
34
|
+
'amount' => amount,
|
35
|
+
'properties' => properties
|
36
|
+
)
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
describe '#from_store' do
|
41
|
+
let(:result) do
|
42
|
+
described_class.from_store(
|
43
|
+
'amount' => amount,
|
44
|
+
'properties' => properties
|
45
|
+
)
|
46
|
+
end
|
47
|
+
|
48
|
+
it 'instantiates a new instance' do
|
49
|
+
expect(result).to be_an_instance_of(described_class)
|
50
|
+
end
|
51
|
+
|
52
|
+
it 'sets its amount from the data' do
|
53
|
+
expect(result.amount).to eq amount
|
54
|
+
end
|
55
|
+
|
56
|
+
it 'sets its properties from the data' do
|
57
|
+
expect(result.properties).to eq properties
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
@@ -26,6 +26,10 @@ describe Mixpal::Tracker do
|
|
26
26
|
expect(subject.user_updates).to eq []
|
27
27
|
end
|
28
28
|
|
29
|
+
it 'creates an empty set of revenue_updates' do
|
30
|
+
expect(subject.revenue_updates).to eq []
|
31
|
+
end
|
32
|
+
|
29
33
|
context 'with an :identity arg' do
|
30
34
|
subject { subject_with_identity }
|
31
35
|
|
@@ -82,6 +86,22 @@ describe Mixpal::Tracker do
|
|
82
86
|
end
|
83
87
|
end
|
84
88
|
|
89
|
+
describe '#track_charge' do
|
90
|
+
it 'instantiates a new Revenue object with properties' do
|
91
|
+
properties = { sku: 'SKU-1010' }
|
92
|
+
Mixpal::Revenue.should_receive(:new).with(50, properties)
|
93
|
+
subject.track_charge(50, properties)
|
94
|
+
end
|
95
|
+
|
96
|
+
it 'adds the Revenue to revenue_updates for rendering later' do
|
97
|
+
expect do
|
98
|
+
subject.track_charge(50, sku: 'SKU-1010')
|
99
|
+
end.to change(subject.revenue_updates, :size).by(1)
|
100
|
+
|
101
|
+
subject.revenue_updates.first.should be_an_instance_of(Mixpal::Revenue)
|
102
|
+
end
|
103
|
+
end
|
104
|
+
|
85
105
|
describe '#render' do
|
86
106
|
it 'outputs script tag' do
|
87
107
|
expect(subject.render).to have_tag('script')
|
@@ -152,6 +172,24 @@ describe Mixpal::Tracker do
|
|
152
172
|
expect(subject.render).to include joined
|
153
173
|
end
|
154
174
|
end
|
175
|
+
|
176
|
+
context 'with revenue' do
|
177
|
+
before do
|
178
|
+
subject.track_charge(50)
|
179
|
+
subject.track_charge(100, sku: 'SKU-1010')
|
180
|
+
end
|
181
|
+
|
182
|
+
it 'delegates render to the revenues' do
|
183
|
+
subject.revenue_updates.each { |r| r.should_receive :render }
|
184
|
+
subject.render
|
185
|
+
end
|
186
|
+
|
187
|
+
it 'joins each rendered revenue' do
|
188
|
+
joined =
|
189
|
+
subject.revenue_updates[0].render + subject.revenue_updates[1].render
|
190
|
+
expect(subject.render).to include joined
|
191
|
+
end
|
192
|
+
end
|
155
193
|
end
|
156
194
|
|
157
195
|
describe '#store!' do
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: mixpal
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- patbenatar
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2015-
|
12
|
+
date: 2015-10-10 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: bundler
|
@@ -184,12 +184,14 @@ files:
|
|
184
184
|
- lib/mixpal.rb
|
185
185
|
- lib/mixpal/event.rb
|
186
186
|
- lib/mixpal/integration.rb
|
187
|
+
- lib/mixpal/revenue.rb
|
187
188
|
- lib/mixpal/tracker.rb
|
188
189
|
- lib/mixpal/user.rb
|
189
190
|
- lib/mixpal/util.rb
|
190
191
|
- lib/mixpal/version.rb
|
191
192
|
- mixpanel_assistant.gemspec
|
192
193
|
- spec/lib/mixpal/event_spec.rb
|
194
|
+
- spec/lib/mixpal/revenue_spec.rb
|
193
195
|
- spec/lib/mixpal/tracker_spec.rb
|
194
196
|
- spec/lib/mixpal/user_spec.rb
|
195
197
|
- spec/lib/mixpal/util_spec.rb
|
@@ -275,6 +277,7 @@ summary: As the JavaScript library is Mixpanel's preferred method of usage, Mixp
|
|
275
277
|
form submissions.
|
276
278
|
test_files:
|
277
279
|
- spec/lib/mixpal/event_spec.rb
|
280
|
+
- spec/lib/mixpal/revenue_spec.rb
|
278
281
|
- spec/lib/mixpal/tracker_spec.rb
|
279
282
|
- spec/lib/mixpal/user_spec.rb
|
280
283
|
- spec/lib/mixpal/util_spec.rb
|