mixpanel_client 4.1.6 → 5.0.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 +5 -5
- data/.rubocop.yml +3 -2
- data/Rakefile +3 -0
- data/changelog.md +103 -69
- data/development.md +13 -0
- data/lib/mixpanel/client.rb +1 -49
- data/lib/mixpanel/utils.rb +0 -13
- data/lib/mixpanel/version.rb +1 -1
- data/mixpanel_client.gemspec +9 -10
- data/readme.md +33 -54
- data/spec/mixpanel_client/mixpanel_client_spec.rb +2 -158
- metadata +41 -61
- data/manual_test/parallel.rb +0 -35
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
|
-
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
2
|
+
SHA256:
|
|
3
|
+
metadata.gz: 92ce0970f6a065421cf5620447554a5bdebe84fc803a4c440123528179b419ca
|
|
4
|
+
data.tar.gz: 11a1d24d5f9c62a7abb24dfd3b18d8da37d90c7144e0a488c8a02c0ea6d8f5c1
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: f98b5c85552df0ed4976379f2ad6a480693c1194994f0128600a8953b561834784c4a9dca3f373d443ff67dd9e56a24865b176b59b8f9b6ee43d5988a2ecd418
|
|
7
|
+
data.tar.gz: eed74d9307fd594115302f09e4aec535fcf5b17ee1e7cd0878737c917073f46bc252df9dcc22667009a50c0d57395f22424e363b6ef9b2e4e2f0448e649ff2fa
|
data/.rubocop.yml
CHANGED
data/Rakefile
CHANGED
data/changelog.md
CHANGED
|
@@ -1,97 +1,131 @@
|
|
|
1
|
-
|
|
2
|
-
* Remove deprecated authentication options. Fixes #55.
|
|
3
|
-
* Use `expect` rspec syntax
|
|
4
|
-
* Added codeclimate config
|
|
1
|
+
# Changelog
|
|
5
2
|
|
|
6
|
-
|
|
7
|
-
* Use new authentication method for mixpanel. Fixes #52.
|
|
8
|
-
* Use `expect` rspec syntax
|
|
3
|
+
## 5.0.0
|
|
9
4
|
|
|
10
|
-
|
|
11
|
-
|
|
5
|
+
- Removed parallel option in favor of having no runtime dependencies (fixes #58)
|
|
6
|
+
- Updated `expect` to use block instead of an argument
|
|
12
7
|
|
|
13
|
-
|
|
14
|
-
* Make request options optional. Closes #46.
|
|
8
|
+
## 4.1.6
|
|
15
9
|
|
|
16
|
-
|
|
17
|
-
|
|
10
|
+
- Remove deprecated authentication options. Fixes #55
|
|
11
|
+
- Use `expect` rspec syntax
|
|
12
|
+
- Added codeclimate config
|
|
18
13
|
|
|
19
|
-
|
|
20
|
-
* Add raw response
|
|
14
|
+
## 4.1.5
|
|
21
15
|
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
* Fixed some rubocop offences
|
|
25
|
-
* Require Typhoeus when used
|
|
16
|
+
- Use new authentication method for mixpanel. Fixes #52
|
|
17
|
+
- Use `expect` rspec syntax
|
|
26
18
|
|
|
27
|
-
|
|
28
|
-
* Raise ConfigurationError if api_key or api_secret are not present
|
|
19
|
+
## 4.1.4
|
|
29
20
|
|
|
30
|
-
|
|
31
|
-
* Dropped support for Ruby 1.8.x
|
|
32
|
-
* Code cleanup via rubocop
|
|
21
|
+
- Add timeout option: Merged PR #48
|
|
33
22
|
|
|
34
|
-
|
|
35
|
-
* Updated docs
|
|
36
|
-
* Updated to latest typhoeus gem
|
|
23
|
+
## 4.1.3
|
|
37
24
|
|
|
38
|
-
|
|
39
|
-
* Added support for the import API.
|
|
40
|
-
* Allow setting of custom expiry.
|
|
25
|
+
- Make request options optional. Closes #46
|
|
41
26
|
|
|
42
|
-
|
|
43
|
-
* Gem updates
|
|
27
|
+
## 4.1.2
|
|
44
28
|
|
|
45
|
-
|
|
46
|
-
* Avoid overriding the arg of client.request
|
|
47
|
-
* Allow retrieving the request_uri of a Mixpanel request
|
|
29
|
+
- Removes typhoeus version lock, fixes a "broken" test
|
|
48
30
|
|
|
49
|
-
|
|
50
|
-
* Parallel requests option.
|
|
31
|
+
## 4.1.1
|
|
51
32
|
|
|
52
|
-
|
|
53
|
-
* NOTE: This version breaks backwards compatibility.
|
|
54
|
-
* Use a regular ruby hash instead of metaprogramming for mixpanel options.
|
|
33
|
+
- Add raw response
|
|
55
34
|
|
|
56
|
-
|
|
57
|
-
* Added some more options.
|
|
35
|
+
## 4.1.0
|
|
58
36
|
|
|
59
|
-
|
|
60
|
-
|
|
37
|
+
- Drop support for config keys to be strings. Use symbols instead
|
|
38
|
+
- Fixed some rubocop offences
|
|
39
|
+
- Require Typhoeus when used
|
|
61
40
|
|
|
62
|
-
|
|
63
|
-
* Added support for the raw data export API.
|
|
41
|
+
## 4.0.1
|
|
64
42
|
|
|
65
|
-
|
|
66
|
-
* BASE_URI is now https.
|
|
67
|
-
* Changed funnel to funnel_id.
|
|
43
|
+
- Raise ConfigurationError if api_key or api_secret are not present
|
|
68
44
|
|
|
69
|
-
|
|
70
|
-
* Updated json dependency to 1.6.
|
|
45
|
+
## 4.0.0
|
|
71
46
|
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
* All exceptions can be caught under Mixpanel::Error.
|
|
47
|
+
- Dropped support for Ruby 1.8.x
|
|
48
|
+
- Code cleanup via rubocop
|
|
75
49
|
|
|
76
|
-
|
|
77
|
-
* Added options used in segmentation resources.
|
|
50
|
+
## 3.1.4
|
|
78
51
|
|
|
79
|
-
|
|
80
|
-
|
|
52
|
+
- Updated docs
|
|
53
|
+
- Updated to latest typhoeus gem
|
|
81
54
|
|
|
82
|
-
|
|
83
|
-
* Added JSON to gemspec for ruby versions less than 1.9.
|
|
55
|
+
## 3.1.3
|
|
84
56
|
|
|
85
|
-
|
|
86
|
-
|
|
57
|
+
- Added support for the import API
|
|
58
|
+
- Allow setting of custom expiry
|
|
59
|
+
|
|
60
|
+
## v3.1.2
|
|
61
|
+
|
|
62
|
+
- Gem updates
|
|
63
|
+
|
|
64
|
+
## 3.1.1
|
|
65
|
+
|
|
66
|
+
- Avoid overriding the arg of client.request
|
|
67
|
+
- Allow retrieving the request_uri of a Mixpanel request
|
|
68
|
+
|
|
69
|
+
## 3.1.0
|
|
70
|
+
|
|
71
|
+
- Parallel requests option
|
|
72
|
+
|
|
73
|
+
## 3.0.0
|
|
74
|
+
|
|
75
|
+
- NOTE: This version breaks backwards compatibility
|
|
76
|
+
- Use a regular ruby hash instead of metaprogramming for mixpanel options
|
|
77
|
+
|
|
78
|
+
## 2.2.3
|
|
79
|
+
|
|
80
|
+
- Added some more options
|
|
81
|
+
|
|
82
|
+
## 2.2.2
|
|
83
|
+
|
|
84
|
+
- Added some more options
|
|
85
|
+
|
|
86
|
+
## 2.2.1
|
|
87
|
+
|
|
88
|
+
- Added support for the raw data export API
|
|
89
|
+
|
|
90
|
+
## 2.2.0
|
|
91
|
+
|
|
92
|
+
- BASE_URI is now https
|
|
93
|
+
- Changed funnel to funnel_id
|
|
94
|
+
|
|
95
|
+
## 2.1.0
|
|
96
|
+
|
|
97
|
+
- Updated json dependency to 1.6
|
|
98
|
+
|
|
99
|
+
## 2.0.2
|
|
100
|
+
|
|
101
|
+
- Added timezone to available options
|
|
102
|
+
- All exceptions can be caught under `Mixpanel::Error`
|
|
103
|
+
|
|
104
|
+
## 2.0.1
|
|
105
|
+
|
|
106
|
+
- Added options used in segmentation resources
|
|
107
|
+
|
|
108
|
+
## 2.0.0
|
|
109
|
+
|
|
110
|
+
- Manually tested compatibility with Mixpanel gem
|
|
111
|
+
|
|
112
|
+
## 2.0.0.beta2
|
|
113
|
+
|
|
114
|
+
- Added JSON to gemspec for ruby versions less than 1.9
|
|
115
|
+
|
|
116
|
+
## 2.0.0.beta1
|
|
117
|
+
|
|
118
|
+
- Reverted to namespacing via module name because it's a better practice.
|
|
87
119
|
I.e. Use `Mixpanel::Client` instead of `MixpanelClient`.
|
|
88
|
-
|
|
89
|
-
|
|
120
|
+
- Added 'values' as an optional parameter
|
|
121
|
+
- `gem install mixpanel_client --pre`
|
|
122
|
+
|
|
123
|
+
## 1.0.1
|
|
124
|
+
|
|
125
|
+
- Minor housekeeping and organizing
|
|
126
|
+
- Refactored specs
|
|
90
127
|
|
|
91
|
-
|
|
92
|
-
* Minor housekeeping and organizing
|
|
93
|
-
* Refactored specs
|
|
128
|
+
## 1.0.0
|
|
94
129
|
|
|
95
|
-
|
|
96
|
-
* Changed "Mixpanel" class name to "MixpanelClient" to prevent naming collision in other
|
|
130
|
+
- Changed "Mixpanel" class name to "MixpanelClient" to prevent naming collision in other
|
|
97
131
|
libraries. [a710a84e8ba4b6f018b7](https://github.com/keolo/mixpanel_client/commit/a710a84e8ba4b6f018b7404ab9fabc8f08b4a4f3)
|
data/development.md
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
# Development
|
|
2
|
+
|
|
3
|
+
- `cd` to a working directory for this project
|
|
4
|
+
- `git clone [REPOSITORY URL]`
|
|
5
|
+
- Install dependencies with `bundle install`
|
|
6
|
+
- Try `rake -T` to see available commands
|
|
7
|
+
- Try `rake spec` to run the unit tests
|
|
8
|
+
- Make code and test changes
|
|
9
|
+
- Verify code quality using `rubocop`
|
|
10
|
+
- Verify specs pass
|
|
11
|
+
- Run manual tests `lib/mixpanel/manual_test/basic.rb`
|
|
12
|
+
- Run `rake build` to build the gem into the pkg directory
|
|
13
|
+
- Run `rake release[remote]` to build and release to rubygems
|
data/lib/mixpanel/client.rb
CHANGED
|
@@ -14,7 +14,7 @@ module Mixpanel
|
|
|
14
14
|
IMPORT_URI = 'https://api.mixpanel.com'.freeze
|
|
15
15
|
|
|
16
16
|
attr_reader :uri
|
|
17
|
-
attr_accessor :api_secret, :
|
|
17
|
+
attr_accessor :api_secret, :timeout
|
|
18
18
|
|
|
19
19
|
def self.base_uri_for_resource(resource)
|
|
20
20
|
if resource == 'export'
|
|
@@ -35,7 +35,6 @@ module Mixpanel
|
|
|
35
35
|
# @param [Hash] config consisting of an 'api_secret' and additonal options
|
|
36
36
|
def initialize(config)
|
|
37
37
|
@api_secret = config[:api_secret]
|
|
38
|
-
@parallel = config[:parallel] || false
|
|
39
38
|
@timeout = config[:timeout] || nil
|
|
40
39
|
|
|
41
40
|
raise ConfigurationError, 'api_secret is required' if @api_secret.nil?
|
|
@@ -62,17 +61,7 @@ module Mixpanel
|
|
|
62
61
|
# @return [JSON, String] mixpanel response as a JSON object or CSV string
|
|
63
62
|
def request(resource, options)
|
|
64
63
|
@uri = request_uri(resource, options)
|
|
65
|
-
@parallel ? make_parallel_request : make_normal_request(resource)
|
|
66
|
-
end
|
|
67
|
-
|
|
68
|
-
def make_parallel_request
|
|
69
|
-
require 'typhoeus'
|
|
70
|
-
parallel_request = prepare_parallel_request
|
|
71
|
-
hydra.queue parallel_request
|
|
72
|
-
parallel_request
|
|
73
|
-
end
|
|
74
64
|
|
|
75
|
-
def make_normal_request(resource)
|
|
76
65
|
response = URI.get(@uri, @timeout, @api_secret)
|
|
77
66
|
|
|
78
67
|
if %w(export import).include?(resource) && @format != 'raw'
|
|
@@ -106,43 +95,6 @@ module Mixpanel
|
|
|
106
95
|
URI.mixpanel(resource, normalize_options(options))
|
|
107
96
|
end
|
|
108
97
|
|
|
109
|
-
# TODO: Extract and refactor
|
|
110
|
-
# rubocop:disable MethodLength
|
|
111
|
-
def prepare_parallel_request
|
|
112
|
-
request = ::Typhoeus::Request.new(@uri, userpwd: "#{@api_secret}:")
|
|
113
|
-
|
|
114
|
-
request.on_complete do |response|
|
|
115
|
-
if response.success?
|
|
116
|
-
Utils.to_hash(response.body, @format)
|
|
117
|
-
elsif response.timed_out?
|
|
118
|
-
raise TimeoutError
|
|
119
|
-
elsif response.code == 0
|
|
120
|
-
# Could not get an http response, something's wrong
|
|
121
|
-
raise HTTPError, response.curl_error_message
|
|
122
|
-
else
|
|
123
|
-
# Received a non-successful http response
|
|
124
|
-
error_message = if response.body && response.body != ''
|
|
125
|
-
JSON.parse(response.body)['error']
|
|
126
|
-
else
|
|
127
|
-
response.code.to_s
|
|
128
|
-
end
|
|
129
|
-
|
|
130
|
-
raise HTTPError, error_message
|
|
131
|
-
end
|
|
132
|
-
end
|
|
133
|
-
|
|
134
|
-
request
|
|
135
|
-
end
|
|
136
|
-
# rubocop:enable MethodLength
|
|
137
|
-
|
|
138
|
-
def run_parallel_requests
|
|
139
|
-
hydra.run
|
|
140
|
-
end
|
|
141
|
-
|
|
142
|
-
def hydra
|
|
143
|
-
@hydra ||= ::Typhoeus::Hydra.new
|
|
144
|
-
end
|
|
145
|
-
|
|
146
98
|
private
|
|
147
99
|
|
|
148
100
|
# Return a hash of options along with defaults and a generated signature
|
data/lib/mixpanel/utils.rb
CHANGED
|
@@ -16,19 +16,6 @@ module Mixpanel
|
|
|
16
16
|
# Copyright (c) 2009+ Keolo Keagy
|
|
17
17
|
# See LICENSE for details
|
|
18
18
|
module Utils
|
|
19
|
-
# Return a string composed of hashed values specified by the mixpanel
|
|
20
|
-
# data API
|
|
21
|
-
#
|
|
22
|
-
# @return [String] md5 hash signature required by mixpanel data API
|
|
23
|
-
def self.generate_signature(args, api_secret)
|
|
24
|
-
Digest::MD5.hexdigest(
|
|
25
|
-
args.map { |key, val| "#{key}=#{val}" }
|
|
26
|
-
.sort
|
|
27
|
-
.join +
|
|
28
|
-
api_secret
|
|
29
|
-
)
|
|
30
|
-
end
|
|
31
|
-
|
|
32
19
|
# Return a JSON object or a string depending on a given format
|
|
33
20
|
#
|
|
34
21
|
# @param [String] data either CSV or JSON formatted
|
data/lib/mixpanel/version.rb
CHANGED
data/mixpanel_client.gemspec
CHANGED
|
@@ -19,14 +19,13 @@ Gem::Specification.new do |s|
|
|
|
19
19
|
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
|
20
20
|
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
|
21
21
|
s.require_paths = ['lib']
|
|
22
|
-
s.
|
|
23
|
-
s.add_development_dependency('
|
|
24
|
-
s.add_development_dependency('
|
|
25
|
-
s.add_development_dependency('
|
|
26
|
-
s.add_development_dependency('
|
|
27
|
-
s.add_development_dependency('
|
|
28
|
-
s.add_development_dependency('pry',
|
|
29
|
-
s.add_development_dependency('pry-
|
|
30
|
-
s.add_development_dependency('
|
|
31
|
-
s.add_development_dependency('rubocop', '>=0.19.0')
|
|
22
|
+
s.add_development_dependency('bundler', '~>2.4')
|
|
23
|
+
s.add_development_dependency('rake', '~>13.0')
|
|
24
|
+
s.add_development_dependency('rdoc', '~>6.5')
|
|
25
|
+
s.add_development_dependency('rspec', '~>3.12')
|
|
26
|
+
s.add_development_dependency('webmock', '~>3.18')
|
|
27
|
+
s.add_development_dependency('pry', '~>0.14')
|
|
28
|
+
s.add_development_dependency('pry-byebug', '~>3.10')
|
|
29
|
+
s.add_development_dependency('pry-stack_explorer', '~>0.6')
|
|
30
|
+
s.add_development_dependency('rubocop', '~>1.41')
|
|
32
31
|
end
|
data/readme.md
CHANGED
|
@@ -2,7 +2,6 @@
|
|
|
2
2
|
|
|
3
3
|
[](http://badge.fury.io/rb/mixpanel_client)
|
|
4
4
|
[](https://codeclimate.com/github/keolo/mixpanel_client)
|
|
5
|
-
[ ](https://codeship.com/projects/159479)
|
|
6
5
|
|
|
7
6
|
Ruby access to the [Mixpanel](http://mixpanel.com/) web analytics tool.
|
|
8
7
|
|
|
@@ -23,80 +22,61 @@ or if you use a Gemfile
|
|
|
23
22
|
|
|
24
23
|
client = Mixpanel::Client.new(
|
|
25
24
|
api_secret: 'changeme'
|
|
25
|
+
timeout: 240 # Default is 60 seconds, increase if you get frequent Net::ReadTimeout errors.
|
|
26
26
|
)
|
|
27
27
|
|
|
28
28
|
data = client.request(
|
|
29
29
|
'events/properties',
|
|
30
|
-
event: '
|
|
31
|
-
name: '
|
|
32
|
-
values: '["
|
|
30
|
+
event: 'Product Clicked',
|
|
31
|
+
name: 'product-clicked',
|
|
32
|
+
values: '["value1", "value2"]',
|
|
33
33
|
type: 'unique',
|
|
34
34
|
unit: 'day',
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
35
|
+
limit: 5,
|
|
36
|
+
from_date: '2013-12-1', #<- Date range
|
|
37
|
+
to_date: '2014-3-1' #<-
|
|
38
38
|
)
|
|
39
39
|
|
|
40
|
-
|
|
40
|
+
The API also supports passing a time interval rather than an explicit date range.
|
|
41
41
|
|
|
42
|
-
# The API also supports passing a time interval rather than an explicit date range
|
|
43
42
|
data = client.request(
|
|
44
43
|
'events/properties',
|
|
45
|
-
event: '
|
|
46
|
-
name: '
|
|
47
|
-
values: '["
|
|
44
|
+
event: 'Product Clicked',
|
|
45
|
+
name: 'product-clicked',
|
|
46
|
+
values: '["value1", "value2"]',
|
|
48
47
|
type: 'unique',
|
|
49
48
|
unit: 'day',
|
|
50
|
-
|
|
51
|
-
|
|
49
|
+
limit: 5,
|
|
50
|
+
interval: 7 #<- Interval
|
|
52
51
|
)
|
|
53
52
|
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
# https://mixpanel.com/docs/api-documentation/importing-events-older-than-31-days
|
|
57
|
-
data_to_import = {'event' => 'firstLogin', 'properties' => {'distinct_id' => guid, 'time' => time_as_integer_seconds_since_epoch, 'token' => api_token}}
|
|
58
|
-
require 'base64' # co-located with the Base64 call below for clarity
|
|
59
|
-
encoded_data = Base64.encode64(data_to_import.to_json)
|
|
60
|
-
data = client.request('import', {:data => encoded_data, :api_key => api_key})
|
|
61
|
-
# data == [1] # => true # you can only import one event at a time
|
|
62
|
-
|
|
63
|
-
## Parallel
|
|
53
|
+
Use the Import API to specify a time in the past. You'll need to include your
|
|
54
|
+
API token in the data ([docs](https://mixpanel.com/docs/api-documentation/importing-events-older-than-31-days.)).
|
|
64
55
|
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
require 'rubygems'
|
|
68
|
-
require 'mixpanel_client'
|
|
69
|
-
|
|
70
|
-
client = Mixpanel::Client.new(
|
|
71
|
-
api_secret: 'changeme',
|
|
72
|
-
parallel: true
|
|
73
|
-
)
|
|
74
|
-
|
|
75
|
-
first_request = client.request(
|
|
76
|
-
'events/properties',
|
|
77
|
-
...
|
|
78
|
-
)
|
|
56
|
+
To import, encode the data as JSON and use Base64. Encode the data like this:
|
|
79
57
|
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
58
|
+
data_to_import = {
|
|
59
|
+
'event' => 'firstLogin',
|
|
60
|
+
'properties' => {
|
|
61
|
+
'distinct_id' => guid,
|
|
62
|
+
'time' => time_as_integer_seconds_since_epoch,
|
|
63
|
+
'token' => api_token
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
encoded_data = Base64.encode64(data_to_import.to_json)
|
|
84
67
|
|
|
85
|
-
|
|
86
|
-
'events/properties',
|
|
87
|
-
...
|
|
88
|
-
)
|
|
68
|
+
Then make a request to the API with the given API key, passing in the encoded data:
|
|
89
69
|
|
|
90
|
-
|
|
70
|
+
data = client.request('import', {:data => encoded_data, :api_key => api_key})
|
|
91
71
|
|
|
92
|
-
|
|
72
|
+
You can only import one event at a time.
|
|
93
73
|
|
|
94
|
-
|
|
95
|
-
puts second_request.response.handled_response
|
|
96
|
-
puts third_request.response.handled_response
|
|
74
|
+
## Parallel
|
|
97
75
|
|
|
76
|
+
The option to make parallel requests has been removed (in v5) so that there are no runtime dependencies.
|
|
98
77
|
|
|
99
78
|
## Development
|
|
79
|
+
|
|
100
80
|
List of rake tasks.
|
|
101
81
|
|
|
102
82
|
rake -T
|
|
@@ -115,14 +95,13 @@ Run rubocop and fix offences.
|
|
|
115
95
|
|
|
116
96
|
rubocop
|
|
117
97
|
|
|
118
|
-
|
|
119
98
|
## Changelog
|
|
120
|
-
[Changelog](changelog.md)
|
|
121
99
|
|
|
100
|
+
[Changelog](changelog.md)
|
|
122
101
|
|
|
123
102
|
## Collaborators and Maintainers
|
|
124
|
-
[Contributors](https://github.com/keolo/mixpanel_client/graphs/contributors)
|
|
125
103
|
|
|
104
|
+
[Contributors](https://github.com/keolo/mixpanel_client/graphs/contributors)
|
|
126
105
|
|
|
127
106
|
## Copyright
|
|
128
107
|
|
|
@@ -10,19 +10,6 @@ describe Mixpanel::Client do
|
|
|
10
10
|
end
|
|
11
11
|
|
|
12
12
|
context 'when initializing a new Mixpanel::Client' do
|
|
13
|
-
it 'should set a parallel option as false by default' do
|
|
14
|
-
expect(Mixpanel::Client.new(
|
|
15
|
-
api_secret: 'test_secret'
|
|
16
|
-
).parallel).to eq(false)
|
|
17
|
-
end
|
|
18
|
-
|
|
19
|
-
it 'should be able to set a parallel option when passed' do
|
|
20
|
-
expect(Mixpanel::Client.new(
|
|
21
|
-
api_secret: 'test_secret',
|
|
22
|
-
parallel: true
|
|
23
|
-
).parallel).to eq(true)
|
|
24
|
-
end
|
|
25
|
-
|
|
26
13
|
it 'should set a timeout option as nil by default' do
|
|
27
14
|
expect(Mixpanel::Client.new(
|
|
28
15
|
api_secret: 'test_secret'
|
|
@@ -54,7 +41,7 @@ describe Mixpanel::Client do
|
|
|
54
41
|
body: '{"legend_size": 0, "data": {"series": [], "values": {}}}'
|
|
55
42
|
)
|
|
56
43
|
|
|
57
|
-
|
|
44
|
+
expect {
|
|
58
45
|
@client.request(
|
|
59
46
|
nil,
|
|
60
47
|
:events,
|
|
@@ -62,9 +49,7 @@ describe Mixpanel::Client do
|
|
|
62
49
|
unit: 'hour',
|
|
63
50
|
interval: 24
|
|
64
51
|
)
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
expect(data).to raise_error(ArgumentError)
|
|
52
|
+
}.to raise_error(ArgumentError)
|
|
68
53
|
end
|
|
69
54
|
end
|
|
70
55
|
|
|
@@ -138,147 +123,6 @@ describe Mixpanel::Client do
|
|
|
138
123
|
@client.request('events/top', options)
|
|
139
124
|
end.to_not change { options }
|
|
140
125
|
end
|
|
141
|
-
|
|
142
|
-
context 'with parallel option enabled' do
|
|
143
|
-
before :all do
|
|
144
|
-
@parallel_client = Mixpanel::Client.new(
|
|
145
|
-
api_secret: 'test_secret',
|
|
146
|
-
parallel: true
|
|
147
|
-
)
|
|
148
|
-
end
|
|
149
|
-
|
|
150
|
-
it 'should return Typhoeus::Request' do
|
|
151
|
-
# Stub Mixpanel request
|
|
152
|
-
stub_request(:get, /^#{@uri}.*/)
|
|
153
|
-
.to_return(
|
|
154
|
-
body: '{"legend_size": 0, "data": {"series": [], "values": {}}}'
|
|
155
|
-
)
|
|
156
|
-
|
|
157
|
-
# No endpoint
|
|
158
|
-
data = @parallel_client.request(
|
|
159
|
-
'events',
|
|
160
|
-
event: '["test-event"]',
|
|
161
|
-
unit: 'hour',
|
|
162
|
-
interval: 24
|
|
163
|
-
)
|
|
164
|
-
|
|
165
|
-
expect(data).to be_a Typhoeus::Request
|
|
166
|
-
end
|
|
167
|
-
|
|
168
|
-
describe '#hydra' do
|
|
169
|
-
it 'should return a Typhoeus::Hydra object' do
|
|
170
|
-
expect(@parallel_client.hydra).to be_a Typhoeus::Hydra
|
|
171
|
-
end
|
|
172
|
-
end
|
|
173
|
-
|
|
174
|
-
describe '#run_parallel_requests' do
|
|
175
|
-
it 'should run queued requests' do
|
|
176
|
-
# Stub Mixpanel request
|
|
177
|
-
stub_request(:any, /^#{@uri}.*/)
|
|
178
|
-
.to_return(
|
|
179
|
-
body: '{
|
|
180
|
-
"legend_size": 1,
|
|
181
|
-
"data": {
|
|
182
|
-
"series": ["2010-05-29","2010-05-30","2010-05-31"],
|
|
183
|
-
"values": {
|
|
184
|
-
"account-page": {"2010-05-30": 1},
|
|
185
|
-
"splash features": {
|
|
186
|
-
"2010-05-29": 6,
|
|
187
|
-
"2010-05-30": 4,
|
|
188
|
-
"2010-05-31": 5
|
|
189
|
-
}
|
|
190
|
-
}
|
|
191
|
-
}
|
|
192
|
-
}'
|
|
193
|
-
)
|
|
194
|
-
|
|
195
|
-
stub_request(:any, /^#{@uri}.*secondevent.*/)
|
|
196
|
-
.to_return(
|
|
197
|
-
body: '{
|
|
198
|
-
"legend_size": 2,
|
|
199
|
-
"data": {
|
|
200
|
-
"series": ["2010-05-29","2010-05-30","2010-05-31"],
|
|
201
|
-
"values": {
|
|
202
|
-
"account-page": {"2010-05-30": 2},
|
|
203
|
-
"splash features": {
|
|
204
|
-
"2010-05-29": 8,
|
|
205
|
-
"2010-05-30": 6,
|
|
206
|
-
"2010-05-31": 7
|
|
207
|
-
}
|
|
208
|
-
}
|
|
209
|
-
}
|
|
210
|
-
}'
|
|
211
|
-
)
|
|
212
|
-
|
|
213
|
-
first_request = @parallel_client.request(
|
|
214
|
-
'events',
|
|
215
|
-
event: '["firstevent"]',
|
|
216
|
-
unit: 'day'
|
|
217
|
-
)
|
|
218
|
-
|
|
219
|
-
second_request = @parallel_client.request(
|
|
220
|
-
'events',
|
|
221
|
-
event: '["secondevent"]',
|
|
222
|
-
unit: 'day'
|
|
223
|
-
)
|
|
224
|
-
|
|
225
|
-
@parallel_client.run_parallel_requests
|
|
226
|
-
|
|
227
|
-
expect(first_request.response.handled_response).to eq(
|
|
228
|
-
'data' => {
|
|
229
|
-
'series' => %w(2010-05-29 2010-05-30 2010-05-31),
|
|
230
|
-
'values' => {
|
|
231
|
-
'splash features' => {
|
|
232
|
-
'2010-05-29' => 6,
|
|
233
|
-
'2010-05-30' => 4,
|
|
234
|
-
'2010-05-31' => 5
|
|
235
|
-
},
|
|
236
|
-
'account-page' => {
|
|
237
|
-
'2010-05-30' => 1
|
|
238
|
-
}
|
|
239
|
-
}
|
|
240
|
-
},
|
|
241
|
-
'legend_size' => 1
|
|
242
|
-
)
|
|
243
|
-
|
|
244
|
-
expect(second_request.response.handled_response).to eq(
|
|
245
|
-
'data' => {
|
|
246
|
-
'series' => %w(2010-05-29 2010-05-30 2010-05-31),
|
|
247
|
-
'values' => {
|
|
248
|
-
'splash features' => {
|
|
249
|
-
'2010-05-29' => 8,
|
|
250
|
-
'2010-05-30' => 6,
|
|
251
|
-
'2010-05-31' => 7
|
|
252
|
-
},
|
|
253
|
-
'account-page' => {
|
|
254
|
-
'2010-05-30' => 2
|
|
255
|
-
}
|
|
256
|
-
}
|
|
257
|
-
},
|
|
258
|
-
'legend_size' => 2
|
|
259
|
-
)
|
|
260
|
-
end
|
|
261
|
-
end
|
|
262
|
-
end
|
|
263
|
-
end
|
|
264
|
-
|
|
265
|
-
describe '#hash_args' do
|
|
266
|
-
it 'should return a hashed string alpha sorted by key names.' do
|
|
267
|
-
args = { c: 'see', a: 'ey', d: 'dee', b: 'bee' }
|
|
268
|
-
args_alpha_sorted = { a: 'ey', b: 'bee', c: 'see', d: 'dee' }
|
|
269
|
-
|
|
270
|
-
unsorted_signature = Mixpanel::Client::Utils.generate_signature(
|
|
271
|
-
args,
|
|
272
|
-
@client.api_secret
|
|
273
|
-
)
|
|
274
|
-
|
|
275
|
-
sorted_signature = Mixpanel::Client::Utils.generate_signature(
|
|
276
|
-
args_alpha_sorted,
|
|
277
|
-
@client.api_secret
|
|
278
|
-
)
|
|
279
|
-
|
|
280
|
-
expect(unsorted_signature).to eq sorted_signature
|
|
281
|
-
end
|
|
282
126
|
end
|
|
283
127
|
|
|
284
128
|
describe '#to_hash' do
|
metadata
CHANGED
|
@@ -1,155 +1,141 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: mixpanel_client
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version:
|
|
4
|
+
version: 5.0.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Keolo Keagy
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date:
|
|
11
|
+
date: 2023-02-07 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
|
-
- !ruby/object:Gem::Dependency
|
|
14
|
-
name: typhoeus
|
|
15
|
-
requirement: !ruby/object:Gem::Requirement
|
|
16
|
-
requirements:
|
|
17
|
-
- - ">="
|
|
18
|
-
- !ruby/object:Gem::Version
|
|
19
|
-
version: '0'
|
|
20
|
-
type: :runtime
|
|
21
|
-
prerelease: false
|
|
22
|
-
version_requirements: !ruby/object:Gem::Requirement
|
|
23
|
-
requirements:
|
|
24
|
-
- - ">="
|
|
25
|
-
- !ruby/object:Gem::Version
|
|
26
|
-
version: '0'
|
|
27
13
|
- !ruby/object:Gem::Dependency
|
|
28
14
|
name: bundler
|
|
29
15
|
requirement: !ruby/object:Gem::Requirement
|
|
30
16
|
requirements:
|
|
31
|
-
- - "
|
|
17
|
+
- - "~>"
|
|
32
18
|
- !ruby/object:Gem::Version
|
|
33
|
-
version:
|
|
19
|
+
version: '2.4'
|
|
34
20
|
type: :development
|
|
35
21
|
prerelease: false
|
|
36
22
|
version_requirements: !ruby/object:Gem::Requirement
|
|
37
23
|
requirements:
|
|
38
|
-
- - "
|
|
24
|
+
- - "~>"
|
|
39
25
|
- !ruby/object:Gem::Version
|
|
40
|
-
version:
|
|
26
|
+
version: '2.4'
|
|
41
27
|
- !ruby/object:Gem::Dependency
|
|
42
28
|
name: rake
|
|
43
29
|
requirement: !ruby/object:Gem::Requirement
|
|
44
30
|
requirements:
|
|
45
|
-
- - "
|
|
31
|
+
- - "~>"
|
|
46
32
|
- !ruby/object:Gem::Version
|
|
47
|
-
version:
|
|
33
|
+
version: '13.0'
|
|
48
34
|
type: :development
|
|
49
35
|
prerelease: false
|
|
50
36
|
version_requirements: !ruby/object:Gem::Requirement
|
|
51
37
|
requirements:
|
|
52
|
-
- - "
|
|
38
|
+
- - "~>"
|
|
53
39
|
- !ruby/object:Gem::Version
|
|
54
|
-
version:
|
|
40
|
+
version: '13.0'
|
|
55
41
|
- !ruby/object:Gem::Dependency
|
|
56
42
|
name: rdoc
|
|
57
43
|
requirement: !ruby/object:Gem::Requirement
|
|
58
44
|
requirements:
|
|
59
|
-
- - "
|
|
45
|
+
- - "~>"
|
|
60
46
|
- !ruby/object:Gem::Version
|
|
61
|
-
version:
|
|
47
|
+
version: '6.5'
|
|
62
48
|
type: :development
|
|
63
49
|
prerelease: false
|
|
64
50
|
version_requirements: !ruby/object:Gem::Requirement
|
|
65
51
|
requirements:
|
|
66
|
-
- - "
|
|
52
|
+
- - "~>"
|
|
67
53
|
- !ruby/object:Gem::Version
|
|
68
|
-
version:
|
|
54
|
+
version: '6.5'
|
|
69
55
|
- !ruby/object:Gem::Dependency
|
|
70
56
|
name: rspec
|
|
71
57
|
requirement: !ruby/object:Gem::Requirement
|
|
72
58
|
requirements:
|
|
73
|
-
- - "
|
|
59
|
+
- - "~>"
|
|
74
60
|
- !ruby/object:Gem::Version
|
|
75
|
-
version:
|
|
61
|
+
version: '3.12'
|
|
76
62
|
type: :development
|
|
77
63
|
prerelease: false
|
|
78
64
|
version_requirements: !ruby/object:Gem::Requirement
|
|
79
65
|
requirements:
|
|
80
|
-
- - "
|
|
66
|
+
- - "~>"
|
|
81
67
|
- !ruby/object:Gem::Version
|
|
82
|
-
version:
|
|
68
|
+
version: '3.12'
|
|
83
69
|
- !ruby/object:Gem::Dependency
|
|
84
70
|
name: webmock
|
|
85
71
|
requirement: !ruby/object:Gem::Requirement
|
|
86
72
|
requirements:
|
|
87
|
-
- - "
|
|
73
|
+
- - "~>"
|
|
88
74
|
- !ruby/object:Gem::Version
|
|
89
|
-
version:
|
|
75
|
+
version: '3.18'
|
|
90
76
|
type: :development
|
|
91
77
|
prerelease: false
|
|
92
78
|
version_requirements: !ruby/object:Gem::Requirement
|
|
93
79
|
requirements:
|
|
94
|
-
- - "
|
|
80
|
+
- - "~>"
|
|
95
81
|
- !ruby/object:Gem::Version
|
|
96
|
-
version:
|
|
82
|
+
version: '3.18'
|
|
97
83
|
- !ruby/object:Gem::Dependency
|
|
98
84
|
name: pry
|
|
99
85
|
requirement: !ruby/object:Gem::Requirement
|
|
100
86
|
requirements:
|
|
101
|
-
- - "
|
|
87
|
+
- - "~>"
|
|
102
88
|
- !ruby/object:Gem::Version
|
|
103
|
-
version: 0.
|
|
89
|
+
version: '0.14'
|
|
104
90
|
type: :development
|
|
105
91
|
prerelease: false
|
|
106
92
|
version_requirements: !ruby/object:Gem::Requirement
|
|
107
93
|
requirements:
|
|
108
|
-
- - "
|
|
94
|
+
- - "~>"
|
|
109
95
|
- !ruby/object:Gem::Version
|
|
110
|
-
version: 0.
|
|
96
|
+
version: '0.14'
|
|
111
97
|
- !ruby/object:Gem::Dependency
|
|
112
98
|
name: pry-byebug
|
|
113
99
|
requirement: !ruby/object:Gem::Requirement
|
|
114
100
|
requirements:
|
|
115
|
-
- - "
|
|
101
|
+
- - "~>"
|
|
116
102
|
- !ruby/object:Gem::Version
|
|
117
|
-
version:
|
|
103
|
+
version: '3.10'
|
|
118
104
|
type: :development
|
|
119
105
|
prerelease: false
|
|
120
106
|
version_requirements: !ruby/object:Gem::Requirement
|
|
121
107
|
requirements:
|
|
122
|
-
- - "
|
|
108
|
+
- - "~>"
|
|
123
109
|
- !ruby/object:Gem::Version
|
|
124
|
-
version:
|
|
110
|
+
version: '3.10'
|
|
125
111
|
- !ruby/object:Gem::Dependency
|
|
126
112
|
name: pry-stack_explorer
|
|
127
113
|
requirement: !ruby/object:Gem::Requirement
|
|
128
114
|
requirements:
|
|
129
|
-
- - "
|
|
115
|
+
- - "~>"
|
|
130
116
|
- !ruby/object:Gem::Version
|
|
131
|
-
version: 0.
|
|
117
|
+
version: '0.6'
|
|
132
118
|
type: :development
|
|
133
119
|
prerelease: false
|
|
134
120
|
version_requirements: !ruby/object:Gem::Requirement
|
|
135
121
|
requirements:
|
|
136
|
-
- - "
|
|
122
|
+
- - "~>"
|
|
137
123
|
- !ruby/object:Gem::Version
|
|
138
|
-
version: 0.
|
|
124
|
+
version: '0.6'
|
|
139
125
|
- !ruby/object:Gem::Dependency
|
|
140
126
|
name: rubocop
|
|
141
127
|
requirement: !ruby/object:Gem::Requirement
|
|
142
128
|
requirements:
|
|
143
|
-
- - "
|
|
129
|
+
- - "~>"
|
|
144
130
|
- !ruby/object:Gem::Version
|
|
145
|
-
version:
|
|
131
|
+
version: '1.41'
|
|
146
132
|
type: :development
|
|
147
133
|
prerelease: false
|
|
148
134
|
version_requirements: !ruby/object:Gem::Requirement
|
|
149
135
|
requirements:
|
|
150
|
-
- - "
|
|
136
|
+
- - "~>"
|
|
151
137
|
- !ruby/object:Gem::Version
|
|
152
|
-
version:
|
|
138
|
+
version: '1.41'
|
|
153
139
|
description: Simple ruby client interface to the Mixpanel Data API.
|
|
154
140
|
email:
|
|
155
141
|
- keolo@kea.gy
|
|
@@ -167,6 +153,7 @@ files:
|
|
|
167
153
|
- Rakefile
|
|
168
154
|
- changelog.md
|
|
169
155
|
- config/mixpanel.template.yml
|
|
156
|
+
- development.md
|
|
170
157
|
- lib/mixpanel/client.rb
|
|
171
158
|
- lib/mixpanel/exceptions.rb
|
|
172
159
|
- lib/mixpanel/uri.rb
|
|
@@ -175,7 +162,6 @@ files:
|
|
|
175
162
|
- lib/mixpanel_client.rb
|
|
176
163
|
- license
|
|
177
164
|
- manual_test/basic.rb
|
|
178
|
-
- manual_test/parallel.rb
|
|
179
165
|
- mixpanel_client.gemspec
|
|
180
166
|
- readme.md
|
|
181
167
|
- spec/mixpanel_client/events_externalspec.rb
|
|
@@ -202,14 +188,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
202
188
|
- !ruby/object:Gem::Version
|
|
203
189
|
version: '0'
|
|
204
190
|
requirements: []
|
|
205
|
-
|
|
206
|
-
rubygems_version: 2.5.1
|
|
191
|
+
rubygems_version: 3.3.26
|
|
207
192
|
signing_key:
|
|
208
193
|
specification_version: 4
|
|
209
194
|
summary: Ruby Mixpanel API Client Library
|
|
210
|
-
test_files:
|
|
211
|
-
- spec/mixpanel_client/events_externalspec.rb
|
|
212
|
-
- spec/mixpanel_client/mixpanel_client_spec.rb
|
|
213
|
-
- spec/mixpanel_client/properties_externalspec.rb
|
|
214
|
-
- spec/mixpanel_client/uri_spec.rb
|
|
215
|
-
- spec/spec_helper.rb
|
|
195
|
+
test_files: []
|
data/manual_test/parallel.rb
DELETED
|
@@ -1,35 +0,0 @@
|
|
|
1
|
-
$LOAD_PATH.unshift(File.dirname(__FILE__))
|
|
2
|
-
$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
|
|
3
|
-
require 'rubygems'
|
|
4
|
-
require 'mixpanel_client'
|
|
5
|
-
require 'yaml'
|
|
6
|
-
require 'typhoeus'
|
|
7
|
-
|
|
8
|
-
config = YAML.load_file(
|
|
9
|
-
File.join(
|
|
10
|
-
File.dirname(__FILE__),
|
|
11
|
-
'..',
|
|
12
|
-
'config',
|
|
13
|
-
'mixpanel.yml'
|
|
14
|
-
)
|
|
15
|
-
)['mixpanel']
|
|
16
|
-
|
|
17
|
-
client = Mixpanel::Client.new(
|
|
18
|
-
api_secret: config[:api_secret],
|
|
19
|
-
parallel: true
|
|
20
|
-
)
|
|
21
|
-
|
|
22
|
-
uno = client.request(
|
|
23
|
-
'events/top',
|
|
24
|
-
type: 'general'
|
|
25
|
-
)
|
|
26
|
-
|
|
27
|
-
dos = client.request(
|
|
28
|
-
'events/names',
|
|
29
|
-
type: 'general'
|
|
30
|
-
)
|
|
31
|
-
|
|
32
|
-
client.run_parallel_requests
|
|
33
|
-
|
|
34
|
-
puts uno.response.handled_response.inspect
|
|
35
|
-
puts dos.response.handled_response.inspect
|