From 1472efdd5553dcf913ce9a98b60ea68023ef6564 Mon Sep 17 00:00:00 2001 From: Elijah Tabb Date: Fri, 25 Jul 2014 09:12:56 -0500 Subject: [PATCH 01/10] Added in iglu schema paths --- lib/snowplow-tracker/tracker.rb | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/lib/snowplow-tracker/tracker.rb b/lib/snowplow-tracker/tracker.rb index 9ef0bff..ce51633 100644 --- a/lib/snowplow-tracker/tracker.rb +++ b/lib/snowplow-tracker/tracker.rb @@ -24,7 +24,7 @@ class Tracker @@required_transaction_keys = Set.new(%w(order_id total_value)) @@recognised_transaction_keys = Set.new(%w(order_id total_value affiliation tax_value shipping city state country currency)) - + @@Transaction = lambda { |x| return false unless x.class == Hash transaction_keys = Set.new(x.keys) @@ -61,6 +61,11 @@ class Tracker 'No address associated with name', 'No address associated with hostname'] + @@base_schema_path = "iglu:com.snowplowanalytics.snowplow" + @@schema_tag = "jsonschema" + @@context_schema = "#{@@base_schema_path}/contexts/#{@@schema_tag}/1-0-0" + @@unstruct_event_schema = "#{@@base_schema_path}/unstruct_event/#{@@schema_tag}/1-0-0" + Contract String, Maybe[String], Maybe[String], Maybe[String], Bool => Tracker def initialize(endpoint, namespace=nil, app_id=nil, context_vendor=nil, encode_base64=@@default_encode_base64) @collector_uri = as_collector_uri(endpoint) @@ -116,7 +121,7 @@ def http_get(payload) # Setter methods # Specify the platform - # + # Contract String => String def set_platform(value) if @@supported_platforms.include?(value) @@ -141,7 +146,7 @@ def set_screen_resolution(width, height) end # Set the dimensions of the current viewport - # + # Contract Num, Num => String def set_viewport(width, height) @standard_nv_pairs['vp'] = "#{width}x#{height}" From cd247d00a2b461990f6ce2061b1e669a8ddd6ce9 Mon Sep 17 00:00:00 2001 From: Elijah Tabb Date: Fri, 25 Jul 2014 09:14:40 -0500 Subject: [PATCH 02/10] wrapped main unstructured event argument and context in their respective schemas --- lib/snowplow-tracker/tracker.rb | 24 +++++++++++++++++++----- 1 file changed, 19 insertions(+), 5 deletions(-) diff --git a/lib/snowplow-tracker/tracker.rb b/lib/snowplow-tracker/tracker.rb index ce51633..f774b87 100644 --- a/lib/snowplow-tracker/tracker.rb +++ b/lib/snowplow-tracker/tracker.rb @@ -298,19 +298,33 @@ def track_screen_view(name, id=nil, context=nil, tstamp=nil) # Track an unstructured event # Contract String, Hash, Maybe[String], Maybe[Hash], Maybe[Num] => [Bool, Num] - def track_unstruct_event(event_name, dict, event_vendor=nil, context=nil, tstamp=nil) + def track_unstruct_event(name, event_json, event_vendor=nil, context=nil, tstamp=nil) pb = Payload.new pb.add('e', 'ue') - pb.add('ue_na', event_name) - pb.add_json(dict, @config['encode_base64'], 'ue_px', 'ue_pr') - pb.add('evn', event_vendor) - pb.add_json(context, @config['encode_base64'], 'cx', 'co') + + envelope = { + schema: @@unstruct_event_schema, + data: event_json + } + pb.add_json(envelope, @config['encode_base64'], 'ue_px', 'ue_pr') + tid = get_transaction_id pb.add('tid', tid) + + if event_vendor + pb.add('evn', event_vendor) + end + if tstamp.nil? tstamp = get_timestamp end pb.add('dtm', tstamp) + + if context + context_envelope = {schema: @@context_schema, data: context} + pb.add_json(context_envelope, @config['encode_base64'], 'cx', 'co') + end + track(pb) end From da21497a28d96a68936da59c73e64bf850832cf1 Mon Sep 17 00:00:00 2001 From: Elijah Tabb Date: Fri, 25 Jul 2014 09:16:13 -0500 Subject: [PATCH 03/10] Removing event vendor argument --- lib/snowplow-tracker/tracker.rb | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/lib/snowplow-tracker/tracker.rb b/lib/snowplow-tracker/tracker.rb index f774b87..8c413b1 100644 --- a/lib/snowplow-tracker/tracker.rb +++ b/lib/snowplow-tracker/tracker.rb @@ -297,8 +297,8 @@ def track_screen_view(name, id=nil, context=nil, tstamp=nil) # Track an unstructured event # - Contract String, Hash, Maybe[String], Maybe[Hash], Maybe[Num] => [Bool, Num] - def track_unstruct_event(name, event_json, event_vendor=nil, context=nil, tstamp=nil) + Contract String, Hash, Maybe[Hash], Maybe[Num] => [Bool, Num] + def track_unstruct_event(name, event_json, context=nil, tstamp=nil) pb = Payload.new pb.add('e', 'ue') @@ -311,10 +311,6 @@ def track_unstruct_event(name, event_json, event_vendor=nil, context=nil, tstamp tid = get_transaction_id pb.add('tid', tid) - if event_vendor - pb.add('evn', event_vendor) - end - if tstamp.nil? tstamp = get_timestamp end From 214f4a974232a8f91fb3c6537c494282a92a616d Mon Sep 17 00:00:00 2001 From: Elijah Tabb Date: Fri, 25 Jul 2014 10:19:04 -0500 Subject: [PATCH 04/10] Adding event vendor argument back in --- lib/snowplow-tracker/tracker.rb | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/lib/snowplow-tracker/tracker.rb b/lib/snowplow-tracker/tracker.rb index 8c413b1..f774b87 100644 --- a/lib/snowplow-tracker/tracker.rb +++ b/lib/snowplow-tracker/tracker.rb @@ -297,8 +297,8 @@ def track_screen_view(name, id=nil, context=nil, tstamp=nil) # Track an unstructured event # - Contract String, Hash, Maybe[Hash], Maybe[Num] => [Bool, Num] - def track_unstruct_event(name, event_json, context=nil, tstamp=nil) + Contract String, Hash, Maybe[String], Maybe[Hash], Maybe[Num] => [Bool, Num] + def track_unstruct_event(name, event_json, event_vendor=nil, context=nil, tstamp=nil) pb = Payload.new pb.add('e', 'ue') @@ -311,6 +311,10 @@ def track_unstruct_event(name, event_json, context=nil, tstamp=nil) tid = get_transaction_id pb.add('tid', tid) + if event_vendor + pb.add('evn', event_vendor) + end + if tstamp.nil? tstamp = get_timestamp end From 84457de9188361c2a4affcb27a6edbb3d01433bd Mon Sep 17 00:00:00 2001 From: Elijah Tabb Date: Fri, 25 Jul 2014 11:58:24 -0500 Subject: [PATCH 05/10] Adjuting tests to handle new schema wrappers --- spec/integration/integration_spec.rb | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/spec/integration/integration_spec.rb b/spec/integration/integration_spec.rb index d5020ac..ec96052 100644 --- a/spec/integration/integration_spec.rb +++ b/spec/integration/integration_spec.rb @@ -162,8 +162,8 @@ def get_last_querystring(n=1) param_hash = CGI.parse(t.get_last_querystring(1)) expected_fields = { - 'e' => 'ue', - 'ue_pr' => "{\"product_id\":\"ASO01043\",\"price\":49.95}", + 'e' => 'ue', + 'ue_pr' => "{\"schema\":\"iglu:com.snowplowanalytics.snowplow/unstruct_event/jsonschema/1-0-0\",\"data\":{\"product_id\":\"ASO01043\",\"price\":49.95}}", 'evn' => 'com.example' } for pair in expected_fields @@ -178,8 +178,8 @@ def get_last_querystring(n=1) param_hash = CGI.parse(t.get_last_querystring(1)) expected_fields = { - 'e' => 'ue', - 'ue_px' => 'eyJwcm9kdWN0X2lkIjoiQVNPMDEwNDMiLCJwcmljZSI6NDkuOTV9', + 'e' => 'ue', + 'ue_px' => 'eyJzY2hlbWEiOiJpZ2x1OmNvbS5zbm93cGxvd2FuYWx5dGljcy5zbm93cGxvdy91bnN0cnVjdF9ldmVudC9qc29uc2NoZW1hLzEtMC0wIiwiZGF0YSI6eyJwcm9kdWN0X2lkIjoiQVNPMDEwNDMiLCJwcmljZSI6NDkuOTV9fQ==', 'evn' => 'com.example' } for pair in expected_fields @@ -194,8 +194,8 @@ def get_last_querystring(n=1) param_hash = CGI.parse(t.get_last_querystring(1)) expected_fields = { - 'e' => 'ue', - 'ue_pr' => "{\"name\":\"Game HUD 2\",\"id\":\"e89a34b2f\"}", + 'e' => 'ue', + 'ue_pr' => "{\"schema\":\"iglu:com.snowplowanalytics.snowplow/unstruct_event/jsonschema/1-0-0\",\"data\":{\"name\":\"Game HUD 2\",\"id\":\"e89a34b2f\"}}", 'evn' => 'com.snowplowanalytics' } for pair in expected_fields From 3aef2587710b21498997cf8d83712a5e7ece283b Mon Sep 17 00:00:00 2001 From: Elijah Tabb Date: Sun, 27 Jul 2014 14:59:19 -0500 Subject: [PATCH 06/10] Removing name and event_vendor arguments as in issue #19 --- lib/snowplow-tracker/tracker.rb | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/lib/snowplow-tracker/tracker.rb b/lib/snowplow-tracker/tracker.rb index f774b87..728b099 100644 --- a/lib/snowplow-tracker/tracker.rb +++ b/lib/snowplow-tracker/tracker.rb @@ -297,8 +297,8 @@ def track_screen_view(name, id=nil, context=nil, tstamp=nil) # Track an unstructured event # - Contract String, Hash, Maybe[String], Maybe[Hash], Maybe[Num] => [Bool, Num] - def track_unstruct_event(name, event_json, event_vendor=nil, context=nil, tstamp=nil) + Contract Hash, Maybe[Hash], Maybe[Num] => [Bool, Num] + def track_unstruct_event(event_json, context=nil, tstamp=nil) pb = Payload.new pb.add('e', 'ue') @@ -311,10 +311,6 @@ def track_unstruct_event(name, event_json, event_vendor=nil, context=nil, tstamp tid = get_transaction_id pb.add('tid', tid) - if event_vendor - pb.add('evn', event_vendor) - end - if tstamp.nil? tstamp = get_timestamp end From 9c066cc3b757628b1bb96aa6bea32a6ffac9ba1d Mon Sep 17 00:00:00 2001 From: Elijah Tabb Date: Sun, 27 Jul 2014 15:34:58 -0500 Subject: [PATCH 07/10] Updated track_screen_view to send self-describing screen_view JSON as in #21 --- lib/snowplow-tracker/tracker.rb | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/lib/snowplow-tracker/tracker.rb b/lib/snowplow-tracker/tracker.rb index 728b099..47cc904 100644 --- a/lib/snowplow-tracker/tracker.rb +++ b/lib/snowplow-tracker/tracker.rb @@ -292,7 +292,11 @@ def track_struct_event(category, action, label=nil, property=nil, value=nil, con # Contract String, Maybe[String], Maybe[Hash], Maybe[Num] => [Bool, Num] def track_screen_view(name, id=nil, context=nil, tstamp=nil) - self.track_unstruct_event('screen_view', {'name' => name, 'id' => id}, @@default_vendor, context, tstamp) + screen_view_properties = {'name' => name, 'id' => id} + screen_view_schema = "#{@@base_schema_path}/screen_view/#{@@schema_tag}/1-0-0" + event_json = {schema: screen_view_schema, data: screen_view_properties} + + self.track_unstruct_event(event_json, context, tstamp) end # Track an unstructured event From 7e6e0629c2c8c2cc06aa4a5c9e0e7b8a54cb37bb Mon Sep 17 00:00:00 2001 From: Elijah Tabb Date: Sun, 27 Jul 2014 15:53:13 -0500 Subject: [PATCH 08/10] Adjusting some tests to handle vschema arguments, and to allow for removed name and event_vendor arguments in track_unstruct event. Will require another commit for base64 test --- spec/integration/integration_spec.rb | 21 +++++++++------------ 1 file changed, 9 insertions(+), 12 deletions(-) diff --git a/spec/integration/integration_spec.rb b/spec/integration/integration_spec.rb index ec96052..cf825fe 100644 --- a/spec/integration/integration_spec.rb +++ b/spec/integration/integration_spec.rb @@ -144,27 +144,26 @@ def get_last_querystring(n=1) param_hash = CGI.parse(t.get_last_querystring(1)) expected_fields = { - 'e' => 'se', - 'se_ca' => 'Ecomm', - 'se_ac' => 'add-to-basket', - 'se_pr' => 'hd', + 'e' => 'se', + 'se_ca' => 'Ecomm', + 'se_ac' => 'add-to-basket', + 'se_pr' => 'hd', 'se_va' => '13.99' } for pair in expected_fields expect(param_hash[pair[0]][0]).to eq(pair[1]) - end + end end it 'tracks an unstructured event (no base64)' do t = SnowplowTracker::Tracker.new('localhost', nil, nil, nil, false) - t.track_unstruct_event('viewed_product', {'product_id' => 'ASO01043', 'price' => 49.95}, 'com.example') + t.track_unstruct_event({'event_name' => 'viewed_product', 'event_vendor' => 'com.example', 'product_id' => 'ASO01043', 'price' => 49.95}) param_hash = CGI.parse(t.get_last_querystring(1)) expected_fields = { 'e' => 'ue', - 'ue_pr' => "{\"schema\":\"iglu:com.snowplowanalytics.snowplow/unstruct_event/jsonschema/1-0-0\",\"data\":{\"product_id\":\"ASO01043\",\"price\":49.95}}", - 'evn' => 'com.example' + 'ue_pr' => "{\"schema\":\"iglu:com.snowplowanalytics.snowplow/unstruct_event/jsonschema/1-0-0\",\"data\":{\"event_name\":\"viewed_product\",\"event_vendor\":\"com.example\",\"product_id\":\"ASO01043\",\"price\":49.95}}", } for pair in expected_fields expect(param_hash[pair[0]][0]).to eq(pair[1]) @@ -174,13 +173,12 @@ def get_last_querystring(n=1) it 'tracks an unstructured event (base64)' do t = SnowplowTracker::Tracker.new('localhost') - t.track_unstruct_event('viewed_product', {'product_id' => 'ASO01043', 'price' => 49.95}, 'com.example') + t.track_unstruct_event('event_name' => 'viewed_product', 'event_vendor' => 'com.example', 'product_id' => 'ASO01043', 'price' => 49.95}) param_hash = CGI.parse(t.get_last_querystring(1)) expected_fields = { 'e' => 'ue', 'ue_px' => 'eyJzY2hlbWEiOiJpZ2x1OmNvbS5zbm93cGxvd2FuYWx5dGljcy5zbm93cGxvdy91bnN0cnVjdF9ldmVudC9qc29uc2NoZW1hLzEtMC0wIiwiZGF0YSI6eyJwcm9kdWN0X2lkIjoiQVNPMDEwNDMiLCJwcmljZSI6NDkuOTV9fQ==', - 'evn' => 'com.example' } for pair in expected_fields expect(param_hash[pair[0]][0]).to eq(pair[1]) @@ -195,8 +193,7 @@ def get_last_querystring(n=1) param_hash = CGI.parse(t.get_last_querystring(1)) expected_fields = { 'e' => 'ue', - 'ue_pr' => "{\"schema\":\"iglu:com.snowplowanalytics.snowplow/unstruct_event/jsonschema/1-0-0\",\"data\":{\"name\":\"Game HUD 2\",\"id\":\"e89a34b2f\"}}", - 'evn' => 'com.snowplowanalytics' + 'ue_pr' => "{\"schema\":\"iglu:com.snowplowanalytics.snowplow/unstruct_event/jsonschema/1-0-0\",\"data\":{\"schema\":\"iglu:com.snowplowanalytics.snowplow/screen_view/jsonschema/1-0-0\",\"data\":{\"name\":\"Game HUD 2\",\"id\":\"e89a34b2f\"}}}", } for pair in expected_fields expect(param_hash[pair[0]][0]).to eq(pair[1]) From 65c790d0b7e3e09eb63250580dc0349de8083100 Mon Sep 17 00:00:00 2001 From: Elijah Tabb Date: Sun, 27 Jul 2014 16:11:10 -0500 Subject: [PATCH 09/10] Adding in forgotten { --- spec/integration/integration_spec.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spec/integration/integration_spec.rb b/spec/integration/integration_spec.rb index cf825fe..e5a4b4b 100644 --- a/spec/integration/integration_spec.rb +++ b/spec/integration/integration_spec.rb @@ -173,7 +173,7 @@ def get_last_querystring(n=1) it 'tracks an unstructured event (base64)' do t = SnowplowTracker::Tracker.new('localhost') - t.track_unstruct_event('event_name' => 'viewed_product', 'event_vendor' => 'com.example', 'product_id' => 'ASO01043', 'price' => 49.95}) + t.track_unstruct_event({'event_name' => 'viewed_product', 'event_vendor' => 'com.example', 'product_id' => 'ASO01043', 'price' => 49.95}) param_hash = CGI.parse(t.get_last_querystring(1)) expected_fields = { From c5ef1c91ea4118a9314bff53773362701e659b92 Mon Sep 17 00:00:00 2001 From: Elijah Tabb Date: Sun, 27 Jul 2014 16:16:43 -0500 Subject: [PATCH 10/10] Adjusting base64 unstructured event test --- spec/integration/integration_spec.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spec/integration/integration_spec.rb b/spec/integration/integration_spec.rb index e5a4b4b..4a4d34b 100644 --- a/spec/integration/integration_spec.rb +++ b/spec/integration/integration_spec.rb @@ -178,7 +178,7 @@ def get_last_querystring(n=1) param_hash = CGI.parse(t.get_last_querystring(1)) expected_fields = { 'e' => 'ue', - 'ue_px' => 'eyJzY2hlbWEiOiJpZ2x1OmNvbS5zbm93cGxvd2FuYWx5dGljcy5zbm93cGxvdy91bnN0cnVjdF9ldmVudC9qc29uc2NoZW1hLzEtMC0wIiwiZGF0YSI6eyJwcm9kdWN0X2lkIjoiQVNPMDEwNDMiLCJwcmljZSI6NDkuOTV9fQ==', + 'ue_px' => 'eyJzY2hlbWEiOiJpZ2x1OmNvbS5zbm93cGxvd2FuYWx5dGljcy5zbm93cGxvdy91bnN0cnVjdF9ldmVudC9qc29uc2NoZW1hLzEtMC0wIiwiZGF0YSI6eyJldmVudF9uYW1lIjoidmlld2VkX3Byb2R1Y3QiLCJldmVudF92ZW5kb3IiOiJjb20uZXhhbXBsZSIsInByb2R1Y3RfaWQiOiJBU08wMTA0MyIsInByaWNlIjo0OS45NX19', } for pair in expected_fields expect(param_hash[pair[0]][0]).to eq(pair[1])