traffic_mansion 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 8a660cb1fe56a4de45f4dc7deafd6bde1047abbd
4
+ data.tar.gz: 88fd56ea76a4211109338f1cef39affc160093b6
5
+ SHA512:
6
+ metadata.gz: 91521431d855ba34deafa166fe605fc2812719b82cd8fdaae9c570a8ceaf7dc266780e03124b0deadecda6db8e887a4e41b7dcfec9569b58c01400271f37c275
7
+ data.tar.gz: f7ba1666b17eabebae9ffc31039bd1bb60a216bcf3025f020e84983c3c16f635e1d151fc163caeff0a13b2cdbf42f6cc56b85f0f0c5a13277740bb92019f6116
data/.gitignore ADDED
@@ -0,0 +1,18 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
18
+ .DS_Store
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in traffic_mansion.gemspec
4
+ gemspec
data/LICENSE.txt ADDED
@@ -0,0 +1 @@
1
+ Copyright (c) 2013 AgileWings
data/README.md ADDED
@@ -0,0 +1,11 @@
1
+ # TrafficMansion
2
+
3
+ ## Installation
4
+
5
+ Add this line to your application's Gemfile:
6
+
7
+ gem 'traffic_mansion'
8
+
9
+ And then execute:
10
+
11
+ $ bundle
data/Rakefile ADDED
@@ -0,0 +1 @@
1
+ require "bundler/gem_tasks"
@@ -0,0 +1,14 @@
1
+ require File.dirname(__FILE__) + "/traffic_mansion/version"
2
+ require File.dirname(__FILE__) + "/traffic_mansion/response"
3
+ require File.dirname(__FILE__) + "/traffic_mansion/tracker"
4
+ require File.dirname(__FILE__) + "/traffic_mansion/queue_processor"
5
+ require File.dirname(__FILE__) + "/traffic_mansion/queue"
6
+ require File.dirname(__FILE__) + "/traffic_mansion/railtie" if defined?(Rails)
7
+
8
+ module TrafficMansion
9
+ COOKIE_NAME = "tme"
10
+
11
+ def self.tracked_client? cookie_jar
12
+ cookie_jar[TrafficMansion::COOKIE_NAME].present?
13
+ end
14
+ end
@@ -0,0 +1,123 @@
1
+ require "mongoid"
2
+
3
+ module TrafficMansion
4
+ class Queue
5
+ include Mongoid::Document
6
+ include Mongoid::Timestamps
7
+
8
+ field :type, :type => String
9
+ field :parent_event_id, :type => String
10
+ field :user_id, :type => String
11
+ field :data, :type => Hash
12
+ field :result, :type => Hash
13
+ field :processed, :type => Boolean, :default => false
14
+
15
+ index({ :type => 1 })
16
+ index({ :parent_event_id => 1 })
17
+ index({ :user_id => 1 })
18
+ index({ :processed => 1 })
19
+
20
+ def self.add_unique_visit campaign_id, remote_ip, referer
21
+ event_data = {
22
+ "campaign_id" => campaign_id,
23
+ "timestamp" => Time.now.to_i,
24
+ "remote_addr" => remote_ip,
25
+ "http_referer" => referer
26
+ }
27
+ TrafficMansion::Queue::add "visit", nil, event_data
28
+ end
29
+
30
+ def self.add_signup parent_event_id, user_id, remote_ip, referer
31
+ event_data = {
32
+ "user_id" => user_id,
33
+ "timestamp" => Time.now.to_i,
34
+ "remote_addr" => remote_ip,
35
+ "http_referer" => referer
36
+ }
37
+ TrafficMansion::Queue::add "signup", parent_event_id, event_data
38
+ end
39
+
40
+ def self.add_sale user_id, payment_id, amount, product_code, remote_ip, referer
41
+ event_data = {
42
+ "user_id" => user_id,
43
+ "timestamp" => Time.now.to_i,
44
+ "transaction" => payment_id,
45
+ "amount" => amount,
46
+ "product_code" => product_code,
47
+ "remote_addr" => remote_ip,
48
+ "http_referer" => referer
49
+ }
50
+ TrafficMansion::Queue::add "sale", nil, event_data
51
+ end
52
+
53
+ def self.add_rebill user_id, payment_id, amount, product_code, remote_ip, referer
54
+ event_data = {
55
+ "user_id" => user_id,
56
+ "timestamp" => Time.now.to_i,
57
+ "transaction" => payment_id,
58
+ "amount" => amount,
59
+ "product_code" => product_code,
60
+ "remote_addr" => remote_ip,
61
+ "http_referer" => referer
62
+ }
63
+ TrafficMansion::Queue::add "rebill", nil, event_data
64
+ end
65
+
66
+ def self.add type, parent_event_id = nil, data = {}
67
+ user_id = data["user_id"]
68
+ event = TrafficMansion::Queue.create :type => type, :parent_event_id => parent_event_id, :user_id => user_id, :data => data
69
+ TrafficMansion::QueueProcessor.perform_async event.id
70
+ event
71
+ end
72
+
73
+ def self.find_parent_by_user user_id
74
+ TrafficMansion::Queue.where(:user_id => user_id, :type => "signup").first
75
+ end
76
+
77
+ def process
78
+ if !parent? && parent_event_id.nil?
79
+ update_parent_event_id
80
+ end
81
+ if parent_event_id.present?
82
+ update_from_parent
83
+ end
84
+ track
85
+ end
86
+
87
+ def parent?
88
+ self.type == "visit"
89
+ end
90
+
91
+ def update_parent_event_id
92
+ parent_event = TrafficMansion::Queue.find_parent_by_user self.user_id
93
+ if parent_event
94
+ self.parent_event_id = parent_event.id
95
+ save
96
+ else
97
+ raise "Could not find a parent event!"
98
+ end
99
+ end
100
+
101
+ def update_from_parent
102
+ parent_event = TrafficMansion::Queue.find parent_event_id
103
+ if parent_event && parent_event.processed
104
+ self.data["visit_id"] = parent_event.data["visit_id"].present? ? parent_event.data["visit_id"] : parent_event.result["visit_id"]
105
+ save
106
+ else
107
+ raise "Parent was not processed yet!"
108
+ end
109
+ end
110
+
111
+ def track
112
+ tracker = TrafficMansion::Tracker.new data
113
+ res = tracker.send type, data
114
+ if res.success?
115
+ self.result = res.get_response
116
+ self.processed = true
117
+ save
118
+ else
119
+ raise "Tracking failed with result: #{res.get_error}"
120
+ end
121
+ end
122
+ end
123
+ end
@@ -0,0 +1,23 @@
1
+ require "sidekiq"
2
+ require "mongoid"
3
+
4
+ module TrafficMansion
5
+ class QueueProcessor
6
+ include Sidekiq::Worker
7
+
8
+ def work(event_id)
9
+ begin
10
+ event = TrafficMansion::Queue.find(event_id)
11
+ if !event.processed
12
+ event.process
13
+ end
14
+ end
15
+ end
16
+
17
+ def perform *args
18
+ Mongoid.unit_of_work(disable: :all) do
19
+ work(*args)
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,10 @@
1
+ require "traffic_mansion"
2
+ require "rails"
3
+
4
+ module TrafficMansion
5
+ class Railtie < Rails::Railtie
6
+ rake_tasks do
7
+ import File.dirname(__FILE__) + "../../../tasks/traffic_mansion.rake"
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,31 @@
1
+ require "rack"
2
+
3
+ module TrafficMansion
4
+ class Response
5
+ def initialize response = ""
6
+ @last = parse_response response
7
+ end
8
+
9
+ def success?
10
+ @last["result"].present? && @last["result"] == "1"
11
+ end
12
+
13
+ def error?
14
+ @last["result"].present? && @last["result"] == "0"
15
+ end
16
+
17
+ def get_error
18
+ @last["error"]
19
+ end
20
+
21
+ def get_response
22
+ @last
23
+ end
24
+
25
+ private
26
+
27
+ def parse_response response
28
+ Rack::Utils.parse_nested_query response, "\n"
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,86 @@
1
+ require "rest_client"
2
+
3
+ module TrafficMansion
4
+ class Tracker
5
+ def initialize options = {}, endpoint = ENV["TRAFFIC_MANSION_ENDPOINT"], http_host = ENV["TRAFFIC_MANSION_HTTP_HOST"]
6
+ @endpoint = endpoint
7
+ @http_host = http_host
8
+ set_data options
9
+ end
10
+
11
+ def set_data data
12
+ @remote_addr = data[:remote_addr] ? data[:remote_addr] : nil
13
+ @campaign_id = data[:campaign_id] ? data[:campaign_id] : nil
14
+ @visit_id = data[:visit_id] ? data[:visit_id] : nil
15
+ @affiliate_id = data[:affiliate_id] ? data[:affiliate_id] : nil
16
+ @user_id = data[:user_id] ? data[:user_id] : nil
17
+ end
18
+
19
+ def visit options = {}
20
+ url = "#{@endpoint}/xd_visit.php"
21
+ params = {
22
+ :campaign_id => @campaign_id,
23
+ :keyword => nil,
24
+ :timestamp => Time.now.to_i,
25
+ :http_host => @http_host,
26
+ :remote_addr => @remote_addr,
27
+ :http_referer => nil,
28
+ :visit_id => @visit_id,
29
+ :affiliate_id => @affiliate_id
30
+ }.merge options
31
+ get_response url, params
32
+ end
33
+
34
+ def signup options = {}
35
+ auth true, options
36
+ end
37
+
38
+ def activate options = {}
39
+ auth false, options
40
+ end
41
+
42
+ def sale options = {}
43
+ payment "sale", options
44
+ end
45
+
46
+ def rebill options = {}
47
+ payment "rebill", options
48
+ end
49
+
50
+
51
+ private
52
+
53
+ def auth is_create, options
54
+ url = "#{@endpoint}/xd_postsignup.php"
55
+ params = {
56
+ :visit_id => @visit_id,
57
+ :active => is_create ? 0 : 1,
58
+ :timestamp => Time.now.to_i,
59
+ :remote_addr => @remote_addr,
60
+ :user_id => @user_id
61
+ }.merge options
62
+ get_response url, params
63
+ end
64
+
65
+ def payment command, options
66
+ url = "#{@endpoint}/xd_postsale.php"
67
+ params = {
68
+ :visit_id => @visit_id,
69
+ :timestamp => Time.now.to_i,
70
+ :amount => nil,
71
+ :product_code => nil,
72
+ :user_id => @user_id,
73
+ :username => @username,
74
+ :transaction => nil,
75
+ :remote_addr => @remote_addr,
76
+ :command => command
77
+ }.merge options
78
+ get_response url, params
79
+ end
80
+
81
+ def get_response url, params
82
+ response = RestClient.post url, params
83
+ TrafficMansion::Response.new response
84
+ end
85
+ end
86
+ end
@@ -0,0 +1,3 @@
1
+ module TrafficMansion
2
+ VERSION = "0.0.2"
3
+ end
@@ -0,0 +1,277 @@
1
+ require 'spec_helper'
2
+ require 'traffic_mansion'
3
+
4
+ describe TrafficMansion::Queue do
5
+ describe "self.add_unique_visit" do
6
+ let(:campaign_id) { "campaign_id" }
7
+ let(:remote_ip) { "remote_ip" }
8
+ let(:referer) { "referer" }
9
+
10
+ it "persists the visit" do
11
+ TrafficMansion::Queue.add_unique_visit campaign_id, remote_ip, referer
12
+ TrafficMansion::Queue.last.type.should eql "visit"
13
+ end
14
+
15
+ it "persists the campaign id" do
16
+ TrafficMansion::Queue.add_unique_visit campaign_id, remote_ip, referer
17
+ TrafficMansion::Queue.last.data["campaign_id"].should eql campaign_id
18
+ end
19
+
20
+ it "persists the remote ip" do
21
+ TrafficMansion::Queue.add_unique_visit campaign_id, remote_ip, referer
22
+ TrafficMansion::Queue.last.data["remote_addr"].should eql remote_ip
23
+ end
24
+
25
+ it "persists the referer" do
26
+ TrafficMansion::Queue.add_unique_visit campaign_id, remote_ip, referer
27
+ TrafficMansion::Queue.last.data["http_referer"].should eql referer
28
+ end
29
+ end
30
+
31
+ describe "self.add_signup" do
32
+ let(:parent_event_id) { "campaign_id" }
33
+ let(:user_id) { "user_id" }
34
+ let(:remote_ip) { "remote_ip" }
35
+ let(:referer) { "referer" }
36
+
37
+ it "persists the signup" do
38
+ TrafficMansion::Queue.add_signup parent_event_id, user_id, remote_ip, referer
39
+ TrafficMansion::Queue.last.type.should eql "signup"
40
+ end
41
+
42
+ it "persists the parent event id" do
43
+ TrafficMansion::Queue.add_signup parent_event_id, user_id, remote_ip, referer
44
+ TrafficMansion::Queue.last.parent_event_id.should eql parent_event_id
45
+ end
46
+
47
+ it "persists the user id" do
48
+ TrafficMansion::Queue.add_signup parent_event_id, user_id, remote_ip, referer
49
+ TrafficMansion::Queue.last.user_id.should eql user_id
50
+ end
51
+
52
+ it "persists the user id" do
53
+ TrafficMansion::Queue.add_signup parent_event_id, user_id, remote_ip, referer
54
+ TrafficMansion::Queue.last.data["user_id"].should eql user_id
55
+ end
56
+
57
+ it "persists the remote ip" do
58
+ TrafficMansion::Queue.add_signup parent_event_id, user_id, remote_ip, referer
59
+ TrafficMansion::Queue.last.data["remote_addr"].should eql remote_ip
60
+ end
61
+
62
+ it "persists the referer" do
63
+ TrafficMansion::Queue.add_signup parent_event_id, user_id, remote_ip, referer
64
+ TrafficMansion::Queue.last.data["http_referer"].should eql referer
65
+ end
66
+ end
67
+
68
+ describe "self.add_sale" do
69
+ let(:user_id) { "user_id" }
70
+ let(:payment_id) { "payment_id" }
71
+ let(:amount) { "amount" }
72
+ let(:product_code) { "product_code" }
73
+ let(:remote_ip) { "remote_ip" }
74
+ let(:referer) { "referer" }
75
+
76
+ it "persists the sale" do
77
+ TrafficMansion::Queue.add_sale user_id, payment_id, amount, product_code, remote_ip, referer
78
+ TrafficMansion::Queue.last.type.should eql "sale"
79
+ end
80
+
81
+ it "persists the user id" do
82
+ TrafficMansion::Queue.add_sale user_id, payment_id, amount, product_code, remote_ip, referer
83
+ TrafficMansion::Queue.last.user_id.should eql user_id
84
+ end
85
+
86
+ it "persists the user id" do
87
+ TrafficMansion::Queue.add_sale user_id, payment_id, amount, product_code, remote_ip, referer
88
+ TrafficMansion::Queue.last.data["user_id"].should eql user_id
89
+ end
90
+
91
+ it "persists the transaction id" do
92
+ TrafficMansion::Queue.add_sale user_id, payment_id, amount, product_code, remote_ip, referer
93
+ TrafficMansion::Queue.last.data["transaction"].should eql payment_id
94
+ end
95
+
96
+ it "persists the amount" do
97
+ TrafficMansion::Queue.add_sale user_id, payment_id, amount, product_code, remote_ip, referer
98
+ TrafficMansion::Queue.last.data["amount"].should eql amount
99
+ end
100
+
101
+ it "persists the product code" do
102
+ TrafficMansion::Queue.add_sale user_id, payment_id, amount, product_code, remote_ip, referer
103
+ TrafficMansion::Queue.last.data["product_code"].should eql product_code
104
+ end
105
+
106
+ it "persists the remote ip" do
107
+ TrafficMansion::Queue.add_sale user_id, payment_id, amount, product_code, remote_ip, referer
108
+ TrafficMansion::Queue.last.data["remote_addr"].should eql remote_ip
109
+ end
110
+
111
+ it "persists the referer" do
112
+ TrafficMansion::Queue.add_sale user_id, payment_id, amount, product_code, remote_ip, referer
113
+ TrafficMansion::Queue.last.data["http_referer"].should eql referer
114
+ end
115
+ end
116
+
117
+ describe "self.add_rebill" do
118
+ let(:user_id) { "user_id" }
119
+ let(:payment_id) { "payment_id" }
120
+ let(:amount) { "amount" }
121
+ let(:product_code) { "product_code" }
122
+ let(:remote_ip) { "remote_ip" }
123
+ let(:referer) { "referer" }
124
+
125
+ it "persists the rebill" do
126
+ TrafficMansion::Queue.add_rebill user_id, payment_id, amount, product_code, remote_ip, referer
127
+ TrafficMansion::Queue.last.type.should eql "rebill"
128
+ end
129
+
130
+ it "persists the user id" do
131
+ TrafficMansion::Queue.add_rebill user_id, payment_id, amount, product_code, remote_ip, referer
132
+ TrafficMansion::Queue.last.user_id.should eql user_id
133
+ end
134
+
135
+ it "persists the user id" do
136
+ TrafficMansion::Queue.add_rebill user_id, payment_id, amount, product_code, remote_ip, referer
137
+ TrafficMansion::Queue.last.data["user_id"].should eql user_id
138
+ end
139
+
140
+ it "persists the transaction id" do
141
+ TrafficMansion::Queue.add_rebill user_id, payment_id, amount, product_code, remote_ip, referer
142
+ TrafficMansion::Queue.last.data["transaction"].should eql payment_id
143
+ end
144
+
145
+ it "persists the amount" do
146
+ TrafficMansion::Queue.add_rebill user_id, payment_id, amount, product_code, remote_ip, referer
147
+ TrafficMansion::Queue.last.data["amount"].should eql amount
148
+ end
149
+
150
+ it "persists the product code" do
151
+ TrafficMansion::Queue.add_rebill user_id, payment_id, amount, product_code, remote_ip, referer
152
+ TrafficMansion::Queue.last.data["product_code"].should eql product_code
153
+ end
154
+
155
+ it "persists the remote ip" do
156
+ TrafficMansion::Queue.add_rebill user_id, payment_id, amount, product_code, remote_ip, referer
157
+ TrafficMansion::Queue.last.data["remote_addr"].should eql remote_ip
158
+ end
159
+
160
+ it "persists the referer" do
161
+ TrafficMansion::Queue.add_rebill user_id, payment_id, amount, product_code, remote_ip, referer
162
+ TrafficMansion::Queue.last.data["http_referer"].should eql referer
163
+ end
164
+ end
165
+
166
+ describe "self.find_parent_by_user" do
167
+ before :each do
168
+ TrafficMansion::Queue.add_signup "parent_event_id", "user_id", "remote_ip", "referer"
169
+ end
170
+
171
+ it "finds the user parent" do
172
+ TrafficMansion::Queue.find_parent_by_user("user_id").parent_event_id.should eql "parent_event_id"
173
+ end
174
+ end
175
+
176
+ describe :process do
177
+ context "when it is a visit event" do
178
+ let!(:event) { TrafficMansion::Queue.add "visit"}
179
+
180
+ context "when the repsonse is success" do
181
+ let(:result) { mock("TMResult", :success? => true, :get_response => nil) }
182
+
183
+ before :each do
184
+ TrafficMansion::Tracker.any_instance.stub(:send => result)
185
+ end
186
+
187
+ it "is processed" do
188
+ event.process
189
+ event.processed.should be_true
190
+ end
191
+ end
192
+
193
+ context "when the repsonse is not success" do
194
+ let(:result) { mock("TMResult", :success? => false, :get_error => "error text") }
195
+
196
+ before :each do
197
+ TrafficMansion::Tracker.any_instance.stub(:send => result)
198
+ end
199
+
200
+ it "is not processed" do
201
+ lambda{ event.process }
202
+ event.processed.should be_false
203
+ end
204
+
205
+ it "raises an error" do
206
+ lambda{ event.process }.should raise_error("Tracking failed with result: error text")
207
+ end
208
+ end
209
+ end
210
+ end
211
+
212
+ context "when it is not a visit event" do
213
+ let!(:parent_event) { TrafficMansion::Queue.add_signup "parent_event_id", "user_id", nil, nil }
214
+ let!(:event) { TrafficMansion::Queue.add_sale "user_id", nil, nil, nil, nil, nil }
215
+ let(:result) { mock("TMResult", :success? => true, :get_response => nil) }
216
+
217
+ before :each do
218
+ parent_event.set :data, {:visit_id => "visit_id"}
219
+ parent_event.set :processed, true
220
+ TrafficMansion::Tracker.any_instance.stub(:send => result)
221
+ end
222
+
223
+ it "should update the parent event id" do
224
+ event.process
225
+ event.parent_event_id.should eql parent_event.id.to_s
226
+ end
227
+
228
+ context "when it has a parent event id" do
229
+ context "when it finds a visit id in the data attribute" do
230
+ before :each do
231
+ parent_event.data["visit_id"] = "visit_id"
232
+ end
233
+
234
+ it "copies the visit id of the parent" do
235
+ event.process
236
+ event.data["visit_id"].should eql parent_event.data["visit_id"]
237
+ end
238
+ end
239
+
240
+ context "when it finds a visit id in the result attribute" do
241
+ before :each do
242
+ parent_event.set :data, {}
243
+ parent_event.set :result, { "visit_id" => "visit_result_id" }
244
+ end
245
+
246
+ it "copies the visit id of the parent" do
247
+ event.process
248
+ event.data["visit_id"].should eql parent_event.result["visit_id"]
249
+ end
250
+ end
251
+ end
252
+
253
+ context "when the repsonse is success" do
254
+ it "is processed" do
255
+ event.process
256
+ event.processed.should be_true
257
+ end
258
+ end
259
+
260
+ context "when the repsonse is not success" do
261
+ let(:result) { mock("TMResult", :success? => false, :get_error => "error text") }
262
+
263
+ before :each do
264
+ TrafficMansion::Tracker.any_instance.stub(:send => result)
265
+ end
266
+
267
+ it "is not processed" do
268
+ lambda{ event.process }
269
+ event.processed.should be_false
270
+ end
271
+
272
+ it "raises an error" do
273
+ lambda{ event.process }.should raise_error("Tracking failed with result: error text")
274
+ end
275
+ end
276
+ end
277
+ end
@@ -0,0 +1,80 @@
1
+ require 'spec_helper'
2
+ require 'traffic_mansion'
3
+
4
+ describe TrafficMansion::Response do
5
+ describe :success? do
6
+ let(:response_text) {"result=1\nerror=success"}
7
+ let(:res) { TrafficMansion::Response.new response_text }
8
+
9
+ context "when the result is 1" do
10
+ it "returns true" do
11
+ res.should be_success
12
+ end
13
+ end
14
+
15
+ context "when the result is 0" do
16
+ let(:response_text) {"result=0\nerror=errormsg"}
17
+ let(:res) { TrafficMansion::Response.new response_text }
18
+
19
+ it "returns false" do
20
+ res.should_not be_success
21
+ end
22
+ end
23
+
24
+ context "when the result is not present" do
25
+ let(:response_text) {"error=errormsg"}
26
+ let(:res) { TrafficMansion::Response.new response_text }
27
+
28
+ it "returns false" do
29
+ res.should_not be_success
30
+ end
31
+ end
32
+ end
33
+
34
+ describe :error? do
35
+ context "when the result is 0" do
36
+ let(:response_text) {"result=0\nerror=successmsg"}
37
+ let(:res) { TrafficMansion::Response.new response_text }
38
+
39
+ it "returns true" do
40
+ res.should be_error
41
+ end
42
+ end
43
+
44
+ context "when the result is 1" do
45
+ let(:response_text) {"result=1\nerror=successmsg"}
46
+ let(:res) { TrafficMansion::Response.new response_text }
47
+
48
+ it "returns false" do
49
+ res.should_not be_error
50
+ end
51
+ end
52
+
53
+ context "when the result is not present" do
54
+ let(:response_text) {"error=errormsg"}
55
+ let(:res) { TrafficMansion::Response.new response_text }
56
+
57
+ it "returns false" do
58
+ res.should_not be_error
59
+ end
60
+ end
61
+ end
62
+
63
+ describe :get_error do
64
+ let(:response_text) {"error=errormsg"}
65
+ let(:res) { TrafficMansion::Response.new response_text }
66
+
67
+ it "returns the error message" do
68
+ res.get_error.should eql "errormsg"
69
+ end
70
+ end
71
+
72
+ describe :get_response do
73
+ let(:response_text) {"error=errormsg"}
74
+ let(:res) { TrafficMansion::Response.new response_text }
75
+
76
+ it "returns the error message" do
77
+ res.get_response.should eql Hash["error", "errormsg"]
78
+ end
79
+ end
80
+ end
@@ -0,0 +1,20 @@
1
+ require "rubygems"
2
+ require "database_cleaner"
3
+ require "mongoid"
4
+
5
+ Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].each {|f| require f}
6
+
7
+ RSpec.configure do |config|
8
+ config.mock_with :rspec
9
+ config.before(:suite) do
10
+ DatabaseCleaner.strategy = :truncation
11
+ end
12
+ config.before(:each) do
13
+ Mongoid::IdentityMap.clear
14
+ end
15
+ config.after(:each) do
16
+ DatabaseCleaner.clean
17
+ end
18
+ end
19
+
20
+ Mongoid::Config.connect_to("mongoid_traffic_mansion_test")
@@ -0,0 +1,8 @@
1
+ require "traffic_mansion"
2
+
3
+ namespace :traffic_mansion do
4
+ desc "Create database indexes"
5
+ task :create_indexes => :environment do
6
+ TrafficMansion::Queue.create_indexes
7
+ end
8
+ end
@@ -0,0 +1,30 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'traffic_mansion/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "traffic_mansion"
8
+ spec.version = TrafficMansion::VERSION
9
+ spec.authors = ["AgileWings"]
10
+ spec.email = ["dumitru@agilewings.com"]
11
+ spec.description = %q{Traffic Mansion campaign tracker client}
12
+ spec.summary = %q{A Ruby on Rails tracker for Traffic Mansion. Depends on MongoID and Sidekiq.}
13
+ spec.homepage = "http://trafficmansion.com"
14
+ spec.license = "Copyright 2013 AgileWings"
15
+
16
+ spec.files = `git ls-files`.split($/)
17
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
18
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
+ spec.require_paths = ["lib"]
20
+
21
+ spec.add_development_dependency "bundler", "~> 1.3"
22
+ spec.add_development_dependency "rspec", "~> 2.13.0"
23
+ spec.add_development_dependency "database_cleaner", "~> 1.0.1"
24
+
25
+ spec.add_runtime_dependency "rack", "~> 1.4.5"
26
+ spec.add_runtime_dependency "rake", "~> 10.0.3"
27
+ spec.add_runtime_dependency "rest-client", "~> 1.6.7"
28
+ spec.add_runtime_dependency "mongoid", "~> 3.0.6"
29
+ spec.add_runtime_dependency "sidekiq", "~> 2.6.5"
30
+ end
metadata ADDED
@@ -0,0 +1,176 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: traffic_mansion
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.2
5
+ platform: ruby
6
+ authors:
7
+ - AgileWings
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2013-05-14 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ~>
18
+ - !ruby/object:Gem::Version
19
+ version: '1.3'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ~>
25
+ - !ruby/object:Gem::Version
26
+ version: '1.3'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rspec
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ~>
32
+ - !ruby/object:Gem::Version
33
+ version: 2.13.0
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ~>
39
+ - !ruby/object:Gem::Version
40
+ version: 2.13.0
41
+ - !ruby/object:Gem::Dependency
42
+ name: database_cleaner
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ~>
46
+ - !ruby/object:Gem::Version
47
+ version: 1.0.1
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ~>
53
+ - !ruby/object:Gem::Version
54
+ version: 1.0.1
55
+ - !ruby/object:Gem::Dependency
56
+ name: rack
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ~>
60
+ - !ruby/object:Gem::Version
61
+ version: 1.4.5
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ~>
67
+ - !ruby/object:Gem::Version
68
+ version: 1.4.5
69
+ - !ruby/object:Gem::Dependency
70
+ name: rake
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ~>
74
+ - !ruby/object:Gem::Version
75
+ version: 10.0.3
76
+ type: :runtime
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ~>
81
+ - !ruby/object:Gem::Version
82
+ version: 10.0.3
83
+ - !ruby/object:Gem::Dependency
84
+ name: rest-client
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ~>
88
+ - !ruby/object:Gem::Version
89
+ version: 1.6.7
90
+ type: :runtime
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ~>
95
+ - !ruby/object:Gem::Version
96
+ version: 1.6.7
97
+ - !ruby/object:Gem::Dependency
98
+ name: mongoid
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ~>
102
+ - !ruby/object:Gem::Version
103
+ version: 3.0.6
104
+ type: :runtime
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ~>
109
+ - !ruby/object:Gem::Version
110
+ version: 3.0.6
111
+ - !ruby/object:Gem::Dependency
112
+ name: sidekiq
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - ~>
116
+ - !ruby/object:Gem::Version
117
+ version: 2.6.5
118
+ type: :runtime
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - ~>
123
+ - !ruby/object:Gem::Version
124
+ version: 2.6.5
125
+ description: Traffic Mansion campaign tracker client
126
+ email:
127
+ - dumitru@agilewings.com
128
+ executables: []
129
+ extensions: []
130
+ extra_rdoc_files: []
131
+ files:
132
+ - .gitignore
133
+ - Gemfile
134
+ - LICENSE.txt
135
+ - README.md
136
+ - Rakefile
137
+ - lib/traffic_mansion.rb
138
+ - lib/traffic_mansion/queue.rb
139
+ - lib/traffic_mansion/queue_processor.rb
140
+ - lib/traffic_mansion/railtie.rb
141
+ - lib/traffic_mansion/response.rb
142
+ - lib/traffic_mansion/tracker.rb
143
+ - lib/traffic_mansion/version.rb
144
+ - spec/queue_spec.rb
145
+ - spec/response_spec.rb
146
+ - spec/spec_helper.rb
147
+ - tasks/traffic_mansion.rake
148
+ - traffic_mansion.gemspec
149
+ homepage: http://trafficmansion.com
150
+ licenses:
151
+ - Copyright 2013 AgileWings
152
+ metadata: {}
153
+ post_install_message:
154
+ rdoc_options: []
155
+ require_paths:
156
+ - lib
157
+ required_ruby_version: !ruby/object:Gem::Requirement
158
+ requirements:
159
+ - - '>='
160
+ - !ruby/object:Gem::Version
161
+ version: '0'
162
+ required_rubygems_version: !ruby/object:Gem::Requirement
163
+ requirements:
164
+ - - '>='
165
+ - !ruby/object:Gem::Version
166
+ version: '0'
167
+ requirements: []
168
+ rubyforge_project:
169
+ rubygems_version: 2.0.3
170
+ signing_key:
171
+ specification_version: 4
172
+ summary: A Ruby on Rails tracker for Traffic Mansion. Depends on MongoID and Sidekiq.
173
+ test_files:
174
+ - spec/queue_spec.rb
175
+ - spec/response_spec.rb
176
+ - spec/spec_helper.rb