cheddargetter_client_ruby 0.2.1 → 0.3.0
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/VERSION +1 -1
- data/cheddargetter_client_ruby.gemspec +2 -2
- data/lib/cheddar_getter/client.rb +160 -3
- data/lib/cheddar_getter/response.rb +2 -2
- data/test/test_cheddargetter_client_ruby.rb +106 -0
- metadata +5 -5
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
0.3.0
|
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{cheddargetter_client_ruby}
|
8
|
-
s.version = "0.
|
8
|
+
s.version = "0.3.0"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Expected Behavior"]
|
12
|
-
s.date = %q{
|
12
|
+
s.date = %q{2011-01-13}
|
13
13
|
s.description = %q{A CheddarGetter API wrapper for Ruby}
|
14
14
|
s.email = %q{support@expectedbehavior.com}
|
15
15
|
s.extra_rdoc_files = [
|
@@ -120,7 +120,27 @@ module CheddarGetter
|
|
120
120
|
# }
|
121
121
|
# }
|
122
122
|
#}
|
123
|
-
|
123
|
+
#
|
124
|
+
#Pass in the cookie info hash if you have been using the
|
125
|
+
#set_marketing_cookie method to track marketing metrics.
|
126
|
+
#Info from the marketing cookie will be passed along to
|
127
|
+
#Cheddar Getter in the new_customer call.
|
128
|
+
#
|
129
|
+
#cookie_info (optional):
|
130
|
+
#
|
131
|
+
#{
|
132
|
+
# :cookies => required
|
133
|
+
# :cookie_name => not_required
|
134
|
+
#}
|
135
|
+
def new_customer(data = { }, cookie_info = nil)
|
136
|
+
if cookie_info
|
137
|
+
cookie_name = cookie_info[:cookie_name] || DEFAULT_COOKIE_NAME
|
138
|
+
cookie_data = (YAML.load(cookie_info[:cookies][cookie_name] || "") rescue nil) || { }
|
139
|
+
[:firstContactDatetime, :referer, :campaignTerm, :campaignName,
|
140
|
+
:campaignSource, :campaignMedium, :campaignContent].each do |key|
|
141
|
+
data[key] ||= cookie_data[key] if cookie_data[key]
|
142
|
+
end
|
143
|
+
end
|
124
144
|
do_request(:item => :customers, :action => :new, :data => data)
|
125
145
|
end
|
126
146
|
|
@@ -303,6 +323,138 @@ module CheddarGetter
|
|
303
323
|
do_request(:item => :customers, :action => "add-charge", :id_hash => id_hash, :data => data)
|
304
324
|
end
|
305
325
|
|
326
|
+
#http://support.cheddargetter.com/faqs/marketing-metrics/marketing-metrics
|
327
|
+
#
|
328
|
+
#Convenience wrapper of setcookie() for setting a persistent cookie
|
329
|
+
#containing marketing metrics compatible with CheddarGetter's marketing metrics tracking.
|
330
|
+
#Running this method on every request to your marketing site sets or refines the marketing
|
331
|
+
#cookie data over time.
|
332
|
+
#If you are using this method, you can pass in the cookies to the new_customer call,
|
333
|
+
#which will automatically add the data to the customer record.
|
334
|
+
#
|
335
|
+
#Sample usage for your controller:
|
336
|
+
#
|
337
|
+
# before_filter :update_cheddar_getter_cookie
|
338
|
+
# def update_cheddar_getter_cookie
|
339
|
+
# CheddarGetter::Client.set_marketing_cookie(:cookies => cookies, :request => request)
|
340
|
+
# end
|
341
|
+
#
|
342
|
+
#options:
|
343
|
+
#
|
344
|
+
#{
|
345
|
+
# :cookies => required,
|
346
|
+
# :request => required,
|
347
|
+
# :cookie_name => not_required (default 'CGMK'),
|
348
|
+
# :expires => not_required (default 2 years),
|
349
|
+
# :path => not_required (default '/'),
|
350
|
+
# :domain => not_required (default nil),
|
351
|
+
# :secure => not_required (default false),
|
352
|
+
# :httponly => not_required (default false)
|
353
|
+
#}
|
354
|
+
def self.set_marketing_cookie(options = { })
|
355
|
+
default_options = {
|
356
|
+
:cookie_name => DEFAULT_COOKIE_NAME,
|
357
|
+
:expires => Time.now + 60*60*24*365*2,
|
358
|
+
:path => '/',
|
359
|
+
:domain => nil,
|
360
|
+
:secure => false,
|
361
|
+
:httponly => false
|
362
|
+
}
|
363
|
+
|
364
|
+
options = default_options.merge(options)
|
365
|
+
cookies = options[:cookies]
|
366
|
+
raise CheddarGetter::ClientException.new("The option :cookies is required") unless cookies
|
367
|
+
request = options[:request]
|
368
|
+
raise CheddarGetter::ClientException.new("The option :request is required") unless request
|
369
|
+
|
370
|
+
utm_params = {
|
371
|
+
:utm_term => :campaignTerm,
|
372
|
+
:utm_campaign => :campaignName,
|
373
|
+
:utm_source => :campaignSource,
|
374
|
+
:utm_medium => :campaignMedium,
|
375
|
+
:utm_content => :campaignContent
|
376
|
+
}
|
377
|
+
|
378
|
+
# get the existing cookie information, if any
|
379
|
+
cookie_data = (YAML.load(cookies[options[:cookie_name]] || "") rescue nil)
|
380
|
+
cookie_data = nil unless cookie_data.kind_of?(Hash)
|
381
|
+
|
382
|
+
# no cookie yet -- set the first contact date and referer in the cookie
|
383
|
+
# (only first request)
|
384
|
+
if !cookie_data
|
385
|
+
# when did this lead first find us? (right now!)
|
386
|
+
# we'll use this to determine the customer "vintage"
|
387
|
+
cookie_data = { :firstContactDatetime => Time.now.strftime("%Y-%m-%dT%H:%M:%S%z") }
|
388
|
+
|
389
|
+
# if there's a __utma cookie, we can get a more accurate time
|
390
|
+
# which helps us get better data from visitors who first found us
|
391
|
+
# before we started setting our own cookie
|
392
|
+
if cookies['__utma']
|
393
|
+
domain_hash, visitor_id, initial_visit, previous_visit, current_visit, visit_counter =
|
394
|
+
cookies['__utma'].split('.')
|
395
|
+
|
396
|
+
initial_visit = initial_visit.to_i
|
397
|
+
if initial_visit != 0
|
398
|
+
cookie_data[:firstContactDatetime] = Time.at(initial_visit).strftime("%Y-%m-%dT%H:%M:%S%z")
|
399
|
+
end
|
400
|
+
end
|
401
|
+
|
402
|
+
#set the raw referer (defaults to 'direct')
|
403
|
+
cookie_data[:referer] = 'direct'
|
404
|
+
cookie_data[:referer] = request.env['HTTP_REFERER'] unless request.env['HTTP_REFERER'].blank?
|
405
|
+
|
406
|
+
# if there's some utm vars
|
407
|
+
# When tagging your inbound links for google analytics
|
408
|
+
# http://www.google.com/support/analytics/bin/answer.py?answer=55518
|
409
|
+
# our cookie will also benenfit by the added params
|
410
|
+
utm_params.each { |k, v| cookie_data[v] = request.params[k] unless request.params[k].blank? }
|
411
|
+
|
412
|
+
cookies[options[:cookie_name]] = {
|
413
|
+
:value => cookie_data.to_yaml,
|
414
|
+
:path => options[:path],
|
415
|
+
:domain => options[:domain],
|
416
|
+
:expires => options[:expires],
|
417
|
+
:secure => options[:secure],
|
418
|
+
:httponly => options[:httponly]
|
419
|
+
}
|
420
|
+
|
421
|
+
# cookie is already set but maybe we can refine it with __utmz data
|
422
|
+
# (second and subsequent requests)
|
423
|
+
elsif cookies['__utmz']
|
424
|
+
return if cookie_data.size >= 3 #already has enough info
|
425
|
+
|
426
|
+
domain_hash, timestamp, session_number, campaign_number, campaign_data =
|
427
|
+
cookies['__utmz'].split('.')
|
428
|
+
|
429
|
+
return if campaign_data.blank?
|
430
|
+
campaign_data = (Hash[*campaign_data.split(/\||=/)] rescue { })
|
431
|
+
|
432
|
+
# see if it's a google adwords lead
|
433
|
+
# in this case, we only get the keyword
|
434
|
+
if ! campaign_data["utmgclid"].blank?
|
435
|
+
cookie_data[:campaignSource] = 'google';
|
436
|
+
cookie_data[:campaignMedium] = 'ppc';
|
437
|
+
cookie_data[:campaignTerm] = campaign_data["utmctr"] unless campaign_data["utmctr"].blank?
|
438
|
+
else
|
439
|
+
cookieData[:campaignSource] = campaign_data["utmcsr"] unless campaign_data["utmcsr"].blank?
|
440
|
+
cookieData[:campaignName] = campaign_data["utmccn"] unless campaign_data["utmccn"].blank?
|
441
|
+
cookieData[:campaignMedium] = campaign_data["utmcmd"] unless campaign_data["utmcmd"].blank?
|
442
|
+
cookieData[:campaignTerm] = campaign_data["utmctr"] unless campaign_data["utmctr"].blank?
|
443
|
+
cookieData[:campaignContent] = campaign_data["utmcct"] unless campaign_data["utmcct"].blank?
|
444
|
+
end
|
445
|
+
|
446
|
+
cookies[options[:cookie_name]] = {
|
447
|
+
:value => cookie_data.to_yaml,
|
448
|
+
:path => options[:path],
|
449
|
+
:domain => options[:domain],
|
450
|
+
:expires => options[:expires],
|
451
|
+
:secure => options[:secure],
|
452
|
+
:httponly => options[:httponly]
|
453
|
+
}
|
454
|
+
end
|
455
|
+
end
|
456
|
+
|
457
|
+
|
306
458
|
private
|
307
459
|
def get_identifier_string(type, id_hash)
|
308
460
|
code = type ? "#{type}_code".to_sym : :code
|
@@ -356,9 +508,13 @@ module CheddarGetter
|
|
356
508
|
:createdAfterDate => :year_month_day,
|
357
509
|
:createdBeforeDate => :year_month_day,
|
358
510
|
:canceledAfterDate => :year_month_day,
|
359
|
-
:canceledBeforeDate => :year_month_day
|
511
|
+
:canceledBeforeDate => :year_month_day,
|
512
|
+
:firstContactDatetime => :datetime,
|
513
|
+
:changeBillDate => :datetime
|
360
514
|
}
|
361
515
|
|
516
|
+
DEFAULT_COOKIE_NAME = 'CGMK'
|
517
|
+
|
362
518
|
def deep_fix_request_data!(data)
|
363
519
|
if data.is_a?(Array)
|
364
520
|
data.each do |v|
|
@@ -372,7 +528,8 @@ module CheddarGetter
|
|
372
528
|
data[k] = case type
|
373
529
|
when :month_year then v.respond_to?(:strftime) ? v.strftime("%m/%Y") : v
|
374
530
|
when :boolean then v ? "1" : "0"
|
375
|
-
when :year_month_day then v.respond_to?(:strftime) ? v.strftime("%Y
|
531
|
+
when :year_month_day then v.respond_to?(:strftime) ? v.strftime("%Y-%m-%d") : v
|
532
|
+
when :datetime then v.respond_to?(:strftime) ? v.strftime("%Y-%m-%dT%H:%M:%S%z") : v
|
376
533
|
else v
|
377
534
|
end
|
378
535
|
end
|
@@ -171,7 +171,7 @@ module CheddarGetter
|
|
171
171
|
#
|
172
172
|
#code must be provided if this response contains more than one customer.
|
173
173
|
def customer_outstanding_invoices(code = nil)
|
174
|
-
now =
|
174
|
+
now = Time.now
|
175
175
|
customer_invoices(code).reject do |i|
|
176
176
|
i[:paidTransactionId] || i[:billingDatetime] > now
|
177
177
|
end
|
@@ -282,7 +282,7 @@ module CheddarGetter
|
|
282
282
|
data[k] = case type
|
283
283
|
when :integer then v.to_i
|
284
284
|
when :float then v.to_f
|
285
|
-
when :datetime then
|
285
|
+
when :datetime then Time.parse(v) rescue v
|
286
286
|
when :date then Date.parse(v) rescue v
|
287
287
|
when :boolean then v.to_i != 0
|
288
288
|
else v
|
@@ -40,6 +40,7 @@ class TestCheddargetterClientRuby < Test::Unit::TestCase
|
|
40
40
|
:firstName => "First",
|
41
41
|
:lastName => "Last",
|
42
42
|
:email => "email@example.com",
|
43
|
+
:firstContactDatetime => Time.now,
|
43
44
|
:subscription => {
|
44
45
|
:planCode => "TEST_PLAN_2",
|
45
46
|
:ccNumber => "4111111111111111",
|
@@ -873,4 +874,109 @@ class TestCheddargetterClientRuby < Test::Unit::TestCase
|
|
873
874
|
assert_equal ["Credit card type is not accepted"], result.error_messages
|
874
875
|
end
|
875
876
|
|
877
|
+
should "test setting the marketing cookie" do
|
878
|
+
cn = CheddarGetter::Client::DEFAULT_COOKIE_NAME
|
879
|
+
fake_request_class = Struct.new(:env, :params)
|
880
|
+
assert_raises(CheddarGetter::ClientException) { CheddarGetter::Client.set_marketing_cookie }
|
881
|
+
assert_raises(CheddarGetter::ClientException) { CheddarGetter::Client.set_marketing_cookie(:cookies => { }) }
|
882
|
+
|
883
|
+
request = fake_request_class.new({'HTTP_REFERER' => 'woot'}, { :utm_term => 'hi' })
|
884
|
+
time = Time.now
|
885
|
+
cookies = { "__utma" => " . .#{time.to_i}. . . "}
|
886
|
+
CheddarGetter::Client.set_marketing_cookie(:cookies => cookies, :request => request)
|
887
|
+
|
888
|
+
assert_equal '/', cookies[cn][:path]
|
889
|
+
assert_equal nil, cookies[cn][:domain]
|
890
|
+
assert_equal false, cookies[cn][:secure]
|
891
|
+
assert_equal false, cookies[cn][:httponly]
|
892
|
+
cookie_data = YAML.load(cookies[cn][:value])
|
893
|
+
assert_equal 3, cookie_data.size
|
894
|
+
assert_equal time.strftime("%Y-%m-%dT%H:%M:%S%z"), cookie_data[:firstContactDatetime]
|
895
|
+
assert_equal "woot", cookie_data[:referer]
|
896
|
+
assert_equal "hi", cookie_data[:campaignTerm]
|
897
|
+
|
898
|
+
cookies[cn] = cookies[cn][:value]
|
899
|
+
cookies['__utmz'] = " . . . .utmgclid=value|utmctr=bye"
|
900
|
+
CheddarGetter::Client.set_marketing_cookie(:cookies => cookies, :request => request)
|
901
|
+
cookie_data = YAML.load(cookies[cn]) #was not manipulated
|
902
|
+
assert_equal 3, cookie_data.size
|
903
|
+
assert_equal time.strftime("%Y-%m-%dT%H:%M:%S%z"), cookie_data[:firstContactDatetime]
|
904
|
+
assert_equal "woot", cookie_data[:referer]
|
905
|
+
assert_equal "hi", cookie_data[:campaignTerm]
|
906
|
+
|
907
|
+
cookie_data.delete(:campaignTerm)
|
908
|
+
cookies[cn] = cookie_data.to_yaml
|
909
|
+
CheddarGetter::Client.set_marketing_cookie(:cookies => cookies, :request => request)
|
910
|
+
cookie_data = YAML.load(cookies[cn][:value])
|
911
|
+
assert_equal 5, cookie_data.size
|
912
|
+
assert_equal time.strftime("%Y-%m-%dT%H:%M:%S%z"), cookie_data[:firstContactDatetime]
|
913
|
+
assert_equal "woot", cookie_data[:referer]
|
914
|
+
assert_equal "bye", cookie_data[:campaignTerm]
|
915
|
+
assert_equal "google", cookie_data[:campaignSource]
|
916
|
+
assert_equal "ppc", cookie_data[:campaignMedium]
|
917
|
+
|
918
|
+
cookie_data.delete(:campaignTerm)
|
919
|
+
cookie_data.delete(:campaignSource)
|
920
|
+
cookie_data.delete(:campaignMedium)
|
921
|
+
cookies['__utmz'] = " . . . ."
|
922
|
+
cookies[cn] = cookie_data.to_yaml
|
923
|
+
CheddarGetter::Client.set_marketing_cookie(:cookies => cookies, :request => request)
|
924
|
+
cookie_data = YAML.load(cookies[cn]) #was not manipulated
|
925
|
+
assert_equal 2, cookie_data.size
|
926
|
+
assert_equal time.strftime("%Y-%m-%dT%H:%M:%S%z"), cookie_data[:firstContactDatetime]
|
927
|
+
assert_equal "woot", cookie_data[:referer]
|
928
|
+
|
929
|
+
cookies['__utmz'] = " . . . .utmgclid=value"
|
930
|
+
cookies[cn] = cookie_data.to_yaml
|
931
|
+
CheddarGetter::Client.set_marketing_cookie(:cookies => cookies, :request => request)
|
932
|
+
cookie_data = YAML.load(cookies[cn][:value])
|
933
|
+
assert_equal 4, cookie_data.size
|
934
|
+
assert_equal time.strftime("%Y-%m-%dT%H:%M:%S%z"), cookie_data[:firstContactDatetime]
|
935
|
+
assert_equal "woot", cookie_data[:referer]
|
936
|
+
assert_equal "google", cookie_data[:campaignSource]
|
937
|
+
assert_equal "ppc", cookie_data[:campaignMedium]
|
938
|
+
|
939
|
+
cookie_data.delete(:campaignTerm)
|
940
|
+
cookie_data.delete(:campaignSource)
|
941
|
+
cookie_data.delete(:campaignMedium)
|
942
|
+
cookies['__utmz'] = " . . . . "
|
943
|
+
cookies[cn] = cookie_data.to_yaml
|
944
|
+
CheddarGetter::Client.set_marketing_cookie(:cookies => cookies, :request => request)
|
945
|
+
cookie_data = YAML.load(cookies[cn][:value])
|
946
|
+
assert_equal 2, cookie_data.size
|
947
|
+
assert_equal time.strftime("%Y-%m-%dT%H:%M:%S%z"), cookie_data[:firstContactDatetime]
|
948
|
+
assert_equal "woot", cookie_data[:referer]
|
949
|
+
|
950
|
+
cookies[cn] = "stuff"
|
951
|
+
CheddarGetter::Client.set_marketing_cookie(:cookies => cookies, :request => request)
|
952
|
+
cookie_data = YAML.load(cookies[cn][:value])
|
953
|
+
assert_equal 3, cookie_data.size
|
954
|
+
assert_equal time.strftime("%Y-%m-%dT%H:%M:%S%z"), cookie_data[:firstContactDatetime]
|
955
|
+
assert_equal "woot", cookie_data[:referer]
|
956
|
+
assert_equal "hi", cookie_data[:campaignTerm]
|
957
|
+
end
|
958
|
+
|
959
|
+
should "create a customer with marketing data" do
|
960
|
+
result = CG.delete_all_customers
|
961
|
+
assert_equal true, result.valid?
|
962
|
+
|
963
|
+
time = Time.now
|
964
|
+
|
965
|
+
cookies = { CheddarGetter::Client::DEFAULT_COOKIE_NAME => ({
|
966
|
+
:firstContactDatetime => time.strftime("%Y-%m-%dT%H:%M:%S%z"),
|
967
|
+
:referer => 'direct',
|
968
|
+
:campaignTerm => "incorrect"
|
969
|
+
}.to_yaml) }
|
970
|
+
|
971
|
+
result = CG.new_customer({ :campaignTerm => "correct"}.merge(free_new_user_hash(1)),
|
972
|
+
{ :cookies => cookies })
|
973
|
+
assert_equal 1, result.customers.size
|
974
|
+
assert_equal "1", result.customer[:code]
|
975
|
+
assert_equal "Free Plan Test", result.customer_plan[:name]
|
976
|
+
assert_equal time.strftime("%Y-%m-%dT%H:%M:%S%z"),
|
977
|
+
result.customer[:firstContactDatetime].strftime("%Y-%m-%dT%H:%M:%S%z")
|
978
|
+
assert_equal 'direct', result.customer[:referer]
|
979
|
+
assert_equal 'correct', result.customer[:campaignTerm]
|
980
|
+
end
|
981
|
+
|
876
982
|
end
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: cheddargetter_client_ruby
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 19
|
5
5
|
prerelease: false
|
6
6
|
segments:
|
7
7
|
- 0
|
8
|
-
-
|
9
|
-
-
|
10
|
-
version: 0.
|
8
|
+
- 3
|
9
|
+
- 0
|
10
|
+
version: 0.3.0
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Expected Behavior
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date:
|
18
|
+
date: 2011-01-13 00:00:00 -05:00
|
19
19
|
default_executable:
|
20
20
|
dependencies:
|
21
21
|
- !ruby/object:Gem::Dependency
|