ahoy_matey 2.2.1 → 3.0.4
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/CHANGELOG.md +69 -42
- data/README.md +76 -39
- data/app/controllers/ahoy/base_controller.rb +5 -8
- data/lib/ahoy.rb +11 -4
- data/lib/ahoy/base_store.rb +4 -2
- data/lib/ahoy/controller.rb +8 -4
- data/lib/ahoy/database_store.rb +2 -2
- data/lib/ahoy/engine.rb +2 -0
- data/lib/ahoy/model.rb +2 -4
- data/lib/ahoy/tracker.rb +16 -13
- data/lib/ahoy/version.rb +1 -1
- data/lib/ahoy/visit_properties.rb +16 -11
- data/lib/generators/ahoy/activerecord_generator.rb +6 -23
- data/lib/generators/ahoy/base_generator.rb +1 -1
- data/lib/generators/ahoy/install_generator.rb +1 -1
- data/lib/generators/ahoy/mongoid_generator.rb +1 -5
- data/lib/generators/ahoy/templates/active_record_event_model.rb.tt +2 -2
- data/lib/generators/ahoy/templates/active_record_migration.rb.tt +5 -4
- data/lib/generators/ahoy/templates/active_record_visit_model.rb.tt +2 -2
- data/lib/generators/ahoy/templates/base_store_initializer.rb.tt +0 -6
- data/lib/generators/ahoy/templates/database_store_initializer.rb.tt +0 -6
- data/lib/generators/ahoy/templates/mongoid_event_model.rb.tt +1 -1
- data/lib/generators/ahoy/templates/mongoid_visit_model.rb.tt +1 -1
- data/vendor/assets/javascripts/ahoy.js +21 -112
- metadata +20 -62
@@ -2,112 +2,17 @@
|
|
2
2
|
* Ahoy.js
|
3
3
|
* Simple, powerful JavaScript analytics
|
4
4
|
* https://github.com/ankane/ahoy.js
|
5
|
-
* v0.3.
|
5
|
+
* v0.3.6
|
6
6
|
* MIT License
|
7
7
|
*/
|
8
8
|
|
9
9
|
(function (global, factory) {
|
10
10
|
typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
|
11
11
|
typeof define === 'function' && define.amd ? define(factory) :
|
12
|
-
(global.ahoy = factory());
|
12
|
+
(global = global || self, global.ahoy = factory());
|
13
13
|
}(this, (function () { 'use strict';
|
14
14
|
|
15
|
-
function
|
16
|
-
return value === undefined;
|
17
|
-
}
|
18
|
-
|
19
|
-
function isNull(value) {
|
20
|
-
return value === null;
|
21
|
-
}
|
22
|
-
|
23
|
-
function isObject(value) {
|
24
|
-
return value === Object(value);
|
25
|
-
}
|
26
|
-
|
27
|
-
function isArray(value) {
|
28
|
-
return Array.isArray(value);
|
29
|
-
}
|
30
|
-
|
31
|
-
function isDate(value) {
|
32
|
-
return value instanceof Date;
|
33
|
-
}
|
34
|
-
|
35
|
-
function isBlob(value) {
|
36
|
-
return (
|
37
|
-
value &&
|
38
|
-
typeof value.size === 'number' &&
|
39
|
-
typeof value.type === 'string' &&
|
40
|
-
typeof value.slice === 'function'
|
41
|
-
);
|
42
|
-
}
|
43
|
-
|
44
|
-
function isFile(value) {
|
45
|
-
return (
|
46
|
-
isBlob(value) &&
|
47
|
-
(typeof value.lastModifiedDate === 'object' ||
|
48
|
-
typeof value.lastModified === 'number') &&
|
49
|
-
typeof value.name === 'string'
|
50
|
-
);
|
51
|
-
}
|
52
|
-
|
53
|
-
function isFormData(value) {
|
54
|
-
return value instanceof FormData;
|
55
|
-
}
|
56
|
-
|
57
|
-
function objectToFormData(obj, cfg, fd, pre) {
|
58
|
-
if (isFormData(cfg)) {
|
59
|
-
pre = fd;
|
60
|
-
fd = cfg;
|
61
|
-
cfg = null;
|
62
|
-
}
|
63
|
-
|
64
|
-
cfg = cfg || {};
|
65
|
-
cfg.indices = isUndefined(cfg.indices) ? false : cfg.indices;
|
66
|
-
cfg.nulls = isUndefined(cfg.nulls) ? true : cfg.nulls;
|
67
|
-
fd = fd || new FormData();
|
68
|
-
|
69
|
-
if (isUndefined(obj)) {
|
70
|
-
return fd;
|
71
|
-
} else if (isNull(obj)) {
|
72
|
-
if (cfg.nulls) {
|
73
|
-
fd.append(pre, '');
|
74
|
-
}
|
75
|
-
} else if (isArray(obj)) {
|
76
|
-
if (!obj.length) {
|
77
|
-
var key = pre + '[]';
|
78
|
-
|
79
|
-
fd.append(key, '');
|
80
|
-
} else {
|
81
|
-
obj.forEach(function(value, index) {
|
82
|
-
var key = pre + '[' + (cfg.indices ? index : '') + ']';
|
83
|
-
|
84
|
-
objectToFormData(value, cfg, fd, key);
|
85
|
-
});
|
86
|
-
}
|
87
|
-
} else if (isDate(obj)) {
|
88
|
-
fd.append(pre, obj.toISOString());
|
89
|
-
} else if (isObject(obj) && !isFile(obj) && !isBlob(obj)) {
|
90
|
-
Object.keys(obj).forEach(function(prop) {
|
91
|
-
var value = obj[prop];
|
92
|
-
|
93
|
-
if (isArray(value)) {
|
94
|
-
while (prop.length > 2 && prop.lastIndexOf('[]') === prop.length - 2) {
|
95
|
-
prop = prop.substring(0, prop.length - 2);
|
96
|
-
}
|
97
|
-
}
|
98
|
-
|
99
|
-
var key = pre ? pre + '[' + prop + ']' : prop;
|
100
|
-
|
101
|
-
objectToFormData(value, cfg, fd, key);
|
102
|
-
});
|
103
|
-
} else {
|
104
|
-
fd.append(pre, obj);
|
105
|
-
}
|
106
|
-
|
107
|
-
return fd;
|
108
|
-
}
|
109
|
-
|
110
|
-
var objectToFormdata = objectToFormData;
|
15
|
+
var n=function(n){return void 0===n},e=function(n){return Array.isArray(n)},t=function(n){return n&&"number"==typeof n.size&&"string"==typeof n.type&&"function"==typeof n.slice},s=function(o,i,r,f){return (i=i||{}).indices=!n(i.indices)&&i.indices,i.nullsAsUndefineds=!n(i.nullsAsUndefineds)&&i.nullsAsUndefineds,i.booleansAsIntegers=!n(i.booleansAsIntegers)&&i.booleansAsIntegers,r=r||new FormData,n(o)?r:(null===o?i.nullsAsUndefineds||r.append(f,""):"boolean"!=typeof o?e(o)?o.length&&o.forEach(function(n,e){s(n,i,r,f+"["+(i.indices?e:"")+"]");}):o instanceof Date?r.append(f,o.toISOString()):o!==Object(o)||function(n){return t(n)&&"string"==typeof n.name&&("object"==typeof n.lastModifiedDate||"number"==typeof n.lastModified)}(o)||t(o)?r.append(f,o):Object.keys(o).forEach(function(n){var t=o[n];if(e(t)){ for(;n.length>2&&n.lastIndexOf("[]")===n.length-2;){ n=n.substring(0,n.length-2); } }s(t,i,r,f?f+"["+n+"]":n);}):r.append(f,i.booleansAsIntegers?o?1:0:o),r)};
|
111
16
|
|
112
17
|
// https://www.quirksmode.org/js/cookies.html
|
113
18
|
|
@@ -155,7 +60,9 @@
|
|
155
60
|
cookieDomain: null,
|
156
61
|
headers: {},
|
157
62
|
visitParams: {},
|
158
|
-
withCredentials: false
|
63
|
+
withCredentials: false,
|
64
|
+
visitDuration: 4 * 60, // default 4 hours
|
65
|
+
visitorDuration: 2 * 365 * 24 * 60 // default 2 years
|
159
66
|
};
|
160
67
|
|
161
68
|
var ahoy = window.ahoy || window.Ahoy || {};
|
@@ -173,8 +80,6 @@
|
|
173
80
|
|
174
81
|
var $ = window.jQuery || window.Zepto || window.$;
|
175
82
|
var visitId, visitorId, track;
|
176
|
-
var visitTtl = 4 * 60; // 4 hours
|
177
|
-
var visitorTtl = 2 * 365 * 24 * 60; // 2 years
|
178
83
|
var isReady = false;
|
179
84
|
var queue = [];
|
180
85
|
var canStringify = typeof(JSON) !== "undefined" && typeof(JSON.stringify) !== "undefined";
|
@@ -224,13 +129,13 @@
|
|
224
129
|
isReady = true;
|
225
130
|
}
|
226
131
|
|
227
|
-
function
|
132
|
+
ahoy.ready = function (callback) {
|
228
133
|
if (isReady) {
|
229
134
|
callback();
|
230
135
|
} else {
|
231
136
|
queue.push(callback);
|
232
137
|
}
|
233
|
-
}
|
138
|
+
};
|
234
139
|
|
235
140
|
function matchesSelector(element, selector) {
|
236
141
|
var matches = element.matches ||
|
@@ -258,7 +163,11 @@
|
|
258
163
|
|
259
164
|
// http://beeker.io/jquery-document-ready-equivalent-vanilla-javascript
|
260
165
|
function documentReady(callback) {
|
261
|
-
document.readyState === "interactive" || document.readyState === "complete"
|
166
|
+
if (document.readyState === "interactive" || document.readyState === "complete") {
|
167
|
+
setTimeout(callback, 0);
|
168
|
+
} else {
|
169
|
+
document.addEventListener("DOMContentLoaded", callback);
|
170
|
+
}
|
262
171
|
}
|
263
172
|
|
264
173
|
// https://stackoverflow.com/a/2117523/1177228
|
@@ -294,7 +203,7 @@
|
|
294
203
|
|
295
204
|
function sendRequest(url, data, success) {
|
296
205
|
if (canStringify) {
|
297
|
-
if ($) {
|
206
|
+
if ($ && $.ajax) {
|
298
207
|
$.ajax({
|
299
208
|
type: "POST",
|
300
209
|
url: url,
|
@@ -343,7 +252,7 @@
|
|
343
252
|
}
|
344
253
|
|
345
254
|
function trackEvent(event) {
|
346
|
-
ready( function () {
|
255
|
+
ahoy.ready( function () {
|
347
256
|
sendRequest(eventsUrl(), eventData(event), function() {
|
348
257
|
// remove from queue
|
349
258
|
for (var i = 0; i < eventQueue.length; i++) {
|
@@ -358,7 +267,7 @@
|
|
358
267
|
}
|
359
268
|
|
360
269
|
function trackEventNow(event) {
|
361
|
-
ready( function () {
|
270
|
+
ahoy.ready( function () {
|
362
271
|
var data = eventData(event);
|
363
272
|
var param = csrfParam();
|
364
273
|
var token = csrfToken();
|
@@ -366,7 +275,7 @@
|
|
366
275
|
// stringify so we keep the type
|
367
276
|
data.events_json = JSON.stringify(data.events);
|
368
277
|
delete data.events;
|
369
|
-
window.navigator.sendBeacon(eventsUrl(),
|
278
|
+
window.navigator.sendBeacon(eventsUrl(), s(data));
|
370
279
|
});
|
371
280
|
}
|
372
281
|
|
@@ -427,7 +336,7 @@
|
|
427
336
|
} else {
|
428
337
|
if (!visitId) {
|
429
338
|
visitId = generateId();
|
430
|
-
setCookie("ahoy_visit", visitId,
|
339
|
+
setCookie("ahoy_visit", visitId, config.visitDuration);
|
431
340
|
}
|
432
341
|
|
433
342
|
// make sure cookies are enabled
|
@@ -436,7 +345,7 @@
|
|
436
345
|
|
437
346
|
if (!visitorId) {
|
438
347
|
visitorId = generateId();
|
439
|
-
setCookie("ahoy_visitor", visitorId,
|
348
|
+
setCookie("ahoy_visitor", visitorId, config.visitorDuration);
|
440
349
|
}
|
441
350
|
|
442
351
|
var data = {
|
@@ -509,12 +418,12 @@
|
|
509
418
|
js: true
|
510
419
|
};
|
511
420
|
|
512
|
-
ready( function () {
|
421
|
+
ahoy.ready( function () {
|
513
422
|
if (config.cookies && !ahoy.getVisitId()) {
|
514
423
|
createVisit();
|
515
424
|
}
|
516
425
|
|
517
|
-
ready( function () {
|
426
|
+
ahoy.ready( function () {
|
518
427
|
log(event);
|
519
428
|
|
520
429
|
event.visit_token = ahoy.getVisitId();
|
metadata
CHANGED
@@ -1,43 +1,29 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ahoy_matey
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 3.0.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Andrew Kane
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2020-06-07 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
|
-
name:
|
14
|
+
name: activesupport
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
17
|
- - ">="
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: '
|
19
|
+
version: '5'
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - ">="
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: '
|
27
|
-
- !ruby/object:Gem::Dependency
|
28
|
-
name: addressable
|
29
|
-
requirement: !ruby/object:Gem::Requirement
|
30
|
-
requirements:
|
31
|
-
- - ">="
|
32
|
-
- !ruby/object:Gem::Version
|
33
|
-
version: '0'
|
34
|
-
type: :runtime
|
35
|
-
prerelease: false
|
36
|
-
version_requirements: !ruby/object:Gem::Requirement
|
37
|
-
requirements:
|
38
|
-
- - ">="
|
39
|
-
- !ruby/object:Gem::Version
|
40
|
-
version: '0'
|
26
|
+
version: '5'
|
41
27
|
- !ruby/object:Gem::Dependency
|
42
28
|
name: geocoder
|
43
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -53,35 +39,21 @@ dependencies:
|
|
53
39
|
- !ruby/object:Gem::Version
|
54
40
|
version: 1.4.5
|
55
41
|
- !ruby/object:Gem::Dependency
|
56
|
-
name:
|
57
|
-
requirement: !ruby/object:Gem::Requirement
|
58
|
-
requirements:
|
59
|
-
- - "~>"
|
60
|
-
- !ruby/object:Gem::Version
|
61
|
-
version: '2.0'
|
62
|
-
type: :runtime
|
63
|
-
prerelease: false
|
64
|
-
version_requirements: !ruby/object:Gem::Requirement
|
65
|
-
requirements:
|
66
|
-
- - "~>"
|
67
|
-
- !ruby/object:Gem::Version
|
68
|
-
version: '2.0'
|
69
|
-
- !ruby/object:Gem::Dependency
|
70
|
-
name: referer-parser
|
42
|
+
name: safely_block
|
71
43
|
requirement: !ruby/object:Gem::Requirement
|
72
44
|
requirements:
|
73
45
|
- - ">="
|
74
46
|
- !ruby/object:Gem::Version
|
75
|
-
version:
|
47
|
+
version: 0.2.1
|
76
48
|
type: :runtime
|
77
49
|
prerelease: false
|
78
50
|
version_requirements: !ruby/object:Gem::Requirement
|
79
51
|
requirements:
|
80
52
|
- - ">="
|
81
53
|
- !ruby/object:Gem::Version
|
82
|
-
version:
|
54
|
+
version: 0.2.1
|
83
55
|
- !ruby/object:Gem::Dependency
|
84
|
-
name:
|
56
|
+
name: device_detector
|
85
57
|
requirement: !ruby/object:Gem::Requirement
|
86
58
|
requirements:
|
87
59
|
- - ">="
|
@@ -95,13 +67,13 @@ dependencies:
|
|
95
67
|
- !ruby/object:Gem::Version
|
96
68
|
version: '0'
|
97
69
|
- !ruby/object:Gem::Dependency
|
98
|
-
name:
|
70
|
+
name: bundler
|
99
71
|
requirement: !ruby/object:Gem::Requirement
|
100
72
|
requirements:
|
101
73
|
- - ">="
|
102
74
|
- !ruby/object:Gem::Version
|
103
75
|
version: '0'
|
104
|
-
type: :
|
76
|
+
type: :development
|
105
77
|
prerelease: false
|
106
78
|
version_requirements: !ruby/object:Gem::Requirement
|
107
79
|
requirements:
|
@@ -109,27 +81,13 @@ dependencies:
|
|
109
81
|
- !ruby/object:Gem::Version
|
110
82
|
version: '0'
|
111
83
|
- !ruby/object:Gem::Dependency
|
112
|
-
name:
|
113
|
-
requirement: !ruby/object:Gem::Requirement
|
114
|
-
requirements:
|
115
|
-
- - ">="
|
116
|
-
- !ruby/object:Gem::Version
|
117
|
-
version: 0.2.1
|
118
|
-
type: :runtime
|
119
|
-
prerelease: false
|
120
|
-
version_requirements: !ruby/object:Gem::Requirement
|
121
|
-
requirements:
|
122
|
-
- - ">="
|
123
|
-
- !ruby/object:Gem::Version
|
124
|
-
version: 0.2.1
|
125
|
-
- !ruby/object:Gem::Dependency
|
126
|
-
name: device_detector
|
84
|
+
name: rake
|
127
85
|
requirement: !ruby/object:Gem::Requirement
|
128
86
|
requirements:
|
129
87
|
- - ">="
|
130
88
|
- !ruby/object:Gem::Version
|
131
89
|
version: '0'
|
132
|
-
type: :
|
90
|
+
type: :development
|
133
91
|
prerelease: false
|
134
92
|
version_requirements: !ruby/object:Gem::Requirement
|
135
93
|
requirements:
|
@@ -137,7 +95,7 @@ dependencies:
|
|
137
95
|
- !ruby/object:Gem::Version
|
138
96
|
version: '0'
|
139
97
|
- !ruby/object:Gem::Dependency
|
140
|
-
name:
|
98
|
+
name: minitest
|
141
99
|
requirement: !ruby/object:Gem::Requirement
|
142
100
|
requirements:
|
143
101
|
- - ">="
|
@@ -151,7 +109,7 @@ dependencies:
|
|
151
109
|
- !ruby/object:Gem::Version
|
152
110
|
version: '0'
|
153
111
|
- !ruby/object:Gem::Dependency
|
154
|
-
name:
|
112
|
+
name: combustion
|
155
113
|
requirement: !ruby/object:Gem::Requirement
|
156
114
|
requirements:
|
157
115
|
- - ">="
|
@@ -165,7 +123,7 @@ dependencies:
|
|
165
123
|
- !ruby/object:Gem::Version
|
166
124
|
version: '0'
|
167
125
|
- !ruby/object:Gem::Dependency
|
168
|
-
name:
|
126
|
+
name: rails
|
169
127
|
requirement: !ruby/object:Gem::Requirement
|
170
128
|
requirements:
|
171
129
|
- - ">="
|
@@ -179,7 +137,7 @@ dependencies:
|
|
179
137
|
- !ruby/object:Gem::Version
|
180
138
|
version: '0'
|
181
139
|
- !ruby/object:Gem::Dependency
|
182
|
-
name:
|
140
|
+
name: sqlite3
|
183
141
|
requirement: !ruby/object:Gem::Requirement
|
184
142
|
requirements:
|
185
143
|
- - ">="
|
@@ -288,15 +246,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
288
246
|
requirements:
|
289
247
|
- - ">="
|
290
248
|
- !ruby/object:Gem::Version
|
291
|
-
version: '2.
|
249
|
+
version: '2.4'
|
292
250
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
293
251
|
requirements:
|
294
252
|
- - ">="
|
295
253
|
- !ruby/object:Gem::Version
|
296
254
|
version: '0'
|
297
255
|
requirements: []
|
298
|
-
rubygems_version: 3.
|
256
|
+
rubygems_version: 3.1.2
|
299
257
|
signing_key:
|
300
258
|
specification_version: 4
|
301
|
-
summary: Simple, powerful analytics for Rails
|
259
|
+
summary: Simple, powerful, first-party analytics for Rails
|
302
260
|
test_files: []
|