ga_events 4.0.1 → 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 +2 -2
- data/ga_events.gemspec +3 -3
- data/lib/ga_events/list.rb +1 -0
- data/lib/ga_events/middleware.rb +32 -22
- 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 +8 -7
- data/spec/spec_helper.rb +0 -1
- metadata +9 -15
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
data/ga_events.gemspec
CHANGED
@@ -20,12 +20,12 @@ Gem::Specification.new do |gem|
|
|
20
20
|
|
21
21
|
gem.files = `git ls-files`.split($OUTPUT_RECORD_SEPARATOR)
|
22
22
|
gem.executables = gem.files.grep(%r{^bin/}).map { |f| File.basename(f) }
|
23
|
-
gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
|
24
23
|
gem.name = 'ga_events'
|
25
24
|
gem.require_paths = ['lib']
|
26
25
|
gem.version = GaEvents::VERSION
|
27
26
|
gem.licenses = ['MIT']
|
28
27
|
|
29
|
-
gem.required_ruby_version = '>= 3.
|
30
|
-
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'
|
31
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,33 +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
|
-
def inject_div(response, serialized_data)
|
58
|
-
r = normalize_response(response)
|
59
|
-
serialized_data = CGI.escapeHTML(serialized_data)
|
60
|
-
[
|
61
|
-
r.sub('</body>') do |body|
|
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)
|
62
68
|
"<div data-ga-events=\"#{serialized_data}\"></div>#{body}"
|
63
69
|
end
|
64
|
-
|
70
|
+
body = [html]
|
71
|
+
end
|
72
|
+
body
|
73
|
+
ensure
|
74
|
+
body.close if body.respond_to?(:close)
|
65
75
|
end
|
66
76
|
|
67
77
|
# Taken from:
|
68
78
|
# https://github.com/rack/rack-contrib/blob/master/lib/rack/contrib/jsonp.rb
|
69
79
|
def html?(status, headers)
|
70
80
|
!Rack::Utils::STATUS_WITH_NO_ENTITY_BODY.include?(status.to_i) &&
|
71
|
-
headers.key?('
|
72
|
-
headers['
|
81
|
+
headers.key?('content-type') &&
|
82
|
+
headers['content-type'].start_with?('text/html')
|
73
83
|
end
|
74
84
|
|
75
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
@@ -38,12 +38,13 @@ describe GaEvents::Middleware do
|
|
38
38
|
'cool' => 'stuff',
|
39
39
|
'ding' => ["it's a bug", 'this is "fine"', 'x=1&y=2', '>:3<']
|
40
40
|
)
|
41
|
-
[200, { 'Content-Type' => 'text/html' }, response_body]
|
41
|
+
[200, { 'Content-Type' => 'text/html' }, [response_body]]
|
42
42
|
end
|
43
43
|
end
|
44
44
|
|
45
|
-
context 'when no body
|
45
|
+
context 'when no closing body tag exists' do
|
46
46
|
let(:response) { request.get('/') }
|
47
|
+
|
47
48
|
it 'leaves everything as it was' do
|
48
49
|
expect(response.body).to eq response_body
|
49
50
|
end
|
@@ -60,12 +61,12 @@ describe GaEvents::Middleware do
|
|
60
61
|
'"__event__":"test",' \
|
61
62
|
'"cool":"stuff",' \
|
62
63
|
'"ding":[' \
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
64
|
+
'"it's a bug",' \
|
65
|
+
'"this is \"fine\"",' \
|
66
|
+
'"x=1&y=2",' \
|
67
|
+
'">:3<"' \
|
67
68
|
']' \
|
68
|
-
|
69
|
+
'}]"></div></body>'
|
69
70
|
)
|
70
71
|
end
|
71
72
|
end
|
data/spec/spec_helper.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ga_events
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 4.0
|
4
|
+
version: 4.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Nix-wie-weg Team
|
8
|
-
autorequire:
|
9
8
|
bindir: bin
|
10
9
|
cert_chain: []
|
11
|
-
date:
|
10
|
+
date: 1980-01-02 00:00:00.000000000 Z
|
12
11
|
dependencies:
|
13
12
|
- !ruby/object:Gem::Dependency
|
14
13
|
name: rails
|
@@ -16,14 +15,14 @@ dependencies:
|
|
16
15
|
requirements:
|
17
16
|
- - ">="
|
18
17
|
- !ruby/object:Gem::Version
|
19
|
-
version: '
|
18
|
+
version: '7.2'
|
20
19
|
type: :runtime
|
21
20
|
prerelease: false
|
22
21
|
version_requirements: !ruby/object:Gem::Requirement
|
23
22
|
requirements:
|
24
23
|
- - ">="
|
25
24
|
- !ruby/object:Gem::Version
|
26
|
-
version: '
|
25
|
+
version: '7.2'
|
27
26
|
description: Google Analytics' Event Tracking everywhere in your Rails app)
|
28
27
|
email:
|
29
28
|
- admin@nix-wie-weg.de
|
@@ -54,8 +53,8 @@ files:
|
|
54
53
|
homepage: https://github.com/Nix-wie-weg/ga_events
|
55
54
|
licenses:
|
56
55
|
- MIT
|
57
|
-
metadata:
|
58
|
-
|
56
|
+
metadata:
|
57
|
+
rubygems_mfa_required: 'true'
|
59
58
|
rdoc_options: []
|
60
59
|
require_paths:
|
61
60
|
- lib
|
@@ -63,15 +62,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
63
62
|
requirements:
|
64
63
|
- - ">="
|
65
64
|
- !ruby/object:Gem::Version
|
66
|
-
version: '3.
|
65
|
+
version: '3.4'
|
67
66
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
68
67
|
requirements:
|
69
68
|
- - ">="
|
70
69
|
- !ruby/object:Gem::Version
|
71
70
|
version: '0'
|
72
71
|
requirements: []
|
73
|
-
rubygems_version: 3.
|
74
|
-
signing_key:
|
72
|
+
rubygems_version: 3.7.2
|
75
73
|
specification_version: 4
|
76
74
|
summary: This gem allows you to annotate events everywhere in the code of your Rails
|
77
75
|
app. A rack middleware is automatically inserted into the stack. It transports the
|
@@ -79,8 +77,4 @@ summary: This gem allows you to annotate events everywhere in the code of your R
|
|
79
77
|
a data-pounded custom HTTP header appended. The asset pipeline-ready CoffeeScript
|
80
78
|
extracts this data on the client side and pushes it to Google Analytics via ga.js
|
81
79
|
or Google Tag Manager.
|
82
|
-
test_files:
|
83
|
-
- spec/event_spec.rb
|
84
|
-
- spec/list_spec.rb
|
85
|
-
- spec/middleware_spec.rb
|
86
|
-
- spec/spec_helper.rb
|
80
|
+
test_files: []
|