ga_events 4.0.0 → 4.1.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/.rubocop.yml +3 -1
- data/Gemfile +1 -2
- data/README.md +3 -3
- data/ga_events.gemspec +5 -6
- data/lib/ga_events/list.rb +1 -0
- data/lib/ga_events/middleware.rb +34 -19
- data/lib/ga_events/version.rb +1 -1
- data/spec/event_spec.rb +2 -0
- data/spec/list_spec.rb +4 -2
- data/spec/middleware_spec.rb +18 -4
- data/spec/spec_helper.rb +0 -1
- metadata +11 -19
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b93d2ffe7308a325730dc5c73faf0765807c9a3c83aea96d911199044e73cf89
|
4
|
+
data.tar.gz: 044d35f5bba0adf9613e5886065cef5eadd38fded5957879b13ff16beb0dfb89
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e3ae1007735e30a3217f69fbbb026883eebb1096bb390ed831d855e9324b8444d5460b68842df05e9e5e0ffa5072d0f4ea4b7b09a95d63de8093f74f0c8f2212
|
7
|
+
data.tar.gz: 68ea2765ce64928d0b64bfebed5a9fdee2feffd4be04d22a31e3f6d40cd63584c60a576e6dce89809723f82f7c1b36263fa56f2a3af8e646c489e6755479c15f
|
data/.rubocop.yml
CHANGED
data/Gemfile
CHANGED
data/README.md
CHANGED
@@ -13,8 +13,8 @@ pushes it to Google Analytics via gtag.js or Google Tag Manager.
|
|
13
13
|
|
14
14
|
## Dependencies
|
15
15
|
|
16
|
-
* Ruby >= 3.
|
17
|
-
* Rails
|
16
|
+
* Ruby >= 3.4
|
17
|
+
* Rails 7.2 onwards
|
18
18
|
* jQuery
|
19
19
|
|
20
20
|
## Installation
|
@@ -156,7 +156,7 @@ Yes please! Use pull requests.
|
|
156
156
|
|
157
157
|
### Credits
|
158
158
|
|
159
|
-
* [danielbayerlein](https://github.com/danielbayerlein) former core committer
|
159
|
+
* [danielbayerlein](https://github.com/danielbayerlein), [der-flo](https://github.com/der-flo), [svenwin](https://github.com/svenwin) former core committer
|
160
160
|
* [jhilden](https://github.com/jhilden) for ideas and bug reports
|
161
161
|
* [brain-geek](https://github.com/brain-geek) for bug fixes, specs, features
|
162
162
|
|
data/ga_events.gemspec
CHANGED
@@ -3,9 +3,8 @@
|
|
3
3
|
require File.expand_path('lib/ga_events/version', __dir__)
|
4
4
|
|
5
5
|
Gem::Specification.new do |gem|
|
6
|
-
gem.authors = ['
|
7
|
-
gem.email = ['
|
8
|
-
'sven.winkler@nix-wie-weg.de']
|
6
|
+
gem.authors = ['Nix-wie-weg Team']
|
7
|
+
gem.email = ['admin@nix-wie-weg.de']
|
9
8
|
gem.description =
|
10
9
|
"Google Analytics' Event Tracking everywhere in your Rails app)"
|
11
10
|
gem.summary = 'This gem allows you to annotate events everywhere in ' \
|
@@ -21,12 +20,12 @@ Gem::Specification.new do |gem|
|
|
21
20
|
|
22
21
|
gem.files = `git ls-files`.split($OUTPUT_RECORD_SEPARATOR)
|
23
22
|
gem.executables = gem.files.grep(%r{^bin/}).map { |f| File.basename(f) }
|
24
|
-
gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
|
25
23
|
gem.name = 'ga_events'
|
26
24
|
gem.require_paths = ['lib']
|
27
25
|
gem.version = GaEvents::VERSION
|
28
26
|
gem.licenses = ['MIT']
|
29
27
|
|
30
|
-
gem.required_ruby_version = '>= 3.
|
31
|
-
gem.add_dependency 'rails', '>=
|
28
|
+
gem.required_ruby_version = '>= 3.4'
|
29
|
+
gem.add_dependency 'rails', '>= 7.2'
|
30
|
+
gem.metadata['rubygems_mfa_required'] = 'true'
|
32
31
|
end
|
data/lib/ga_events/list.rb
CHANGED
data/lib/ga_events/middleware.rb
CHANGED
@@ -1,38 +1,49 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
require 'rack/utils'
|
4
|
+
require 'rack/request'
|
5
|
+
require 'rack/headers'
|
6
|
+
require 'cgi'
|
7
|
+
require 'rubygems'
|
4
8
|
|
5
9
|
module GaEvents
|
6
10
|
class Middleware
|
7
11
|
SESSION_GA_EVENTS_KEY = 'ga_events.events'
|
8
12
|
|
13
|
+
HEADERS_KLASS = if Gem::Version.new(Rack.release) < Gem::Version.new('3.0')
|
14
|
+
Rack::Utils::HeaderHash
|
15
|
+
else
|
16
|
+
Rack::Headers
|
17
|
+
end
|
18
|
+
private_constant :HEADERS_KLASS
|
19
|
+
|
9
20
|
def initialize(app)
|
10
21
|
@app = app
|
11
22
|
end
|
12
23
|
|
13
24
|
def call(env)
|
14
25
|
init_event_list(env)
|
15
|
-
status, headers,
|
26
|
+
status, headers, body = @app.call(env)
|
16
27
|
|
17
|
-
headers = Rack::Utils::HeaderHash.new(headers)
|
18
28
|
if GaEvents::List.present?
|
29
|
+
headers = HEADERS_KLASS.new.merge(headers)
|
19
30
|
request = Rack::Request.new(env)
|
20
31
|
|
21
32
|
# Can outgrow, headers might get too big
|
22
|
-
|
33
|
+
serialized_events = GaEvents::List.to_s
|
23
34
|
if xhr_or_turbolinks?(request)
|
24
35
|
# AJAX request
|
25
|
-
headers['x-ga-events'] = CGI.escapeURIComponent(
|
36
|
+
headers['x-ga-events'] = CGI.escapeURIComponent(serialized_events)
|
26
37
|
elsif redirect?(status)
|
27
38
|
# 30x/redirect? Then add event list to rack session to survive the
|
28
39
|
# redirect.
|
29
|
-
add_events_to_session(env,
|
40
|
+
add_events_to_session(env, serialized_events)
|
30
41
|
elsif html?(status, headers)
|
31
|
-
|
42
|
+
body = inject_div(body, serialized_events)
|
32
43
|
end
|
33
44
|
end
|
34
45
|
|
35
|
-
[status, headers,
|
46
|
+
[status, headers, body]
|
36
47
|
end
|
37
48
|
|
38
49
|
private
|
@@ -43,28 +54,32 @@ module GaEvents
|
|
43
54
|
end
|
44
55
|
|
45
56
|
def add_events_to_session env, serialized_data
|
46
|
-
if session = env
|
57
|
+
if session = env['rack.session']
|
47
58
|
session[SESSION_GA_EVENTS_KEY] = serialized_data
|
48
59
|
end
|
49
60
|
end
|
50
61
|
|
51
|
-
def
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
62
|
+
def inject_div(body, serialized_data)
|
63
|
+
if body.respond_to?(:to_ary)
|
64
|
+
html = +''
|
65
|
+
body.to_ary.each { |chunk| html << chunk }
|
66
|
+
html.sub!(%r{</body>}i) do |body|
|
67
|
+
serialized_data = CGI.escapeHTML(serialized_data)
|
68
|
+
"<div data-ga-events=\"#{serialized_data}\"></div>#{body}"
|
69
|
+
end
|
70
|
+
body = [html]
|
71
|
+
end
|
72
|
+
body
|
73
|
+
ensure
|
74
|
+
body.close if body.respond_to?(:close)
|
60
75
|
end
|
61
76
|
|
62
77
|
# Taken from:
|
63
78
|
# https://github.com/rack/rack-contrib/blob/master/lib/rack/contrib/jsonp.rb
|
64
79
|
def html?(status, headers)
|
65
80
|
!Rack::Utils::STATUS_WITH_NO_ENTITY_BODY.include?(status.to_i) &&
|
66
|
-
headers.key?('
|
67
|
-
headers['
|
81
|
+
headers.key?('content-type') &&
|
82
|
+
headers['content-type'].start_with?('text/html')
|
68
83
|
end
|
69
84
|
|
70
85
|
def redirect?(status)
|
data/lib/ga_events/version.rb
CHANGED
data/spec/event_spec.rb
CHANGED
data/spec/list_spec.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'spec_helper'
|
2
4
|
|
3
5
|
RSpec.describe 'GaEvents::List' do
|
@@ -22,7 +24,7 @@ RSpec.describe 'GaEvents::List' do
|
|
22
24
|
JSON
|
23
25
|
|
24
26
|
expect(
|
25
|
-
GaEvents::List.send(:data).to_h { [
|
27
|
+
GaEvents::List.send(:data).to_h { [it.event_name, it.event_params] }
|
26
28
|
).to eq({ 'clicked' => { 'a' => 'a' } })
|
27
29
|
end
|
28
30
|
|
@@ -34,7 +36,7 @@ RSpec.describe 'GaEvents::List' do
|
|
34
36
|
JSON
|
35
37
|
|
36
38
|
expect(
|
37
|
-
GaEvents::List.send(:data).to_h { [
|
39
|
+
GaEvents::List.send(:data).to_h { [it.event_name, it.event_params] }
|
38
40
|
).to be_empty
|
39
41
|
end
|
40
42
|
end
|
data/spec/middleware_spec.rb
CHANGED
@@ -33,13 +33,18 @@ describe GaEvents::Middleware do
|
|
33
33
|
context 'events present in GaEvents::List' do
|
34
34
|
let(:app) do
|
35
35
|
proc do |_|
|
36
|
-
GaEvents::Event.new(
|
37
|
-
|
36
|
+
GaEvents::Event.new(
|
37
|
+
'test',
|
38
|
+
'cool' => 'stuff',
|
39
|
+
'ding' => ["it's a bug", 'this is "fine"', 'x=1&y=2', '>:3<']
|
40
|
+
)
|
41
|
+
[200, { 'Content-Type' => 'text/html' }, [response_body]]
|
38
42
|
end
|
39
43
|
end
|
40
44
|
|
41
|
-
context 'when no body
|
45
|
+
context 'when no closing body tag exists' do
|
42
46
|
let(:response) { request.get('/') }
|
47
|
+
|
43
48
|
it 'leaves everything as it was' do
|
44
49
|
expect(response.body).to eq response_body
|
45
50
|
end
|
@@ -52,7 +57,16 @@ describe GaEvents::Middleware do
|
|
52
57
|
it 'injects data-ga-events' do
|
53
58
|
expect(response.body).to eq(
|
54
59
|
'something awesome!' \
|
55
|
-
|
60
|
+
'<div data-ga-events="[{' \
|
61
|
+
'"__event__":"test",' \
|
62
|
+
'"cool":"stuff",' \
|
63
|
+
'"ding":[' \
|
64
|
+
'"it's a bug",' \
|
65
|
+
'"this is \"fine\"",' \
|
66
|
+
'"x=1&y=2",' \
|
67
|
+
'">:3<"' \
|
68
|
+
']' \
|
69
|
+
'}]"></div></body>'
|
56
70
|
)
|
57
71
|
end
|
58
72
|
end
|
data/spec/spec_helper.rb
CHANGED
metadata
CHANGED
@@ -1,15 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ga_events
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 4.
|
4
|
+
version: 4.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
|
-
-
|
8
|
-
- Sven Winkler
|
9
|
-
autorequire:
|
7
|
+
- Nix-wie-weg Team
|
10
8
|
bindir: bin
|
11
9
|
cert_chain: []
|
12
|
-
date:
|
10
|
+
date: 1980-01-02 00:00:00.000000000 Z
|
13
11
|
dependencies:
|
14
12
|
- !ruby/object:Gem::Dependency
|
15
13
|
name: rails
|
@@ -17,18 +15,17 @@ dependencies:
|
|
17
15
|
requirements:
|
18
16
|
- - ">="
|
19
17
|
- !ruby/object:Gem::Version
|
20
|
-
version: '
|
18
|
+
version: '7.2'
|
21
19
|
type: :runtime
|
22
20
|
prerelease: false
|
23
21
|
version_requirements: !ruby/object:Gem::Requirement
|
24
22
|
requirements:
|
25
23
|
- - ">="
|
26
24
|
- !ruby/object:Gem::Version
|
27
|
-
version: '
|
25
|
+
version: '7.2'
|
28
26
|
description: Google Analytics' Event Tracking everywhere in your Rails app)
|
29
27
|
email:
|
30
|
-
-
|
31
|
-
- sven.winkler@nix-wie-weg.de
|
28
|
+
- admin@nix-wie-weg.de
|
32
29
|
executables: []
|
33
30
|
extensions: []
|
34
31
|
extra_rdoc_files: []
|
@@ -56,8 +53,8 @@ files:
|
|
56
53
|
homepage: https://github.com/Nix-wie-weg/ga_events
|
57
54
|
licenses:
|
58
55
|
- MIT
|
59
|
-
metadata:
|
60
|
-
|
56
|
+
metadata:
|
57
|
+
rubygems_mfa_required: 'true'
|
61
58
|
rdoc_options: []
|
62
59
|
require_paths:
|
63
60
|
- lib
|
@@ -65,15 +62,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
65
62
|
requirements:
|
66
63
|
- - ">="
|
67
64
|
- !ruby/object:Gem::Version
|
68
|
-
version: '3.
|
65
|
+
version: '3.4'
|
69
66
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
70
67
|
requirements:
|
71
68
|
- - ">="
|
72
69
|
- !ruby/object:Gem::Version
|
73
70
|
version: '0'
|
74
71
|
requirements: []
|
75
|
-
rubygems_version: 3.
|
76
|
-
signing_key:
|
72
|
+
rubygems_version: 3.7.2
|
77
73
|
specification_version: 4
|
78
74
|
summary: This gem allows you to annotate events everywhere in the code of your Rails
|
79
75
|
app. A rack middleware is automatically inserted into the stack. It transports the
|
@@ -81,8 +77,4 @@ summary: This gem allows you to annotate events everywhere in the code of your R
|
|
81
77
|
a data-pounded custom HTTP header appended. The asset pipeline-ready CoffeeScript
|
82
78
|
extracts this data on the client side and pushes it to Google Analytics via ga.js
|
83
79
|
or Google Tag Manager.
|
84
|
-
test_files:
|
85
|
-
- spec/event_spec.rb
|
86
|
-
- spec/list_spec.rb
|
87
|
-
- spec/middleware_spec.rb
|
88
|
-
- spec/spec_helper.rb
|
80
|
+
test_files: []
|