traffic_mansion 0.0.2

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