rack-tracker 1.12.0 → 1.12.1

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: 96cc84b108179e10df6c41c10fb536597f8ba93ac7106d38bbfe9b8d36e6da6e
4
- data.tar.gz: dccdd57d1f3c8985ef500c45a6441b0821e7a1dc33dd232503bd1ca73d5ed1ef
3
+ metadata.gz: 0ba26127c80f03ca9e62148bcc7bed290e716f268ee5b0db44ab0e8f0bfda6b7
4
+ data.tar.gz: 53c75c93dc91a11a0d55e2b415ce3f4a4045ea5c36e0bf3f606f7b2174c0ec02
5
5
  SHA512:
6
- metadata.gz: 78b014112e736701afb694c07384cd368a37054c8d734a8b38d9bb9224a33d0b857e8596e486a9e06d8c0038a54e9917835e7e2ba64efc96ecb5f06a21bc7b30
7
- data.tar.gz: 9d81d707139e7393409c15a2e1f9fe7289394988bf1804613550bab4a114d3c393e175c512062bca1b3816b97ad3aa4c913614fd51a27cbc736a57bd8517aa96
6
+ metadata.gz: a50ac45ea4aed6309bdf29b910b2d86ef25a1b1543c1d322ee51932711cc929e9ce5acd068f2785ed9dbb124ac991cb238741f3d06c6c189075b684e11b30734
7
+ data.tar.gz: 36a514edc61a4d2b1357ac347610749fba442cf7f16da4457b20749ae3545327d7ea793e75d127ad84def56b00165ccbb4cbf79fa5e2982f1636b677926e47f2
@@ -1,3 +1,8 @@
1
+ # 1.12.1
2
+
3
+ * [ENHANCEMENT] Use local variables to prevent instance state #151 (thx @bumi)
4
+ * [ENHANCEMENT] Make middleware thread safe #150 (thx @kspe)
5
+
1
6
  # 1.12.0
2
7
 
3
8
  * [ENHANCEMENT] Add support for Heap #147 (thx @mohanzhang)
@@ -38,10 +38,14 @@ module Rack
38
38
  end
39
39
 
40
40
  def call(env)
41
- @status, @headers, @body = @app.call(env)
42
- return [@status, @headers, @body] unless html?
43
- response = Rack::Response.new([], @status, @headers)
41
+ dup._call(env)
42
+ end
43
+
44
+ def _call(env)
45
+ status, headers, body = @app.call(env)
46
+ return [status, headers, body] unless headers['Content-Type'] =~ /html/
44
47
 
48
+ response = Rack::Response.new([], status, headers)
45
49
  env[EVENT_TRACKING_KEY] ||= {}
46
50
 
47
51
  if session = env["rack.session"]
@@ -52,16 +56,14 @@ module Rack
52
56
  session[EVENT_TRACKING_KEY] = env[EVENT_TRACKING_KEY]
53
57
  end
54
58
 
55
- @body.each { |fragment| response.write inject(env, fragment) }
56
- @body.close if @body.respond_to?(:close)
59
+ body.each { |fragment| response.write inject(env, fragment) }
60
+ body.close if body.respond_to?(:close)
57
61
 
58
62
  response.finish
59
63
  end
60
64
 
61
65
  private
62
66
 
63
- def html?; @headers['Content-Type'] =~ /html/; end
64
-
65
67
  def inject(env, response)
66
68
  duplicated_response = response.dup
67
69
  @handlers.each(env) do |handler|
@@ -8,37 +8,37 @@
8
8
 
9
9
  ga('create', '<%= tracker %>', <%= tracker_options.to_json %>);
10
10
  }
11
- <% if options[:enhanced_link_attribution] %>
12
- ga('require', 'linkid', 'linkid.js');
13
- <% end %>
14
- <% if options[:advertising] %>
15
- ga('require', 'displayfeatures');
16
- <% end %>
17
- <% if options[:enhanced_ecommerce] %>
18
- ga('require', 'ec');
19
- <% end %>
20
- <% if options[:ecommerce] %>
21
- ga('require', 'ecommerce', 'ecommerce.js');
22
- <% end %>
23
- <% if options[:optimize] %>
24
- ga('require', '<%= options[:optimize] %>');
25
- <% end %>
26
- <% if options[:anonymize_ip] %>
27
- ga('set', 'anonymizeIp', true);
28
- <% end %>
29
- <% if options[:adjusted_bounce_rate_timeouts] %>
30
- <% options[:adjusted_bounce_rate_timeouts].each do |timeout| %>
31
- setTimeout(function() { ga('send', 'event', '<%= "#{timeout.to_s}_seconds" %>', 'read'); },<%= timeout*1000 %>);
11
+ <% if options[:enhanced_link_attribution] %>
12
+ ga('require', 'linkid', 'linkid.js');
13
+ <% end %>
14
+ <% if options[:advertising] %>
15
+ ga('require', 'displayfeatures');
16
+ <% end %>
17
+ <% if options[:enhanced_ecommerce] %>
18
+ ga('require', 'ec');
19
+ <% end %>
20
+ <% if options[:ecommerce] %>
21
+ ga('require', 'ecommerce', 'ecommerce.js');
22
+ <% end %>
23
+ <% if options[:optimize] %>
24
+ ga('require', '<%= options[:optimize] %>');
25
+ <% end %>
26
+ <% if options[:anonymize_ip] %>
27
+ ga('set', 'anonymizeIp', true);
28
+ <% end %>
29
+ <% if options[:adjusted_bounce_rate_timeouts] %>
30
+ <% options[:adjusted_bounce_rate_timeouts].each do |timeout| %>
31
+ setTimeout(function() { ga('send', 'event', '<%= "#{timeout.to_s}_seconds" %>', 'read'); },<%= timeout*1000 %>);
32
+ <% end %>
33
+ <% end %>
34
+ <% events.each do |var| %>
35
+ ga(<%= var.write() %>);
36
+ <% end %>
37
+ <% if options[:ecommerce] && ecommerce_events.any? %>
38
+ ga('ecommerce:send');
39
+ <% end %>
40
+ <% if tracker && options[:explicit_pageview] %>
41
+ ga('send', 'pageview', <%= pageview_url_script %>);
32
42
  <% end %>
33
- <% end %>
34
- <% end %>
35
- <% events.each do |var| %>
36
- ga(<%= var.write() %>);
37
- <% end %>
38
- <% if options[:ecommerce] && ecommerce_events.any? %>
39
- ga('ecommerce:send');
40
- <% end %>
41
- <% if tracker && options[:explicit_pageview] %>
42
- ga('send', 'pageview', <%= pageview_url_script %>);
43
43
  </script>
44
44
  <% end %>
@@ -35,9 +35,7 @@ class Rack::Tracker::GoogleGlobal < Rack::Tracker::Handler
35
35
  end
36
36
 
37
37
  def trackers
38
- options[:trackers].map { |tracker|
39
- tracker[:id].respond_to?(:call) ? tracker.merge(id: tracker[:id].call(env)) : tracker
40
- }.reject { |tracker| tracker[:id].nil? }
38
+ @_trackers ||= build_trackers
41
39
  end
42
40
 
43
41
  def set_options
@@ -46,6 +44,31 @@ class Rack::Tracker::GoogleGlobal < Rack::Tracker::Handler
46
44
 
47
45
  private
48
46
 
47
+ def build_trackers
48
+ options[:trackers].map(&method(:call_tracker)).reject(&method(:invalid_tracker?))
49
+ end
50
+
51
+ def call_tracker(tracker)
52
+ if tracker[:id].respond_to?(:call)
53
+ tracker.merge(id: tracker[:id].call(env))
54
+ else
55
+ tracker
56
+ end
57
+ end
58
+
59
+ def invalid_tracker?(tracker)
60
+ if tracker[:id].to_s.strip == ''
61
+ $stdout.puts <<~WARN
62
+ WARNING: One of the trackers specified for Rack::Tracker handler 'google_global' is empty.
63
+ Trackers: #{options[:trackers]}
64
+ WARN
65
+
66
+ true
67
+ else
68
+ false
69
+ end
70
+ end
71
+
49
72
  def build_set_options
50
73
  value = options[:set]
51
74
  value.respond_to?(:call) ? value.call(env) : value
@@ -1,4 +1,4 @@
1
- <% if trackers %>
1
+ <% if trackers.any? %>
2
2
  <script async src='https://www.googletagmanager.com/gtag/js?id=<%= trackers[0][:id] %>'></script>
3
3
  <script>
4
4
  window.dataLayer = window.dataLayer || [];
@@ -1,5 +1,5 @@
1
1
  module Rack
2
2
  class Tracker
3
- VERSION = '1.12.0'
3
+ VERSION = '1.12.1'
4
4
  end
5
5
  end
@@ -3,28 +3,39 @@ require 'support/capybara_app_helper'
3
3
  RSpec.describe "Google Global Integration Integration" do
4
4
  before do
5
5
  setup_app(action: :google_global) do |tracker|
6
- tracker.handler :google_global, trackers: [{ id: 'U-XXX-Y' }]
6
+ tracker.handler :google_global, tracker_options
7
7
  end
8
8
  visit '/'
9
9
  end
10
10
 
11
- subject { page }
11
+ let(:tracker_options) { { trackers: [{ id: 'U-XXX-Y' }] } }
12
12
 
13
13
  it "embeds the script tag with tracking event from the controller action" do
14
14
  expect(page.find("head")).to have_content('U-XXX-Y')
15
15
  end
16
16
 
17
17
  describe 'adjust tracker position via options' do
18
- before do
19
- setup_app(action: :google_global) do |tracker|
20
- tracker.handler :google_global, trackers: [{ id: 'U-XXX-Y' }], position: :body
21
- end
22
- visit '/'
23
- end
18
+ let(:tracker_options) { { trackers: [{ id: 'U-XXX-Y' }], position: :body } }
24
19
 
25
20
  it "will be placed in the specified tag" do
26
21
  expect(page.find("head")).to_not have_content('U-XXX-Y')
27
22
  expect(page.find("body")).to have_content('U-XXX-Y')
28
23
  end
29
24
  end
25
+
26
+ describe "handles empty tracker id" do
27
+ let(:tracker_options) { { trackers: [{ id: nil }, { id: "" }, { id: " " }] } }
28
+
29
+ it "does not inject scripts" do
30
+ expect(page.find("head")).to_not have_content("<script async src='https://www.googletagmanager.com/gtag/js?id=")
31
+ end
32
+ end
33
+
34
+ describe "callable tracker id" do
35
+ let(:tracker_options) { { trackers: [{ id: proc { "U-XXX-Y" } }] } }
36
+
37
+ it "is injected into head with id from proc" do
38
+ expect(page.find("head")).to have_content('U-XXX-Y')
39
+ end
40
+ end
30
41
  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.12.0
4
+ version: 1.12.1
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-11-14 00:00:00.000000000 Z
12
+ date: 2020-03-27 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rack