rack-tracker 1.8.0 → 1.9.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: e9d098ca10113dc7340ab5e268dec40e8b0143a0d1284d1caaeac155510c1bd6
4
- data.tar.gz: c84e057fd1021e504ff749fd5a70e3a79ced5343d39720af987fb5b3783a38b3
3
+ metadata.gz: 36432546f568d8bd4224d5009397e5dbaa6481977b605c7faaa4248caa527a0c
4
+ data.tar.gz: 54aa497e17eda29100f863958db67dc9a8a68331f580719d2c425e4cf8325341
5
5
  SHA512:
6
- metadata.gz: 4a140e3e30f813d916adec3e6a6aed6919b53d72281d2880ae81ecc035d980c9c330fce2b0bd85497bb92e20172db0aa5bffa8edd0e9fd538f15380be66124aa
7
- data.tar.gz: 357e0828908134f96ed5370554b17d9ecdce43a098493471dc9a5807e1af7f186ce05bb7a5674ac2f36a0f6eddefdf93742be93f8682573266065bd368c087d6
6
+ metadata.gz: b1eb4c67eeddaae64d5f539d2d276fdb19e5bfded706e5e0156f68ab3edb4a1bcb159fdb959bba69f0480c7068397d7a2bb38f1e9476c6a98670199eacbccc0e
7
+ data.tar.gz: a927f10a586c038598836ed80528ee3ecc7d122dfb22d63b43a5c88dff06cb98b6472dd0eb7fea7affe2a8a89a1b1eed9802b5294e83efe150b92c0eca430e31
@@ -1,18 +1,13 @@
1
1
  language: ruby
2
2
  sudo: false
3
3
  rvm:
4
- - 2.1.10
5
- - 2.2.9
6
- - 2.3.6
7
- - 2.4.3
8
- - 2.5.0
4
+ - 2.3.8
5
+ - 2.4.5
6
+ - 2.5.3
7
+ - 2.6.1
9
8
  - jruby-9.1.10.0
10
9
  gemfile:
11
10
  - Gemfile
12
11
  - Gemfile.rails-3.2
13
12
  - Gemfile.rails-4.2
14
- - Gemfile.rails-5.1
15
- matrix:
16
- exclude:
17
- - rvm: 2.1.10
18
- gemfile: Gemfile.rails-5.1 # rails 5 needs ruby >= 2.2.2
13
+ - Gemfile.rails-5.2
@@ -1,3 +1,9 @@
1
+ # 1.9.0
2
+
3
+ * [ENHANCEMENT] Integration for Bing tracking #131 (thx @pcraston)
4
+ * [ENHANCEMENT] Possibility to integrate Google Optimize ID into the allowed tracker options #127 (thx @nachoabad)
5
+ * [ENHANCEMENT] Support for google global events #126 (thx @atd)
6
+
1
7
  # 1.8.0
2
8
 
3
9
  * [ENHANCEMENT] Google Global Site Tag: basic integration with support for pageviews to Google global tag #123 (thx @atd)
@@ -0,0 +1,6 @@
1
+ source "https://rubygems.org"
2
+
3
+ gemspec
4
+
5
+ gem 'activesupport', '~> 5.2.0'
6
+ gem 'actionpack', '~> 5.2.0'
data/README.md CHANGED
@@ -120,6 +120,7 @@ request.env['tracker'] = {
120
120
  * `:link_attribution` - Enables [Enhanced Link Attribution](https://developers.google.com/analytics/devguides/collection/gtagjs/enhanced-link-attribution).
121
121
  * `:allow_display_features` - Can be used to disable [Display Features](https://developers.google.com/analytics/devguides/collection/gtagjs/display-features).
122
122
  * `:custom_map` - Used to [Configure and send custom dimensions](https://developers.google.com/analytics/devguides/collection/gtagjs/custom-dims-mets)
123
+ * `:optimize_id` - Used to [Deploy Optimize using gtag](https://support.google.com/optimize/answer/7513085)
123
124
  * `:set` - Used in the [set command to configure multiple properties](https://developers.google.com/analytics/devguides/collection/gtagjs/setting-values)
124
125
 
125
126
  #### Trackers
@@ -575,6 +576,31 @@ config.middleware.use(Rack::Tracker) do
575
576
  end
576
577
  ```
577
578
 
579
+ ### Bing
580
+
581
+ [Bing](https://bingads.microsoft.com/)
582
+
583
+ To add the tracking snippet:
584
+
585
+ ```
586
+ config.middleware.use(Rack::Tracker) do
587
+ handler :bing, { tracker: '12345678' }
588
+ end
589
+ ```
590
+
591
+ To send conversion events:
592
+ ```
593
+ tracker do |t|
594
+ t.bing :conversion, {
595
+ type: 'event',
596
+ category: 'Users',
597
+ action: 'Login',
598
+ label: 'Standard',
599
+ value: 10
600
+ }
601
+ end
602
+ ```
603
+
578
604
 
579
605
  ### Custom Handlers
580
606
 
@@ -23,6 +23,7 @@ require "rack/tracker/go_squared/go_squared"
23
23
  require "rack/tracker/criteo/criteo"
24
24
  require "rack/tracker/zanox/zanox"
25
25
  require "rack/tracker/hotjar/hotjar"
26
+ require "rack/tracker/bing/bing"
26
27
 
27
28
  module Rack
28
29
  class Tracker
@@ -0,0 +1,12 @@
1
+ class Rack::Tracker::Bing < Rack::Tracker::Handler
2
+
3
+ class Conversion < OpenStruct
4
+ end
5
+
6
+ self.position = :body
7
+
8
+ def tracker
9
+ options[:tracker].respond_to?(:call) ? options[:tracker].call(env) : options[:tracker]
10
+ end
11
+
12
+ end
@@ -0,0 +1,22 @@
1
+ <% if events.any? %>
2
+ <script src="//bat.bing.com/bat.js" async=""></script>
3
+ <script>
4
+ window.uetq = window.uetq || [];
5
+ <% events.each do |event| %>
6
+ window.uetq.push({ 'ec': '<%= event.category %>', 'ea': '<%= event.action %>', 'el': '<%= event.label %>', 'ev': <%= event.value %> });
7
+ <% end %>
8
+ </script>
9
+ <% end %>
10
+
11
+
12
+ <script>(function (w, d, t, r, u) {
13
+ var f, n, i;
14
+ w[u] = w[u] || [], f = function () {
15
+ var o = {ti: "<%= tracker %>"};
16
+ o.q = w[u], w[u] = new UET(o), w[u].push("pageLoad")
17
+ }, n = d.createElement(t), n.src = r, n.async = 1, n.onload = n.onreadystatechange = function () {
18
+ var s = this.readyState;
19
+ s && s !== "loaded" && s !== "complete" || (f(), n.onload = n.onreadystatechange = null)
20
+ }, i = d.getElementsByTagName(t)[0], i.parentNode.insertBefore(n, i)
21
+ })(window, document, "script", "//bat.bing.com/bat.js", "uetq");
22
+ </script>
@@ -1,7 +1,7 @@
1
1
  class Rack::Tracker::GoogleGlobal < Rack::Tracker::Handler
2
2
  self.allowed_tracker_options = [:cookie_domain, :user_id,
3
3
  :link_attribution, :allow_display_features, :anonymize_ip,
4
- :custom_map]
4
+ :custom_map, :optimize_id]
5
5
 
6
6
  class Page < OpenStruct
7
7
  def params
@@ -9,8 +9,30 @@ class Rack::Tracker::GoogleGlobal < Rack::Tracker::Handler
9
9
  end
10
10
  end
11
11
 
12
+ class Event < OpenStruct
13
+ PREFIXED_PARAMS = %i[category label]
14
+ LITERAL_PARAMS = %i[value]
15
+ PARAMS = PREFIXED_PARAMS + LITERAL_PARAMS
16
+
17
+ def params
18
+ Hash[to_h.slice(*PARAMS).map { |key, value| [param_key(key), value] }]
19
+ end
20
+
21
+ private
22
+
23
+ def param_key(key)
24
+ PREFIXED_PARAMS.include?(key) ? "event_#{key}" : key.to_s
25
+ end
26
+ end
27
+
12
28
  def pages
13
- events # TODO: Filter pages after Event is implemented
29
+ select_handler_events(Page)
30
+ end
31
+
32
+ alias handler_events events
33
+
34
+ def events
35
+ select_handler_events(Event)
14
36
  end
15
37
 
16
38
  def trackers
@@ -29,4 +51,8 @@ class Rack::Tracker::GoogleGlobal < Rack::Tracker::Handler
29
51
  value = options[:set]
30
52
  value.respond_to?(:call) ? value.call(env) : value
31
53
  end
54
+
55
+ def select_handler_events(klass)
56
+ handler_events.select { |event| event.is_a?(klass) }
57
+ end
32
58
  end
@@ -15,5 +15,9 @@
15
15
  <% end %>
16
16
  gtag('config', '<%= tracker[:id] %>', <%= tracker_options.to_json %>);
17
17
  <% end %>
18
+
19
+ <% events.each do |event| %>
20
+ gtag('event', '<%= event.action %>', <%= event.params.to_json %>);
21
+ <% end %>
18
22
  </script>
19
23
  <% end %>
@@ -1,5 +1,5 @@
1
1
  module Rack
2
2
  class Tracker
3
- VERSION = '1.8.0'
3
+ VERSION = '1.9.0'
4
4
  end
5
5
  end
@@ -23,7 +23,7 @@ Gem::Specification.new do |spec|
23
23
  spec.add_dependency 'activesupport', '>= 3.0'
24
24
 
25
25
  spec.add_development_dependency 'actionpack', '>= 3.0'
26
- spec.add_development_dependency "bundler", "~> 1.5"
26
+ spec.add_development_dependency "bundler", ">= 1.16"
27
27
  spec.add_development_dependency "rake"
28
28
  spec.add_development_dependency "rspec", "~> 3.2"
29
29
  spec.add_development_dependency "capybara", "~> 2.4"
@@ -0,0 +1,53 @@
1
+ RSpec.describe Rack::Tracker::Bing do
2
+
3
+ it 'will be placed in the body' do
4
+ expect(described_class.position).to eq(:body)
5
+ end
6
+
7
+ describe "with events" do
8
+ subject { described_class.new(env, tracker: 'somebody').render }
9
+
10
+ describe "default" do
11
+ def env
12
+ {'tracker' => {
13
+ 'bing' => [
14
+ { 'class_name' => 'Conversion', 'category' => 'Users', 'action' => 'Login', 'label' => 'Standard', 'value' => 10 }
15
+ ]
16
+ }}
17
+ end
18
+
19
+ it "will show event initialiser" do
20
+ expect(subject).to include "window.uetq = window.uetq || [];"
21
+ end
22
+
23
+ it "will show events" do
24
+ expect(subject).to include "window.uetq.push({ 'ec': 'Users', 'ea': 'Login', 'el': 'Standard', 'ev': 10 });"
25
+ end
26
+ end
27
+ end
28
+
29
+ describe "with multiple events" do
30
+ subject { described_class.new(env, tracker: 'somebody').render }
31
+
32
+ describe "default" do
33
+ def env
34
+ {'tracker' => {
35
+ 'bing' => [
36
+ { 'class_name' => 'Conversion', 'category' => 'Users', 'action' => 'Login', 'label' => 'Standard', 'value' => 10 },
37
+ { 'class_name' => 'Conversion', 'category' => 'Users', 'action' => 'Logout', 'label' => 'Standard', 'value' => 5 }
38
+ ]
39
+ }}
40
+ end
41
+
42
+ it "will show event initialiser" do
43
+ expect(subject).to include "window.uetq = window.uetq || [];"
44
+ end
45
+
46
+ it "will show events" do
47
+ expect(subject).to include "window.uetq.push({ 'ec': 'Users', 'ea': 'Login', 'el': 'Standard', 'ev': 10 });"
48
+ expect(subject).to include "window.uetq.push({ 'ec': 'Users', 'ea': 'Logout', 'el': 'Standard', 'ev': 5 });"
49
+ end
50
+ end
51
+ end
52
+
53
+ end
@@ -184,4 +184,40 @@ RSpec.describe Rack::Tracker::GoogleGlobal do
184
184
  end
185
185
  end
186
186
  end
187
+
188
+ describe "with events" do
189
+ subject { described_class.new(env, trackers: [{ id: 'somebody' }]).render }
190
+
191
+ describe "default" do
192
+ def env
193
+ {'tracker' => {
194
+ 'google_global' => [
195
+ { 'class_name' => 'Event', 'action' => 'login' }
196
+ ]
197
+ }}
198
+ end
199
+
200
+ it "will show the event" do
201
+ expect(subject).to match(%r{gtag\('event', 'login', {}\);})
202
+ end
203
+ end
204
+
205
+ describe "with event parameters" do
206
+ def env
207
+ {'tracker' => {
208
+ 'google_global' => [
209
+ { 'class_name' => 'Event',
210
+ 'action' => 'login',
211
+ 'category' => 'engagement',
212
+ 'label' => 'Github',
213
+ 'value' => 5 }
214
+ ]
215
+ }}
216
+ end
217
+
218
+ it "will show event" do
219
+ expect(subject).to match(%r{gtag\('event', 'login', {\"event_category\":\"engagement\",\"event_label\":\"Github\",\"value\":5}\);})
220
+ end
221
+ end
222
+ end
187
223
  end
@@ -0,0 +1,17 @@
1
+ require 'support/capybara_app_helper'
2
+
3
+ RSpec.describe "Bing Integration" do
4
+ before do
5
+ setup_app(action: :bing) do |tracker|
6
+ tracker.handler :bing, { tracker: '12345678' }
7
+ end
8
+ visit '/'
9
+ end
10
+
11
+ subject { page }
12
+
13
+ it "embeds the script tag with tracker" do
14
+ expect(page.find("body")).to have_content('var o = {ti: "12345678"};')
15
+ end
16
+
17
+ end
@@ -116,4 +116,8 @@ class MetalController < ActionController::Metal
116
116
  def hotjar
117
117
  render "metal/index"
118
118
  end
119
+
120
+ def bing
121
+ render "metal/index"
122
+ end
119
123
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rack-tracker
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.8.0
4
+ version: 1.9.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Lars Brillert
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2019-01-31 00:00:00.000000000 Z
12
+ date: 2019-03-28 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rack
@@ -71,16 +71,16 @@ dependencies:
71
71
  name: bundler
72
72
  requirement: !ruby/object:Gem::Requirement
73
73
  requirements:
74
- - - "~>"
74
+ - - ">="
75
75
  - !ruby/object:Gem::Version
76
- version: '1.5'
76
+ version: '1.16'
77
77
  type: :development
78
78
  prerelease: false
79
79
  version_requirements: !ruby/object:Gem::Requirement
80
80
  requirements:
81
- - - "~>"
81
+ - - ">="
82
82
  - !ruby/object:Gem::Version
83
- version: '1.5'
83
+ version: '1.16'
84
84
  - !ruby/object:Gem::Dependency
85
85
  name: rake
86
86
  requirement: !ruby/object:Gem::Requirement
@@ -153,11 +153,13 @@ files:
153
153
  - Gemfile
154
154
  - Gemfile.rails-3.2
155
155
  - Gemfile.rails-4.2
156
- - Gemfile.rails-5.1
156
+ - Gemfile.rails-5.2
157
157
  - LICENSE.txt
158
158
  - README.md
159
159
  - Rakefile
160
160
  - lib/rack/tracker.rb
161
+ - lib/rack/tracker/bing/bing.rb
162
+ - lib/rack/tracker/bing/template/bing.erb
161
163
  - lib/rack/tracker/controller.rb
162
164
  - lib/rack/tracker/criteo/criteo.rb
163
165
  - lib/rack/tracker/criteo/template/criteo.erb
@@ -197,6 +199,7 @@ files:
197
199
  - spec/fixtures/views/layouts/application.html.erb
198
200
  - spec/fixtures/views/metal/index.html.erb
199
201
  - spec/fixtures/views/metal/turing.html.erb
202
+ - spec/handler/bing_spec.rb
200
203
  - spec/handler/criteo_spec.rb
201
204
  - spec/handler/facebook_pixel_spec.rb
202
205
  - spec/handler/facebook_spec.rb
@@ -209,6 +212,7 @@ files:
209
212
  - spec/handler/hotjar_spec.rb
210
213
  - spec/handler/vwo_spec.rb
211
214
  - spec/handler/zanox_spec.rb
215
+ - spec/integration/bing_integration_spec.rb
212
216
  - spec/integration/criteo_integration_spec.rb
213
217
  - spec/integration/facebook_integration_spec.rb
214
218
  - spec/integration/facebook_pixel_integration_spec.rb
@@ -249,8 +253,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
249
253
  - !ruby/object:Gem::Version
250
254
  version: '0'
251
255
  requirements: []
252
- rubyforge_project:
253
- rubygems_version: 2.7.7
256
+ rubygems_version: 3.0.1
254
257
  signing_key:
255
258
  specification_version: 4
256
259
  summary: Tracking made easy
@@ -262,6 +265,7 @@ test_files:
262
265
  - spec/fixtures/views/layouts/application.html.erb
263
266
  - spec/fixtures/views/metal/index.html.erb
264
267
  - spec/fixtures/views/metal/turing.html.erb
268
+ - spec/handler/bing_spec.rb
265
269
  - spec/handler/criteo_spec.rb
266
270
  - spec/handler/facebook_pixel_spec.rb
267
271
  - spec/handler/facebook_spec.rb
@@ -274,6 +278,7 @@ test_files:
274
278
  - spec/handler/hotjar_spec.rb
275
279
  - spec/handler/vwo_spec.rb
276
280
  - spec/handler/zanox_spec.rb
281
+ - spec/integration/bing_integration_spec.rb
277
282
  - spec/integration/criteo_integration_spec.rb
278
283
  - spec/integration/facebook_integration_spec.rb
279
284
  - spec/integration/facebook_pixel_integration_spec.rb
@@ -1,6 +0,0 @@
1
- source "https://rubygems.org"
2
-
3
- gemspec
4
-
5
- gem 'activesupport', '~> 5.1.0'
6
- gem 'actionpack', '~> 5.1.0'