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 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