mixpanel_test_service 0.0.5

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,98 @@
1
+ require 'rubygems'
2
+ require 'net/http/server'
3
+ require 'thread'
4
+ require 'base64'
5
+ require 'json'
6
+ require 'net/http'
7
+
8
+ module MixpanelTest
9
+ class Service
10
+
11
+ attr_accessor :events
12
+
13
+ @@js_headers = {'Connection' => "keep-alive", "Content-Type" => "application/x-javascript", "Transfer-Encoding" => "chunked", 'Cache-Control' => 'max-age=86400'}
14
+ @@api_headers = {
15
+ "Access-Control-Allow-Headers" => "X-Requested-With",
16
+ "Access-Control-Allow-Methods" => "GET, POST, OPTIONS",
17
+ "Access-Control-Allow-Origin" => "*",
18
+ "Access-Control-Max-Age" => "1728000",
19
+ "Cache-Control" => "no-cache, no-store",
20
+ "Connection" => "close",
21
+ "Content-Type" => "application/json"}
22
+
23
+ public
24
+ def transaction
25
+ @events_mutex.synchronize do
26
+ yield
27
+ end
28
+ end
29
+
30
+ def shutdown
31
+ @server.shutdown
32
+ end
33
+
34
+ def stopped?
35
+ @server.stopped?
36
+ end
37
+
38
+ def stop
39
+ @server.stop
40
+ end
41
+
42
+ def initialize(options={})
43
+
44
+ @events = []
45
+ @events_mutex = Mutex.new
46
+
47
+ @mixpanel_js_cache = {}
48
+
49
+ @options = {:port => 3001}.merge(options).merge(:background => true)
50
+
51
+ @server = Net::HTTP::Server.run(@options) do |req, stream|
52
+
53
+ begin
54
+
55
+ if cached_js = @mixpanel_js_cache[req[:uri][:path].to_s]
56
+ next [200, @@js_headers, [cached_js]]
57
+ elsif req[:uri][:path].to_s.match(/\/libs\//)
58
+ #puts "PATH: #{puts req[:uri][:path]}"
59
+ cached_js = @mixpanel_js_cache[req[:uri][:path].to_s] ||= Net::HTTP.get(URI("http://cdn.mxpnl.com#{req[:uri][:path].to_s}")).gsub('api.mixpanel.com', "localhost:#{options[:port]}")
60
+ next [200, @@js_headers, [cached_js]]
61
+ else
62
+
63
+ # Parse the query string
64
+ query_params = req[:uri][:query].to_s.split('&').map do |s| s.split('=') end.map do |a| {a[0] => a[1]} end.inject(&:merge) || {}
65
+
66
+
67
+ if query_params["data"]
68
+
69
+ # Decode the data
70
+ data = Base64.decode64(URI.unescape(query_params["data"]))
71
+
72
+ # Eliminate extemporaneous chars outside the JSON
73
+ data = data.match(/\{.*\}/)[0]
74
+
75
+ # Parse with JSON
76
+ data = JSON.parse(data)
77
+
78
+ # Save
79
+ transaction do
80
+ @events << data
81
+ end
82
+
83
+ else
84
+ # puts "No data. #{req[:uri].inspect}"
85
+ end
86
+
87
+ next [200, @@api_headers, [1]]
88
+ end
89
+ rescue Exception => e
90
+ puts $!, *$@
91
+ end
92
+ end
93
+
94
+ end
95
+
96
+ end
97
+
98
+ end
@@ -0,0 +1,2 @@
1
+ module MixpanelTest
2
+ end
data/test/server.rb ADDED
@@ -0,0 +1,19 @@
1
+ require "./lib/mixpanel_test"
2
+ require "./lib/mixpanel_test/service"
3
+ require "uri"
4
+ require "net/http"
5
+ require 'pry'
6
+
7
+ TEST_PORT = 3001
8
+
9
+ begin
10
+ Net::HTTP.get(URI("http://localhost:#{TEST_PORT}"))
11
+ puts "Someone already listening on port #{TEST_PORT}"
12
+ exit(0)
13
+ rescue
14
+ # Good
15
+ end
16
+
17
+ service = MixpanelTest::Service.new(:port => TEST_PORT)
18
+
19
+ pry
metadata ADDED
@@ -0,0 +1,80 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: mixpanel_test_service
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.5
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - John Cant
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2012-09-05 00:00:00.000000000Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: net-http-server
16
+ requirement: &13606360 !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - =
20
+ - !ruby/object:Gem::Version
21
+ version: 0.2.2
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: *13606360
25
+ - !ruby/object:Gem::Dependency
26
+ name: pry
27
+ requirement: &13602620 !ruby/object:Gem::Requirement
28
+ none: false
29
+ requirements:
30
+ - - ! '>='
31
+ - !ruby/object:Gem::Version
32
+ version: '0'
33
+ type: :development
34
+ prerelease: false
35
+ version_requirements: *13602620
36
+ - !ruby/object:Gem::Dependency
37
+ name: rspec
38
+ requirement: &13586120 !ruby/object:Gem::Requirement
39
+ none: false
40
+ requirements:
41
+ - - ! '>='
42
+ - !ruby/object:Gem::Version
43
+ version: '0'
44
+ type: :development
45
+ prerelease: false
46
+ version_requirements: *13586120
47
+ description: Mixpanel test service - logs all Mixpanel events sent to it
48
+ email: a.johncant@gmail.com
49
+ executables: []
50
+ extensions: []
51
+ extra_rdoc_files: []
52
+ files:
53
+ - test/server.rb
54
+ - lib/mixpanel_test/service.rb
55
+ - lib/mixpanel_test.rb
56
+ homepage: https://github.com/johncant/mixpanel_test_service
57
+ licenses: []
58
+ post_install_message:
59
+ rdoc_options: []
60
+ require_paths:
61
+ - lib
62
+ required_ruby_version: !ruby/object:Gem::Requirement
63
+ none: false
64
+ requirements:
65
+ - - ! '>='
66
+ - !ruby/object:Gem::Version
67
+ version: '0'
68
+ required_rubygems_version: !ruby/object:Gem::Requirement
69
+ none: false
70
+ requirements:
71
+ - - ! '>='
72
+ - !ruby/object:Gem::Version
73
+ version: '0'
74
+ requirements: []
75
+ rubyforge_project:
76
+ rubygems_version: 1.8.15
77
+ signing_key:
78
+ specification_version: 3
79
+ summary: test your Mixpanel integration
80
+ test_files: []