mixpanel_client 0.5.0 → 0.5.1
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.
- data/README.md +3 -40
- data/Rakefile +10 -11
- data/VERSION +1 -1
- data/lib/mixpanel_client.rb +10 -19
- data/mixpanel_client.gemspec +24 -33
- data/spec/mixpanel_client_spec.rb +18 -16
- data/spec/spec_helper.rb +2 -4
- data/test/manual.rb +0 -24
- metadata +13 -30
- data/.gitignore +0 -24
- data/features/mixpanel_client.feature +0 -9
- data/features/step_definitions/mixpanel_client_steps.rb +0 -0
- data/features/support/env.rb +0 -4
- data/spec/spec.opts +0 -1
data/README.md
CHANGED
@@ -8,61 +8,24 @@ Ruby access to the [Mixpanel](http://mixpanel.com/) web analytics tool.
|
|
8
8
|
gem install mixpanel_client
|
9
9
|
|
10
10
|
|
11
|
-
##
|
11
|
+
## Usage
|
12
12
|
|
13
13
|
require 'rubygems'
|
14
14
|
require 'mixpanel_client'
|
15
15
|
|
16
|
-
|
16
|
+
client = Mixpanel::Client.new('api_key' => 'changeme', 'api_secret' => 'changeme')
|
17
17
|
|
18
|
-
client = Mixpanel::Client.new(config)
|
19
|
-
|
20
|
-
# Get all results for 'test-event' in the last 24 hours from the test bucket
|
21
18
|
data = client.request do
|
22
|
-
resource 'events'
|
19
|
+
resource 'events/retention'
|
23
20
|
event '["test-event"]'
|
24
21
|
type 'general'
|
25
22
|
unit 'hour'
|
26
23
|
interval 24
|
27
24
|
bucket 'test'
|
28
25
|
end
|
29
|
-
puts data.inspect
|
30
26
|
|
31
|
-
# Get the top property names for 'test-event'
|
32
|
-
data = client.request do
|
33
|
-
resource 'events/properties/top'
|
34
|
-
event '["test-event"]'
|
35
|
-
type 'general'
|
36
|
-
end
|
37
27
|
puts data.inspect
|
38
28
|
|
39
|
-
|
40
|
-
## Old Usage (versions prior to 0.5.0)
|
41
|
-
|
42
|
-
__NOTE: This old usage is deprecated and will be removed in future versions.__
|
43
|
-
|
44
|
-
require 'rubygems'
|
45
|
-
require 'mixpanel_client'
|
46
|
-
|
47
|
-
config = {:api_key => 'changeme', :api_secret => 'changeme'}
|
48
|
-
|
49
|
-
api = Mixpanel::Client.new(config)
|
50
|
-
|
51
|
-
# Example without an endpoint
|
52
|
-
data = api.request(nil, :events, {
|
53
|
-
:event => '["test-event"]',
|
54
|
-
:unit => 'hour',
|
55
|
-
:interval => 24
|
56
|
-
})
|
57
|
-
puts data.inspect
|
58
|
-
|
59
|
-
# Example with an endpoint and method
|
60
|
-
data = api.request(:events, :top, {
|
61
|
-
:type => 'general'
|
62
|
-
})
|
63
|
-
puts data.inspect
|
64
|
-
|
65
|
-
|
66
29
|
## Copyright
|
67
30
|
|
68
31
|
Copyright (c) 2009+ Keolo Keagy. See LICENSE for details.
|
data/Rakefile
CHANGED
@@ -11,9 +11,8 @@ begin
|
|
11
11
|
gem.email = 'keolo@dreampointmedia.com'
|
12
12
|
gem.homepage = 'http://github.com/keolo/mixpanel_client'
|
13
13
|
gem.authors = ['Keolo Keagy']
|
14
|
-
gem.add_development_dependency 'rspec', '>=
|
15
|
-
gem.add_development_dependency '
|
16
|
-
gem.add_development_dependency 'webmock', '>= 1.3.5'
|
14
|
+
gem.add_development_dependency 'rspec', '>= 2.4.0'
|
15
|
+
gem.add_development_dependency 'webmock', '>= 1.6.2'
|
17
16
|
# gem is a Gem::Specification... see http://www.rubygems.org/read/chapter/20 for additional settings
|
18
17
|
end
|
19
18
|
Jeweler::GemcutterTasks.new
|
@@ -21,21 +20,21 @@ rescue LoadError
|
|
21
20
|
puts 'Jeweler (or a dependency) not available. Install it with: sudo gem install jeweler'
|
22
21
|
end
|
23
22
|
|
24
|
-
require '
|
25
|
-
|
26
|
-
spec.
|
27
|
-
spec.
|
23
|
+
require 'rspec/core/rake_task'
|
24
|
+
RSpec::Core::RakeTask.new(:spec) do |spec|
|
25
|
+
spec.pattern = 'spec/**/*_spec.rb'
|
26
|
+
spec.rspec_opts = ['--color']
|
28
27
|
end
|
29
28
|
|
30
29
|
namespace :spec do
|
31
30
|
desc 'Run all tests that depend on external dependencies'
|
32
|
-
|
33
|
-
t.
|
31
|
+
RSpec::Core::RakeTask.new(:externals) do |t|
|
32
|
+
t.pattern = 'spec/**/*_externalspec.rb'
|
33
|
+
t.rspec_opts = ['--color']
|
34
34
|
end
|
35
35
|
end
|
36
36
|
|
37
|
-
|
38
|
-
spec.libs << 'lib' << 'spec'
|
37
|
+
RSpec::Core::RakeTask.new(:rcov) do |spec|
|
39
38
|
spec.pattern = 'spec/**/*_spec.rb'
|
40
39
|
spec.rcov = true
|
41
40
|
end
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.5.
|
1
|
+
0.5.1
|
data/lib/mixpanel_client.rb
CHANGED
@@ -39,34 +39,28 @@ module Mixpanel
|
|
39
39
|
|
40
40
|
def params
|
41
41
|
OPTIONS.inject({}) do |params, param|
|
42
|
-
|
42
|
+
option = send(param)
|
43
|
+
params.merge!(param => option) if param != :resource && !option.nil?
|
43
44
|
params
|
44
45
|
end
|
45
46
|
end
|
46
47
|
|
47
|
-
def request(
|
48
|
+
def request(&options)
|
48
49
|
reset_options
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
to_hash(response)
|
54
|
-
else
|
55
|
-
warn 'This usage is deprecated. Please use the new block form (see README).'
|
56
|
-
@uri = URI.deprecated_mixpanel(deprecated_endpoint, deprecated_meth, normalize_params(deprecated_params))
|
57
|
-
response = URI.get(@uri)
|
58
|
-
to_hash(response)
|
59
|
-
end
|
50
|
+
instance_eval(&options)
|
51
|
+
@uri = URI.mixpanel(resource, normalize_params(params))
|
52
|
+
response = URI.get(@uri)
|
53
|
+
to_hash(response)
|
60
54
|
end
|
61
55
|
|
62
56
|
def normalize_params(params)
|
63
57
|
params.merge!(
|
64
58
|
:api_key => @api_key,
|
65
59
|
:expire => Time.now.to_i + 600 # Grant this request 10 minutes
|
66
|
-
).merge!(:sig =>
|
60
|
+
).merge!(:sig => generate_signature(params))
|
67
61
|
end
|
68
62
|
|
69
|
-
def
|
63
|
+
def generate_signature(args)
|
70
64
|
Digest::MD5.hexdigest(args.map{|key,val| "#{key}=#{val}"}.sort.join + api_secret)
|
71
65
|
end
|
72
66
|
|
@@ -87,12 +81,9 @@ module Mixpanel
|
|
87
81
|
|
88
82
|
# URI related helpers
|
89
83
|
class URI
|
84
|
+
# Create an http error class for us to use
|
90
85
|
class HTTPError < StandardError; end
|
91
86
|
|
92
|
-
def self.deprecated_mixpanel(endpoint, meth, params)
|
93
|
-
File.join([BASE_URI, VERSION, endpoint.to_s, meth.to_s].reject(&:empty?)) + "?#{self.encode(params)}"
|
94
|
-
end
|
95
|
-
|
96
87
|
def self.mixpanel(resource, params)
|
97
88
|
File.join([BASE_URI, VERSION, resource.to_s]) + "?#{self.encode(params)}"
|
98
89
|
end
|
data/mixpanel_client.gemspec
CHANGED
@@ -1,50 +1,44 @@
|
|
1
1
|
# Generated by jeweler
|
2
2
|
# DO NOT EDIT THIS FILE DIRECTLY
|
3
|
-
# Instead, edit Jeweler::Tasks in Rakefile, and run
|
3
|
+
# Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
|
4
4
|
# -*- encoding: utf-8 -*-
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{mixpanel_client}
|
8
|
-
s.version = "0.5.
|
8
|
+
s.version = "0.5.1"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Keolo Keagy"]
|
12
|
-
s.date = %q{
|
12
|
+
s.date = %q{2011-01-26}
|
13
13
|
s.description = %q{Simple ruby client interface to the Mixpanel API.}
|
14
14
|
s.email = %q{keolo@dreampointmedia.com}
|
15
15
|
s.extra_rdoc_files = [
|
16
16
|
"LICENSE",
|
17
|
-
|
17
|
+
"README.md"
|
18
18
|
]
|
19
19
|
s.files = [
|
20
20
|
".document",
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
"mixpanel_client.gemspec",
|
32
|
-
"spec/events_externalspec.rb",
|
33
|
-
"spec/mixpanel_client_spec.rb",
|
34
|
-
"spec/spec.opts",
|
35
|
-
"spec/spec_helper.rb"
|
21
|
+
"LICENSE",
|
22
|
+
"README.md",
|
23
|
+
"Rakefile",
|
24
|
+
"VERSION",
|
25
|
+
"config/mixpanel.template.yml",
|
26
|
+
"lib/mixpanel_client.rb",
|
27
|
+
"mixpanel_client.gemspec",
|
28
|
+
"spec/events_externalspec.rb",
|
29
|
+
"spec/mixpanel_client_spec.rb",
|
30
|
+
"spec/spec_helper.rb"
|
36
31
|
]
|
37
32
|
s.homepage = %q{http://github.com/keolo/mixpanel_client}
|
38
|
-
s.rdoc_options = ["--charset=UTF-8"]
|
39
33
|
s.require_paths = ["lib"]
|
40
34
|
s.rubygems_version = %q{1.3.6}
|
41
35
|
s.summary = %q{Ruby Mixpanel API Client Library}
|
42
36
|
s.test_files = [
|
43
37
|
"spec/events_externalspec.rb",
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
38
|
+
"spec/mixpanel_client_spec.rb",
|
39
|
+
"spec/spec_helper.rb",
|
40
|
+
"test/manual.rb",
|
41
|
+
"test/test.rb"
|
48
42
|
]
|
49
43
|
|
50
44
|
if s.respond_to? :specification_version then
|
@@ -52,18 +46,15 @@ Gem::Specification.new do |s|
|
|
52
46
|
s.specification_version = 3
|
53
47
|
|
54
48
|
if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
|
55
|
-
s.add_development_dependency(%q<rspec>, [">=
|
56
|
-
s.add_development_dependency(%q<
|
57
|
-
s.add_development_dependency(%q<webmock>, [">= 1.3.5"])
|
49
|
+
s.add_development_dependency(%q<rspec>, [">= 2.4.0"])
|
50
|
+
s.add_development_dependency(%q<webmock>, [">= 1.6.2"])
|
58
51
|
else
|
59
|
-
s.add_dependency(%q<rspec>, [">=
|
60
|
-
s.add_dependency(%q<
|
61
|
-
s.add_dependency(%q<webmock>, [">= 1.3.5"])
|
52
|
+
s.add_dependency(%q<rspec>, [">= 2.4.0"])
|
53
|
+
s.add_dependency(%q<webmock>, [">= 1.6.2"])
|
62
54
|
end
|
63
55
|
else
|
64
|
-
s.add_dependency(%q<rspec>, [">=
|
65
|
-
s.add_dependency(%q<
|
66
|
-
s.add_dependency(%q<webmock>, [">= 1.3.5"])
|
56
|
+
s.add_dependency(%q<rspec>, [">= 2.4.0"])
|
57
|
+
s.add_dependency(%q<webmock>, [">= 1.6.2"])
|
67
58
|
end
|
68
59
|
end
|
69
60
|
|
@@ -9,17 +9,17 @@ describe Mixpanel::Client do
|
|
9
9
|
end
|
10
10
|
|
11
11
|
describe '#request' do
|
12
|
-
it 'should return
|
12
|
+
it 'should return an argument error "Wrong number of arguments" if using the deprecated usage' do
|
13
13
|
# Stub Mixpanel request
|
14
14
|
stub_request(:get, /^#{@uri}.*/).to_return(:body => '{"legend_size": 0, "data": {"series": [], "values": {}}}')
|
15
15
|
|
16
|
-
data = @client.request(nil, :events, {
|
16
|
+
data = lambda{@client.request(nil, :events, {
|
17
17
|
:event => '["test-event"]',
|
18
18
|
:unit => 'hour',
|
19
19
|
:interval => 24
|
20
|
-
})
|
20
|
+
})}
|
21
21
|
|
22
|
-
data.should
|
22
|
+
data.should raise_error(ArgumentError)
|
23
23
|
end
|
24
24
|
end
|
25
25
|
|
@@ -49,13 +49,26 @@ describe Mixpanel::Client do
|
|
49
49
|
end
|
50
50
|
data.should == {"events"=>[], "type"=>"general"}
|
51
51
|
end
|
52
|
+
|
53
|
+
it 'should create getter methods for given options' do
|
54
|
+
@client.resource.should == 'events/top'
|
55
|
+
@client.type.should == 'general'
|
56
|
+
end
|
57
|
+
|
58
|
+
it 'should create setter methods for given options' do
|
59
|
+
@client.resource 'hi'
|
60
|
+
@client.resource.should == 'hi'
|
61
|
+
|
62
|
+
@client.type 'ok'
|
63
|
+
@client.type.should == 'ok'
|
64
|
+
end
|
52
65
|
end
|
53
66
|
|
54
67
|
describe '#hash_args' do
|
55
68
|
it 'should return a hashed string alpha sorted by key names.' do
|
56
69
|
args = {:c => 'see', :a => 'aye', :d => 'dee', :b => 'bee'}
|
57
70
|
args_alpha_sorted = {:a => 'aye', :b => 'bee', :c => 'see', :d => 'dee'}
|
58
|
-
@client.
|
71
|
+
@client.generate_signature(args).should == @client.generate_signature(args_alpha_sorted)
|
59
72
|
end
|
60
73
|
end
|
61
74
|
|
@@ -99,17 +112,6 @@ describe Mixpanel::Client do
|
|
99
112
|
end
|
100
113
|
|
101
114
|
describe Mixpanel::URI do
|
102
|
-
describe '.deprecated_mixpanel' do
|
103
|
-
it 'should return a properly formatted mixpanel uri as a string (without an endpoint)' do
|
104
|
-
endpoint, meth, params = [:events, nil, {:c => 'see', :a => 'aye'}]
|
105
|
-
Mixpanel::URI.deprecated_mixpanel(endpoint, meth, params).should == 'http://mixpanel.com/api/2.0/events?a=aye&c=see'
|
106
|
-
end
|
107
|
-
it 'should return a properly formatted mixpanel uri as a string (with an endpoint)' do
|
108
|
-
endpoint, meth, params = [:events, :top, {:c => 'see', :a => 'aye'}]
|
109
|
-
Mixpanel::URI.deprecated_mixpanel(endpoint, meth, params).should == 'http://mixpanel.com/api/2.0/events/top?a=aye&c=see'
|
110
|
-
end
|
111
|
-
end
|
112
|
-
|
113
115
|
describe '.mixpanel' do
|
114
116
|
it 'should return a properly formatted mixpanel uri as a string (without an endpoint)' do
|
115
117
|
resource, params = ['events', {:c => 'see', :a => 'aye'}]
|
data/spec/spec_helper.rb
CHANGED
@@ -1,10 +1,8 @@
|
|
1
1
|
$LOAD_PATH.unshift(File.dirname(__FILE__))
|
2
2
|
$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
|
3
3
|
require 'mixpanel_client'
|
4
|
-
require 'spec'
|
5
|
-
require 'spec/autorun'
|
6
4
|
require 'webmock/rspec'
|
7
5
|
|
8
|
-
|
9
|
-
config.include WebMock
|
6
|
+
RSpec.configure do |config|
|
7
|
+
config.include WebMock::API
|
10
8
|
end
|
data/test/manual.rb
CHANGED
@@ -11,7 +11,6 @@
|
|
11
11
|
|
12
12
|
require 'rubygems'
|
13
13
|
require "#{File.dirname(__FILE__)}/../lib/mixpanel_client"
|
14
|
-
#require 'mixpanel_client'
|
15
14
|
|
16
15
|
config = {'api_key' => 'e81de686c96261747fdc443d4809c297', 'api_secret' => '201ff82db5f1e8766b0004f0acf8d82e'}
|
17
16
|
|
@@ -31,18 +30,6 @@ puts client.inspect
|
|
31
30
|
puts data.inspect
|
32
31
|
puts
|
33
32
|
|
34
|
-
# Argument form
|
35
|
-
data = client.request(nil, :events, {
|
36
|
-
:event => '["test-event"]',
|
37
|
-
:unit => 'hour',
|
38
|
-
:interval => 24,
|
39
|
-
})
|
40
|
-
|
41
|
-
puts
|
42
|
-
puts client.inspect
|
43
|
-
puts data.inspect
|
44
|
-
puts
|
45
|
-
|
46
33
|
# Block form
|
47
34
|
data = client.request do
|
48
35
|
resource 'events/properties/top'
|
@@ -55,17 +42,6 @@ puts client.inspect
|
|
55
42
|
puts data.inspect
|
56
43
|
puts
|
57
44
|
|
58
|
-
# Argument form
|
59
|
-
data = client.request(:events, :top, {
|
60
|
-
:type => 'general',
|
61
|
-
#:format => :csv
|
62
|
-
})
|
63
|
-
|
64
|
-
puts
|
65
|
-
puts client.inspect
|
66
|
-
puts data.inspect
|
67
|
-
puts
|
68
|
-
|
69
45
|
# Bucket
|
70
46
|
data = client.request do
|
71
47
|
resource 'events'
|
metadata
CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
|
|
5
5
|
segments:
|
6
6
|
- 0
|
7
7
|
- 5
|
8
|
-
-
|
9
|
-
version: 0.5.
|
8
|
+
- 1
|
9
|
+
version: 0.5.1
|
10
10
|
platform: ruby
|
11
11
|
authors:
|
12
12
|
- Keolo Keagy
|
@@ -14,7 +14,7 @@ autorequire:
|
|
14
14
|
bindir: bin
|
15
15
|
cert_chain: []
|
16
16
|
|
17
|
-
date:
|
17
|
+
date: 2011-01-26 00:00:00 -08:00
|
18
18
|
default_executable:
|
19
19
|
dependencies:
|
20
20
|
- !ruby/object:Gem::Dependency
|
@@ -25,38 +25,26 @@ dependencies:
|
|
25
25
|
- - ">="
|
26
26
|
- !ruby/object:Gem::Version
|
27
27
|
segments:
|
28
|
-
- 1
|
29
28
|
- 2
|
30
|
-
-
|
31
|
-
version: 1.2.9
|
32
|
-
type: :development
|
33
|
-
version_requirements: *id001
|
34
|
-
- !ruby/object:Gem::Dependency
|
35
|
-
name: cucumber
|
36
|
-
prerelease: false
|
37
|
-
requirement: &id002 !ruby/object:Gem::Requirement
|
38
|
-
requirements:
|
39
|
-
- - ">="
|
40
|
-
- !ruby/object:Gem::Version
|
41
|
-
segments:
|
29
|
+
- 4
|
42
30
|
- 0
|
43
|
-
version:
|
31
|
+
version: 2.4.0
|
44
32
|
type: :development
|
45
|
-
version_requirements: *
|
33
|
+
version_requirements: *id001
|
46
34
|
- !ruby/object:Gem::Dependency
|
47
35
|
name: webmock
|
48
36
|
prerelease: false
|
49
|
-
requirement: &
|
37
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
50
38
|
requirements:
|
51
39
|
- - ">="
|
52
40
|
- !ruby/object:Gem::Version
|
53
41
|
segments:
|
54
42
|
- 1
|
55
|
-
-
|
56
|
-
-
|
57
|
-
version: 1.
|
43
|
+
- 6
|
44
|
+
- 2
|
45
|
+
version: 1.6.2
|
58
46
|
type: :development
|
59
|
-
version_requirements: *
|
47
|
+
version_requirements: *id002
|
60
48
|
description: Simple ruby client interface to the Mixpanel API.
|
61
49
|
email: keolo@dreampointmedia.com
|
62
50
|
executables: []
|
@@ -68,28 +56,23 @@ extra_rdoc_files:
|
|
68
56
|
- README.md
|
69
57
|
files:
|
70
58
|
- .document
|
71
|
-
- .gitignore
|
72
59
|
- LICENSE
|
73
60
|
- README.md
|
74
61
|
- Rakefile
|
75
62
|
- VERSION
|
76
63
|
- config/mixpanel.template.yml
|
77
|
-
- features/mixpanel_client.feature
|
78
|
-
- features/step_definitions/mixpanel_client_steps.rb
|
79
|
-
- features/support/env.rb
|
80
64
|
- lib/mixpanel_client.rb
|
81
65
|
- mixpanel_client.gemspec
|
82
66
|
- spec/events_externalspec.rb
|
83
67
|
- spec/mixpanel_client_spec.rb
|
84
|
-
- spec/spec.opts
|
85
68
|
- spec/spec_helper.rb
|
86
69
|
has_rdoc: true
|
87
70
|
homepage: http://github.com/keolo/mixpanel_client
|
88
71
|
licenses: []
|
89
72
|
|
90
73
|
post_install_message:
|
91
|
-
rdoc_options:
|
92
|
-
|
74
|
+
rdoc_options: []
|
75
|
+
|
93
76
|
require_paths:
|
94
77
|
- lib
|
95
78
|
required_ruby_version: !ruby/object:Gem::Requirement
|
data/.gitignore
DELETED
File without changes
|
data/features/support/env.rb
DELETED
data/spec/spec.opts
DELETED
@@ -1 +0,0 @@
|
|
1
|
-
--color
|