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.
- data/lib/mixpanel_test/service.rb +98 -0
- data/lib/mixpanel_test.rb +2 -0
- data/test/server.rb +19 -0
- metadata +80 -0
@@ -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
|
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: []
|