mixpanel_client 4.1.5 → 4.1.6
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/.codeclimate.yml +21 -0
- data/changelog.md +5 -0
- data/config/mixpanel.template.yml +0 -1
- data/lib/mixpanel/client.rb +27 -37
- data/lib/mixpanel/uri.rb +4 -1
- data/lib/mixpanel/version.rb +1 -1
- data/manual_test/basic.rb +1 -3
- data/manual_test/parallel.rb +2 -2
- data/readme.md +0 -2
- data/spec/mixpanel_client/events_externalspec.rb +7 -14
- data/spec/mixpanel_client/mixpanel_client_spec.rb +7 -65
- data/spec/mixpanel_client/properties_externalspec.rb +4 -5
- data/spec/mixpanel_client/uri_spec.rb +11 -8
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a0b1c877cdcf416ba164f8e7b9fe9ab31857b090
|
4
|
+
data.tar.gz: bfd32fe4693da8458500b26fe18e2143dd03359b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 2b6d2372e919718d682ade39e7edf8740e31685c2e6272418c022e2b3374d53927a47e0dfd5a5c72d39a0df4bde2ad2c18943eed0acf01ea7708634989f372ff
|
7
|
+
data.tar.gz: 330f9bd86e8436c439944fced484d8919c07279ad7ce1dff5023e15e99a2aa7b9dde581e7cfbb5be71a6029d898be5ab8b9ef7b6cf1489d5cb026c266f82eb65
|
data/.codeclimate.yml
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
---
|
2
|
+
engines:
|
3
|
+
duplication:
|
4
|
+
enabled: true
|
5
|
+
config:
|
6
|
+
languages:
|
7
|
+
- ruby
|
8
|
+
fixme:
|
9
|
+
enabled: true
|
10
|
+
rubocop:
|
11
|
+
enabled: true
|
12
|
+
markdownlint:
|
13
|
+
enabled: true
|
14
|
+
reek:
|
15
|
+
enabled: true
|
16
|
+
ratings:
|
17
|
+
paths:
|
18
|
+
- "**.rb"
|
19
|
+
exclude_paths:
|
20
|
+
- config/
|
21
|
+
- spec/
|
data/changelog.md
CHANGED
data/lib/mixpanel/client.rb
CHANGED
@@ -9,27 +9,36 @@
|
|
9
9
|
module Mixpanel
|
10
10
|
# Return metrics from Mixpanel Data API
|
11
11
|
class Client
|
12
|
-
BASE_URI = 'https://mixpanel.com/api/2.0'
|
13
|
-
DATA_URI = 'https://data.mixpanel.com/api/2.0'
|
14
|
-
IMPORT_URI = 'https://api.mixpanel.com'
|
12
|
+
BASE_URI = 'https://mixpanel.com/api/2.0'.freeze
|
13
|
+
DATA_URI = 'https://data.mixpanel.com/api/2.0'.freeze
|
14
|
+
IMPORT_URI = 'https://api.mixpanel.com'.freeze
|
15
15
|
|
16
16
|
attr_reader :uri
|
17
|
-
attr_accessor :
|
17
|
+
attr_accessor :api_secret, :parallel, :timeout
|
18
|
+
|
19
|
+
def self.base_uri_for_resource(resource)
|
20
|
+
if resource == 'export'
|
21
|
+
DATA_URI
|
22
|
+
elsif resource == 'import'
|
23
|
+
IMPORT_URI
|
24
|
+
else
|
25
|
+
BASE_URI
|
26
|
+
end
|
27
|
+
end
|
18
28
|
|
19
29
|
# Configure the client
|
20
30
|
#
|
21
31
|
# @example
|
22
|
-
# config = {
|
32
|
+
# config = {api_secret: '456'}
|
23
33
|
# client = Mixpanel::Client.new(config)
|
24
34
|
#
|
25
|
-
# @param [Hash] config consisting of an '
|
35
|
+
# @param [Hash] config consisting of an 'api_secret' and additonal options
|
26
36
|
def initialize(config)
|
27
|
-
@api_key = config[:api_key]
|
28
37
|
@api_secret = config[:api_secret]
|
29
38
|
@parallel = config[:parallel] || false
|
30
39
|
@timeout = config[:timeout] || nil
|
31
40
|
|
32
|
-
|
41
|
+
raise ConfigurationError, 'api_secret is required' if @api_secret.nil?
|
33
42
|
end
|
34
43
|
|
35
44
|
# Return mixpanel data as a JSON object or CSV string
|
@@ -97,6 +106,7 @@ module Mixpanel
|
|
97
106
|
URI.mixpanel(resource, normalize_options(options))
|
98
107
|
end
|
99
108
|
|
109
|
+
# TODO: Extract and refactor
|
100
110
|
# rubocop:disable MethodLength
|
101
111
|
def prepare_parallel_request
|
102
112
|
request = ::Typhoeus::Request.new(@uri, userpwd: "#{@api_secret}:")
|
@@ -105,19 +115,19 @@ module Mixpanel
|
|
105
115
|
if response.success?
|
106
116
|
Utils.to_hash(response.body, @format)
|
107
117
|
elsif response.timed_out?
|
108
|
-
|
118
|
+
raise TimeoutError
|
109
119
|
elsif response.code == 0
|
110
120
|
# Could not get an http response, something's wrong
|
111
|
-
|
121
|
+
raise HTTPError, response.curl_error_message
|
112
122
|
else
|
113
123
|
# Received a non-successful http response
|
114
|
-
if response.body && response.body != ''
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
124
|
+
error_message = if response.body && response.body != ''
|
125
|
+
JSON.parse(response.body)['error']
|
126
|
+
else
|
127
|
+
response.code.to_s
|
128
|
+
end
|
119
129
|
|
120
|
-
|
130
|
+
raise HTTPError, error_message
|
121
131
|
end
|
122
132
|
end
|
123
133
|
|
@@ -141,27 +151,7 @@ module Mixpanel
|
|
141
151
|
# signature
|
142
152
|
def normalize_options(options)
|
143
153
|
normalized_options = options.dup
|
144
|
-
|
145
|
-
normalized_options
|
146
|
-
.merge!(
|
147
|
-
format: @format,
|
148
|
-
expire: request_expires_at(normalized_options)
|
149
|
-
)
|
150
|
-
end
|
151
|
-
|
152
|
-
def request_expires_at(options)
|
153
|
-
ten_minutes_from_now = Time.now.to_i + 600
|
154
|
-
options[:expire] ? options[:expire].to_i : ten_minutes_from_now
|
155
|
-
end
|
156
|
-
|
157
|
-
def self.base_uri_for_resource(resource)
|
158
|
-
if resource == 'export'
|
159
|
-
DATA_URI
|
160
|
-
elsif resource == 'import'
|
161
|
-
IMPORT_URI
|
162
|
-
else
|
163
|
-
BASE_URI
|
164
|
-
end
|
154
|
+
normalized_options.merge!(format: @format)
|
165
155
|
end
|
166
156
|
end
|
167
157
|
end
|
data/lib/mixpanel/uri.rb
CHANGED
@@ -19,7 +19,10 @@ module Mixpanel
|
|
19
19
|
end
|
20
20
|
|
21
21
|
def self.get(uri, timeout, secret)
|
22
|
-
::URI.parse(uri).read(
|
22
|
+
::URI.parse(uri).read(
|
23
|
+
read_timeout: timeout,
|
24
|
+
http_basic_authentication: [secret, nil]
|
25
|
+
)
|
23
26
|
rescue OpenURI::HTTPError => error
|
24
27
|
raise HTTPError, JSON.parse(error.io.read)['error']
|
25
28
|
end
|
data/lib/mixpanel/version.rb
CHANGED
data/manual_test/basic.rb
CHANGED
@@ -12,7 +12,6 @@ config = YAML.load_file(File.join(
|
|
12
12
|
))['mixpanel']
|
13
13
|
|
14
14
|
client = Mixpanel::Client.new(
|
15
|
-
api_key: config[:api_key],
|
16
15
|
api_secret: config[:api_secret]
|
17
16
|
)
|
18
17
|
|
@@ -20,7 +19,6 @@ data = client.request('events/properties',
|
|
20
19
|
event: '["test-event"]',
|
21
20
|
type: 'general',
|
22
21
|
unit: 'hour',
|
23
|
-
name: 'test'
|
24
|
-
)
|
22
|
+
name: 'test')
|
25
23
|
|
26
24
|
puts data.inspect
|
data/manual_test/parallel.rb
CHANGED
data/readme.md
CHANGED
@@ -22,7 +22,6 @@ or if you use a Gemfile
|
|
22
22
|
require 'mixpanel_client'
|
23
23
|
|
24
24
|
client = Mixpanel::Client.new(
|
25
|
-
api_key: 'changeme',
|
26
25
|
api_secret: 'changeme'
|
27
26
|
)
|
28
27
|
|
@@ -69,7 +68,6 @@ You may also make requests in parallel by passing in the `parallel: true` option
|
|
69
68
|
require 'mixpanel_client'
|
70
69
|
|
71
70
|
client = Mixpanel::Client.new(
|
72
|
-
api_key: 'changeme',
|
73
71
|
api_secret: 'changeme',
|
74
72
|
parallel: true
|
75
73
|
)
|
@@ -29,8 +29,7 @@ describe 'External calls to mixpanel' do
|
|
29
29
|
event: '["test-event"]',
|
30
30
|
type: 'general',
|
31
31
|
unit: 'hour',
|
32
|
-
interval: 24
|
33
|
-
)
|
32
|
+
interval: 24)
|
34
33
|
expect(data).to_not be_a Exception
|
35
34
|
end
|
36
35
|
|
@@ -40,8 +39,7 @@ describe 'External calls to mixpanel' do
|
|
40
39
|
type: 'general',
|
41
40
|
unit: 'hour',
|
42
41
|
interval: 24,
|
43
|
-
format: 'csv'
|
44
|
-
)
|
42
|
+
format: 'csv')
|
45
43
|
expect(data).to_not be_a Exception
|
46
44
|
end
|
47
45
|
|
@@ -51,16 +49,14 @@ describe 'External calls to mixpanel' do
|
|
51
49
|
type: 'general',
|
52
50
|
unit: 'hour',
|
53
51
|
interval: 24,
|
54
|
-
bucket: 'test'
|
55
|
-
)
|
52
|
+
bucket: 'test')
|
56
53
|
expect(data).to_not be_a Exception
|
57
54
|
end
|
58
55
|
|
59
56
|
it 'should return top events' do
|
60
57
|
data = @client.request('events/top',
|
61
58
|
type: 'general',
|
62
|
-
limit: 10
|
63
|
-
)
|
59
|
+
limit: 10)
|
64
60
|
expect(data).to_not be_a Exception
|
65
61
|
end
|
66
62
|
|
@@ -69,8 +65,7 @@ describe 'External calls to mixpanel' do
|
|
69
65
|
type: 'general',
|
70
66
|
unit: 'hour',
|
71
67
|
interval: 24,
|
72
|
-
limit: 10
|
73
|
-
)
|
68
|
+
limit: 10)
|
74
69
|
expect(data).to_not be_a Exception
|
75
70
|
end
|
76
71
|
|
@@ -80,8 +75,7 @@ describe 'External calls to mixpanel' do
|
|
80
75
|
event: '["test-event"]',
|
81
76
|
type: 'general',
|
82
77
|
unit: 'hour',
|
83
|
-
interval: 24
|
84
|
-
)
|
78
|
+
interval: 24)
|
85
79
|
expect(data).to_not be_a Exception
|
86
80
|
end
|
87
81
|
|
@@ -92,8 +86,7 @@ describe 'External calls to mixpanel' do
|
|
92
86
|
type: 'general',
|
93
87
|
unit: 'hour',
|
94
88
|
interval: 24,
|
95
|
-
format: 'csv'
|
96
|
-
)
|
89
|
+
format: 'csv')
|
97
90
|
expect(data).to_not be_a Exception
|
98
91
|
end
|
99
92
|
end
|
@@ -3,7 +3,6 @@ require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
|
|
3
3
|
describe Mixpanel::Client do
|
4
4
|
before :all do
|
5
5
|
@client = Mixpanel::Client.new(
|
6
|
-
api_key: 'test_key',
|
7
6
|
api_secret: 'test_secret'
|
8
7
|
)
|
9
8
|
|
@@ -13,14 +12,12 @@ describe Mixpanel::Client do
|
|
13
12
|
context 'when initializing a new Mixpanel::Client' do
|
14
13
|
it 'should set a parallel option as false by default' do
|
15
14
|
expect(Mixpanel::Client.new(
|
16
|
-
api_key: 'test_key',
|
17
15
|
api_secret: 'test_secret'
|
18
16
|
).parallel).to eq(false)
|
19
17
|
end
|
20
18
|
|
21
19
|
it 'should be able to set a parallel option when passed' do
|
22
20
|
expect(Mixpanel::Client.new(
|
23
|
-
api_key: 'test_key',
|
24
21
|
api_secret: 'test_secret',
|
25
22
|
parallel: true
|
26
23
|
).parallel).to eq(true)
|
@@ -28,14 +25,12 @@ describe Mixpanel::Client do
|
|
28
25
|
|
29
26
|
it 'should set a timeout option as nil by default' do
|
30
27
|
expect(Mixpanel::Client.new(
|
31
|
-
api_key: 'test_key',
|
32
28
|
api_secret: 'test_secret'
|
33
29
|
).timeout).to be_nil
|
34
30
|
end
|
35
31
|
|
36
32
|
it 'should be able to set a timeout option when passed' do
|
37
33
|
expect(Mixpanel::Client.new(
|
38
|
-
api_key: 'test_key',
|
39
34
|
api_secret: 'test_secret',
|
40
35
|
timeout: 3
|
41
36
|
).timeout).to eql(3)
|
@@ -43,22 +38,12 @@ describe Mixpanel::Client do
|
|
43
38
|
end
|
44
39
|
|
45
40
|
context 'when making an invalid request' do
|
46
|
-
it 'should raise an error when API key is null' do
|
47
|
-
expect do
|
48
|
-
Mixpanel::Client.new(
|
49
|
-
api_key: nil,
|
50
|
-
api_secret: 'test_secret'
|
51
|
-
)
|
52
|
-
end.to raise_error
|
53
|
-
end
|
54
|
-
|
55
41
|
it 'should raise an error when API secret is null' do
|
56
42
|
expect do
|
57
43
|
Mixpanel::Client.new(
|
58
|
-
api_key: 'test_key',
|
59
44
|
api_secret: nil
|
60
45
|
)
|
61
|
-
end.to raise_error
|
46
|
+
end.to raise_error(Mixpanel::ConfigurationError)
|
62
47
|
end
|
63
48
|
|
64
49
|
it 'should return an argument error "Wrong number of arguments" if using
|
@@ -154,52 +139,9 @@ describe Mixpanel::Client do
|
|
154
139
|
end.to_not change { options }
|
155
140
|
end
|
156
141
|
|
157
|
-
context 'with a custom expiry time' do
|
158
|
-
# Stub Mixpanel request
|
159
|
-
before do
|
160
|
-
stub_request(:get, /^#{@uri}.*/)
|
161
|
-
.to_return(
|
162
|
-
body: '{"events": [], "type": "general"}'
|
163
|
-
)
|
164
|
-
end
|
165
|
-
|
166
|
-
let(:expiry) { Time.now + 100_000 }
|
167
|
-
let(:fake_url) { Mixpanel::Client::BASE_URI }
|
168
|
-
|
169
|
-
specify 'Client#request should return a hash with empty events and
|
170
|
-
type' do
|
171
|
-
# With endpoint
|
172
|
-
data = @client.request(
|
173
|
-
'events/top',
|
174
|
-
type: 'general',
|
175
|
-
expire: expiry
|
176
|
-
)
|
177
|
-
|
178
|
-
data.should eq(
|
179
|
-
'events' => [],
|
180
|
-
'type' => 'general'
|
181
|
-
)
|
182
|
-
end
|
183
|
-
|
184
|
-
specify 'Mixpanel::URI instance should receive the custom expiry time in
|
185
|
-
the options[:expiry] instead of 600s' do
|
186
|
-
expect(Mixpanel::URI).to receive(:mixpanel) do |*args|
|
187
|
-
args.pop[:expire].should eq expiry.to_i
|
188
|
-
true
|
189
|
-
end.and_return(fake_url)
|
190
|
-
|
191
|
-
@client.request(
|
192
|
-
'events/top',
|
193
|
-
type: 'general',
|
194
|
-
expire: expiry
|
195
|
-
)
|
196
|
-
end
|
197
|
-
end
|
198
|
-
|
199
142
|
context 'with parallel option enabled' do
|
200
143
|
before :all do
|
201
144
|
@parallel_client = Mixpanel::Client.new(
|
202
|
-
api_key: 'test_key',
|
203
145
|
api_secret: 'test_secret',
|
204
146
|
parallel: true
|
205
147
|
)
|
@@ -225,7 +167,7 @@ describe Mixpanel::Client do
|
|
225
167
|
|
226
168
|
describe '#hydra' do
|
227
169
|
it 'should return a Typhoeus::Hydra object' do
|
228
|
-
@parallel_client.hydra.
|
170
|
+
expect(@parallel_client.hydra).to be_a Typhoeus::Hydra
|
229
171
|
end
|
230
172
|
end
|
231
173
|
|
@@ -282,7 +224,7 @@ describe Mixpanel::Client do
|
|
282
224
|
|
283
225
|
@parallel_client.run_parallel_requests
|
284
226
|
|
285
|
-
first_request.response.handled_response.
|
227
|
+
expect(first_request.response.handled_response).to eq(
|
286
228
|
'data' => {
|
287
229
|
'series' => %w(2010-05-29 2010-05-30 2010-05-31),
|
288
230
|
'values' => {
|
@@ -299,7 +241,7 @@ describe Mixpanel::Client do
|
|
299
241
|
'legend_size' => 1
|
300
242
|
)
|
301
243
|
|
302
|
-
second_request.response.handled_response.
|
244
|
+
expect(second_request.response.handled_response).to eq(
|
303
245
|
'data' => {
|
304
246
|
'series' => %w(2010-05-29 2010-05-30 2010-05-31),
|
305
247
|
'values' => {
|
@@ -335,15 +277,15 @@ describe Mixpanel::Client do
|
|
335
277
|
@client.api_secret
|
336
278
|
)
|
337
279
|
|
338
|
-
unsorted_signature.
|
280
|
+
expect(unsorted_signature).to eq sorted_signature
|
339
281
|
end
|
340
282
|
end
|
341
283
|
|
342
284
|
describe '#to_hash' do
|
343
285
|
it 'should return a ruby hash given json as a string' do
|
344
286
|
expect(Mixpanel::Client::Utils.to_hash(
|
345
|
-
|
346
|
-
|
287
|
+
'{"a" : "ey", "b" : "bee"}',
|
288
|
+
:json
|
347
289
|
)).to eq(
|
348
290
|
'a' => 'ey',
|
349
291
|
'b' => 'bee'
|
@@ -12,7 +12,7 @@ describe 'External calls to mixpanel' do
|
|
12
12
|
'mixpanel.yml'
|
13
13
|
))['mixpanel']
|
14
14
|
|
15
|
-
config.
|
15
|
+
expect(config).not_to be_nil
|
16
16
|
@client = Mixpanel::Client.new(config)
|
17
17
|
end
|
18
18
|
|
@@ -21,7 +21,7 @@ describe 'External calls to mixpanel' do
|
|
21
21
|
data = lambda do
|
22
22
|
@client.request('properties', {})
|
23
23
|
end
|
24
|
-
data.
|
24
|
+
expect(data).to raise_error(Mixpanel::HTTPError)
|
25
25
|
end
|
26
26
|
|
27
27
|
it 'should return events' do
|
@@ -33,9 +33,8 @@ describe 'External calls to mixpanel' do
|
|
33
33
|
unit: 'hour',
|
34
34
|
interval: 24,
|
35
35
|
limit: 5,
|
36
|
-
bucket: 'kicked'
|
37
|
-
|
38
|
-
data.should_not be_a Exception
|
36
|
+
bucket: 'kicked')
|
37
|
+
expect(data).not_to be_a Exception
|
39
38
|
end
|
40
39
|
end
|
41
40
|
end
|
@@ -8,7 +8,7 @@ describe Mixpanel::URI do
|
|
8
8
|
resource = 'events'
|
9
9
|
params = { c: 'see', a: 'ey' }
|
10
10
|
|
11
|
-
Mixpanel::URI.mixpanel(resource, params).
|
11
|
+
expect(Mixpanel::URI.mixpanel(resource, params)).to eq(
|
12
12
|
"#{Mixpanel::Client::BASE_URI}/events?a=ey&c=see"
|
13
13
|
)
|
14
14
|
end
|
@@ -18,7 +18,7 @@ describe Mixpanel::URI do
|
|
18
18
|
resource = 'events/top'
|
19
19
|
params = { c: 'see', a: 'ey' }
|
20
20
|
|
21
|
-
Mixpanel::URI.mixpanel(resource, params).
|
21
|
+
expect(Mixpanel::URI.mixpanel(resource, params)).to eq(
|
22
22
|
"#{Mixpanel::Client::BASE_URI}/events/top?a=ey&c=see"
|
23
23
|
)
|
24
24
|
end
|
@@ -28,7 +28,7 @@ describe Mixpanel::URI do
|
|
28
28
|
resource = 'export'
|
29
29
|
params = { c: 'see', a: 'ey' }
|
30
30
|
|
31
|
-
Mixpanel::URI.mixpanel(resource, params).
|
31
|
+
expect(Mixpanel::URI.mixpanel(resource, params)).to eq(
|
32
32
|
"#{Mixpanel::Client::DATA_URI}/export?a=ey&c=see"
|
33
33
|
)
|
34
34
|
end
|
@@ -37,7 +37,7 @@ describe Mixpanel::URI do
|
|
37
37
|
import' do
|
38
38
|
resource = 'import'
|
39
39
|
params = { c: 'see', a: 'ey' }
|
40
|
-
Mixpanel::URI.mixpanel(resource, params).
|
40
|
+
expect(Mixpanel::URI.mixpanel(resource, params)).to eq(
|
41
41
|
"#{Mixpanel::Client::IMPORT_URI}/import?a=ey&c=see"
|
42
42
|
)
|
43
43
|
end
|
@@ -47,8 +47,9 @@ describe Mixpanel::URI do
|
|
47
47
|
it 'should return a string with url encoded values.' do
|
48
48
|
params = { hey: '!@#$%^&*()\/"Ü', soo: 'hëllö?' }
|
49
49
|
|
50
|
-
Mixpanel::URI.encode(params).
|
51
|
-
'hey=%21%40%23%24%25%5E%26%2A%28%29%5C%2F%22%C3%9C&
|
50
|
+
expect(Mixpanel::URI.encode(params)).to eq(
|
51
|
+
'hey=%21%40%23%24%25%5E%26%2A%28%29%5C%2F%22%C3%9C&' +
|
52
|
+
'soo=h%C3%ABll%C3%B6%3F'
|
52
53
|
)
|
53
54
|
end
|
54
55
|
end
|
@@ -57,7 +58,8 @@ describe Mixpanel::URI do
|
|
57
58
|
it 'should return a string response' do
|
58
59
|
stub_request(:get, 'http://example.com').to_return(body: 'something')
|
59
60
|
|
60
|
-
Mixpanel::URI.get('http://example.com', nil, 'secret').
|
61
|
+
expect(Mixpanel::URI.get('http://example.com', nil, 'secret')).to \
|
62
|
+
eq('something')
|
61
63
|
end
|
62
64
|
|
63
65
|
context 'when timeout is not nil' do
|
@@ -75,7 +77,8 @@ describe Mixpanel::URI do
|
|
75
77
|
it 'should return a string response' do
|
76
78
|
stub_request(:get, 'http://example.com').to_return(body: 'something')
|
77
79
|
|
78
|
-
Mixpanel::URI.get('http://example.com', 3, 'secret').
|
80
|
+
expect(Mixpanel::URI.get('http://example.com', 3, 'secret')).to \
|
81
|
+
eq('something')
|
79
82
|
end
|
80
83
|
end
|
81
84
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: mixpanel_client
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 4.1.
|
4
|
+
version: 4.1.6
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Keolo Keagy
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-
|
11
|
+
date: 2016-12-30 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: typhoeus
|
@@ -157,6 +157,7 @@ executables: []
|
|
157
157
|
extensions: []
|
158
158
|
extra_rdoc_files: []
|
159
159
|
files:
|
160
|
+
- ".codeclimate.yml"
|
160
161
|
- ".document"
|
161
162
|
- ".gitignore"
|
162
163
|
- ".rubocop.yml"
|