mixpanel-ruby 2.1.0 → 2.2.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: f9e1a1a4366eebfc28e385aafb1a74df684b02d4
4
- data.tar.gz: 2569a46638a4c168e6766ca21c3ce54adf5d9ee4
3
+ metadata.gz: ffb9a7cb934ae663374cf0850ba2049e77ad6844
4
+ data.tar.gz: 577cf98aaeb43e608a7d50e0b37d49b2437dd298
5
5
  SHA512:
6
- metadata.gz: 2e759bb1cd88260c95e1d5edf2efd61bcf284984f3595c5e1b3126b3db428db85806942bf09d73e2974cd0da8b292d8c8edd9315ad2cb81a9456bfe555049ee6
7
- data.tar.gz: 9d53eccb3b1cee24a2dbda7cf16719feb5933002bf394079050bd10882493ecd53f93263e489df28a049e649344f5cfc992cce10914aa24417a958e342606020
6
+ metadata.gz: 3e768a749828219fd77e9d3b4c29810d2f92a47b6ec8d4f6e0ab92f977d6f540b1c57bba0881f73d18fb59073a1e97da8688fe0a3cc8d4d10aefe6825aa36870
7
+ data.tar.gz: c19c92bcbb59663e617ba24eb6df74662e67e08605cbb535040185d5d66c28206c70d5f34268d1e98a0e98558707772dc338f57c61f1bc6cfcd0a127bc7bd9a4
@@ -13,7 +13,7 @@ updates to \Mixpanel from your ruby applications.
13
13
 
14
14
  require 'mixpanel-ruby'
15
15
 
16
- tracker = Mixpanel::Tracker.new(YOUR_TOKEN)
16
+ tracker = Mixpanel::Tracker.new(YOUR_MIXPANEL_TOKEN)
17
17
 
18
18
  # Track an event on behalf of user "User1"
19
19
  tracker.track('User1', 'A Mixpanel Event')
@@ -49,6 +49,12 @@ In particular, for Rails apps, the following projects are currently actively mai
49
49
 
50
50
  == Changes
51
51
 
52
+ == 2.2.0
53
+ * Add Mixpanel::ErrorHandler to simplify custom error handling.
54
+ * Modify Mixpanel::People#fix_property_dates to handle ActiveSupport::TimeWithZone.
55
+ * Increase open and ssl timeouts from 2s to 10s.
56
+ * Fix Doc inconsistancy: always pass token on Mixpanel::tracker.new.
57
+
52
58
  == 2.1.0
53
59
  * Add Mixpanel::Tracker#generate_tracking_url, which generates {pixel tracking urls}[https://mixpanel.com/docs/api-documentation/pixel-based-event-tracking].
54
60
  * Rescue JSONErrors in the consumer and raise Mixpanel::ServerError in Mixpanel::Consumer#send!.
@@ -1,17 +1,8 @@
1
1
  require 'base64'
2
- require 'net/https'
3
2
  require 'json'
3
+ require 'net/https'
4
4
 
5
5
  module Mixpanel
6
- class MixpanelError < StandardError
7
- end
8
-
9
- class ConnectionError < MixpanelError
10
- end
11
-
12
- class ServerError < MixpanelError
13
- end
14
-
15
6
  @@init_http = nil
16
7
 
17
8
  # This method exists for backwards compatibility. The preferred
@@ -44,7 +35,7 @@ module Mixpanel
44
35
  # either by passing in an argument with a #send! method when you construct
45
36
  # the tracker, or just passing a block to Mixpanel::Tracker.new
46
37
  #
47
- # tracker = Mixpanel::Tracker.new(MY_TOKEN) do |type, message|
38
+ # tracker = Mixpanel::Tracker.new(YOUR_MIXPANEL_TOKEN) do |type, message|
48
39
  # # type will be one of :event, :profile_update or :import
49
40
  # @kestrel.set(ANALYTICS_QUEUE, [type, message].to_json)
50
41
  # end
@@ -134,10 +125,10 @@ module Mixpanel
134
125
 
135
126
  client = Net::HTTP.new(uri.host, uri.port)
136
127
  client.use_ssl = true
137
- client.open_timeout = 2
128
+ client.open_timeout = 10
138
129
  client.continue_timeout = 10
139
130
  client.read_timeout = 10
140
- client.ssl_timeout = 2
131
+ client.ssl_timeout = 10
141
132
 
142
133
  Mixpanel.with_http(client)
143
134
 
@@ -157,7 +148,7 @@ module Mixpanel
157
148
  #
158
149
  # buffered_consumer = Mixpanel::BufferedConsumer.new
159
150
  # begin
160
- # buffered_tracker = Mixpanel::Tracker.new(YOUR_TOKEN) do |type, message|
151
+ # buffered_tracker = Mixpanel::Tracker.new(YOUR_MIXPANEL_TOKEN) do |type, message|
161
152
  # buffered_consumer.send!(type, message)
162
153
  # end
163
154
  # # Do some tracking here
@@ -0,0 +1,46 @@
1
+ module Mixpanel
2
+
3
+ # Mixpanel specific errors that are thrown in the gem.
4
+ # In the default consumer we catch all errors and raise
5
+ # Mixpanel specific errors that can be handled using a
6
+ # custom error handler.
7
+ class MixpanelError < StandardError
8
+ end
9
+
10
+ class ConnectionError < MixpanelError
11
+ end
12
+
13
+ class ServerError < MixpanelError
14
+ end
15
+
16
+
17
+ # The default behavior of the gem is to silence all errors
18
+ # thrown in the consumer. If you wish to handle MixpanelErrors
19
+ # yourself you can pass an instance of a class that extends
20
+ # Mixpanel::ErrorHandler to Mixpanel::Tracker on initialize.
21
+ #
22
+ # require 'logger'
23
+ #
24
+ # class MyErrorHandler < Mixpanel::ErrorHandler
25
+ #
26
+ # def initialize
27
+ # @logger = Logger.new('mylogfile.log')
28
+ # @logger.level = Logger::ERROR
29
+ # end
30
+ #
31
+ # def handle(error)
32
+ # logger.error "#{error.inspect}\n Backtrace: #{error.backtrace}"
33
+ # end
34
+ #
35
+ # end
36
+ #
37
+ # my_error_handler = MyErrorHandler.new
38
+ # tracker = Mixpanel::Tracker.new(YOUR_MIXPANEL_TOKEN, my_error_handler)
39
+ class ErrorHandler
40
+
41
+ # Override #handle to customize error handling
42
+ def handle(error)
43
+ false
44
+ end
45
+ end
46
+ end
@@ -1,6 +1,8 @@
1
- require 'mixpanel-ruby/consumer'
2
1
  require 'time'
3
2
 
3
+ require 'mixpanel-ruby/consumer'
4
+ require 'mixpanel-ruby/error'
5
+
4
6
  module Mixpanel
5
7
 
6
8
  # Handles formatting Mixpanel event tracking messages
@@ -8,7 +10,7 @@ module Mixpanel
8
10
  # is a subclass of this class, and the best way to
9
11
  # track events is to instantiate a Mixpanel::Tracker
10
12
  #
11
- # tracker = Mixpanel::Tracker.new # Has all of the methods of Mixpanel::Event
13
+ # tracker = Mixpanel::Tracker.new(YOUR_MIXPANEL_TOKEN) # Has all of the methods of Mixpanel::Event
12
14
  # tracker.track(...)
13
15
  #
14
16
  class Events
@@ -18,10 +20,11 @@ module Mixpanel
18
20
  # is to use Mixpanel::Tracker
19
21
  #
20
22
  # # tracker has all of the methods of Mixpanel::Events
21
- # tracker = Mixpanel::Tracker.new(...)
23
+ # tracker = Mixpanel::Tracker.new(YOUR_MIXPANEL_TOKEN)
22
24
  #
23
- def initialize(token, &block)
25
+ def initialize(token, error_handler=nil, &block)
24
26
  @token = token
27
+ @error_handler = error_handler || ErrorHandler.new
25
28
 
26
29
  if block
27
30
  @sink = block
@@ -37,7 +40,7 @@ module Mixpanel
37
40
  # describing that event. Properties are provided as a Hash with
38
41
  # string keys and strings, numbers or booleans as values.
39
42
  #
40
- # tracker = Mixpanel::Tracker.new
43
+ # tracker = Mixpanel::Tracker.new(YOUR_MIXPANEL_TOKEN)
41
44
  #
42
45
  # # Track that user "12345"'s credit card was declined
43
46
  # tracker.track("12345", "Credit Card Declined")
@@ -68,7 +71,8 @@ module Mixpanel
68
71
  ret = true
69
72
  begin
70
73
  @sink.call(:event, message.to_json)
71
- rescue MixpanelError
74
+ rescue MixpanelError => e
75
+ @error_handler.handle(e)
72
76
  ret = false
73
77
  end
74
78
 
@@ -83,7 +87,7 @@ module Mixpanel
83
87
  # we pass the time of the method call as the time the event occured, if you
84
88
  # wish to override this pass a timestamp in the properties hash.
85
89
  #
86
- # tracker = Mixpanel::Tracker.new
90
+ # tracker = Mixpanel::Tracker.new(YOUR_MIXPANEL_TOKEN)
87
91
  #
88
92
  # # Track that user "12345"'s credit card was declined
89
93
  # tracker.import("API_KEY", "12345", "Credit Card Declined")
@@ -118,7 +122,8 @@ module Mixpanel
118
122
  ret = true
119
123
  begin
120
124
  @sink.call(:import, message.to_json)
121
- rescue MixpanelError
125
+ rescue MixpanelError => e
126
+ @error_handler.handle(e)
122
127
  ret = false
123
128
  end
124
129
 
@@ -1,8 +1,10 @@
1
- require 'mixpanel-ruby/consumer'
2
- require 'json'
3
1
  require 'date'
2
+ require 'json'
4
3
  require 'time'
5
4
 
5
+ require 'mixpanel-ruby/consumer'
6
+ require 'mixpanel-ruby/error'
7
+
6
8
  module Mixpanel
7
9
 
8
10
  # Handles formatting Mixpanel profile updates and
@@ -17,11 +19,12 @@ module Mixpanel
17
19
  # You likely won't need to instantiate instances of Mixpanel::People
18
20
  # directly. The best way to get an instance of Mixpanel::People is
19
21
  #
20
- # tracker = Mixpanel::Tracker.new(...)
22
+ # tracker = Mixpanel::Tracker.new(YOUR_MIXPANEL_TOKEN)
21
23
  # tracker.people # An instance of Mixpanel::People
22
24
  #
23
- def initialize(token, &block)
25
+ def initialize(token, error_handler=nil, &block)
24
26
  @token = token
27
+ @error_handler = error_handler || ErrorHandler.new
25
28
 
26
29
  if block
27
30
  @sink = block
@@ -35,7 +38,7 @@ module Mixpanel
35
38
  # keys, and values that are strings, numbers, booleans, or
36
39
  # DateTimes
37
40
  #
38
- # tracker = Mixpanel::Tracker.new
41
+ # tracker = Mixpanel::Tracker.new(YOUR_MIXPANEL_TOKEN)
39
42
  # # Sets properties on profile with id "1234"
40
43
  # tracker.people.set("1234", {
41
44
  # 'company' => 'Acme',
@@ -61,7 +64,7 @@ module Mixpanel
61
64
  # in the profile. That means you can call set_once many times
62
65
  # without changing an original value.
63
66
  #
64
- # tracker = Mixpanel::Tracker.new
67
+ # tracker = Mixpanel::Tracker.new(YOUR_MIXPANEL_TOKEN)
65
68
  # tracker.people.set_once("12345", {
66
69
  # 'First Login Date': DateTime.now
67
70
  # });
@@ -83,7 +86,7 @@ module Mixpanel
83
86
  # property. If no property exists with a given name, the value
84
87
  # will be added to zero.
85
88
  #
86
- # tracker = Mixpanel::Tracker.new
89
+ # tracker = Mixpanel::Tracker.new(YOUR_MIXPANEL_TOKEN)
87
90
  # tracker.people.increment("12345", {
88
91
  # 'Coins Spent' => 7,
89
92
  # 'Coins Earned' => -7, # Use a negative number to subtract
@@ -104,7 +107,7 @@ module Mixpanel
104
107
  # by one. Calling #plus_one(distinct_id, property_name) is the same as calling
105
108
  # #increment(distinct_id, {property_name => 1})
106
109
  #
107
- # tracker = Mixpanel::Tracker.new
110
+ # tracker = Mixpanel::Tracker.new(YOUR_MIXPANEL_TOKEN)
108
111
  # tracker.people.plus_one("12345", "Albums Released")
109
112
  #
110
113
  def plus_one(distinct_id, property_name, ip=nil, optional_params={})
@@ -115,7 +118,7 @@ module Mixpanel
115
118
  # If the given properties don't exist, a new list-valued
116
119
  # property will be created.
117
120
  #
118
- # tracker = Mixpanel::Tracker.new
121
+ # tracker = Mixpanel::Tracker.new(YOUR_MIXPANEL_TOKEN)
119
122
  # tracker.people.append("12345", {
120
123
  # 'Login Dates' => DateTime.now,
121
124
  # 'Alter Ego Names' => 'Ziggy Stardust'
@@ -138,7 +141,7 @@ module Mixpanel
138
141
  # property. After a union, every element in the list associated
139
142
  # with a property will be unique.
140
143
  #
141
- # tracker = Mixpanel::Tracker.new
144
+ # tracker = Mixpanel::Tracker.new(YOUR_MIXPANEL_TOKEN)
142
145
  # tracker.people.union("12345", {
143
146
  # 'Levels Completed' => ['Suffragette City']
144
147
  # });
@@ -156,7 +159,7 @@ module Mixpanel
156
159
 
157
160
  # Removes properties and their values from a profile.
158
161
  #
159
- # tracker = Mixpanel::Tracker.new
162
+ # tracker = Mixpanel::Tracker.new(YOUR_MIXPANEL_TOKEN)
160
163
  #
161
164
  # # removes a single property and its value from a profile
162
165
  # tracker.people.unset("12345", "Overdue Since")
@@ -178,7 +181,7 @@ module Mixpanel
178
181
  # Records a payment to you to a profile. Charges recorded with
179
182
  # #track_charge will appear in the \Mixpanel revenue report.
180
183
  #
181
- # tracker = Mixpanel::Tracker.new
184
+ # tracker = Mixpanel::Tracker.new(YOUR_MIXPANEL_TOKEN)
182
185
  #
183
186
  # # records a charge of $25.32 from user 12345
184
187
  # tracker.people.track_charge("12345", 25.32)
@@ -228,7 +231,8 @@ module Mixpanel
228
231
  ret = true
229
232
  begin
230
233
  @sink.call(:profile_update, message.to_json)
231
- rescue MixpanelError
234
+ rescue MixpanelError => e
235
+ @error_handler.handle(e)
232
236
  ret = false
233
237
  end
234
238
 
@@ -237,10 +241,12 @@ module Mixpanel
237
241
 
238
242
  private
239
243
 
240
- def fix_property_dates(h)
241
- h.inject({}) do |ret,(k,v)|
242
- v = v.respond_to?(:new_offset) ? v.new_offset('0') : v
243
- ret[k] = v.respond_to?(:strftime) ? v.strftime('%Y-%m-%dT%H:%M:%S') : v
244
+ def fix_property_dates(properties)
245
+ properties.inject({}) do |ret, (key, value)|
246
+ value = value.respond_to?(:new_offset) ? value.new_offset('0') : value
247
+ value = value.respond_to?(:utc) ? value.utc : value # Handle ActiveSupport::TimeWithZone
248
+
249
+ ret[key] = value.respond_to?(:strftime) ? value.strftime('%Y-%m-%dT%H:%M:%S') : value
244
250
  ret
245
251
  end
246
252
  end
@@ -42,10 +42,10 @@ module Mixpanel
42
42
  # If a block is provided, it is passed a type (one of :event or :profile_update)
43
43
  # and a string message. This same format is accepted by Mixpanel::Consumer#send!
44
44
  # and Mixpanel::BufferedConsumer#send!
45
- def initialize(token, &block)
46
- super(token, &block)
45
+ def initialize(token, error_handler=nil, &block)
46
+ super(token, error_handler, &block)
47
47
  @token = token
48
- @people = People.new(token, &block)
48
+ @people = People.new(token, error_handler, &block)
49
49
  end
50
50
 
51
51
  # A call to #track is a report that an event has occurred. #track
@@ -55,7 +55,7 @@ module Mixpanel
55
55
  # as a Hash with string keys and strings, numbers or booleans as
56
56
  # values.
57
57
  #
58
- # tracker = Mixpanel::Tracker.new
58
+ # tracker = Mixpanel::Tracker.new(YOUR_MIXPANEL_TOKEN)
59
59
  #
60
60
  # # Track that user "12345"'s credit card was declined
61
61
  # tracker.track("12345", "Credit Card Declined")
@@ -79,7 +79,7 @@ module Mixpanel
79
79
  # as a Hash with string keys and strings, numbers or booleans as
80
80
  # values.
81
81
  #
82
- # tracker = Mixpanel::Tracker.new
82
+ # tracker = Mixpanel::Tracker.new(YOUR_MIXPANEL_TOKEN)
83
83
  #
84
84
  # # Import event that user "12345"'s credit card was declined
85
85
  # tracker.import("API_KEY", "12345", "Credit Card Declined", {
@@ -125,7 +125,8 @@ module Mixpanel
125
125
  ret = true
126
126
  begin
127
127
  consumer.send!(:event, message.to_json)
128
- rescue MixpanelError
128
+ rescue MixpanelError => e
129
+ @error_handler.handle(e)
129
130
  ret = false
130
131
  end
131
132
 
@@ -140,7 +141,7 @@ module Mixpanel
140
141
  # strings, numbers or booleans as values. For more information, please see:
141
142
  # https://mixpanel.com/docs/api-documentation/pixel-based-event-tracking
142
143
  #
143
- # tracker = Mixpanel::Tracker.new
144
+ # tracker = Mixpanel::Tracker.new(YOUR_MIXPANEL_TOKEN)
144
145
  #
145
146
  # # generate pixel tracking url in order to track that user
146
147
  # # "12345"'s credit card was declined
@@ -1,3 +1,3 @@
1
1
  module Mixpanel
2
- VERSION = '2.1.0'
2
+ VERSION = '2.2.0'
3
3
  end
@@ -14,6 +14,7 @@ spec = Gem::Specification.new do |spec|
14
14
 
15
15
  spec.required_ruby_version = '>= 2.0.0'
16
16
 
17
+ spec.add_development_dependency 'activesupport', '~> 4.0'
17
18
  spec.add_development_dependency 'rake', '~> 0'
18
19
  spec.add_development_dependency 'rspec', '~> 3.0'
19
20
  spec.add_development_dependency 'webmock', '~> 1.18'
@@ -1,6 +1,7 @@
1
+ require 'base64'
1
2
  require 'spec_helper'
2
3
  require 'webmock'
3
- require 'base64'
4
+
4
5
  require 'mixpanel-ruby/consumer'
5
6
 
6
7
  describe Mixpanel::Consumer do
@@ -0,0 +1,76 @@
1
+ require 'spec_helper'
2
+
3
+ require 'mixpanel-ruby/error.rb'
4
+ require 'mixpanel-ruby/events.rb'
5
+
6
+ class TestErrorHandler < Mixpanel::ErrorHandler
7
+ def initialize(log)
8
+ @log = log
9
+ end
10
+
11
+ def handle(error)
12
+ @log << error.to_s
13
+ end
14
+ end
15
+
16
+ describe Mixpanel::ErrorHandler do
17
+ it "should respond to #handle`" do
18
+ error_handler = Mixpanel::ErrorHandler.new
19
+ expect(error_handler.respond_to?(:handle)).to be true
20
+ end
21
+
22
+ context 'without a customer error_handler' do
23
+
24
+ before(:each) do
25
+ @tracker = Mixpanel::Tracker.new('TEST TOKEN') do |type, message|
26
+ raise Mixpanel::MixpanelError
27
+ end
28
+ end
29
+
30
+ it "should silence errors in track calls" do
31
+ expect {
32
+ expect(@tracker.track('TEST ID', 'Test Event')).to be false
33
+ }.to_not raise_error
34
+ end
35
+
36
+ it "should handle errors in import calls" do
37
+ expect {
38
+ expect(@tracker.import('TEST API KEY', 'TEST DISTINCT_ID', 'Test Event')).to be false
39
+ }.to_not raise_error
40
+ end
41
+
42
+ it "should handle errors in people calls" do
43
+ expect {
44
+ expect(@tracker.people.set('TEST ID', {})).to be false
45
+ }.to_not raise_error
46
+ end
47
+
48
+ end
49
+
50
+ context 'with a custom error_handler' do
51
+
52
+ before(:each) do
53
+ @log = []
54
+ @error_handler = TestErrorHandler.new(@log)
55
+ @tracker = Mixpanel::Tracker.new('TEST TOKEN', @error_handler) do |type, message|
56
+ raise Mixpanel::MixpanelError
57
+ end
58
+ end
59
+
60
+ it "should handle errors in track calls" do
61
+ @tracker.track('TEST ID', 'Test Event', {})
62
+ expect(@log).to eq(['Mixpanel::MixpanelError'])
63
+ end
64
+
65
+ it "should handle errors in import calls" do
66
+ @tracker.import('TEST API KEY', 'TEST DISTINCT_ID', 'Test Event')
67
+ expect(@log).to eq(['Mixpanel::MixpanelError'])
68
+ end
69
+
70
+ it "should handle errors in people calls" do
71
+ @tracker.people.set('TEST ID', {})
72
+ expect(@log).to eq(['Mixpanel::MixpanelError'])
73
+ end
74
+
75
+ end
76
+ end
@@ -1,7 +1,8 @@
1
1
  require 'spec_helper'
2
+ require 'time'
3
+
2
4
  require 'mixpanel-ruby/events.rb'
3
5
  require 'mixpanel-ruby/version.rb'
4
- require 'time'
5
6
 
6
7
  describe Mixpanel::Events do
7
8
  before(:each) do
@@ -1,4 +1,6 @@
1
1
  require 'spec_helper'
2
+ require 'active_support/time'
3
+
2
4
  require 'mixpanel-ruby/people'
3
5
 
4
6
  describe Mixpanel::People do
@@ -44,14 +46,29 @@ describe Mixpanel::People do
44
46
 
45
47
  it 'should convert offset datetimes to UTC' do
46
48
  @people.set("TEST ID", {
47
- 'created_at' => DateTime.new(2013, 1, 1, 18, 4, 5, '-9')
49
+ 'created_at' => DateTime.new(2013, 1, 1, 18, 4, 5, '-8')
48
50
  })
49
51
  expect(@log).to eq([[:profile_update, 'data' => {
50
52
  '$token' => 'TEST TOKEN',
51
53
  '$distinct_id' => 'TEST ID',
52
54
  '$time' => @time_now.to_i * 1000,
53
55
  '$set' => {
54
- 'created_at' => '2013-01-02T03:04:05'
56
+ 'created_at' => '2013-01-02T02:04:05'
57
+ }
58
+ }]])
59
+ end
60
+
61
+ it 'should convert offset ActiveSupport::TimeWithZone objects to UTC' do
62
+ Time.zone = 'Pacific Time (US & Canada)'
63
+ @people.set("TEST ID", {
64
+ 'created_at' => Time.zone.local(2013, 1, 1, 18, 4, 5)
65
+ })
66
+ expect(@log).to eq([[:profile_update, 'data' => {
67
+ '$token' => 'TEST TOKEN',
68
+ '$distinct_id' => 'TEST ID',
69
+ '$time' => @time_now.to_i * 1000,
70
+ '$set' => {
71
+ 'created_at' => '2013-01-02T02:04:05'
55
72
  }
56
73
  }]])
57
74
  end
@@ -1,8 +1,8 @@
1
- require 'mixpanel-ruby'
2
1
  require 'base64'
2
+ require 'cgi'
3
3
  require 'json'
4
+ require 'mixpanel-ruby'
4
5
  require 'uri'
5
- require 'cgi'
6
6
 
7
7
  describe Mixpanel::Tracker do
8
8
  before(:each) do
metadata CHANGED
@@ -1,15 +1,29 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mixpanel-ruby
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.1.0
4
+ version: 2.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Mixpanel
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-04-07 00:00:00.000000000 Z
11
+ date: 2015-07-13 00:00:00.000000000 Z
12
12
  dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: activesupport
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '4.0'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '4.0'
13
27
  - !ruby/object:Gem::Dependency
14
28
  name: rake
15
29
  requirement: !ruby/object:Gem::Requirement
@@ -70,12 +84,14 @@ files:
70
84
  - demo/simple_messages.rb
71
85
  - lib/mixpanel-ruby.rb
72
86
  - lib/mixpanel-ruby/consumer.rb
87
+ - lib/mixpanel-ruby/error.rb
73
88
  - lib/mixpanel-ruby/events.rb
74
89
  - lib/mixpanel-ruby/people.rb
75
90
  - lib/mixpanel-ruby/tracker.rb
76
91
  - lib/mixpanel-ruby/version.rb
77
92
  - mixpanel-ruby.gemspec
78
93
  - spec/mixpanel-ruby/consumer_spec.rb
94
+ - spec/mixpanel-ruby/error_spec.rb
79
95
  - spec/mixpanel-ruby/events_spec.rb
80
96
  - spec/mixpanel-ruby/people_spec.rb
81
97
  - spec/mixpanel-ruby/tracker_spec.rb