rack-tracker 1.8.0 → 1.9.0

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