mixpanel_client 0.5.0 → 0.5.1
Sign up to get free protection for your applications and to get access to all the features.
- 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
|