spree_mixpanel 2.1.8 → 2.2.0
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.
- checksums.yaml +4 -4
- data/Gemfile +1 -1
- data/README.md +49 -9
- data/app/assets/javascripts/spree/backend/spree_mixpanel.js +1 -0
- data/app/assets/javascripts/spree/frontend/all.js +1 -0
- data/app/assets/javascripts/spree/frontend/spree_mixpanel.js +0 -0
- data/app/assets/stylesheets/spree/backend/spree_mixpanel.css +3 -0
- data/app/assets/stylesheets/spree/frontend/spree_mixpanel.css +3 -0
- data/app/models/spree/mixpanel_configuration.rb +1 -0
- data/app/models/spree/order_decorator.rb +15 -3
- data/app/models/spree/user_decorator.rb +6 -2
- data/app/workers/spree_mixpanel_worker.rb +8 -0
- data/lib/generators/spree_mixpanel/install/install_generator.rb +4 -4
- data/lib/generators/spree_mixpanel/install/templates/mixpanel.rb +1 -0
- data/lib/spree_mixpanel/mixpanel.rb +48 -0
- data/lib/spree_mixpanel/tracker/mixpanel_tracker.rb +23 -7
- data/lib/spree_mixpanel.rb +0 -1
- data/spree_mixpanel.gemspec +3 -3
- metadata +14 -30
- data/app/assets/javascripts/admin/spree_mixpanel.js +0 -1
- data/app/assets/javascripts/store/spree_mixpanel.js +0 -1
- data/app/assets/stylesheets/admin/spree_mixpanel.css +0 -3
- data/app/assets/stylesheets/store/spree_mixpanel.css +0 -3
- data/app/workers/mixpanel_orders_worker.rb +0 -8
- data/app/workers/mixpanel_users_worker.rb +0 -7
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b6cb12efc5f8e72659dfde5c2aabb9b8193dbcef
|
4
|
+
data.tar.gz: f2064fb3e32810fd76d14b72a262c1d8dc2fc0db
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: aa566a347f48e3e35cc916d0710489cefbd0e376313237c226526247b7bfb549eefa1ea7dedd25ad913e23effd0965956f801f63036222a653cd875ab53f8ecc
|
7
|
+
data.tar.gz: e65db0a0f1e16986e682d23fa9e7a6746d2bd5dc95f4822f2ab87b2ec6d009f9e052a57115a6001775ec0100aef87a3de949342581fe58350269d67dbd88e830
|
data/Gemfile
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
source 'https://rubygems.org'
|
2
2
|
|
3
3
|
# Provides basic authentication functionality for testing parts of your engine
|
4
|
-
gem 'spree_auth_devise', github: 'spree/spree_auth_devise', :branch => '2-
|
4
|
+
gem 'spree_auth_devise', github: 'spree/spree_auth_devise', :branch => '2-2-stable'
|
5
5
|
|
6
6
|
gemspec
|
data/README.md
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
SpreeMixpanel
|
2
2
|
=============
|
3
3
|
|
4
|
-
Spree integration with Mixpanel
|
4
|
+
[Spree](http://spreecommerce.com/) integration with [Mixpanel](https://mixpanel.com)
|
5
5
|
|
6
6
|
Installation
|
7
7
|
------------
|
@@ -9,7 +9,8 @@ Installation
|
|
9
9
|
Add spree_mixpanel to your Gemfile:
|
10
10
|
|
11
11
|
```ruby
|
12
|
-
gem '
|
12
|
+
gem 'spree_auth_devise', github: 'spree/spree_auth_devise', branch: '2-2-stable'
|
13
|
+
gem 'spree_mixpanel', git: 'git@github.com:marcosteixeira/spree_mixpanel.git', branch: '2-2-stable'
|
13
14
|
```
|
14
15
|
|
15
16
|
Bundle your dependencies and run the installation generator:
|
@@ -19,6 +20,10 @@ bundle
|
|
19
20
|
bundle exec rails g spree_mixpanel:install
|
20
21
|
```
|
21
22
|
|
23
|
+
### Sidekiq (Optional)
|
24
|
+
|
25
|
+
In order to upload data to mixpanel in background you can use [Sidekiq](http://sidekiq.org/) gem.
|
26
|
+
|
22
27
|
Run your redis server
|
23
28
|
```shell
|
24
29
|
redis-server
|
@@ -46,14 +51,14 @@ end
|
|
46
51
|
@user.mixpanel_track_user
|
47
52
|
```
|
48
53
|
|
49
|
-
By default, we send `first_name`, `last_name`, and `email` from user. You can override user `
|
54
|
+
By default, we send `first_name`, `last_name`, and `email` from user. You can override user `mixpanel_personalized_fields` and return personalized fields.
|
50
55
|
|
51
56
|
```ruby
|
52
57
|
User.class_eval do
|
53
|
-
def
|
54
|
-
{
|
58
|
+
def mixpanel_personalized_fields
|
59
|
+
{
|
55
60
|
'My Field' => 'FIELD',
|
56
|
-
'Total sales' => self.total_sales
|
61
|
+
'Total sales' => self.total_sales # personalized method in your user model
|
57
62
|
}
|
58
63
|
end
|
59
64
|
end
|
@@ -65,18 +70,53 @@ end
|
|
65
70
|
@order.mixpanel_track_order
|
66
71
|
```
|
67
72
|
|
68
|
-
By default, we send `number`, `total`, `state`, `email` and `payment_state` from order. You can override order `
|
73
|
+
By default, we send `number`, `total`, `state`, `email` and `payment_state` from order. You can override order `mixpanel_personalized_fields` and return personalized fields.
|
69
74
|
|
70
75
|
```ruby
|
71
76
|
Order.class_eval do
|
72
|
-
def
|
77
|
+
def mixpanel_personalized_fields
|
73
78
|
{
|
74
79
|
'My Field' => 'FIELD',
|
75
|
-
'Personal
|
80
|
+
'Personal amount' => self.personal_amount
|
76
81
|
}
|
77
82
|
end
|
78
83
|
end
|
79
84
|
```
|
85
|
+
### Tracking order revenue
|
86
|
+
|
87
|
+
```ruby
|
88
|
+
@order.mixpanel_track_charges
|
89
|
+
```
|
90
|
+
|
91
|
+
By default paid orders revenue are automatically sent to mixpanel.
|
92
|
+
|
93
|
+
You can change this behaviour changing `push_order_charges` configuration.
|
94
|
+
|
95
|
+
```ruby
|
96
|
+
# config/initializers/mixpanel.rb
|
97
|
+
Spree::Mixpanel::Config.configure do |config|
|
98
|
+
config.push_order_charges = false # true by default
|
99
|
+
end
|
100
|
+
```
|
101
|
+
|
102
|
+
You can override `mixpanel_total`.
|
103
|
+
|
104
|
+
```ruby
|
105
|
+
Order.class_eval do
|
106
|
+
def mixpanel_total
|
107
|
+
100 # personalized total
|
108
|
+
end
|
109
|
+
end
|
110
|
+
```
|
111
|
+
By default we send the revenue time. In order to send personalized fields you can override `mixpanel_charge_fields`
|
112
|
+
|
113
|
+
```ruby
|
114
|
+
Order.class_eval do
|
115
|
+
def mixpanel_charge_fields
|
116
|
+
{'User name' => user_name } # personalized field
|
117
|
+
end
|
118
|
+
end
|
119
|
+
```
|
80
120
|
|
81
121
|
Testing
|
82
122
|
-------
|
@@ -0,0 +1 @@
|
|
1
|
+
//= require spree/backend
|
@@ -0,0 +1 @@
|
|
1
|
+
//= require spree/frontend
|
File without changes
|
@@ -3,25 +3,37 @@ module Spree
|
|
3
3
|
Order.class_eval do
|
4
4
|
|
5
5
|
def mixpanel_track_order
|
6
|
-
|
6
|
+
Mixpanel::EventHandler.new('event' => :order, 'order_id' => self.id).handle_event
|
7
|
+
end
|
8
|
+
|
9
|
+
def mixpanel_track_charges
|
10
|
+
Mixpanel::EventHandler.new('event' => :charge, 'order_id' => self.id).handle_event
|
7
11
|
end
|
8
12
|
|
9
13
|
def mixpanel_fields
|
10
14
|
{
|
11
15
|
'Number' => number,
|
12
|
-
'Total' =>
|
16
|
+
'Total' => mixpanel_total,
|
13
17
|
'State' => state,
|
14
18
|
'User email' => email,
|
15
19
|
'Payment state' => payment_state
|
16
20
|
}
|
17
21
|
end
|
18
22
|
|
19
|
-
def
|
23
|
+
def mixpanel_charge_fields
|
24
|
+
{}
|
25
|
+
end
|
26
|
+
|
27
|
+
def mixpanel_personalized_fields
|
20
28
|
{}
|
21
29
|
end
|
22
30
|
|
23
31
|
def mixpanel_event_message
|
24
32
|
new_record? ? "Order created" : "Order updated"
|
25
33
|
end
|
34
|
+
|
35
|
+
def mixpanel_total
|
36
|
+
display_total.cents.to_f / 100
|
37
|
+
end
|
26
38
|
end
|
27
39
|
end
|
@@ -3,10 +3,14 @@ module Spree
|
|
3
3
|
User.class_eval do
|
4
4
|
|
5
5
|
def mixpanel_track_user
|
6
|
-
|
6
|
+
Mixpanel::EventHandler.new('event' => :user, 'user_email' => self.email).handle_event
|
7
7
|
end
|
8
8
|
|
9
|
-
def
|
9
|
+
def mixpanel_opts
|
10
|
+
mixpanel_fields.merge(mixpanel_personalized_fields)
|
11
|
+
end
|
12
|
+
|
13
|
+
def mixpanel_personalized_fields
|
10
14
|
{}
|
11
15
|
end
|
12
16
|
|
@@ -11,13 +11,13 @@ module SpreeMixpanel
|
|
11
11
|
class_option :auto_run_migrations, :type => :boolean, :default => false
|
12
12
|
|
13
13
|
def add_javascripts
|
14
|
-
append_file '
|
15
|
-
append_file '
|
14
|
+
append_file 'vendor/assets/javascripts/spree/frontend/all.js', "//= require spree/frontend/spree_mixpanel\n"
|
15
|
+
append_file 'vendor/assets/javascripts/spree/backend/all.js', "//= require spree/backend/spree_mixpanel\n"
|
16
16
|
end
|
17
17
|
|
18
18
|
def add_stylesheets
|
19
|
-
inject_into_file '
|
20
|
-
inject_into_file '
|
19
|
+
inject_into_file 'vendor/assets/stylesheets/spree/frontend/all.css', " *= require spree/frontend/spree_mixpanel\n", :before => /\*\//, :verbose => true
|
20
|
+
inject_into_file 'vendor/assets/stylesheets/spree/backend/all.css', " *= require spree/backend/spree_mixpanel\n", :before => /\*\//, :verbose => true
|
21
21
|
end
|
22
22
|
|
23
23
|
def add_migrations
|
@@ -1,5 +1,53 @@
|
|
1
1
|
module Spree
|
2
2
|
module Mixpanel
|
3
|
+
class EventHandler
|
3
4
|
|
5
|
+
def initialize(opts={})
|
6
|
+
@opts = opts
|
7
|
+
@event_opts = opts["event_opts"]
|
8
|
+
@event = opts["event"].try(:to_sym) || :track
|
9
|
+
@user_email = opts["user_email"]
|
10
|
+
@order_id = opts["order_id"]
|
11
|
+
@event_name = opts["event_name"]
|
12
|
+
end
|
13
|
+
|
14
|
+
def handle_event
|
15
|
+
if has_sidekiq?
|
16
|
+
begin
|
17
|
+
SpreeMixpanelWorker.perform_async(opts)
|
18
|
+
rescue Redis::CannotConnectError
|
19
|
+
Rails.logger.info "Cannot connect with Redis"
|
20
|
+
end
|
21
|
+
else
|
22
|
+
mixpanel_perform
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
def mixpanel_perform
|
27
|
+
case event
|
28
|
+
when :user
|
29
|
+
MixpanelTracker.track_user(user_email)
|
30
|
+
when :order
|
31
|
+
MixpanelTracker.track_order(order_id)
|
32
|
+
when :charge
|
33
|
+
MixpanelTracker.track_charge(order_id)
|
34
|
+
when :track
|
35
|
+
MixpanelTracker.track_event(user_email, event_name, event_opts)
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
private
|
40
|
+
|
41
|
+
attr_reader :opts, :event_opts, :event, :user_email, :order_id, :event_name
|
42
|
+
|
43
|
+
def has_sidekiq?
|
44
|
+
@has_sidekiq ||= begin
|
45
|
+
require 'sidekiq'
|
46
|
+
true
|
47
|
+
rescue LoadError
|
48
|
+
false
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
4
52
|
end
|
5
53
|
end
|
@@ -2,14 +2,28 @@ require 'mixpanel-ruby'
|
|
2
2
|
|
3
3
|
module MixpanelTracker
|
4
4
|
|
5
|
-
def self.track_user(email
|
6
|
-
|
5
|
+
def self.track_user(email)
|
6
|
+
user = Spree.user_class.find_by_email(email)
|
7
|
+
tracker.people.set(email, user.mixpanel_opts)
|
7
8
|
end
|
8
9
|
|
9
|
-
def self.track_order(
|
10
|
-
|
10
|
+
def self.track_order(order_id)
|
11
|
+
order = Spree::Order.find(order_id)
|
12
|
+
tracker.track(order.email, order.mixpanel_event_message, order.mixpanel_fields.merge(order.mixpanel_personalized_fields))
|
13
|
+
track_charge(order.id) if push_order_charges? && order.paid?
|
11
14
|
end
|
12
15
|
|
16
|
+
def self.track_charge(order_id)
|
17
|
+
order = Spree::Order.find(order_id)
|
18
|
+
tracker.people.track_charge(order.email, order.mixpanel_total, {'$time' => I18n.l(DateTime.now, format: "%Y-%m-%dT%H:%M:%S")}.merge(order.mixpanel_charge_fields))
|
19
|
+
end
|
20
|
+
|
21
|
+
def self.track_event(user_email,name, opts={})
|
22
|
+
tracker.track(user_email, name, opts)
|
23
|
+
end
|
24
|
+
|
25
|
+
class MixpanelApiError < StandardError; end
|
26
|
+
|
13
27
|
private
|
14
28
|
def self.tracker
|
15
29
|
validate_connection_token
|
@@ -20,9 +34,11 @@ module MixpanelTracker
|
|
20
34
|
Spree::Mixpanel::Config[:connection_token]
|
21
35
|
end
|
22
36
|
|
23
|
-
def self.
|
24
|
-
|
37
|
+
def self.push_order_charges?
|
38
|
+
@push_charges ||= Spree::Mixpanel::Config[:push_order_charges]
|
25
39
|
end
|
26
40
|
|
27
|
-
|
41
|
+
def self.validate_connection_token
|
42
|
+
raise MixpanelApiError, "Mixpanel connection token is required" unless connection_token.present?
|
43
|
+
end
|
28
44
|
end
|
data/lib/spree_mixpanel.rb
CHANGED
data/spree_mixpanel.gemspec
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
Gem::Specification.new do |s|
|
3
3
|
s.platform = Gem::Platform::RUBY
|
4
4
|
s.name = 'spree_mixpanel'
|
5
|
-
s.version = '2.
|
5
|
+
s.version = '2.2.0'
|
6
6
|
s.summary = 'Spree/Mixpanel integration'
|
7
7
|
s.description = s.summary
|
8
8
|
s.required_ruby_version = '>= 1.9.3'
|
@@ -16,9 +16,9 @@ Gem::Specification.new do |s|
|
|
16
16
|
s.require_path = 'lib'
|
17
17
|
s.requirements << 'none'
|
18
18
|
|
19
|
-
|
19
|
+
spree_version = '~> 2.2.0'
|
20
|
+
s.add_dependency 'spree_core', spree_version
|
20
21
|
s.add_dependency 'mixpanel-ruby', '~> 1.4.0'
|
21
|
-
s.add_dependency 'sidekiq', '~> 3.2.1'
|
22
22
|
|
23
23
|
s.add_development_dependency 'database_cleaner'
|
24
24
|
s.add_development_dependency 'factory_girl', '~> 4.2'
|
metadata
CHANGED
@@ -1,29 +1,29 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: spree_mixpanel
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.
|
4
|
+
version: 2.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Marcos Teixeira
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-
|
11
|
+
date: 2014-11-05 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: spree_core
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- -
|
17
|
+
- - ~>
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version:
|
19
|
+
version: 2.2.0
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
|
-
- -
|
24
|
+
- - ~>
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version:
|
26
|
+
version: 2.2.0
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: mixpanel-ruby
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -38,20 +38,6 @@ dependencies:
|
|
38
38
|
- - ~>
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: 1.4.0
|
41
|
-
- !ruby/object:Gem::Dependency
|
42
|
-
name: sidekiq
|
43
|
-
requirement: !ruby/object:Gem::Requirement
|
44
|
-
requirements:
|
45
|
-
- - ~>
|
46
|
-
- !ruby/object:Gem::Version
|
47
|
-
version: 3.2.1
|
48
|
-
type: :runtime
|
49
|
-
prerelease: false
|
50
|
-
version_requirements: !ruby/object:Gem::Requirement
|
51
|
-
requirements:
|
52
|
-
- - ~>
|
53
|
-
- !ruby/object:Gem::Version
|
54
|
-
version: 3.2.1
|
55
41
|
- !ruby/object:Gem::Dependency
|
56
42
|
name: database_cleaner
|
57
43
|
requirement: !ruby/object:Gem::Requirement
|
@@ -120,15 +106,15 @@ files:
|
|
120
106
|
- LICENSE
|
121
107
|
- README.md
|
122
108
|
- Rakefile
|
123
|
-
- app/assets/javascripts/
|
124
|
-
- app/assets/javascripts/
|
125
|
-
- app/assets/
|
126
|
-
- app/assets/stylesheets/
|
109
|
+
- app/assets/javascripts/spree/backend/spree_mixpanel.js
|
110
|
+
- app/assets/javascripts/spree/frontend/all.js
|
111
|
+
- app/assets/javascripts/spree/frontend/spree_mixpanel.js
|
112
|
+
- app/assets/stylesheets/spree/backend/spree_mixpanel.css
|
113
|
+
- app/assets/stylesheets/spree/frontend/spree_mixpanel.css
|
127
114
|
- app/models/spree/mixpanel_configuration.rb
|
128
115
|
- app/models/spree/order_decorator.rb
|
129
116
|
- app/models/spree/user_decorator.rb
|
130
|
-
- app/workers/
|
131
|
-
- app/workers/mixpanel_users_worker.rb
|
117
|
+
- app/workers/spree_mixpanel_worker.rb
|
132
118
|
- bin/rails
|
133
119
|
- config/locales/en.yml
|
134
120
|
- config/routes.rb
|
@@ -162,10 +148,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
162
148
|
requirements:
|
163
149
|
- none
|
164
150
|
rubyforge_project:
|
165
|
-
rubygems_version: 2.
|
151
|
+
rubygems_version: 2.2.2
|
166
152
|
signing_key:
|
167
153
|
specification_version: 4
|
168
154
|
summary: Spree/Mixpanel integration
|
169
|
-
test_files:
|
170
|
-
- spec/lib/spree_mixpanel/tracker/mixpanel_tracker_spec.rb
|
171
|
-
- spec/spec_helper.rb
|
155
|
+
test_files: []
|
@@ -1 +0,0 @@
|
|
1
|
-
//= require admin/spree_backend
|
@@ -1 +0,0 @@
|
|
1
|
-
//= require store/spree_frontend
|