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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 42c882f19b618a8ce401d37e6dd5baba8dcc2335
4
- data.tar.gz: b841bbdbac1fb8752bbddf6be2c526286a337c04
3
+ metadata.gz: f55df00d45fb101f47bca6a636ae7767a5fe4cfe
4
+ data.tar.gz: 32310d9a1103ac86809a3e374e7759de91a4c135
5
5
  SHA512:
6
- metadata.gz: ad51b4b1fd58c9dcc2f0985d8066fe13b58504cdf4cb6d1397285bb67ae729ea3fdffb119bcd41c2abec7924da3c8887a1668f03468b70b4f941bc8f7cb90e16
7
- data.tar.gz: bb7a62cde667581a270cc4036b1413ce15be8c1ad490569210060763c572713611d5bc9ecf1ca3b35640402e0c2eee39c1a6fba29d6d027702eefda7b0d5fdb6
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
- config.middleware.use(Rack::Tracker) do
26
- handler :google_analytics, { tracker: 'U-XXXXX-Y' }
27
- end
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
- ### Facebook
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
- * `custom_audience_id`
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
- ## Server side events
63
+ #### Events
49
64
 
50
- When using `rack-tracker` within a Rails application you can track events from
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
- google_analytics category: 'foo'
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
- self.position = :body
3
-
4
- # options do
5
- # locale 'de_DE'
6
- # app_id
7
- # custom_audience_id
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
- # event do
11
- # id
12
- # value
13
- # currency
14
- # end
9
+ def write
10
+ ['track', @id, to_h.compact].to_json
11
+ end
12
+ end
15
13
 
16
- # position :body
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[:custom_audience_id] %>
17
+ <% if options[:custom_audience] %>
18
18
  <script type="text/javascript">
19
- window._fbq.push(['addPixelId', '<%= options[:custom_audience_id] %>']);
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[:custom_audience_id] %>&amp;ev=PixelInitialized">
24
+ <img height="1" width="1" alt="" style="display:none" src="https://www.facebook.com/tr?id=<%= options[:custom_audience] %>&amp;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(['track', '<%= event["pixel_id"] %>', {'value': '<%= event["value"] %>', 'currency': '<%= event["currency"] %>'}]);
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["pixel_id"] %>&amp;value=<%= event["value"] %>&amp;currency=<%= event["currency"] %>">
37
+ <img height="1" width="1" alt="" style="display:none" src="https://www.facebook.com/offsite_event.php?id=<%= event.id %>&amp;value=<%= event.value %>&amp;currency=<%= event.currency %>">
38
38
  <% end %>
39
39
  </noscript>
40
40
  <% end %>
@@ -18,7 +18,7 @@ class Rack::Tracker::Handler
18
18
  raise NotImplementedError.new('needs implementation')
19
19
  end
20
20
 
21
- def self.track(name, event)
21
+ def self.track(name, event)
22
22
  raise NotImplementedError.new("class method `#{__callee__}` is not implemented.")
23
23
  end
24
24
  end
@@ -1,5 +1,5 @@
1
1
  module Rack
2
2
  class Tracker
3
- VERSION = "0.0.2"
3
+ VERSION = "0.0.3"
4
4
  end
5
5
  end
@@ -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, custom_audience_id: 'custom_audience_id').render }
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\(\['addPixelId', 'custom_audience_id'\]\)})
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
- {'pixel_id' => '123456789',
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{\['track', '123456789', \{'value': '23', 'currency': 'EUR'\}\]})
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&amp;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&amp;value=1&amp;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
- Capybara.app = Rack::Builder.new do
5
- use Rack::Tracker do
6
- handler :track_all_the_things, { custom_key: 'SomeKey123' }
7
- handler :another_handler, { custom_key: 'AnotherKey42' }
8
- end
9
- run MetalController.action(:index)
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
@@ -14,4 +14,11 @@ class MetalController < ActionController::Metal
14
14
  end
15
15
  render "metal/index"
16
16
  end
17
+
18
+ def facebook
19
+ tracker do
20
+ facebook 'conversion-event', { value: '1', currency: 'EUR' }
21
+ end
22
+ render "metal/index"
23
+ end
17
24
  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: 0.0.2
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
- - ".gitignore"
150
- - ".rspec"
151
- - ".travis.yml"
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