ahoy_matey 2.0.0 → 2.0.1

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: 47cc04adfac18b2f14547b376a3465f601d59307
4
- data.tar.gz: 6e1638296155ceab46f9d105e52d7422259ebc63
3
+ metadata.gz: 640c91af9741127b748f530d102751a73f71b4c9
4
+ data.tar.gz: b341bf79dc207745b63f7a419711d402f2fc8cc0
5
5
  SHA512:
6
- metadata.gz: 1f0a217bd790fff2b55e1e6395ea940079b2a457efc1328c61a054d6a3835f0d6fcb9c154eae7f3496f8a79559282cc3d9b1eefb2db4ce651d74d6c14dce536a
7
- data.tar.gz: 6789de07f914f49b05f72b4b5517935571368be2e43987421e170dd8da838d78a1fa48e1d878424a9800f53ea779b5dcd8b3523432977f7aec4a29e296941a41
6
+ metadata.gz: 9f154fb9aefbee54089fc9c6e269c26e7f09eb4229c211ccd073d9d8a25fb191c875155a687e358966ff20b9dc3c39bf00e1a6701eda787ed212a800e594408c
7
+ data.tar.gz: ddac0a216a109b50904be1a2553cfa48df607908dacb50a3329f88bf8a7025faaa86df4e067247390dac8c2dbccc2d520fcabe50e072fe4240111682ffb46b5e
@@ -1,3 +1,8 @@
1
+ ## 2.0.1
2
+
3
+ - Added `Ahoy.server_side_visits = :when_needed` to automatically create visits server-side when needed for events and `visitable`
4
+ - Better handling of visit duration and expiration in JavaScript
5
+
1
6
  ## 2.0.0
2
7
 
3
8
  - Removed dependency on jQuery
data/README.md CHANGED
@@ -79,10 +79,10 @@ skip_before_action :track_ahoy_visit
79
79
 
80
80
  This is typically useful for APIs.
81
81
 
82
- You can also defer visit tracking to JavaScript (Ahoy 1.0 behavior) with:
82
+ You can also defer visit tracking to JavaScript. This is useful for preventing bots (that aren’t detected by their user agent) and users with cookies disabled from creating a new visit on each request. `:when_needed` will create visits server-side when needed by events, and `false` will discard events without a visit.
83
83
 
84
84
  ```ruby
85
- Ahoy.server_side_visits = false
85
+ Ahoy.server_side_visits = :when_needed
86
86
  ```
87
87
 
88
88
  ### Events
@@ -131,19 +131,7 @@ See the [API spec](#api-spec).
131
131
 
132
132
  ### Associated Models
133
133
 
134
- Say we want to associate orders with visits. Ahoy can do this automatically.
135
-
136
- First, generate a migration and add a `visit_id` column (not needed for Mongoid).
137
-
138
- ```ruby
139
- class AddVisitIdToOrders < ActiveRecord::Migration[5.1]
140
- def change
141
- add_column :orders, :visit_id, :bigint
142
- end
143
- end
144
- ```
145
-
146
- Then, add `visitable` to the model.
134
+ Say we want to associate orders with visits. Just add `visitable` to the model.
147
135
 
148
136
  ```ruby
149
137
  class Order < ApplicationRecord
@@ -161,6 +149,16 @@ Order.joins(:visit).group("city").count
161
149
  Order.joins(:visit).group("device_type").count
162
150
  ```
163
151
 
152
+ Here’s what the migration to add the `visit_id` column should look like:
153
+
154
+ ```ruby
155
+ class AddVisitIdToOrders < ActiveRecord::Migration[5.1]
156
+ def change
157
+ add_column :orders, :visit_id, :bigint
158
+ end
159
+ end
160
+ ```
161
+
164
162
  Customize the column and class name with:
165
163
 
166
164
  ```ruby
@@ -205,7 +203,7 @@ or use a proc
205
203
  Ahoy.user_method = ->(controller) { controller.true_user }
206
204
  ```
207
205
 
208
- ### Doorkeeper
206
+ #### Doorkeeper
209
207
 
210
208
  To attach the user with [Doorkeeper](https://github.com/doorkeeper-gem/doorkeeper), be sure you have a `current_resource_owner` method in `ApplicationController`.
211
209
 
@@ -221,7 +219,7 @@ end
221
219
 
222
220
  ### Exclusions
223
221
 
224
- Bots are excluded from tracking by default. To enable, use:
222
+ Bots are excluded from tracking by default. To include them, use:
225
223
 
226
224
  ```ruby
227
225
  Ahoy.track_bots = true
@@ -474,6 +472,20 @@ Send a `POST` request to `/ahoy/events` with `Content-Type: application/json` an
474
472
  }
475
473
  ```
476
474
 
475
+ ## Webpacker
476
+
477
+ For Webpacker, use Yarn to install the JavaScript library:
478
+
479
+ ```sh
480
+ yarn add ahoy.js
481
+ ```
482
+
483
+ Then include it in your pack.
484
+
485
+ ```es6
486
+ import ahoy from "ahoy.js";
487
+ ```
488
+
477
489
  ## History
478
490
 
479
491
  View the [changelog](https://github.com/ankane/ahoy/blob/master/CHANGELOG.md)
@@ -5,11 +5,11 @@ module Ahoy
5
5
  skip_before_action(*filters, raise: false)
6
6
  skip_after_action(*filters, raise: false)
7
7
  skip_around_action(*filters, raise: false)
8
- before_action :verify_request_size
9
8
  else
10
9
  skip_action_callback *filters
11
- before_action :verify_request_size
12
10
  end
11
+ before_action :verify_request_size
12
+ before_action :renew_cookies
13
13
 
14
14
  if respond_to?(:protect_from_forgery)
15
15
  protect_from_forgery with: :null_session, if: -> { Ahoy.protect_from_forgery }
@@ -21,6 +21,13 @@ module Ahoy
21
21
  @ahoy ||= Ahoy::Tracker.new(controller: self, api: true)
22
22
  end
23
23
 
24
+ # set proper ttl if cookie generated from JavaScript
25
+ # approach is not perfect, as user must reload the page
26
+ # for new cookie settings to take effect
27
+ def renew_cookies
28
+ set_ahoy_cookies if params[:js] && !Ahoy.api_only
29
+ end
30
+
24
31
  def verify_request_size
25
32
  if request.content_length > Ahoy.max_content_length
26
33
  logger.info "[ahoy] Payload too large"
@@ -2,6 +2,7 @@ module Ahoy
2
2
  class VisitsController < BaseController
3
3
  def create
4
4
  ahoy.track_visit
5
+
5
6
  render json: {
6
7
  visit_token: ahoy.visit_token,
7
8
  visitor_token: ahoy.visitor_token,
@@ -7,7 +7,7 @@ module Ahoy
7
7
  begin
8
8
  Geocoder.search(ip).first
9
9
  rescue => e
10
- $stderr.puts e.message
10
+ Rails.logger.warn "[ahoy] Geocode error: #{e.class.name}: #{e.message}"
11
11
  nil
12
12
  end
13
13
 
@@ -27,6 +27,8 @@ Ahoy.api = true
27
27
  Ahoy.server_side_visits = false
28
28
  ```
29
29
 
30
+ You can also try the new `Ahoy.server_side_visits = :when_needed` to automatically create visits server-side when needed for events and `visitable`.
31
+
30
32
  If you use `visitable`, add `class_name` to each instance:
31
33
 
32
34
  ```ruby
@@ -39,6 +39,10 @@ module Ahoy
39
39
  Ahoy.token_generator.call
40
40
  end
41
41
 
42
+ def visit_or_create
43
+ visit
44
+ end
45
+
42
46
  protected
43
47
 
44
48
  def bot?
@@ -27,7 +27,7 @@ module Ahoy
27
27
 
28
28
  def track_ahoy_visit
29
29
  if ahoy.new_visit?
30
- ahoy.track_visit(defer: !Ahoy.server_side_visits)
30
+ ahoy.track_visit(defer: Ahoy.server_side_visits != true)
31
31
  end
32
32
  end
33
33
 
@@ -4,19 +4,21 @@ module Ahoy
4
4
  @visit = visit_model.create!(slice_data(visit_model, data))
5
5
  rescue => e
6
6
  raise e unless unique_exception?(e)
7
- @visit = nil
7
+ remove_instance_variable(:@visit)
8
8
  end
9
9
 
10
10
  def track_event(data)
11
- # if we don't have a visit, let's try to create one first
12
- ahoy.track_visit unless visit
13
-
14
- event = event_model.new(slice_data(event_model, data))
15
- event.visit = visit
16
- begin
17
- event.save!
18
- rescue => e
19
- raise e unless unique_exception?(e)
11
+ visit = visit_or_create
12
+ if visit
13
+ event = event_model.new(slice_data(event_model, data))
14
+ event.visit = visit
15
+ begin
16
+ event.save!
17
+ rescue => e
18
+ raise e unless unique_exception?(e)
19
+ end
20
+ else
21
+ Rails.logger.warn "[ahoy] Event excluded since visit not created: #{data[:visit_token]}"
20
22
  end
21
23
  end
22
24
 
@@ -28,7 +30,7 @@ module Ahoy
28
30
  elsif visit
29
31
  visit.update_attributes(data)
30
32
  else
31
- $stderr.puts "[ahoy] Visit for geocode not found: #{data[:visit_token]}"
33
+ Rails.logger.warn "[ahoy] Visit for geocode not found: #{data[:visit_token]}"
32
34
  end
33
35
  end
34
36
 
@@ -44,7 +46,16 @@ module Ahoy
44
46
  end
45
47
 
46
48
  def visit
47
- @visit ||= visit_model.where(visit_token: ahoy.visit_token).first if ahoy.visit_token
49
+ unless defined?(@visit)
50
+ @visit = visit_model.where(visit_token: ahoy.visit_token).first if ahoy.visit_token
51
+ end
52
+ @visit
53
+ end
54
+
55
+ # if we don't have a visit, let's try to create one first
56
+ def visit_or_create
57
+ ahoy.track_visit if !visit && Ahoy.server_side_visits
58
+ visit
48
59
  end
49
60
 
50
61
  protected
@@ -7,7 +7,7 @@ module Ahoy
7
7
  end
8
8
  class_eval %{
9
9
  def set_ahoy_visit
10
- self.#{name} ||= RequestStore.store[:ahoy].try(:visit)
10
+ self.#{name} ||= RequestStore.store[:ahoy].try(:visit_or_create)
11
11
  end
12
12
  }
13
13
  end
@@ -42,6 +42,8 @@ module Ahoy
42
42
  if defer
43
43
  set_cookie("ahoy_track", true, nil, false)
44
44
  else
45
+ delete_cookie("ahoy_track")
46
+
45
47
  data = {
46
48
  visit_token: visit_token,
47
49
  visitor_token: visitor_token,
@@ -91,6 +93,10 @@ module Ahoy
91
93
  @visit ||= @store.visit
92
94
  end
93
95
 
96
+ def visit_or_create
97
+ @visit ||= @store.visit_or_create
98
+ end
99
+
94
100
  def new_visit?
95
101
  !existing_visit_token
96
102
  end
@@ -130,13 +136,13 @@ module Ahoy
130
136
 
131
137
  def reset
132
138
  reset_visit
133
- request.cookie_jar.delete("ahoy_visitor")
139
+ delete_cookie("ahoy_visitor")
134
140
  end
135
141
 
136
142
  def reset_visit
137
- request.cookie_jar.delete("ahoy_visit")
138
- request.cookie_jar.delete("ahoy_events")
139
- request.cookie_jar.delete("ahoy_track")
143
+ delete_cookie("ahoy_visit")
144
+ delete_cookie("ahoy_events")
145
+ delete_cookie("ahoy_track")
140
146
  end
141
147
 
142
148
  protected
@@ -163,6 +169,10 @@ module Ahoy
163
169
  request.cookie_jar[name] = cookie
164
170
  end
165
171
 
172
+ def delete_cookie(name)
173
+ request.cookie_jar.delete(name)
174
+ end
175
+
166
176
  def trusted_time(time = nil)
167
177
  if !time || (api? && !(1.minute.ago..Time.now).cover?(time))
168
178
  Time.zone.now
@@ -1,3 +1,3 @@
1
1
  module Ahoy
2
- VERSION = "2.0.0"
2
+ VERSION = "2.0.1"
3
3
  end
@@ -1,76 +1,76 @@
1
1
  (function webpackUniversalModuleDefinition(root, factory) {
2
- if(typeof exports === 'object' && typeof module === 'object')
3
- module.exports = factory();
4
- else if(typeof define === 'function' && define.amd)
5
- define([], factory);
6
- else if(typeof exports === 'object')
7
- exports["ahoy"] = factory();
8
- else
9
- root["ahoy"] = factory();
2
+ if(typeof exports === 'object' && typeof module === 'object')
3
+ module.exports = factory();
4
+ else if(typeof define === 'function' && define.amd)
5
+ define([], factory);
6
+ else if(typeof exports === 'object')
7
+ exports["ahoy"] = factory();
8
+ else
9
+ root["ahoy"] = factory();
10
10
  })(typeof self !== 'undefined' ? self : this, function() {
11
11
  return /******/ (function(modules) { // webpackBootstrap
12
- /******/ // The module cache
13
- /******/ var installedModules = {};
12
+ /******/ // The module cache
13
+ /******/ var installedModules = {};
14
14
  /******/
15
- /******/ // The require function
16
- /******/ function __webpack_require__(moduleId) {
15
+ /******/ // The require function
16
+ /******/ function __webpack_require__(moduleId) {
17
17
  /******/
18
- /******/ // Check if module is in cache
19
- /******/ if(installedModules[moduleId]) {
20
- /******/ return installedModules[moduleId].exports;
21
- /******/ }
22
- /******/ // Create a new module (and put it into the cache)
23
- /******/ var module = installedModules[moduleId] = {
24
- /******/ i: moduleId,
25
- /******/ l: false,
26
- /******/ exports: {}
27
- /******/ };
18
+ /******/ // Check if module is in cache
19
+ /******/ if(installedModules[moduleId]) {
20
+ /******/ return installedModules[moduleId].exports;
21
+ /******/ }
22
+ /******/ // Create a new module (and put it into the cache)
23
+ /******/ var module = installedModules[moduleId] = {
24
+ /******/ i: moduleId,
25
+ /******/ l: false,
26
+ /******/ exports: {}
27
+ /******/ };
28
28
  /******/
29
- /******/ // Execute the module function
30
- /******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
29
+ /******/ // Execute the module function
30
+ /******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
31
31
  /******/
32
- /******/ // Flag the module as loaded
33
- /******/ module.l = true;
32
+ /******/ // Flag the module as loaded
33
+ /******/ module.l = true;
34
34
  /******/
35
- /******/ // Return the exports of the module
36
- /******/ return module.exports;
37
- /******/ }
35
+ /******/ // Return the exports of the module
36
+ /******/ return module.exports;
37
+ /******/ }
38
38
  /******/
39
39
  /******/
40
- /******/ // expose the modules object (__webpack_modules__)
41
- /******/ __webpack_require__.m = modules;
40
+ /******/ // expose the modules object (__webpack_modules__)
41
+ /******/ __webpack_require__.m = modules;
42
42
  /******/
43
- /******/ // expose the module cache
44
- /******/ __webpack_require__.c = installedModules;
43
+ /******/ // expose the module cache
44
+ /******/ __webpack_require__.c = installedModules;
45
45
  /******/
46
- /******/ // define getter function for harmony exports
47
- /******/ __webpack_require__.d = function(exports, name, getter) {
48
- /******/ if(!__webpack_require__.o(exports, name)) {
49
- /******/ Object.defineProperty(exports, name, {
50
- /******/ configurable: false,
51
- /******/ enumerable: true,
52
- /******/ get: getter
53
- /******/ });
54
- /******/ }
55
- /******/ };
46
+ /******/ // define getter function for harmony exports
47
+ /******/ __webpack_require__.d = function(exports, name, getter) {
48
+ /******/ if(!__webpack_require__.o(exports, name)) {
49
+ /******/ Object.defineProperty(exports, name, {
50
+ /******/ configurable: false,
51
+ /******/ enumerable: true,
52
+ /******/ get: getter
53
+ /******/ });
54
+ /******/ }
55
+ /******/ };
56
56
  /******/
57
- /******/ // getDefaultExport function for compatibility with non-harmony modules
58
- /******/ __webpack_require__.n = function(module) {
59
- /******/ var getter = module && module.__esModule ?
60
- /******/ function getDefault() { return module['default']; } :
61
- /******/ function getModuleExports() { return module; };
62
- /******/ __webpack_require__.d(getter, 'a', getter);
63
- /******/ return getter;
64
- /******/ };
57
+ /******/ // getDefaultExport function for compatibility with non-harmony modules
58
+ /******/ __webpack_require__.n = function(module) {
59
+ /******/ var getter = module && module.__esModule ?
60
+ /******/ function getDefault() { return module['default']; } :
61
+ /******/ function getModuleExports() { return module; };
62
+ /******/ __webpack_require__.d(getter, 'a', getter);
63
+ /******/ return getter;
64
+ /******/ };
65
65
  /******/
66
- /******/ // Object.prototype.hasOwnProperty.call
67
- /******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
66
+ /******/ // Object.prototype.hasOwnProperty.call
67
+ /******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
68
68
  /******/
69
- /******/ // __webpack_public_path__
70
- /******/ __webpack_require__.p = "";
69
+ /******/ // __webpack_public_path__
70
+ /******/ __webpack_require__.p = "";
71
71
  /******/
72
- /******/ // Load entry module and return exports
73
- /******/ return __webpack_require__(__webpack_require__.s = 0);
72
+ /******/ // Load entry module and return exports
73
+ /******/ return __webpack_require__(__webpack_require__.s = 0);
74
74
  /******/ })
75
75
  /************************************************************************/
76
76
  /******/ ([
@@ -88,8 +88,20 @@ var _objectToFormdata = __webpack_require__(1);
88
88
 
89
89
  var _objectToFormdata2 = _interopRequireDefault(_objectToFormdata);
90
90
 
91
+ var _cookies = __webpack_require__(2);
92
+
93
+ var _cookies2 = _interopRequireDefault(_cookies);
94
+
91
95
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
92
96
 
97
+ /*
98
+ * Ahoy.js
99
+ * Simple, powerful JavaScript analytics
100
+ * https://github.com/ankane/ahoy.js
101
+ * v0.3.0
102
+ * MIT License
103
+ */
104
+
93
105
  var config = {
94
106
  urlPrefix: "",
95
107
  visitsUrl: "/ahoy/visits",
@@ -99,13 +111,7 @@ var config = {
99
111
  platform: "Web",
100
112
  useBeacon: true,
101
113
  startOnReady: true
102
- }; /*
103
- * Ahoy.js
104
- * Simple, powerful JavaScript analytics
105
- * https://github.com/ankane/ahoy.js
106
- * v0.3.0
107
- * MIT License
108
- */
114
+ };
109
115
 
110
116
  var ahoy = window.ahoy || window.Ahoy || {};
111
117
 
@@ -145,41 +151,16 @@ function canTrackNow() {
145
151
 
146
152
  // cookies
147
153
 
148
- // http://www.quirksmode.org/js/cookies.html
149
154
  function setCookie(name, value, ttl) {
150
- var expires = "";
151
- var cookieDomain = "";
152
- if (ttl) {
153
- var date = new Date();
154
- date.setTime(date.getTime() + ttl * 60 * 1000);
155
- expires = "; expires=" + date.toGMTString();
156
- }
157
- var domain = config.cookieDomain || config.domain;
158
- if (domain) {
159
- cookieDomain = "; domain=" + domain;
160
- }
161
- document.cookie = name + "=" + escape(value) + expires + cookieDomain + "; path=/";
155
+ _cookies2.default.set(name, value, ttl, config.cookieDomain || config.domain);
162
156
  }
163
157
 
164
158
  function getCookie(name) {
165
- var i = void 0,
166
- c = void 0;
167
- var nameEQ = name + "=";
168
- var ca = document.cookie.split(';');
169
- for (i = 0; i < ca.length; i++) {
170
- c = ca[i];
171
- while (c.charAt(0) === ' ') {
172
- c = c.substring(1, c.length);
173
- }
174
- if (c.indexOf(nameEQ) === 0) {
175
- return unescape(c.substring(nameEQ.length, c.length));
176
- }
177
- }
178
- return null;
159
+ return _cookies2.default.get(name);
179
160
  }
180
161
 
181
162
  function destroyCookie(name) {
182
- setCookie(name, "", -1);
163
+ _cookies2.default.set(name, "", -1);
183
164
  }
184
165
 
185
166
  function log(message) {
@@ -376,10 +357,6 @@ function createVisit() {
376
357
  log("Active visit");
377
358
  setReady();
378
359
  } else {
379
- if (track) {
380
- destroyCookie("ahoy_track");
381
- }
382
-
383
360
  if (!visitId) {
384
361
  visitId = generateId();
385
362
  setCookie("ahoy_visit", visitId, visitTtl);
@@ -400,7 +377,8 @@ function createVisit() {
400
377
  platform: config.platform,
401
378
  landing_page: window.location.href,
402
379
  screen_width: window.screen.width,
403
- screen_height: window.screen.height
380
+ screen_height: window.screen.height,
381
+ js: true
404
382
  };
405
383
 
406
384
  // referrer
@@ -410,7 +388,11 @@ function createVisit() {
410
388
 
411
389
  log(data);
412
390
 
413
- sendRequest(visitsUrl(), data, setReady);
391
+ sendRequest(visitsUrl(), data, function () {
392
+ // wait until successful to destroy
393
+ destroyCookie("ahoy_track");
394
+ setReady();
395
+ });
414
396
  } else {
415
397
  log("Cookies disabled");
416
398
  setReady();
@@ -449,34 +431,36 @@ ahoy.track = function (name, properties) {
449
431
  name: name,
450
432
  properties: properties || {},
451
433
  time: new Date().getTime() / 1000.0,
452
- id: generateId()
434
+ id: generateId(),
435
+ js: true
453
436
  };
454
437
 
455
- // wait for createVisit to log
456
- documentReady(function () {
457
- log(event);
458
- });
459
-
460
438
  ready(function () {
461
439
  if (!ahoy.getVisitId()) {
462
440
  createVisit();
463
441
  }
464
442
 
465
- event.visit_token = ahoy.getVisitId();
466
- event.visitor_token = ahoy.getVisitorId();
443
+ ready(function () {
444
+ log(event);
467
445
 
468
- if (canTrackNow()) {
469
- trackEventNow(event);
470
- } else {
471
- eventQueue.push(event);
472
- saveEventQueue();
446
+ event.visit_token = ahoy.getVisitId();
447
+ event.visitor_token = ahoy.getVisitorId();
473
448
 
474
- // wait in case navigating to reduce duplicate events
475
- setTimeout(function () {
476
- trackEvent(event);
477
- }, 1000);
478
- }
449
+ if (canTrackNow()) {
450
+ trackEventNow(event);
451
+ } else {
452
+ eventQueue.push(event);
453
+ saveEventQueue();
454
+
455
+ // wait in case navigating to reduce duplicate events
456
+ setTimeout(function () {
457
+ trackEvent(event);
458
+ }, 1000);
459
+ }
460
+ });
479
461
  });
462
+
463
+ return true;
480
464
  };
481
465
 
482
466
  ahoy.trackView = function (additionalProperties) {
@@ -623,6 +607,50 @@ function objectToFormData (obj, fd, pre) {
623
607
  module.exports = objectToFormData
624
608
 
625
609
 
610
+ /***/ }),
611
+ /* 2 */
612
+ /***/ (function(module, exports, __webpack_require__) {
613
+
614
+ "use strict";
615
+
616
+
617
+ Object.defineProperty(exports, "__esModule", {
618
+ value: true
619
+ });
620
+ // http://www.quirksmode.org/js/cookies.html
621
+
622
+ exports.default = {
623
+ set: function set(name, value, ttl, domain) {
624
+ var expires = "";
625
+ var cookieDomain = "";
626
+ if (ttl) {
627
+ var date = new Date();
628
+ date.setTime(date.getTime() + ttl * 60 * 1000);
629
+ expires = "; expires=" + date.toGMTString();
630
+ }
631
+ if (domain) {
632
+ cookieDomain = "; domain=" + domain;
633
+ }
634
+ document.cookie = name + "=" + escape(value) + expires + cookieDomain + "; path=/";
635
+ },
636
+ get: function get(name) {
637
+ var i = void 0,
638
+ c = void 0;
639
+ var nameEQ = name + "=";
640
+ var ca = document.cookie.split(';');
641
+ for (i = 0; i < ca.length; i++) {
642
+ c = ca[i];
643
+ while (c.charAt(0) === ' ') {
644
+ c = c.substring(1, c.length);
645
+ }
646
+ if (c.indexOf(nameEQ) === 0) {
647
+ return unescape(c.substring(nameEQ.length, c.length));
648
+ }
649
+ }
650
+ return null;
651
+ }
652
+ };
653
+
626
654
  /***/ })
627
655
  /******/ ])["default"];
628
- });
656
+ });
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ahoy_matey
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.0.0
4
+ version: 2.0.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Andrew Kane
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-02-26 00:00:00.000000000 Z
11
+ date: 2018-02-27 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: railties