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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: fd4a0289d4e8aea4964282fb8d7e6ecea884abf0
4
- data.tar.gz: 716077b12521d92afb45b445780b78285ebf1b55
3
+ metadata.gz: b6cb12efc5f8e72659dfde5c2aabb9b8193dbcef
4
+ data.tar.gz: f2064fb3e32810fd76d14b72a262c1d8dc2fc0db
5
5
  SHA512:
6
- metadata.gz: d7f6fb50e9c089bf9a6dd207f1eaea2d596ceacd31163e62ce2dfd7d76b1d868de0c2368703f7101d3196240b646ae56e022fe47c6766d6377af789220514fb4
7
- data.tar.gz: 6d5a5dfbc256877d79128ab058ee1e39ae095655bfc3683b514e143437393276802387e67dfd292fe745ab6be112bedb1dc82b97a3a7eb11a1f978f16e6deb5e
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-1-stable'
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 'spree_mixpanel', git: 'git@github.com:marcosteixeira/spree_mixpanel.git', branch: '2-1-stable'
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 `mixpanel_personal_fields` and return personalized fields.
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 mixpanel_personal_fields
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 `mixpanel_personal_fields` and return personalized fields.
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 mixpanel_personal_fields
77
+ def mixpanel_personalized_fields
73
78
  {
74
79
  'My Field' => 'FIELD',
75
- 'Personal amout' => self.personal_amount
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
@@ -0,0 +1,3 @@
1
+ /*
2
+ *= require spree/backend
3
+ */
@@ -0,0 +1,3 @@
1
+ /*
2
+ *= require spree/frontend
3
+ */
@@ -1,5 +1,6 @@
1
1
  module Spree
2
2
  class MixpanelConfiguration < Preferences::Configuration
3
3
  preference :connection_token, :string
4
+ preference :push_order_charges, :boolean, :default => true
4
5
  end
5
6
  end
@@ -3,25 +3,37 @@ module Spree
3
3
  Order.class_eval do
4
4
 
5
5
  def mixpanel_track_order
6
- MixpanelOrdersWorker.perform_async(self.id)
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' => 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 mixpanel_personal_fields
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
- MixpanelUsersWorker.perform_async(email, mixpanel_fields.merge(mixpanel_personal_fields))
6
+ Mixpanel::EventHandler.new('event' => :user, 'user_email' => self.email).handle_event
7
7
  end
8
8
 
9
- def mixpanel_personal_fields
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
 
@@ -0,0 +1,8 @@
1
+ class SpreeMixpanelWorker
2
+ include Sidekiq::Worker
3
+
4
+ def perform(opts={})
5
+ Spree::Mixpanel::EventHandler.new(opts).mixpanel_perform
6
+ end
7
+ end
8
+
@@ -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 'app/assets/javascripts/store/all.js', "//= require store/spree_mixpanel\n"
15
- append_file 'app/assets/javascripts/admin/all.js', "//= require admin/spree_mixpanel\n"
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 'app/assets/stylesheets/store/all.css', " *= require store/spree_mixpanel\n", :before => /\*\//, :verbose => true
20
- inject_into_file 'app/assets/stylesheets/admin/all.css', " *= require admin/spree_mixpanel\n", :before => /\*\//, :verbose => true
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,3 +1,4 @@
1
1
  Spree::Mixpanel::Config.configure do |config|
2
2
  config.connection_token = 'YOUR TOKEN'
3
+ config.push_order_charges = true
3
4
  end
@@ -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, opts)
6
- tracker.people.set(email, opts)
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(order)
10
- tracker.track(order.email, order.mixpanel_event_message, order.mixpanel_fields.merge(order.mixpanel_personal_fields))
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.validate_connection_token
24
- raise MixpanelApiError, "Mixpanel connection token is required" if !connection_token.present?
37
+ def self.push_order_charges?
38
+ @push_charges ||= Spree::Mixpanel::Config[:push_order_charges]
25
39
  end
26
40
 
27
- class MixpanelApiError < StandardError; end
41
+ def self.validate_connection_token
42
+ raise MixpanelApiError, "Mixpanel connection token is required" unless connection_token.present?
43
+ end
28
44
  end
@@ -2,4 +2,3 @@ require 'spree_core'
2
2
  require 'spree_mixpanel/engine'
3
3
  require 'spree_mixpanel/mixpanel'
4
4
  require 'spree_mixpanel/tracker/mixpanel_tracker'
5
- require 'sidekiq'
@@ -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.1.8'
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
- s.add_dependency 'spree_core'
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.1.8
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-07-16 00:00:00.000000000 Z
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: '0'
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: '0'
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/admin/spree_mixpanel.js
124
- - app/assets/javascripts/store/spree_mixpanel.js
125
- - app/assets/stylesheets/admin/spree_mixpanel.css
126
- - app/assets/stylesheets/store/spree_mixpanel.css
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/mixpanel_orders_worker.rb
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.3.0
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
@@ -1,3 +0,0 @@
1
- /*
2
- *= require admin/spree_backend
3
- */
@@ -1,3 +0,0 @@
1
- /*
2
- *= require store/spree_frontend
3
- */
@@ -1,8 +0,0 @@
1
- class MixpanelOrdersWorker
2
- include Sidekiq::Worker
3
-
4
- def perform(order_id)
5
- order = Spree::Order.find(order_id)
6
- MixpanelTracker.track_order(order)
7
- end
8
- end
@@ -1,7 +0,0 @@
1
- class MixpanelUsersWorker
2
- include Sidekiq::Worker
3
-
4
- def perform(user_email, opts={})
5
- MixpanelTracker.track_user(user_email, opts)
6
- end
7
- end