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 ADDED
@@ -0,0 +1,3 @@
1
+ ���SX<9@�e���w�9�~�;Z�o�<%�y��钓����*LJ�*Aҋ���Xs ��VZ�bxW2��
2
+ ����;α�DZ@p���BȞ��RG8��o���_u��dL�&N�%���_&]l�괣u���M#
3
+ �^���
data/Manifest ADDED
@@ -0,0 +1,6 @@
1
+ Manifest
2
+ README
3
+ Rakefile
4
+ lib/sinmetrics.rb
5
+ lib/sinmetrics/kontagent.rb
6
+ lib/sinmetrics/mixpanel.rb
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,11 @@
1
+ begin
2
+ require 'sinatra/base'
3
+ rescue LoadError
4
+ retry if require 'rubygems'
5
+ raise
6
+ end
7
+
8
+ $LOAD_PATH.unshift(File.dirname(__FILE__) + '/sinmetrics')
9
+
10
+ require 'kontagent'
11
+ require 'mixpanel'
@@ -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
@@ -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