sinmetrics 0.0.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.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
|