mixpanel_test_service 0.0.5

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.
@@ -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: []