sinmetrics 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- data.tar.gz.sig +3 -0
- data/Manifest +6 -0
- data/README +33 -0
- data/Rakefile +11 -0
- data/lib/sinmetrics.rb +11 -0
- data/lib/sinmetrics/kontagent.rb +126 -0
- data/lib/sinmetrics/mixpanel.rb +94 -0
- data/sinmetrics.gemspec +31 -0
- metadata +95 -0
- metadata.gz.sig +0 -0
data.tar.gz.sig
ADDED
data/Manifest
ADDED
data/README
ADDED
@@ -0,0 +1,33 @@
|
|
1
|
+
sinmetrics: simple sinatra metrics helpers
|
2
|
+
(c) 2010 Luke Petre (lpetre)
|
3
|
+
|
4
|
+
=== Usage
|
5
|
+
|
6
|
+
require 'sinmetrics'
|
7
|
+
require 'sinatra'
|
8
|
+
|
9
|
+
mixpanel do
|
10
|
+
token '4579...cbb0'
|
11
|
+
end
|
12
|
+
|
13
|
+
get '/' do
|
14
|
+
mp.log_event( 'play', @user.id)
|
15
|
+
"hello world"
|
16
|
+
end
|
17
|
+
|
18
|
+
=== Features
|
19
|
+
|
20
|
+
=== Other Options
|
21
|
+
|
22
|
+
=== Standalone Usage
|
23
|
+
|
24
|
+
require 'sinmetrics'
|
25
|
+
mp = MixPanel.new(
|
26
|
+
:token => '4579...cbb0',
|
27
|
+
)
|
28
|
+
|
29
|
+
>> mp.log_event( 'play', 1234 )
|
30
|
+
=> 1
|
31
|
+
|
32
|
+
=== Special Thanks
|
33
|
+
This library is *heavily* inspired by sinbook, http://github.com/tmm1/sinbook
|
data/Rakefile
ADDED
@@ -0,0 +1,11 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'rake'
|
3
|
+
require 'echoe'
|
4
|
+
|
5
|
+
Echoe.new('sinmetrics', '0.0.1') do |p|
|
6
|
+
p.description = "Some metrics helpers for the Sinatra web framework"
|
7
|
+
p.url = "http://github.com/lpetre/sinmetrics"
|
8
|
+
p.author = "Luke Petre"
|
9
|
+
p.email = "lpetre@gmail.com"
|
10
|
+
p.rdoc_pattern = []
|
11
|
+
end
|
data/lib/sinmetrics.rb
ADDED
@@ -0,0 +1,126 @@
|
|
1
|
+
begin
|
2
|
+
require 'sinatra/base'
|
3
|
+
rescue LoadError
|
4
|
+
retry if require 'rubygems'
|
5
|
+
raise
|
6
|
+
end
|
7
|
+
|
8
|
+
module Sinatra
|
9
|
+
require 'digest/md5'
|
10
|
+
require 'net/http'
|
11
|
+
|
12
|
+
class KontagentObject
|
13
|
+
@@version = 1
|
14
|
+
def initialize app
|
15
|
+
if app.respond_to?(:options)
|
16
|
+
@app = app
|
17
|
+
[:api_key, :secret, :env].each do |var|
|
18
|
+
instance_variable_set("@#{var}", app.options.send("mixpanel_#{var}"))
|
19
|
+
end
|
20
|
+
else
|
21
|
+
[:api_key, :secret, :env, :request].each do |var|
|
22
|
+
instance_variable_set("@#{var}", app[var]) if app.has_key?(var)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
attr_reader :app
|
28
|
+
attr_accessor :api_key, :secret, :env
|
29
|
+
def request *args
|
30
|
+
if @app
|
31
|
+
@app.options.kontagent_request *args
|
32
|
+
else
|
33
|
+
@request.call *args
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
class APIProxy
|
38
|
+
Types = %w[
|
39
|
+
ins inr
|
40
|
+
nts ntr
|
41
|
+
nes nei
|
42
|
+
pst psr
|
43
|
+
apa apr
|
44
|
+
ucc
|
45
|
+
pgr
|
46
|
+
cpu
|
47
|
+
gci
|
48
|
+
mtu
|
49
|
+
]
|
50
|
+
end
|
51
|
+
|
52
|
+
APIProxy::Types.each do |n|
|
53
|
+
class_eval %[
|
54
|
+
def #{n}_url args
|
55
|
+
make_url '#{n}', args
|
56
|
+
end
|
57
|
+
def #{n} args = {}
|
58
|
+
request( #{n}_url( args ) ) unless env == :test
|
59
|
+
end
|
60
|
+
]
|
61
|
+
end
|
62
|
+
|
63
|
+
def base_url
|
64
|
+
case env
|
65
|
+
when :production ; 'http://api.geo.kontagent.net/api'
|
66
|
+
else ; 'http://api.test.kontagent.com/api'
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
def make_url method, args = {}
|
71
|
+
args = { :ts => Time.now.getgm.strftime("%Y-%m-%dT%H:%M:%S") }.merge(args)
|
72
|
+
sorted = args.map{ |k,v|
|
73
|
+
next nil unless v
|
74
|
+
next nil if k == :url_only
|
75
|
+
"#{k}=" + case v
|
76
|
+
when Array
|
77
|
+
v.join('%2C')
|
78
|
+
else
|
79
|
+
v.to_s
|
80
|
+
end
|
81
|
+
}.compact.sort
|
82
|
+
|
83
|
+
sorted << "an_sig=" + Digest::MD5.hexdigest(sorted.join+self.secret)
|
84
|
+
query = sorted.map{|v| v.gsub('&', '%26').gsub(' ', '+')}.join('&')
|
85
|
+
"#{base_url}/v#{@@version}/#{api_key}/#{method}/?#{query}"
|
86
|
+
end
|
87
|
+
end
|
88
|
+
|
89
|
+
module KontagentHelper
|
90
|
+
def kontagent
|
91
|
+
env['kontagent.helper'] ||= KontagentObject.new(self)
|
92
|
+
end
|
93
|
+
|
94
|
+
alias kt kontagent
|
95
|
+
end
|
96
|
+
|
97
|
+
class KontagentSettings
|
98
|
+
def initialize app, &blk
|
99
|
+
@app = app
|
100
|
+
@app.set :kontagent_env, @app.environment
|
101
|
+
@app.set :kontagent_request, Proc.new { |url| Net::HTTP.get( URI.parse(url) ) }
|
102
|
+
instance_eval &blk
|
103
|
+
end
|
104
|
+
%w[ api_key secret env request ].each do |param|
|
105
|
+
class_eval %[
|
106
|
+
def #{param} val, &blk
|
107
|
+
@app.set :kontagent_#{param}, val
|
108
|
+
end
|
109
|
+
]
|
110
|
+
end
|
111
|
+
end
|
112
|
+
|
113
|
+
module Kontagent
|
114
|
+
def kontagent &blk
|
115
|
+
KontagentSettings.new(self, &blk)
|
116
|
+
end
|
117
|
+
|
118
|
+
def self.registered app
|
119
|
+
app.helpers KontagentHelper
|
120
|
+
end
|
121
|
+
end
|
122
|
+
|
123
|
+
Application.register Kontagent
|
124
|
+
end
|
125
|
+
|
126
|
+
Kontagent = Sinatra::KontagentObject
|
@@ -0,0 +1,94 @@
|
|
1
|
+
module Sinatra
|
2
|
+
require 'digest/md5'
|
3
|
+
require 'base64'
|
4
|
+
require 'net/http'
|
5
|
+
|
6
|
+
class MixpanelObject
|
7
|
+
@@version = 1
|
8
|
+
def initialize app
|
9
|
+
if app.respond_to?(:options)
|
10
|
+
@app = app
|
11
|
+
[:api_key, :secret, :token].each do |var|
|
12
|
+
instance_variable_set("@#{var}", app.options.send("mixpanel_#{var}"))
|
13
|
+
end
|
14
|
+
else
|
15
|
+
[:api_key, :secret, :token, :request ].each do |var|
|
16
|
+
instance_variable_set("@#{var}", app[var]) if app.has_key?(var)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
attr_reader :app
|
22
|
+
attr_accessor :api_key, :secret, :token
|
23
|
+
|
24
|
+
def request *args
|
25
|
+
if @app
|
26
|
+
@app.options.mixpanel_request *args
|
27
|
+
else
|
28
|
+
@request.call *args
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
def log_event(event, user_id, opts = {})
|
33
|
+
options = {}
|
34
|
+
options['ip'] = @app.request.ip if @app
|
35
|
+
options['time'] = Time.now.to_i
|
36
|
+
options['token'] = token
|
37
|
+
options['distinct_id'] = user_id if user_id
|
38
|
+
opts.each do |key, value|
|
39
|
+
if [:step].include? key
|
40
|
+
options[key.to_s] = value.to_i
|
41
|
+
else
|
42
|
+
options[key.to_s] = value.to_s
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
data = ::Base64.encode64( { 'event' => event, 'properties' => options }.to_json ).gsub(/\n/, '')
|
47
|
+
data = "#{data}&ip=1" if options.has_key? 'ip'
|
48
|
+
request "http://api.mixpanel.com/track/?data=#{data}"
|
49
|
+
end
|
50
|
+
|
51
|
+
def log_funnel(funnel_name, step_number, step_name, user_id, opts = {})
|
52
|
+
funnel_opts = opts.merge({:funnel => funnel_name, :step => step_number, :goal => step_name})
|
53
|
+
log_event("mp_funnel", user_id, funnel_opts)
|
54
|
+
end
|
55
|
+
|
56
|
+
end
|
57
|
+
|
58
|
+
module MixpanelHelper
|
59
|
+
def mixpanel
|
60
|
+
env['mixpanel.helper'] ||= MixpanelObject.new(self)
|
61
|
+
end
|
62
|
+
|
63
|
+
alias mp mixpanel
|
64
|
+
end
|
65
|
+
|
66
|
+
class MixpanelSettings
|
67
|
+
def initialize app, &blk
|
68
|
+
@app = app
|
69
|
+
@app.set :mixpanel_request, Proc.new { |url| Net::HTTP.get(URI.parse(url)) }
|
70
|
+
instance_eval &blk
|
71
|
+
end
|
72
|
+
%w[ api_key secret token request ].each do |param|
|
73
|
+
class_eval %[
|
74
|
+
def #{param} val, &blk
|
75
|
+
@app.set :mixpanel_#{param}, val
|
76
|
+
end
|
77
|
+
]
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
module Mixpanel
|
82
|
+
def mixpanel &blk
|
83
|
+
MixpanelSettings.new(self, &blk)
|
84
|
+
end
|
85
|
+
|
86
|
+
def self.registered app
|
87
|
+
app.helpers MixpanelHelper
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
91
|
+
Application.register Mixpanel
|
92
|
+
end
|
93
|
+
|
94
|
+
Mixpanel = Sinatra::MixpanelObject
|
data/sinmetrics.gemspec
ADDED
@@ -0,0 +1,31 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
|
3
|
+
Gem::Specification.new do |s|
|
4
|
+
s.name = %q{sinmetrics}
|
5
|
+
s.version = "0.0.1"
|
6
|
+
|
7
|
+
s.required_rubygems_version = Gem::Requirement.new(">= 1.2") if s.respond_to? :required_rubygems_version=
|
8
|
+
s.authors = ["Luke Petre"]
|
9
|
+
s.cert_chain = ["/Users/luke/.gem/trust/gem-public_cert.pem"]
|
10
|
+
s.date = %q{2010-04-05}
|
11
|
+
s.description = %q{Some metrics helpers for the Sinatra web framework}
|
12
|
+
s.email = %q{lpetre@gmail.com}
|
13
|
+
s.files = ["Manifest", "README", "Rakefile", "lib/sinmetrics.rb", "lib/sinmetrics/kontagent.rb", "lib/sinmetrics/mixpanel.rb", "sinmetrics.gemspec"]
|
14
|
+
s.homepage = %q{http://github.com/lpetre/sinmetrics}
|
15
|
+
s.rdoc_options = ["--line-numbers", "--inline-source", "--title", "Sinmetrics", "--main", "README"]
|
16
|
+
s.require_paths = ["lib"]
|
17
|
+
s.rubyforge_project = %q{sinmetrics}
|
18
|
+
s.rubygems_version = %q{1.3.6}
|
19
|
+
s.signing_key = %q{/Users/luke/.gem/trust/gem-private_key.pem}
|
20
|
+
s.summary = %q{Some metrics helpers for the Sinatra web framework}
|
21
|
+
|
22
|
+
if s.respond_to? :specification_version then
|
23
|
+
current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
|
24
|
+
s.specification_version = 3
|
25
|
+
|
26
|
+
if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
|
27
|
+
else
|
28
|
+
end
|
29
|
+
else
|
30
|
+
end
|
31
|
+
end
|
metadata
ADDED
@@ -0,0 +1,95 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: sinmetrics
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
prerelease: false
|
5
|
+
segments:
|
6
|
+
- 0
|
7
|
+
- 0
|
8
|
+
- 1
|
9
|
+
version: 0.0.1
|
10
|
+
platform: ruby
|
11
|
+
authors:
|
12
|
+
- Luke Petre
|
13
|
+
autorequire:
|
14
|
+
bindir: bin
|
15
|
+
cert_chain:
|
16
|
+
- |
|
17
|
+
-----BEGIN CERTIFICATE-----
|
18
|
+
MIIDLjCCAhagAwIBAgIBADANBgkqhkiG9w0BAQUFADA9MQ8wDQYDVQQDDAZscGV0
|
19
|
+
cmUxFTATBgoJkiaJk/IsZAEZFgVnbWFpbDETMBEGCgmSJomT8ixkARkWA2NvbTAe
|
20
|
+
Fw0xMDA0MDUxNTAwNThaFw0xMTA0MDUxNTAwNThaMD0xDzANBgNVBAMMBmxwZXRy
|
21
|
+
ZTEVMBMGCgmSJomT8ixkARkWBWdtYWlsMRMwEQYKCZImiZPyLGQBGRYDY29tMIIB
|
22
|
+
IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0/zvDJ9OhFdwBVMTgVY5tXhG
|
23
|
+
EXeHUAJsXSknjds2eD8pgAues2EXHdTHjj1HTxeIuYP1Q6EG6tVQoajwj+ifgtBZ
|
24
|
+
cbs7F1KfixyxnVDXskhf+JfT8hIFZSIdOZ+PhGXcRKsrgbuf+0XR1UXGQu/lYsIh
|
25
|
+
Ofj9u0ssYfT/AuAwaBqkSPHWVYV3s/8cmoaWf/EMl8tsgdTdCS0GqceyCFSDClGE
|
26
|
+
Mn8I/x3yPKcwBsWlU0rnEQ65D++2C44CW3P9RO4Td6tqtyhDapeSOhHCQFOEMu6s
|
27
|
+
mCSFTcjuuuTT1nt/v5wox0sV70FD2afr3cBN+QQUHah4hjVU1RoTx3ucm5++5wID
|
28
|
+
AQABozkwNzAJBgNVHRMEAjAAMAsGA1UdDwQEAwIEsDAdBgNVHQ4EFgQUM1t89+b4
|
29
|
+
vHmERgzN5XEWhaYPqs8wDQYJKoZIhvcNAQEFBQADggEBAHWF1oZuT7QSuWb5uUMT
|
30
|
+
wC0EcYb1PFqjUrq0VUvZLJYZGpcw3cpAJvjW4S/B3bOI7l5Vr8P+PK3uIPVz3lNz
|
31
|
+
sKrqLRgbeQZ8BHR1qiLLSnx2Jt7o8R3P1iFp2lOYc8jFTRnHNzb7kn1uSAhoJwWB
|
32
|
+
rZFMRQmdK+6KrtC9wJMg+4i38yfHJZPwLnSYEBUz6OBqR8VL2qRPGDyOIdYQ5y3X
|
33
|
+
hNJb+hNnJbo0z3KDO3krl8ey+7pNf5c5hokQS8xNuxc5/+3Nla6rGSEXdhYuUSE7
|
34
|
+
1RC0WSSpIC7Zgezv4Acajto6LdnWMmPtM8d8KeD9IWOAD4NlL3wuzMcfId0IkBiq
|
35
|
+
Q3o=
|
36
|
+
-----END CERTIFICATE-----
|
37
|
+
|
38
|
+
date: 2010-04-05 00:00:00 +01:00
|
39
|
+
default_executable:
|
40
|
+
dependencies: []
|
41
|
+
|
42
|
+
description: Some metrics helpers for the Sinatra web framework
|
43
|
+
email: lpetre@gmail.com
|
44
|
+
executables: []
|
45
|
+
|
46
|
+
extensions: []
|
47
|
+
|
48
|
+
extra_rdoc_files: []
|
49
|
+
|
50
|
+
files:
|
51
|
+
- Manifest
|
52
|
+
- README
|
53
|
+
- Rakefile
|
54
|
+
- lib/sinmetrics.rb
|
55
|
+
- lib/sinmetrics/kontagent.rb
|
56
|
+
- lib/sinmetrics/mixpanel.rb
|
57
|
+
- sinmetrics.gemspec
|
58
|
+
has_rdoc: true
|
59
|
+
homepage: http://github.com/lpetre/sinmetrics
|
60
|
+
licenses: []
|
61
|
+
|
62
|
+
post_install_message:
|
63
|
+
rdoc_options:
|
64
|
+
- --line-numbers
|
65
|
+
- --inline-source
|
66
|
+
- --title
|
67
|
+
- Sinmetrics
|
68
|
+
- --main
|
69
|
+
- README
|
70
|
+
require_paths:
|
71
|
+
- lib
|
72
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
73
|
+
requirements:
|
74
|
+
- - ">="
|
75
|
+
- !ruby/object:Gem::Version
|
76
|
+
segments:
|
77
|
+
- 0
|
78
|
+
version: "0"
|
79
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
80
|
+
requirements:
|
81
|
+
- - ">="
|
82
|
+
- !ruby/object:Gem::Version
|
83
|
+
segments:
|
84
|
+
- 1
|
85
|
+
- 2
|
86
|
+
version: "1.2"
|
87
|
+
requirements: []
|
88
|
+
|
89
|
+
rubyforge_project: sinmetrics
|
90
|
+
rubygems_version: 1.3.6
|
91
|
+
signing_key:
|
92
|
+
specification_version: 3
|
93
|
+
summary: Some metrics helpers for the Sinatra web framework
|
94
|
+
test_files: []
|
95
|
+
|
metadata.gz.sig
ADDED
Binary file
|