rack-tracker 0.0.2 → 0.0.3
Sign up to get free protection for your applications and to get access to all the features.
- 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
|