rack-tracker 1.2.0 → 1.3.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
  SHA1:
3
- metadata.gz: f8b00e842917a8b4a5860ba6b66fc31d007330e4
4
- data.tar.gz: ddcef1305f6638771741e5b1dcb0a95093cf1d30
3
+ metadata.gz: 9a48bd3ebea8da26e68cf92e916f68f0dc7beabf
4
+ data.tar.gz: 70724503d65e0fae7e652de8c97e8c89d66e941e
5
5
  SHA512:
6
- metadata.gz: ec3e26414ba7877d46661e8f8eca1b2d80192d8f1eedd4d789f06dd5302937ea59f5ebf83a370bfc04d85ca890a242840c95187aaebf3f8b0d27a574494a292a
7
- data.tar.gz: 7b9c3a9e365ca61ae867e9a5cc971daad4706d10c96aebffcfb7d65f8de7aa2eaa3a6de95cfc51a39645564657a0e254ddcc13c1829cdbebe0ed13cb1112dea6
6
+ metadata.gz: a575794387624e7c5281940caf991b35b663885974313c38184613aaf2f12e4c6f06ae40d52af4f5175d90e7f2bd29865951cd8434cf8e9ff6d3d41c96d343b2
7
+ data.tar.gz: 03c9e701bc4e2167f218b986b436f9b1eb0e6e13f56257a5de2f4792e8a61165b32800dd2a568270c0c1fcd7b9844309ceb5eb17ef75f92209fa049095295987
data/CHANGELOG.md CHANGED
@@ -1,3 +1,7 @@
1
+ # 1.3.0
2
+
3
+ * Added handler multiposition support which fixes #80 and
4
+
1
5
  # 1.2.0
2
6
 
3
7
  * Added Facebook Pixel support #75
data/README.md CHANGED
@@ -502,6 +502,10 @@ def render
502
502
  end
503
503
  ```
504
504
 
505
+ > There might be cases where you need to modify the response at multiple places. To do so you
506
+ can overwrite the `#inject`-method in your handler. For an example please have a look at the
507
+ Google Tag Manager [implementation](https://github.com/railslove/rack-tracker/blob/master/lib/rack/tracker/google_tag_manager/google_tag_manager.rb#L9-L20).
508
+
505
509
  This will render the `template/my_handler.erb` and inject the result into the source. You
506
510
  can be creative about where the template is stored, but we tend to have them around
507
511
  our actual handler code.
@@ -551,8 +555,8 @@ Checkout the existing handlers in `lib/rack/tracker` for some inspiration. :)
551
555
 
552
556
  ## Please note
553
557
 
554
- Most tracking is done using some kind of Javascript and any tracking data is simply passed on.
555
- Using unvalidated user input in the tracking might result in [XSS issues](https://en.wikipedia.org/wiki/Cross-site_scripting). Do only use secure data.
558
+ Most tracking is done using some kind of Javascript and any tracking data is simply passed on.
559
+ Using unvalidated user input in the tracking might result in [XSS issues](https://en.wikipedia.org/wiki/Cross-site_scripting). Do only use secure data.
556
560
 
557
561
 
558
562
  ## Contributing
data/lib/rack/tracker.rb CHANGED
@@ -58,12 +58,7 @@ module Rack
58
58
 
59
59
  def inject(env, response)
60
60
  @handlers.each(env) do |handler|
61
- # Sub! is enough, in well formed html there's only one head or body tag.
62
- # Block syntax need to be used, otherwise backslashes in input will mess the output.
63
- # @see http://stackoverflow.com/a/4149087/518204 and https://github.com/railslove/rack-tracker/issues/50
64
- response.sub! %r{</#{handler.position}>} do |m|
65
- handler.render << m.to_s
66
- end
61
+ handler.inject(response)
67
62
  end
68
63
  response
69
64
  end
@@ -6,16 +6,29 @@ class Rack::Tracker::GoogleTagManager < Rack::Tracker::Handler
6
6
  end
7
7
  end
8
8
 
9
- # It is strongly recommended to put the google_tag_manager snippet only in the body tag
10
- # https://developers.google.com/tag-manager/quickstart
11
- self.position = :body
9
+ def inject(response)
10
+ # Sub! is enough, in well formed html there's only one head or body tag.
11
+ # Block syntax need to be used, otherwise backslashes in input will mess the output.
12
+ # @see http://stackoverflow.com/a/4149087/518204 and https://github.com/railslove/rack-tracker/issues/50
13
+ response.sub! %r{<head>} do |m|
14
+ m.to_s << self.render_head
15
+ end
16
+ response.sub! %r{<body>} do |m|
17
+ m.to_s << self.render_body
18
+ end
19
+ response
20
+ end
12
21
 
13
22
  def container
14
23
  options[:container].respond_to?(:call) ? options[:container].call(env) : options[:container]
15
24
  end
16
25
 
17
- def render
18
- Tilt.new( File.join( File.dirname(__FILE__), 'template', 'google_tag_manager.erb') ).render(self)
26
+ def render_head
27
+ Tilt.new( File.join( File.dirname(__FILE__), 'template', 'google_tag_manager_head.erb') ).render(self)
28
+ end
29
+
30
+ def render_body
31
+ Tilt.new( File.join( File.dirname(__FILE__), 'template', 'google_tag_manager_body.erb') ).render(self)
19
32
  end
20
33
 
21
34
  def self.track(name, *event)
@@ -0,0 +1,4 @@
1
+ <% if container %>
2
+ <noscript><iframe src="https://www.googletagmanager.com/ns.html?id=<%= container %>"
3
+ height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>
4
+ <% end %>
@@ -9,12 +9,9 @@ dataLayer.push(
9
9
  );
10
10
  </script>
11
11
 
12
- <noscript><iframe src="//www.googletagmanager.com/ns.html?id=<%= container %>"
13
- height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>
14
12
  <script>(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start':
15
13
  new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0],
16
14
  j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src=
17
- '//www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f);
15
+ 'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f);
18
16
  })(window,document,'script','dataLayer','<%= container %>');</script>
19
-
20
17
  <% end %>
@@ -23,6 +23,16 @@ class Rack::Tracker::Handler
23
23
  raise NotImplementedError.new('needs implementation')
24
24
  end
25
25
 
26
+ def inject(response)
27
+ # Sub! is enough, in well formed html there's only one head or body tag.
28
+ # Block syntax need to be used, otherwise backslashes in input will mess the output.
29
+ # @see http://stackoverflow.com/a/4149087/518204 and https://github.com/railslove/rack-tracker/issues/50
30
+ response.sub! %r{</#{self.position}>} do |m|
31
+ self.render << m.to_s
32
+ end
33
+ response
34
+ end
35
+
26
36
  def self.track(name, event)
27
37
  raise NotImplementedError.new("class method `#{__callee__}` is not implemented.")
28
38
  end
@@ -1,5 +1,5 @@
1
1
  module Rack
2
2
  class Tracker
3
- VERSION = '1.2.0'
3
+ VERSION = '1.3.0'
4
4
  end
5
5
  end
@@ -7,12 +7,6 @@ RSpec.describe Rack::Tracker::GoogleTagManager do
7
7
  }
8
8
  end
9
9
 
10
- it 'will be placed in the body by default' do
11
- expect(described_class.position).to eq(:body)
12
- expect(described_class.new(env).position).to eq(:body)
13
- expect(described_class.new(env, position: :head).position).to eq(:head)
14
- end
15
-
16
10
  describe "with events" do
17
11
  describe "default" do
18
12
  def env
@@ -23,7 +17,7 @@ RSpec.describe Rack::Tracker::GoogleTagManager do
23
17
  }}
24
18
  end
25
19
 
26
- subject { described_class.new(env, container: 'somebody').render }
20
+ subject { described_class.new(env, container: 'somebody').render_head }
27
21
  it "will show events" do
28
22
  expect(subject).to match(%r{"page":"Cart","price":50,"content_ids":\["sku_1","sku_2","sku_3"\]})
29
23
  end
@@ -31,7 +25,7 @@ RSpec.describe Rack::Tracker::GoogleTagManager do
31
25
  end
32
26
 
33
27
  describe "with dynamic tracker" do
34
- subject { described_class.new(env, { container: lambda { |env| return env[:misc] }}).render }
28
+ subject { described_class.new(env, { container: lambda { |env| return env[:misc] }}).render_head }
35
29
 
36
30
  it 'will call tracker lambdas to obtain tracking codes' do
37
31
  expect(subject).to match(%r{\(window,document,'script','dataLayer','foobar'\)})
@@ -11,8 +11,9 @@ RSpec.describe "Google Tag Manager Integration" do
11
11
  subject { page }
12
12
 
13
13
  it "embeds the script tag with tracking event from the controller action" do
14
- expect(page.find("body")).to have_content 'GTM-ABCDEF'
15
- expect(page.find("body")).to have_content "dataLayer.push( {\"click\":\"X\",\"price\":10}, {\"transactionProducts\":[{\"sku\":\"DD44\",\"name\":\"T-shirt\"},{\"sku\":\"DD66\",\"name\":\"Jeans\"}]} );"
14
+ expect(page.find("head")).to have_content 'GTM-ABCDEF'
15
+ expect(page.find("head")).to have_content "dataLayer.push( {\"click\":\"X\",\"price\":10}, {\"transactionProducts\":[{\"sku\":\"DD44\",\"name\":\"T-shirt\"},{\"sku\":\"DD66\",\"name\":\"Jeans\"}]} );"
16
+ expect(page.find("body")).to have_xpath '//body/noscript/iframe[@src="https://www.googletagmanager.com/ns.html?id=GTM-ABCDEF"]'
16
17
  end
17
18
 
18
19
  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.2.0
4
+ version: 1.3.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: 2017-06-02 00:00:00.000000000 Z
12
+ date: 2017-06-09 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rack
@@ -174,7 +174,8 @@ files:
174
174
  - lib/rack/tracker/google_analytics/google_analytics.rb
175
175
  - lib/rack/tracker/google_analytics/template/google_analytics.erb
176
176
  - lib/rack/tracker/google_tag_manager/google_tag_manager.rb
177
- - lib/rack/tracker/google_tag_manager/template/google_tag_manager.erb
177
+ - lib/rack/tracker/google_tag_manager/template/google_tag_manager_body.erb
178
+ - lib/rack/tracker/google_tag_manager/template/google_tag_manager_head.erb
178
179
  - lib/rack/tracker/handler.rb
179
180
  - lib/rack/tracker/handler_delegator.rb
180
181
  - lib/rack/tracker/javascript_helper.rb
@@ -238,7 +239,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
238
239
  version: '0'
239
240
  requirements: []
240
241
  rubyforge_project:
241
- rubygems_version: 2.4.8
242
+ rubygems_version: 2.5.1
242
243
  signing_key:
243
244
  specification_version: 4
244
245
  summary: Tracking made easy