staccato 0.3.0 → 0.3.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 77a4bb9be23d9d9cefe9806374d07466fe8720bb
4
- data.tar.gz: 5a8c255a6a421a29bbe66552db15e16e4d2c2400
3
+ metadata.gz: 1de9ca3518d24e4139fc2311de9ff15aa79d18a2
4
+ data.tar.gz: bccdd80d9c617e2303ce2290ceddcd06828d888d
5
5
  SHA512:
6
- metadata.gz: ca6efa1c2142f14c64ee0860bb9687d8b0fa4a8f4eb39ef3d068b031bc99ce90de0ee408c8365c355b6f8d9e6e1adcd0085e79f34a7445eb0694b55a1d4f6bdb
7
- data.tar.gz: 4a492e972ea4776380c7ed2f041323bdffacca2c02feefab612ab96952e148a18038640c9ae2fbfbbcae3916a81851973c52a25980cbccdaf28bec90c9aa8c88
6
+ metadata.gz: fde81fda9b06a81f5c45cea7ed60cfe51fd4942ff7f104227817e2424666654976ab6ad935efb27a114e5d2b6ae1840bc5cdde33bd451770a1e92cd15a5eba70
7
+ data.tar.gz: 58e26c6147b312c0a8ed846d39b36edd416d6a8a7f20c60f6a5eb048c8a8417fe21a387924145da2e9e5560e088920444838edefb005c2209ceb4e669e59e9ef
data/.ruby-version CHANGED
@@ -1 +1 @@
1
- 1.9.3
1
+ 2.2.2
data/.travis.yml CHANGED
@@ -1,8 +1,7 @@
1
1
  language: ruby
2
2
  rvm:
3
- - 1.9.2
4
3
  - 1.9.3
5
4
  - 2.0.0
6
- - 2.1.0
7
- - 2.2.0
5
+ - 2.1.6
6
+ - 2.2.2
8
7
  script: bundle exec rake
data/CHANGELOG.md CHANGED
@@ -1,3 +1,9 @@
1
+ ## Staccato 0.3.1 ##
2
+
3
+ * Add customer dimensions and metrics to Product and ProductImpression measurements
4
+
5
+ *Agustin Cavilliotti <@cavi21>*
6
+
1
7
  ## Staccato 0.3.0 ##
2
8
 
3
9
  * HTTP Adapters for HTTP, net/http, and Faraday
data/README.md CHANGED
@@ -431,7 +431,7 @@ You can also make your own Adapters by implementing any class that responds to `
431
431
  One such example might be for a new `net/http` adapter which accepts more options for configuring the connection:
432
432
 
433
433
  ```ruby
434
- class CustomerAdapter
434
+ class CustomAdapter
435
435
  attr_reader :uri
436
436
 
437
437
  def initialize(uri, options={})
data/lib/staccato/hit.rb CHANGED
@@ -135,11 +135,15 @@ module Staccato
135
135
  end
136
136
 
137
137
  # Add a measurement by its symbol name with options
138
- #
138
+ #
139
139
  # @param key [Symbol] any one of the measurable classes lookup key
140
- # @param options [Hash] options for the measurement
140
+ # @param options [Hash or Object] for the measurement
141
141
  def add_measurement(key, options = {})
142
- self.measurements << Measurement.lookup(key).new(options)
142
+ if options.is_a?(Hash)
143
+ self.measurements << Measurement.lookup(key).new(options)
144
+ else
145
+ self.measurements << options
146
+ end
143
147
  end
144
148
 
145
149
  # Measurements for this hit
@@ -28,9 +28,53 @@ module Staccato
28
28
  ''
29
29
  end
30
30
 
31
+ # not all measurements allow custom dimensions or metrics
32
+ def custom_fields_allowed?
33
+ false
34
+ end
35
+
31
36
  # collects the parameters from options for this measurement
32
37
  # @return [Hash]
33
38
  def params
39
+ {}.
40
+ merge!(measurable_params).
41
+ merge!(custom_dimensions).
42
+ merge!(custom_metrics).
43
+ reject {|_,v| v.nil?}
44
+ end
45
+
46
+ # Set a custom dimension value at an index
47
+ # @param dimension_index [Integer]
48
+ # @param value
49
+ def add_custom_dimension(dimension_index, value)
50
+ return unless custom_fields_allowed?
51
+ self.custom_dimensions["#{prefix}cd#{dimension_index}"] = value
52
+ end
53
+
54
+ # Custom dimensions for this measurable
55
+ # @return [Hash]
56
+ def custom_dimensions
57
+ @custom_dimensions ||= {}
58
+ end
59
+
60
+ # Set a custom metric value at an index
61
+ # @param metric_index [Integer]
62
+ # @param value
63
+ def add_custom_metric(metric_index, value)
64
+ return unless custom_fields_allowed?
65
+ self.custom_metrics["#{prefix}cm#{metric_index}"] = value
66
+ end
67
+
68
+ # Custom metrics for this measurable
69
+ # @return [Hash]
70
+ def custom_metrics
71
+ @custom_metrics ||= {}
72
+ end
73
+
74
+ private
75
+
76
+ # @private
77
+ def measurable_params
34
78
  Hash[
35
79
  fields.map { |field,key|
36
80
  next if key.nil?
@@ -14,6 +14,11 @@ module Staccato
14
14
  'pr'+index.to_s
15
15
  end
16
16
 
17
+ # product allow custom dimensions and metrics
18
+ def custom_fields_allowed?
19
+ true
20
+ end
21
+
17
22
  # Product measurement options fields
18
23
  FIELDS = {
19
24
  index: nil,
@@ -14,6 +14,11 @@ module Staccato
14
14
  'il' + list_index.to_s + 'pi' + index.to_s
15
15
  end
16
16
 
17
+ # product impression allow custom dimensions and metrics
18
+ def custom_fields_allowed?
19
+ true
20
+ end
21
+
17
22
  # Product impression measurement options fields
18
23
  FIELDS = {
19
24
  index: nil,
@@ -1,4 +1,4 @@
1
1
  module Staccato
2
2
  # The current Staccato VERSION
3
- VERSION = "0.3.0"
3
+ VERSION = "0.3.1"
4
4
  end
@@ -18,18 +18,18 @@ describe Staccato::Measurement::CheckoutOption do
18
18
  })
19
19
  }
20
20
 
21
- let(:measurment_options) {{
21
+ let(:measurement_options) {{
22
22
  step: 1,
23
23
  step_options: 'Visa'
24
24
  }}
25
25
 
26
26
  before(:each) do
27
- pageview.add_measurement(:checkout_option, measurment_options)
27
+ pageview.add_measurement(:checkout_option, measurement_options)
28
28
 
29
29
  pageview.track!
30
30
  end
31
31
 
32
- it 'tracks the measurment' do
32
+ it 'tracks the measurement' do
33
33
  expect(Net::HTTP).to have_received(:post_form).with(uri, {
34
34
  'v' => 1,
35
35
  'tid' => 'UA-XXXX-Y',
@@ -18,18 +18,18 @@ describe Staccato::Measurement::Checkout do
18
18
  })
19
19
  }
20
20
 
21
- let(:measurment_options) {{
21
+ let(:measurement_options) {{
22
22
  step: 1,
23
23
  step_options: 'Visa'
24
24
  }}
25
25
 
26
26
  before(:each) do
27
- pageview.add_measurement(:checkout, measurment_options)
27
+ pageview.add_measurement(:checkout, measurement_options)
28
28
 
29
29
  pageview.track!
30
30
  end
31
31
 
32
- it 'tracks the measurment' do
32
+ it 'tracks the measurement' do
33
33
  expect(Net::HTTP).to have_received(:post_form).with(uri, {
34
34
  'v' => 1,
35
35
  'tid' => 'UA-XXXX-Y',
@@ -5,40 +5,48 @@ describe Staccato::Measurement::ProductImpression do
5
5
  let(:tracker) {Staccato.tracker('UA-XXXX-Y')}
6
6
  let(:response) {stub(:body => '', :status => 201)}
7
7
 
8
+ let(:pageview) {
9
+ tracker.build_pageview({
10
+ path: '/home',
11
+ hostname: 'mystore.com',
12
+ title: 'Home Page'
13
+ })
14
+ }
15
+
16
+ let(:impression_list_options) {{
17
+ index: 1,
18
+ name: 'Search Results'
19
+ }}
20
+
21
+ let(:product_impression_options) {{
22
+ index: 1,
23
+ list_index: 1, # match the impression_list above
24
+ id: 'P12345',
25
+ name: 'T-Shirt',
26
+ category: 'Apparel',
27
+ brand: 'Your Brand',
28
+ variant: 'Purple',
29
+ position: 1,
30
+ price: 14.60
31
+ }}
32
+
33
+ let(:product_impression) { Staccato::Measurement::ProductImpression.new(product_impression_options) }
34
+
8
35
  before(:each) do
9
36
  SecureRandom.stubs(:uuid).returns('555')
10
37
  Net::HTTP.stubs(:post_form).returns(response)
11
38
  end
12
39
 
13
- context 'a pageview with a transaction' do
14
- let(:pageview) {
15
- tracker.build_pageview({
16
- path: '/home',
17
- hostname: 'mystore.com',
18
- title: 'Home Page'
19
- })
20
- }
21
-
22
- let(:measurment_options) {{
23
- index: 1,
24
- list_index: 1, # match the impression_list above
25
- id: 'P12345',
26
- name: 'T-Shirt',
27
- category: 'Apparel',
28
- brand: 'Your Brand',
29
- variant: 'Purple',
30
- position: 1,
31
- price: 14.60
32
- }}
40
+ context 'a pageview with an List Impression' do
33
41
 
34
42
  before(:each) do
35
- pageview.add_measurement(:impression_list, index: 1, name: 'Search Results')
36
- pageview.add_measurement(:product_impression, measurment_options)
43
+ pageview.add_measurement(:impression_list, impression_list_options)
44
+ pageview.add_measurement(:product_impression, product_impression_options)
37
45
 
38
46
  pageview.track!
39
47
  end
40
48
 
41
- it 'tracks the measurment' do
49
+ it 'tracks the measurement' do
42
50
  expect(Net::HTTP).to have_received(:post_form).with(uri, {
43
51
  'v' => 1,
44
52
  'tid' => 'UA-XXXX-Y',
@@ -58,4 +66,73 @@ describe Staccato::Measurement::ProductImpression do
58
66
  })
59
67
  end
60
68
  end
69
+
70
+ context 'with some custom dimensions' do
71
+
72
+ before(:each) do
73
+ pageview.add_measurement(:impression_list, impression_list_options)
74
+ product_impression.add_custom_dimension(1, 'Apple')
75
+ product_impression.add_custom_dimension(5, 'Samsung')
76
+ pageview.add_measurement(:product_impression, product_impression)
77
+
78
+ pageview.track!
79
+ end
80
+
81
+ it 'has custom dimensions data' do
82
+ expect(Net::HTTP).to have_received(:post_form).with(uri, {
83
+ 'v' => 1,
84
+ 'tid' => 'UA-XXXX-Y',
85
+ 'cid' => '555',
86
+ 't' => 'pageview',
87
+ 'dh' => 'mystore.com',
88
+ 'dp' => '/home',
89
+ 'dt' => 'Home Page',
90
+ 'il1nm' => 'Search Results',
91
+ 'il1pi1id' => 'P12345',
92
+ 'il1pi1nm' => 'T-Shirt',
93
+ 'il1pi1br' => 'Your Brand',
94
+ 'il1pi1ca' => 'Apparel',
95
+ 'il1pi1va' => 'Purple',
96
+ 'il1pi1pr' => 14.60,
97
+ 'il1pi1ps' => 1,
98
+ 'il1pi1cd1' => 'Apple',
99
+ 'il1pi1cd5' => 'Samsung'
100
+ })
101
+ end
102
+ end
103
+
104
+ context 'with some custom metrics' do
105
+
106
+ before(:each) do
107
+ pageview.add_measurement(:impression_list, impression_list_options)
108
+ product_impression.add_custom_metric(1, 43.20)
109
+ product_impression.add_custom_metric(3, 8)
110
+ pageview.add_measurement(:product_impression, product_impression)
111
+
112
+ pageview.track!
113
+ end
114
+
115
+ it 'has custom metric data' do
116
+ expect(Net::HTTP).to have_received(:post_form).with(uri, {
117
+ 'v' => 1,
118
+ 'tid' => 'UA-XXXX-Y',
119
+ 'cid' => '555',
120
+ 't' => 'pageview',
121
+ 'dh' => 'mystore.com',
122
+ 'dp' => '/home',
123
+ 'dt' => 'Home Page',
124
+ 'il1nm' => 'Search Results',
125
+ 'il1pi1id' => 'P12345',
126
+ 'il1pi1nm' => 'T-Shirt',
127
+ 'il1pi1br' => 'Your Brand',
128
+ 'il1pi1ca' => 'Apparel',
129
+ 'il1pi1va' => 'Purple',
130
+ 'il1pi1pr' => 14.60,
131
+ 'il1pi1ps' => 1,
132
+ 'il1pi1cm1' => 43.20,
133
+ 'il1pi1cm3' => 8
134
+ })
135
+ end
136
+ end
137
+
61
138
  end
@@ -5,42 +5,113 @@ describe Staccato::Measurement::Product do
5
5
  let(:tracker) {Staccato.tracker('UA-XXXX-Y')}
6
6
  let(:response) {stub(:body => '', :status => 201)}
7
7
 
8
+ let(:event) {
9
+ tracker.build_event({
10
+ category: 'search',
11
+ action: 'click',
12
+ label: 'results',
13
+ product_action: 'click',
14
+ product_action_list: 'Search Results'
15
+ })
16
+ }
17
+
18
+ let(:product_options) {{
19
+ index: 1,
20
+ id: 'P12345',
21
+ name: 'T-Shirt',
22
+ category: 'Apparel',
23
+ brand: 'Your Brand',
24
+ variant: 'Purple',
25
+ quantity: 2,
26
+ position: 1,
27
+ price: 14.60,
28
+ coupon_code: 'ILUVTEES'
29
+ }}
30
+
31
+ let(:product) { Staccato::Measurement::Product.new(product_options) }
32
+
8
33
  before(:each) do
9
34
  SecureRandom.stubs(:uuid).returns('555')
10
35
  Net::HTTP.stubs(:post_form).returns(response)
11
36
  end
12
37
 
13
- context 'a pageview with a transaction' do
14
- let(:event) {
15
- tracker.build_event({
16
- category: 'search',
17
- action: 'click',
18
- label: 'results',
19
- product_action: 'click',
20
- product_action_list: 'Search Results'
38
+ context 'a pageview with an event' do
39
+
40
+ before do
41
+ event.add_measurement(:product, product_options)
42
+ event.track!
43
+ end
44
+
45
+ it 'tracks the measurement' do
46
+ expect(Net::HTTP).to have_received(:post_form).with(uri, {
47
+ 'v' => 1,
48
+ 'tid' => 'UA-XXXX-Y',
49
+ 'cid' => '555',
50
+ 't' => 'event',
51
+ 'ec' => 'search',
52
+ 'ea' => 'click',
53
+ 'el' => 'results',
54
+ 'pa' => 'click',
55
+ 'pal' => 'Search Results',
56
+ 'pr1id' => 'P12345',
57
+ 'pr1nm' => 'T-Shirt',
58
+ 'pr1ca' => 'Apparel',
59
+ 'pr1br' => 'Your Brand',
60
+ 'pr1va' => 'Purple',
61
+ 'pr1qt' => 2,
62
+ 'pr1ps' => 1,
63
+ 'pr1pr' => 14.60,
64
+ 'pr1cc' => 'ILUVTEES'
21
65
  })
22
- }
66
+ end
23
67
 
24
- let(:measurment_options) {{
25
- index: 1,
26
- id: 'P12345',
27
- name: 'T-Shirt',
28
- category: 'Apparel',
29
- brand: 'Your Brand',
30
- variant: 'Purple',
31
- quantity: 2,
32
- position: 1,
33
- price: 14.60,
34
- coupon_code: 'ILUVTEES'
35
- }}
68
+ end
69
+
70
+ context "with some custom dimensions" do
36
71
 
37
72
  before(:each) do
38
- event.add_measurement(:product, measurment_options)
73
+ product.add_custom_dimension(1, 'Apple')
74
+ product.add_custom_dimension(5, 'Samsung')
75
+ event.add_measurement(:product, product)
76
+ event.track!
77
+ end
39
78
 
79
+ it 'has custom dimensions' do
80
+ expect(Net::HTTP).to have_received(:post_form).with(uri, {
81
+ 'v' => 1,
82
+ 'tid' => 'UA-XXXX-Y',
83
+ 'cid' => '555',
84
+ 't' => 'event',
85
+ 'ec' => 'search',
86
+ 'ea' => 'click',
87
+ 'el' => 'results',
88
+ 'pa' => 'click',
89
+ 'pal' => 'Search Results',
90
+ 'pr1id' => 'P12345',
91
+ 'pr1nm' => 'T-Shirt',
92
+ 'pr1ca' => 'Apparel',
93
+ 'pr1br' => 'Your Brand',
94
+ 'pr1va' => 'Purple',
95
+ 'pr1qt' => 2,
96
+ 'pr1ps' => 1,
97
+ 'pr1pr' => 14.60,
98
+ 'pr1cc' => 'ILUVTEES',
99
+ 'pr1cd1' => 'Apple',
100
+ 'pr1cd5' => 'Samsung'
101
+ })
102
+ end
103
+ end
104
+
105
+ context "with some custom metrics" do
106
+
107
+ before do
108
+ product.add_custom_metric(1, 78)
109
+ product.add_custom_metric(3, 30.40)
110
+ event.add_measurement(:product, product)
40
111
  event.track!
41
112
  end
42
113
 
43
- it 'tracks the measurment' do
114
+ it 'has custom metrics' do
44
115
  expect(Net::HTTP).to have_received(:post_form).with(uri, {
45
116
  'v' => 1,
46
117
  'tid' => 'UA-XXXX-Y',
@@ -59,7 +130,9 @@ describe Staccato::Measurement::Product do
59
130
  'pr1qt' => 2,
60
131
  'pr1ps' => 1,
61
132
  'pr1pr' => 14.60,
62
- 'pr1cc' => 'ILUVTEES'
133
+ 'pr1cc' => 'ILUVTEES',
134
+ 'pr1cm1' => 78,
135
+ 'pr1cm3' => 30.40
63
136
  })
64
137
  end
65
138
  end
@@ -18,7 +18,7 @@ describe Staccato::Measurement::Promotion do
18
18
  })
19
19
  }
20
20
 
21
- let(:measurment_options) {{
21
+ let(:measurement_options) {{
22
22
  index: 1,
23
23
  id: 'PROMO_1234',
24
24
  name: 'Summer Sale',
@@ -27,12 +27,12 @@ describe Staccato::Measurement::Promotion do
27
27
  }}
28
28
 
29
29
  before(:each) do
30
- pageview.add_measurement(:promotion, measurment_options)
30
+ pageview.add_measurement(:promotion, measurement_options)
31
31
 
32
32
  pageview.track!
33
33
  end
34
34
 
35
- it 'tracks the measurment' do
35
+ it 'tracks the measurement' do
36
36
  expect(Net::HTTP).to have_received(:post_form).with(uri, {
37
37
  'v' => 1,
38
38
  'tid' => 'UA-XXXX-Y',
@@ -18,7 +18,7 @@ describe Staccato::Measurement::Transaction do
18
18
  })
19
19
  }
20
20
 
21
- let(:measurment_options) {{
21
+ let(:measurement_options) {{
22
22
  transaction_id: 'T12345',
23
23
  affiliation: 'Your Store',
24
24
  revenue: 37.39,
@@ -29,12 +29,12 @@ describe Staccato::Measurement::Transaction do
29
29
  }}
30
30
 
31
31
  before(:each) do
32
- pageview.add_measurement(:transaction, measurment_options)
32
+ pageview.add_measurement(:transaction, measurement_options)
33
33
 
34
34
  pageview.track!
35
35
  end
36
36
 
37
- it 'tracks the measurment' do
37
+ it 'tracks the measurement' do
38
38
  expect(Net::HTTP).to have_received(:post_form).with(uri, {
39
39
  'v' => 1,
40
40
  'tid' => 'UA-XXXX-Y',
@@ -146,7 +146,7 @@ describe Staccato::Pageview do
146
146
  pageview.add_custom_metric(1, 11)
147
147
  end
148
148
 
149
- it 'has custom dimensions' do
149
+ it 'has custom metrics' do
150
150
  expect(pageview.params).to eq({
151
151
  'v' => 1,
152
152
  'tid' => 'UA-XXXX-Y',
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: staccato
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.0
4
+ version: 0.3.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Tony Pitale
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-04-15 00:00:00.000000000 Z
11
+ date: 2015-04-18 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -173,7 +173,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
173
173
  version: '0'
174
174
  requirements: []
175
175
  rubyforge_project:
176
- rubygems_version: 2.2.2
176
+ rubygems_version: 2.4.5
177
177
  signing_key:
178
178
  specification_version: 4
179
179
  summary: Ruby Google Analytics Measurement
@@ -194,4 +194,3 @@ test_files:
194
194
  - spec/lib/staccato/pageview_spec.rb
195
195
  - spec/lib/staccato/tracker_spec.rb
196
196
  - spec/spec_helper.rb
197
- has_rdoc: