rack-tracker 0.0.2 → 0.0.3
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/README.md +23 -9
- data/lib/rack/tracker/facebook/facebook.rb +15 -13
- data/lib/rack/tracker/facebook/template/facebook.erb +5 -5
- data/lib/rack/tracker/handler.rb +1 -1
- data/lib/rack/tracker/version.rb +1 -1
- data/spec/handler/facebook_spec.rb +15 -5
- data/spec/integration/facebook_integration_spec.rb +24 -0
- data/spec/integration/rails_integration_spec.rb +11 -9
- data/spec/support/metal_controller.rb +7 -0
- metadata +26 -24
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f55df00d45fb101f47bca6a636ae7767a5fe4cfe
|
4
|
+
data.tar.gz: 32310d9a1103ac86809a3e374e7759de91a4c135
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f4b01ad9bbfb3cd1df9e499492beb78bd80bc90fd20217714b6879bfc45009936c73734e0ccd9a03b9c3f29d1af889193ebec944fd13eefdb561cc0e99fe63b7
|
7
|
+
data.tar.gz: 27df0ea951b32d8db3d1e95bd5fd5a309fdce2327169a3606c6cf812bac0fbf3495b537f3d4a5f5b8dfa6e75b7e12f12a2f532596f66f5b77985e97ceee7ba9d
|
data/README.md
CHANGED
@@ -22,9 +22,11 @@ Or install it yourself as:
|
|
22
22
|
|
23
23
|
Add it to your middleware stack
|
24
24
|
|
25
|
-
|
26
|
-
|
27
|
-
|
25
|
+
```ruby
|
26
|
+
config.middleware.use(Rack::Tracker) do
|
27
|
+
handler :google_analytics, { tracker: 'U-XXXXX-Y' }
|
28
|
+
end
|
29
|
+
````
|
28
30
|
|
29
31
|
This will add Google Analytics as a tracking handler. `Rack::Tracker` some with
|
30
32
|
support for Google Analytics and Facebook. Others might be added in the future
|
@@ -40,20 +42,32 @@ but you can easily write your own handlers.
|
|
40
42
|
* `:advertising` - Enables [Display Features](https://developers.google.com/analytics/devguides/collection/analyticsjs/display-features).
|
41
43
|
* `:ecommerce` - Enables [Ecommerce Tracking](https://developers.google.com/analytics/devguides/collection/analyticsjs/ecommerce).
|
42
44
|
|
43
|
-
|
45
|
+
#### Events
|
46
|
+
|
47
|
+
To issue [Events](https://developers.google.com/analytics/devguides/collection/analyticsjs/events) from the server side just call the `tracker` method in your controller.
|
44
48
|
|
45
|
-
|
49
|
+
```ruby
|
50
|
+
def show
|
51
|
+
tracker do
|
52
|
+
google_analytics category: 'button', action: 'click', label: 'nav-buttons', value: 'X'
|
53
|
+
end
|
54
|
+
end
|
55
|
+
```
|
56
|
+
|
57
|
+
The event will show up in the next rendered page. If the next page is a redirect, the event are kept in the session for later use.
|
58
|
+
|
59
|
+
### Facebook
|
46
60
|
|
61
|
+
* `custom_audience` - adds the [Custom audience](https://developers.facebook.com/docs/reference/ads-api/custom-audience-website-faq) segmentation pixel
|
47
62
|
|
48
|
-
|
63
|
+
#### Events
|
49
64
|
|
50
|
-
|
51
|
-
your controller and the tracking snippit will then populated with this data.
|
65
|
+
To track [Conversions](https://www.facebook.com/help/435189689870514) from the server side just call the `tracker` method in your controller.
|
52
66
|
|
53
67
|
```ruby
|
54
68
|
def show
|
55
69
|
tracker do
|
56
|
-
|
70
|
+
facebook '123456789', value: 1, currency: 'EUR'
|
57
71
|
end
|
58
72
|
end
|
59
73
|
```
|
@@ -1,22 +1,24 @@
|
|
1
1
|
class Rack::Tracker::Facebook < Rack::Tracker::Handler
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
# end
|
2
|
+
class Event < OpenStruct
|
3
|
+
attr_reader :id
|
4
|
+
def initialize(id, attributes = {})
|
5
|
+
@id = id
|
6
|
+
super(attributes)
|
7
|
+
end
|
9
8
|
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
# end
|
9
|
+
def write
|
10
|
+
['track', @id, to_h.compact].to_json
|
11
|
+
end
|
12
|
+
end
|
15
13
|
|
16
|
-
|
14
|
+
self.position = :body
|
17
15
|
|
18
16
|
def render
|
19
17
|
Tilt.new( File.join( File.dirname(__FILE__), 'template/facebook.erb') ).render(self)
|
20
18
|
end
|
21
19
|
|
20
|
+
def self.track(name, *event)
|
21
|
+
{ name.to_s => [Event.new(*event)] }
|
22
|
+
end
|
23
|
+
|
22
24
|
end
|
@@ -14,27 +14,27 @@
|
|
14
14
|
|
15
15
|
</script>
|
16
16
|
|
17
|
-
<% if options[:
|
17
|
+
<% if options[:custom_audience] %>
|
18
18
|
<script type="text/javascript">
|
19
|
-
window._fbq.push([
|
19
|
+
window._fbq.push(["addPixelId", "<%= options[:custom_audience] %>"]);
|
20
20
|
window._fbq.push(["track", "PixelInitialized", {}]);
|
21
21
|
</script>
|
22
22
|
|
23
23
|
<noscript>
|
24
|
-
<img height="1" width="1" alt="" style="display:none" src="https://www.facebook.com/tr?id=<%= options[:
|
24
|
+
<img height="1" width="1" alt="" style="display:none" src="https://www.facebook.com/tr?id=<%= options[:custom_audience] %>&ev=PixelInitialized">
|
25
25
|
</noscript>
|
26
26
|
<% end %>
|
27
27
|
|
28
28
|
<% if events.any? %>
|
29
29
|
<script type="text/javascript">
|
30
30
|
<% events.each do |event| %>
|
31
|
-
window._fbq.push(
|
31
|
+
window._fbq.push(<%= event.write %>);
|
32
32
|
<% end %>
|
33
33
|
</script>
|
34
34
|
|
35
35
|
<noscript>
|
36
36
|
<% events.each do |event| %>
|
37
|
-
<img height="1" width="1" alt="" style="display:none" src="https://www.facebook.com/offsite_event.php?id=<%= event
|
37
|
+
<img height="1" width="1" alt="" style="display:none" src="https://www.facebook.com/offsite_event.php?id=<%= event.id %>&value=<%= event.value %>&currency=<%= event.currency %>">
|
38
38
|
<% end %>
|
39
39
|
</noscript>
|
40
40
|
<% end %>
|
data/lib/rack/tracker/handler.rb
CHANGED
data/lib/rack/tracker/version.rb
CHANGED
@@ -1,4 +1,13 @@
|
|
1
1
|
RSpec.describe Rack::Tracker::Facebook do
|
2
|
+
describe Rack::Tracker::Facebook::Event do
|
3
|
+
|
4
|
+
subject { described_class.new('id', {foo: 'bar'}) }
|
5
|
+
|
6
|
+
describe '#write' do
|
7
|
+
specify { expect(subject.write).to eq(['track', 'id', {foo: 'bar'}].to_json) }
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
2
11
|
def env
|
3
12
|
{}
|
4
13
|
end
|
@@ -9,10 +18,10 @@ RSpec.describe Rack::Tracker::Facebook do
|
|
9
18
|
end
|
10
19
|
|
11
20
|
describe 'with custom audience id' do
|
12
|
-
subject { described_class.new(env,
|
21
|
+
subject { described_class.new(env, custom_audience: 'custom_audience_id').render }
|
13
22
|
|
14
23
|
it 'will push the tracking events to the queue' do
|
15
|
-
expect(subject).to match(%r{window._fbq.push\(\[
|
24
|
+
expect(subject).to match(%r{window._fbq.push\(\["addPixelId", "custom_audience_id"\]\)})
|
16
25
|
expect(subject).to match(%r{window._fbq.push\(\["track", "PixelInitialized", \{\}\]\)})
|
17
26
|
end
|
18
27
|
|
@@ -27,9 +36,10 @@ RSpec.describe Rack::Tracker::Facebook do
|
|
27
36
|
'tracker' => {
|
28
37
|
'facebook' =>
|
29
38
|
[
|
30
|
-
|
39
|
+
Rack::Tracker::Facebook::Event.new('123456789', {
|
31
40
|
'value' => '23',
|
32
|
-
'currency' => 'EUR'
|
41
|
+
'currency' => 'EUR'
|
42
|
+
})
|
33
43
|
]
|
34
44
|
}
|
35
45
|
}
|
@@ -37,7 +47,7 @@ RSpec.describe Rack::Tracker::Facebook do
|
|
37
47
|
subject { described_class.new(env).render }
|
38
48
|
|
39
49
|
it 'will push the tracking events to the queue' do
|
40
|
-
expect(subject).to match(%r{\[
|
50
|
+
expect(subject).to match(%r{\["track","123456789",\{"value":"23","currency":"EUR"\}\]})
|
41
51
|
end
|
42
52
|
|
43
53
|
it 'will add the noscript fallback' do
|
@@ -0,0 +1,24 @@
|
|
1
|
+
require 'support/metal_controller'
|
2
|
+
require 'support/fake_handler'
|
3
|
+
|
4
|
+
RSpec.describe "Facebook Integration" do
|
5
|
+
before do
|
6
|
+
Capybara.app = Rack::Builder.new do
|
7
|
+
use Rack::Tracker do
|
8
|
+
handler :facebook, { custom_audience: 'my-audience' }
|
9
|
+
end
|
10
|
+
run MetalController.action(:facebook)
|
11
|
+
end
|
12
|
+
|
13
|
+
visit '/'
|
14
|
+
end
|
15
|
+
|
16
|
+
subject { page }
|
17
|
+
|
18
|
+
it "embeds the script tag with tracking event from the controller action" do
|
19
|
+
expect(page).to have_content('window._fbq.push(["addPixelId", "my-audience"]);')
|
20
|
+
expect(page.body).to include('https://www.facebook.com/tr?id=my-audience&ev=PixelInitialized')
|
21
|
+
expect(page).to have_content('window._fbq.push(["track","conversion-event",{"value":"1","currency":"EUR"}]);')
|
22
|
+
expect(page.body).to include('https://www.facebook.com/offsite_event.php?id=conversion-event&value=1&currency=EUR')
|
23
|
+
end
|
24
|
+
end
|
@@ -1,17 +1,19 @@
|
|
1
1
|
require 'support/metal_controller'
|
2
2
|
require 'support/fake_handler'
|
3
3
|
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
end
|
4
|
+
RSpec.describe "Rails Integration" do
|
5
|
+
before do
|
6
|
+
Capybara.app = Rack::Builder.new do
|
7
|
+
use Rack::Tracker do
|
8
|
+
handler :track_all_the_things, { custom_key: 'SomeKey123' }
|
9
|
+
handler :another_handler, { custom_key: 'AnotherKey42' }
|
10
|
+
end
|
11
|
+
run MetalController.action(:index)
|
12
|
+
end
|
11
13
|
|
14
|
+
visit '/'
|
15
|
+
end
|
12
16
|
|
13
|
-
RSpec.describe "Rails Integration" do
|
14
|
-
before { visit '/' }
|
15
17
|
subject { page.html.gsub(/^\s*/, '') }
|
16
18
|
|
17
19
|
let(:expected_html) do
|
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: 0.0.
|
4
|
+
version: 0.0.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Lars Brillert
|
@@ -15,126 +15,126 @@ dependencies:
|
|
15
15
|
name: rack
|
16
16
|
requirement: !ruby/object:Gem::Requirement
|
17
17
|
requirements:
|
18
|
-
- -
|
18
|
+
- - ~>
|
19
19
|
- !ruby/object:Gem::Version
|
20
20
|
version: 1.5.2
|
21
21
|
type: :runtime
|
22
22
|
prerelease: false
|
23
23
|
version_requirements: !ruby/object:Gem::Requirement
|
24
24
|
requirements:
|
25
|
-
- -
|
25
|
+
- - ~>
|
26
26
|
- !ruby/object:Gem::Version
|
27
27
|
version: 1.5.2
|
28
28
|
- !ruby/object:Gem::Dependency
|
29
29
|
name: tilt
|
30
30
|
requirement: !ruby/object:Gem::Requirement
|
31
31
|
requirements:
|
32
|
-
- -
|
32
|
+
- - ~>
|
33
33
|
- !ruby/object:Gem::Version
|
34
34
|
version: 1.4.1
|
35
35
|
type: :runtime
|
36
36
|
prerelease: false
|
37
37
|
version_requirements: !ruby/object:Gem::Requirement
|
38
38
|
requirements:
|
39
|
-
- -
|
39
|
+
- - ~>
|
40
40
|
- !ruby/object:Gem::Version
|
41
41
|
version: 1.4.1
|
42
42
|
- !ruby/object:Gem::Dependency
|
43
43
|
name: activesupport
|
44
44
|
requirement: !ruby/object:Gem::Requirement
|
45
45
|
requirements:
|
46
|
-
- -
|
46
|
+
- - ~>
|
47
47
|
- !ruby/object:Gem::Version
|
48
48
|
version: 4.1.0
|
49
49
|
type: :runtime
|
50
50
|
prerelease: false
|
51
51
|
version_requirements: !ruby/object:Gem::Requirement
|
52
52
|
requirements:
|
53
|
-
- -
|
53
|
+
- - ~>
|
54
54
|
- !ruby/object:Gem::Version
|
55
55
|
version: 4.1.0
|
56
56
|
- !ruby/object:Gem::Dependency
|
57
57
|
name: bundler
|
58
58
|
requirement: !ruby/object:Gem::Requirement
|
59
59
|
requirements:
|
60
|
-
- -
|
60
|
+
- - ~>
|
61
61
|
- !ruby/object:Gem::Version
|
62
62
|
version: '1.5'
|
63
63
|
type: :development
|
64
64
|
prerelease: false
|
65
65
|
version_requirements: !ruby/object:Gem::Requirement
|
66
66
|
requirements:
|
67
|
-
- -
|
67
|
+
- - ~>
|
68
68
|
- !ruby/object:Gem::Version
|
69
69
|
version: '1.5'
|
70
70
|
- !ruby/object:Gem::Dependency
|
71
71
|
name: rake
|
72
72
|
requirement: !ruby/object:Gem::Requirement
|
73
73
|
requirements:
|
74
|
-
- -
|
74
|
+
- - '>='
|
75
75
|
- !ruby/object:Gem::Version
|
76
76
|
version: '0'
|
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
83
|
version: '0'
|
84
84
|
- !ruby/object:Gem::Dependency
|
85
85
|
name: rspec
|
86
86
|
requirement: !ruby/object:Gem::Requirement
|
87
87
|
requirements:
|
88
|
-
- -
|
88
|
+
- - ~>
|
89
89
|
- !ruby/object:Gem::Version
|
90
90
|
version: 3.0.0
|
91
91
|
type: :development
|
92
92
|
prerelease: false
|
93
93
|
version_requirements: !ruby/object:Gem::Requirement
|
94
94
|
requirements:
|
95
|
-
- -
|
95
|
+
- - ~>
|
96
96
|
- !ruby/object:Gem::Version
|
97
97
|
version: 3.0.0
|
98
98
|
- !ruby/object:Gem::Dependency
|
99
99
|
name: capybara
|
100
100
|
requirement: !ruby/object:Gem::Requirement
|
101
101
|
requirements:
|
102
|
-
- -
|
102
|
+
- - ~>
|
103
103
|
- !ruby/object:Gem::Version
|
104
104
|
version: 2.4.1
|
105
105
|
type: :development
|
106
106
|
prerelease: false
|
107
107
|
version_requirements: !ruby/object:Gem::Requirement
|
108
108
|
requirements:
|
109
|
-
- -
|
109
|
+
- - ~>
|
110
110
|
- !ruby/object:Gem::Version
|
111
111
|
version: 2.4.1
|
112
112
|
- !ruby/object:Gem::Dependency
|
113
113
|
name: actionpack
|
114
114
|
requirement: !ruby/object:Gem::Requirement
|
115
115
|
requirements:
|
116
|
-
- -
|
116
|
+
- - ~>
|
117
117
|
- !ruby/object:Gem::Version
|
118
118
|
version: 4.1.5
|
119
119
|
type: :development
|
120
120
|
prerelease: false
|
121
121
|
version_requirements: !ruby/object:Gem::Requirement
|
122
122
|
requirements:
|
123
|
-
- -
|
123
|
+
- - ~>
|
124
124
|
- !ruby/object:Gem::Version
|
125
125
|
version: 4.1.5
|
126
126
|
- !ruby/object:Gem::Dependency
|
127
127
|
name: pry
|
128
128
|
requirement: !ruby/object:Gem::Requirement
|
129
129
|
requirements:
|
130
|
-
- -
|
130
|
+
- - '>='
|
131
131
|
- !ruby/object:Gem::Version
|
132
132
|
version: '0'
|
133
133
|
type: :development
|
134
134
|
prerelease: false
|
135
135
|
version_requirements: !ruby/object:Gem::Requirement
|
136
136
|
requirements:
|
137
|
-
- -
|
137
|
+
- - '>='
|
138
138
|
- !ruby/object:Gem::Version
|
139
139
|
version: '0'
|
140
140
|
description: Don’t fool around with adding tracking partials to your app and concentrate
|
@@ -146,9 +146,9 @@ executables: []
|
|
146
146
|
extensions: []
|
147
147
|
extra_rdoc_files: []
|
148
148
|
files:
|
149
|
-
-
|
150
|
-
-
|
151
|
-
-
|
149
|
+
- .gitignore
|
150
|
+
- .rspec
|
151
|
+
- .travis.yml
|
152
152
|
- Gemfile
|
153
153
|
- LICENSE.txt
|
154
154
|
- README.md
|
@@ -172,6 +172,7 @@ files:
|
|
172
172
|
- spec/fixtures/views/metal/index.html.erb
|
173
173
|
- spec/handler/facebook_spec.rb
|
174
174
|
- spec/handler/google_analytics_spec.rb
|
175
|
+
- spec/integration/facebook_integration_spec.rb
|
175
176
|
- spec/integration/rails_integration_spec.rb
|
176
177
|
- spec/spec_helper.rb
|
177
178
|
- spec/support/fake_handler.rb
|
@@ -190,12 +191,12 @@ require_paths:
|
|
190
191
|
- lib
|
191
192
|
required_ruby_version: !ruby/object:Gem::Requirement
|
192
193
|
requirements:
|
193
|
-
- -
|
194
|
+
- - '>='
|
194
195
|
- !ruby/object:Gem::Version
|
195
196
|
version: '0'
|
196
197
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
197
198
|
requirements:
|
198
|
-
- -
|
199
|
+
- - '>='
|
199
200
|
- !ruby/object:Gem::Version
|
200
201
|
version: '0'
|
201
202
|
requirements: []
|
@@ -212,6 +213,7 @@ test_files:
|
|
212
213
|
- spec/fixtures/views/metal/index.html.erb
|
213
214
|
- spec/handler/facebook_spec.rb
|
214
215
|
- spec/handler/google_analytics_spec.rb
|
216
|
+
- spec/integration/facebook_integration_spec.rb
|
215
217
|
- spec/integration/rails_integration_spec.rb
|
216
218
|
- spec/spec_helper.rb
|
217
219
|
- spec/support/fake_handler.rb
|