rack-tracker 1.2.0 → 1.3.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 +4 -4
- data/CHANGELOG.md +4 -0
- data/README.md +6 -2
- data/lib/rack/tracker.rb +1 -6
- data/lib/rack/tracker/google_tag_manager/google_tag_manager.rb +18 -5
- data/lib/rack/tracker/google_tag_manager/template/google_tag_manager_body.erb +4 -0
- data/lib/rack/tracker/google_tag_manager/template/{google_tag_manager.erb → google_tag_manager_head.erb} +1 -4
- data/lib/rack/tracker/handler.rb +10 -0
- data/lib/rack/tracker/version.rb +1 -1
- data/spec/handler/google_tag_manager_spec.rb +2 -8
- data/spec/integration/google_tag_manager_integration_spec.rb +3 -2
- metadata +5 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 9a48bd3ebea8da26e68cf92e916f68f0dc7beabf
|
4
|
+
data.tar.gz: 70724503d65e0fae7e652de8c97e8c89d66e941e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a575794387624e7c5281940caf991b35b663885974313c38184613aaf2f12e4c6f06ae40d52af4f5175d90e7f2bd29865951cd8434cf8e9ff6d3d41c96d343b2
|
7
|
+
data.tar.gz: 03c9e701bc4e2167f218b986b436f9b1eb0e6e13f56257a5de2f4792e8a61165b32800dd2a568270c0c1fcd7b9844309ceb5eb17ef75f92209fa049095295987
|
data/CHANGELOG.md
CHANGED
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
|
-
|
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
|
-
|
10
|
-
|
11
|
-
|
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
|
18
|
-
Tilt.new( File.join( File.dirname(__FILE__), 'template', '
|
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)
|
@@ -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
|
-
'
|
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 %>
|
data/lib/rack/tracker/handler.rb
CHANGED
@@ -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
|
data/lib/rack/tracker/version.rb
CHANGED
@@ -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').
|
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] }}).
|
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("
|
15
|
-
expect(page.find("
|
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.
|
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-
|
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/
|
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.
|
242
|
+
rubygems_version: 2.5.1
|
242
243
|
signing_key:
|
243
244
|
specification_version: 4
|
244
245
|
summary: Tracking made easy
|