ahoy_matey 3.3.0 → 4.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
  SHA256:
3
- metadata.gz: d09c2a1f7783c94ad857652adfbe8150deb702f9162daf28c2bf9c11454f4277
4
- data.tar.gz: 0e0a9779762c9ad912ba6d8866f85783c00aa0a96f3c53a4b6b803a3cdf41af2
3
+ metadata.gz: 8291f7d5566895e2973be22a9dd2e4f3cd43449d1289a5d176b38eed17c9a81d
4
+ data.tar.gz: a2551e19aefafbf339f77dea16b3544ce2d3f6084372523029c5ac2b86a13260
5
5
  SHA512:
6
- metadata.gz: e479ea5345820038c0a4fe4296504781614b53c6cfef5a79856c51073f768dc64082d494ba64d1e03ec41a346832c320565de63c5953f3bdf91e6e2697a1b7c9
7
- data.tar.gz: 5fc7c4e73835b1ffc7be2d9c125894baccf204b7e7785784887574d80b8d7581d10e1ced1c0562cd7804ad66a22ce05df64ef6b302a981faa567569b618c8557
6
+ metadata.gz: c29a7d295c896e8191b213f877668910f6ca751d50750e1262ac41b2bedf971ec2342dc73dc9ac27d8f4e25306e83474162687bfbef8f44ea9887287adc89f57
7
+ data.tar.gz: 901f80e0995a39f63b6d4ae4f36c8a8c1b064f9820b7783d495775152c81d7310aa40efa2286398fbdf2e7108dd80bb9a6415acf44e62e5a414f71c1d0a5975c
data/CHANGELOG.md CHANGED
@@ -1,3 +1,26 @@
1
+ ## 4.0.3 (2022-01-15)
2
+
3
+ - Support for `importmap-rails` is no longer experimental
4
+ - Fixed asset precompilation error with `importmap-rails`
5
+
6
+ ## 4.0.2 (2021-11-06)
7
+
8
+ - Added experimental support for `importmap-rails`
9
+
10
+ ## 4.0.1 (2021-08-18)
11
+
12
+ - Added support for `where_event`, `where_props`, and `where_group` for SQLite
13
+ - Fixed results with `where_event` for MySQL, MariaDB, and Postgres `hstore`
14
+ - Fixed results with `where_props` and `where_group` when used with other scopes for MySQL, MariaDB, and Postgres `hstore`
15
+
16
+ ## 4.0.0 (2021-08-14)
17
+
18
+ - Disabled geocoding by default (this was already the case for new installations with 3.2.0+)
19
+ - Made the `geocoder` gem an optional dependency
20
+ - Updated Ahoy.js to 0.4.0
21
+ - Updated API to return 400 status code when missing required parameters
22
+ - Dropped support for Ruby < 2.6 and Rails < 5.2
23
+
1
24
  ## 3.3.0 (2021-08-13)
2
25
 
3
26
  - Added `country_code` to geocoding
data/README.md CHANGED
@@ -4,6 +4,8 @@
4
4
 
5
5
  Track visits and events in Ruby, JavaScript, and native apps. Data is stored in your database by default, and you can customize it for any data store as you grow.
6
6
 
7
+ **Ahoy 4.0 was recently released** - see [how to upgrade](#upgrading)
8
+
7
9
  :postbox: Check out [Ahoy Email](https://github.com/ankane/ahoy_email) for emails and [Field Test](https://github.com/ankane/field_test) for A/B testing
8
10
 
9
11
  :tangerine: Battle-tested at [Instacart](https://www.instacart.com/opensource)
@@ -46,6 +48,18 @@ And restart your web server.
46
48
 
47
49
  ### JavaScript
48
50
 
51
+ For Rails 7 / Importmap, add to `config/importmap.rb`:
52
+
53
+ ```ruby
54
+ pin "ahoy", to: "ahoy.js"
55
+ ```
56
+
57
+ And add to `app/javascript/application.js`:
58
+
59
+ ```javascript
60
+ import "ahoy"
61
+ ```
62
+
49
63
  For Rails 6 / Webpacker, run:
50
64
 
51
65
  ```sh
@@ -55,7 +69,7 @@ yarn add ahoy.js
55
69
  And add to `app/javascript/packs/application.js`:
56
70
 
57
71
  ```javascript
58
- import ahoy from "ahoy.js";
72
+ import ahoy from "ahoy.js"
59
73
  ```
60
74
 
61
75
  For Rails 5 / Sprockets, add to `app/assets/javascripts/application.js`:
@@ -143,12 +157,6 @@ end
143
157
  ahoy.track("Viewed book", {title: "The World is Flat"});
144
158
  ```
145
159
 
146
- Track events automatically with:
147
-
148
- ```javascript
149
- ahoy.trackAll();
150
- ```
151
-
152
160
  See [Ahoy.js](https://github.com/ankane/ahoy.js) for a complete list of features.
153
161
 
154
162
  #### Native Apps
@@ -350,7 +358,13 @@ Safely.report_exception_method = ->(e) { Rollbar.error(e) }
350
358
 
351
359
  Ahoy uses [Geocoder](https://github.com/alexreisner/geocoder) for geocoding. We recommend configuring [local geocoding](#local-geocoding) or [load balancer geocoding](#load-balancer-geocoding) so IP addresses are not sent to a 3rd party service. If you do use a 3rd party service and adhere to GDPR, be sure to add it to your subprocessor list. If Ahoy is configured to [mask IPs](#ip-masking), the masked IP is used (this can reduce accuracy but is better for privacy).
352
360
 
353
- To enable geocoding, update `config/initializers/ahoy.rb`:
361
+ To enable geocoding, add this line to your application’s Gemfile:
362
+
363
+ ```ruby
364
+ gem 'geocoder'
365
+ ```
366
+
367
+ And update `config/initializers/ahoy.rb`:
354
368
 
355
369
  ```ruby
356
370
  Ahoy.geocode = true
@@ -659,7 +673,7 @@ Group by properties with:
659
673
  Ahoy::Event.group_prop(:product_id, :category).count
660
674
  ```
661
675
 
662
- Note: MySQL and MariaDB always return string keys (include `"null"` for `nil`) for `group_prop`.
676
+ Note: MySQL and MariaDB always return string keys (including `"null"` for `nil`) for `group_prop`.
663
677
 
664
678
  ### Funnels
665
679
 
@@ -692,6 +706,24 @@ daily_visits = Ahoy::Visit.group_by_day(:started_at).count # uses Groupdate
692
706
  Prophet.forecast(daily_visits)
693
707
  ```
694
708
 
709
+ ### Anomaly Detection
710
+
711
+ To detect anomalies in visits and events, check out [AnomalyDetection.rb](https://github.com/ankane/AnomalyDetection.rb).
712
+
713
+ ```ruby
714
+ daily_visits = Ahoy::Visit.group_by_day(:started_at).count # uses Groupdate
715
+ AnomalyDetection.detect(daily_visits, period: 7)
716
+ ```
717
+
718
+ ### Breakout Detection
719
+
720
+ To detect breakouts in visits and events, check out [Breakout](https://github.com/ankane/breakout).
721
+
722
+ ```ruby
723
+ daily_visits = Ahoy::Visit.group_by_day(:started_at).count # uses Groupdate
724
+ Breakout.detect(daily_visits)
725
+ ```
726
+
695
727
  ### Recommendations
696
728
 
697
729
  To make recommendations based on events, check out [Disco](https://github.com/ankane/disco#ahoy).
@@ -743,62 +775,19 @@ Send a `POST` request to `/ahoy/events` with `Content-Type: application/json` an
743
775
 
744
776
  ## Upgrading
745
777
 
746
- ### 3.0
747
-
748
- If you installed Ahoy before 2.1 and want to keep legacy user agent parsing and bot detection, add to your Gemfile:
749
-
750
- ```ruby
751
- gem "browser", "~> 2.0"
752
- gem "user_agent_parser"
753
- ```
754
-
755
- And add to `config/initializers/ahoy.rb`:
756
-
757
- ```ruby
758
- Ahoy.user_agent_parser = :legacy
759
- ```
778
+ ### 4.0
760
779
 
761
- ### 2.2
780
+ There are two notable changes to geocoding:
762
781
 
763
- Ahoy now ships with better bot detection if you use Device Detector. This should be more accurate but can significantly reduce the number of visits recorded. For existing installs, it’s opt-in to start. To use it, add to `config/initializers/ahoy.rb`:
782
+ 1. Geocoding is now disabled by default (this was already the case for new installations with 3.2.0+). Check out the instructions for [how to enable it](#geocoding).
764
783
 
765
- ```ruby
766
- Ahoy.bot_detection_version = 2
767
- ```
784
+ 2. The `geocoder` gem is now an optional dependency. To use geocoding, add it to your Gemfile:
768
785
 
769
- ### 2.1
786
+ ```ruby
787
+ gem 'geocoder'
788
+ ```
770
789
 
771
- Ahoy recommends [Device Detector](https://github.com/podigee/device_detector) for user agent parsing and makes it the default for new installations. To switch, add to `config/initializers/ahoy.rb`:
772
-
773
- ```ruby
774
- Ahoy.user_agent_parser = :device_detector
775
- ```
776
-
777
- Backfill existing records with:
778
-
779
- ```ruby
780
- Ahoy::Visit.find_each do |visit|
781
- client = DeviceDetector.new(visit.user_agent)
782
- device_type =
783
- case client.device_type
784
- when "smartphone"
785
- "Mobile"
786
- when "tv"
787
- "TV"
788
- else
789
- client.device_type.try(:titleize)
790
- end
791
-
792
- visit.browser = client.name
793
- visit.os = client.os_name
794
- visit.device_type = device_type
795
- visit.save(validate: false) if visit.changed?
796
- end
797
- ```
798
-
799
- ### 2.0
800
-
801
- See the [upgrade guide](docs/Ahoy-2-Upgrade.md)
790
+ Also, check out the [upgrade notes](https://github.com/ankane/ahoy.js#upgrading) for Ahoy.js.
802
791
 
803
792
  ## History
804
793
 
@@ -822,10 +811,20 @@ bundle install
822
811
  bundle exec rake test
823
812
  ```
824
813
 
825
- To test query methods, start PostgreSQL, MySQL, and MongoDB and use:
814
+ To test query methods, use:
826
815
 
827
816
  ```sh
817
+ # Postgres
828
818
  createdb ahoy_test
819
+ bundle exec rake test:query_methods:postgresql
820
+
821
+ # SQLite
822
+ bundle exec rake test:query_methods:sqlite
823
+
824
+ # MySQL and MariaDB
829
825
  mysqladmin create ahoy_test
830
- bundle exec rake test:query_methods
826
+ bundle exec rake test:query_methods:mysql
827
+
828
+ # MongoDB
829
+ bundle exec rake test:query_methods:mongoid
831
830
  ```
@@ -5,19 +5,27 @@ module Ahoy
5
5
  skip_after_action(*filters, raise: false)
6
6
  skip_around_action(*filters, raise: false)
7
7
 
8
- before_action :verify_request_size
9
- before_action :renew_cookies
10
-
11
8
  if respond_to?(:protect_from_forgery)
12
9
  protect_from_forgery with: :null_session, if: -> { Ahoy.protect_from_forgery }
13
10
  end
14
11
 
12
+ before_action :verify_request_size
13
+ before_action :check_params
14
+ before_action :renew_cookies
15
+
15
16
  protected
16
17
 
17
18
  def ahoy
18
19
  @ahoy ||= Ahoy::Tracker.new(controller: self, api: true)
19
20
  end
20
21
 
22
+ def check_params
23
+ if ahoy.send(:missing_params?)
24
+ logger.info "[ahoy] Missing required parameters"
25
+ render plain: "Missing required parameters\n", status: :bad_request
26
+ end
27
+ end
28
+
21
29
  # set proper ttl if cookie generated from JavaScript
22
30
  # approach is not perfect, as user must reload the page
23
31
  # for new cookie settings to take effect
@@ -28,7 +36,7 @@ module Ahoy
28
36
  def verify_request_size
29
37
  if request.content_length > Ahoy.max_content_length
30
38
  logger.info "[ahoy] Payload too large"
31
- render plain: "Payload too large\n", status: 413
39
+ render plain: "Payload too large\n", status: :payload_too_large
32
40
  end
33
41
  end
34
42
  end
@@ -6,6 +6,8 @@ module Ahoy
6
6
  location =
7
7
  begin
8
8
  Geocoder.search(ip).first
9
+ rescue NameError
10
+ raise "Add the geocoder gem to your Gemfile to use geocoding"
9
11
  rescue => e
10
12
  Ahoy.log "Geocode error: #{e.class.name}: #{e.message}"
11
13
  nil
data/lib/ahoy/engine.rb CHANGED
@@ -26,5 +26,12 @@ module Ahoy
26
26
  alias_method :call, :call_with_quiet_ahoy
27
27
  end
28
28
  end
29
+
30
+ # for importmap
31
+ initializer "ahoy.importmap" do |app|
32
+ if defined?(Importmap)
33
+ app.config.assets.precompile << "ahoy.js"
34
+ end
35
+ end
29
36
  end
30
37
  end
@@ -8,64 +8,40 @@ module Ahoy
8
8
  end
9
9
 
10
10
  def where_props(properties)
11
- relation = self
12
- if respond_to?(:columns_hash)
13
- column_type = columns_hash["properties"].type
14
- adapter_name = connection.adapter_name.downcase
15
- else
16
- adapter_name = "mongoid"
17
- end
11
+ return all if properties.empty?
12
+
13
+ adapter_name = respond_to?(:connection) ? connection.adapter_name.downcase : "mongoid"
18
14
  case adapter_name
19
15
  when "mongoid"
20
- relation = where(Hash[properties.map { |k, v| ["properties.#{k}", v] }])
16
+ where(properties.to_h { |k, v| ["properties.#{k}", v] })
21
17
  when /mysql/
22
- if column_type == :json
23
- properties.each do |k, v|
18
+ where("JSON_CONTAINS(properties, ?, '$') = 1", properties.to_json)
19
+ when /postgres|postgis/
20
+ case columns_hash["properties"].type
21
+ when :hstore
22
+ properties.inject(all) do |relation, (k, v)|
24
23
  if v.nil?
25
- v = "null"
26
- elsif v == true
27
- v = "true"
24
+ relation.where("properties -> ? IS NULL", k.to_s)
25
+ else
26
+ relation.where("properties -> ? = ?", k.to_s, v.to_s)
28
27
  end
29
-
30
- relation = relation.where("JSON_UNQUOTE(properties -> ?) = ?", "$.#{k}", v.as_json)
31
28
  end
29
+ when :jsonb
30
+ where("properties @> ?", properties.to_json)
32
31
  else
33
- properties.each do |k, v|
34
- # TODO cast to json instead
35
- relation = relation.where("properties REGEXP ?", "[{,]#{{k.to_s => v}.to_json.sub(/\A\{/, "").sub(/\}\z/, "").gsub("+", "\\\\+")}[,}]")
36
- end
32
+ where("properties::jsonb @> ?", properties.to_json)
37
33
  end
38
- when /postgres|postgis/
39
- if column_type == :jsonb
40
- relation = relation.where("properties @> ?", properties.to_json)
41
- elsif column_type == :json
42
- properties.each do |k, v|
43
- relation =
44
- if v.nil?
45
- relation.where("properties ->> ? IS NULL", k.to_s)
46
- else
47
- relation.where("properties ->> ? = ?", k.to_s, v.as_json.to_s)
48
- end
49
- end
50
- elsif column_type == :hstore
51
- properties.each do |k, v|
52
- relation =
53
- if v.nil?
54
- relation.where("properties -> ? IS NULL", k.to_s)
55
- else
56
- relation.where("properties -> ? = ?", k.to_s, v.to_s)
57
- end
58
- end
59
- else
60
- properties.each do |k, v|
61
- # TODO cast to jsonb instead
62
- relation = relation.where("properties SIMILAR TO ?", "%[{,]#{{k.to_s => v}.to_json.sub(/\A\{/, "").sub(/\}\z/, "").gsub("+", "\\\\+")}[,}]%")
34
+ when /sqlite/
35
+ properties.inject(all) do |relation, (k, v)|
36
+ if v.nil?
37
+ relation.where("JSON_EXTRACT(properties, ?) IS NULL", "$.#{k}")
38
+ else
39
+ relation.where("JSON_EXTRACT(properties, ?) = ?", "$.#{k}", v.as_json)
63
40
  end
64
41
  end
65
42
  else
66
43
  raise "Adapter not supported: #{adapter_name}"
67
44
  end
68
- relation
69
45
  end
70
46
  alias_method :where_properties, :where_props
71
47
 
@@ -73,39 +49,32 @@ module Ahoy
73
49
  # like with group
74
50
  props.flatten!
75
51
 
76
- relation = self
77
- if respond_to?(:columns_hash)
78
- column_type = columns_hash["properties"].type
79
- adapter_name = connection.adapter_name.downcase
80
- else
81
- adapter_name = "mongoid"
82
- end
52
+ relation = all
53
+ adapter_name = respond_to?(:connection) ? connection.adapter_name.downcase : "mongoid"
83
54
  case adapter_name
84
55
  when "mongoid"
85
56
  raise "Adapter not supported: #{adapter_name}"
86
57
  when /mysql/
87
- if connection.try(:mariadb?)
88
- props.each do |prop|
89
- quoted_prop = connection.quote("$.#{prop}")
90
- relation = relation.group("JSON_UNQUOTE(JSON_EXTRACT(properties, #{quoted_prop}))")
91
- end
92
- else
93
- column = column_type == :json ? "properties" : "CAST(properties AS JSON)"
94
- props.each do |prop|
95
- quoted_prop = connection.quote("$.#{prop}")
96
- relation = relation.group("JSON_UNQUOTE(JSON_EXTRACT(#{column}, #{quoted_prop}))")
97
- end
58
+ props.each do |prop|
59
+ quoted_prop = connection.quote("$.#{prop}")
60
+ relation = relation.group("JSON_UNQUOTE(JSON_EXTRACT(properties, #{quoted_prop}))")
98
61
  end
99
62
  when /postgres|postgis/
100
63
  # convert to jsonb to fix
101
64
  # could not identify an equality operator for type json
102
65
  # and for text columns
66
+ column_type = columns_hash["properties"].type
103
67
  cast = [:jsonb, :hstore].include?(column_type) ? "" : "::jsonb"
104
68
 
105
69
  props.each do |prop|
106
70
  quoted_prop = connection.quote(prop)
107
71
  relation = relation.group("properties#{cast} -> #{quoted_prop}")
108
72
  end
73
+ when /sqlite/
74
+ props.each do |prop|
75
+ quoted_prop = connection.quote("$.#{prop}")
76
+ relation = relation.group("JSON_EXTRACT(properties, #{quoted_prop})")
77
+ end
109
78
  else
110
79
  raise "Adapter not supported: #{adapter_name}"
111
80
  end
data/lib/ahoy/tracker.rb CHANGED
@@ -19,8 +19,6 @@ module Ahoy
19
19
  def track(name, properties = {}, options = {})
20
20
  if exclude?
21
21
  debug "Event excluded"
22
- elsif missing_params?
23
- debug "Missing required parameters"
24
22
  else
25
23
  data = {
26
24
  visit_token: visit_token,
@@ -41,8 +39,6 @@ module Ahoy
41
39
  def track_visit(defer: false, started_at: nil)
42
40
  if exclude?
43
41
  debug "Visit excluded"
44
- elsif missing_params?
45
- debug "Missing required parameters"
46
42
  else
47
43
  if defer
48
44
  set_cookie("ahoy_track", true, nil, false)
@@ -155,6 +151,7 @@ module Ahoy
155
151
  @options[:api]
156
152
  end
157
153
 
154
+ # private, but used by API
158
155
  def missing_params?
159
156
  if Ahoy.cookies && api? && Ahoy.protect_from_forgery
160
157
  !(existing_visit_token && existing_visitor_token)
data/lib/ahoy/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Ahoy
2
- VERSION = "3.3.0"
2
+ VERSION = "4.0.3"
3
3
  end
data/lib/ahoy.rb CHANGED
@@ -4,7 +4,6 @@ require "ipaddr"
4
4
  # dependencies
5
5
  require "active_support"
6
6
  require "active_support/core_ext"
7
- require "geocoder"
8
7
  require "safely/core"
9
8
 
10
9
  # modules
@@ -44,7 +43,7 @@ module Ahoy
44
43
  self.quiet = true
45
44
 
46
45
  mattr_accessor :geocode
47
- self.geocode = true
46
+ self.geocode = false
48
47
 
49
48
  mattr_accessor :max_content_length
50
49
  self.max_content_length = 8192
@@ -128,10 +127,6 @@ ActiveSupport.on_load(:action_view) do
128
127
  end
129
128
 
130
129
  # Mongoid
131
- # TODO use
132
- # ActiveSupport.on_load(:mongoid) do
133
- # Mongoid::Document::ClassMethods.include(Ahoy::Model)
134
- # end
135
- if defined?(ActiveModel)
136
- ActiveModel::Callbacks.include(Ahoy::Model)
130
+ ActiveSupport.on_load(:mongoid) do
131
+ Mongoid::Document::ClassMethods.include(Ahoy::Model)
137
132
  end
@@ -19,7 +19,7 @@ end
19
19
  # set to true for JavaScript tracking
20
20
  Ahoy.api = false
21
21
 
22
- # set to true for geocoding
23
- # we recommend configuring local geocoding first
22
+ # set to true for geocoding (and add the geocoder gem to your Gemfile)
23
+ # we recommend configuring local geocoding as well
24
24
  # see https://github.com/ankane/ahoy#geocoding
25
25
  Ahoy.geocode = false
@@ -4,7 +4,7 @@ end
4
4
  # set to true for JavaScript tracking
5
5
  Ahoy.api = false
6
6
 
7
- # set to true for geocoding
8
- # we recommend configuring local geocoding first
7
+ # set to true for geocoding (and add the geocoder gem to your Gemfile)
8
+ # we recommend configuring local geocoding as well
9
9
  # see https://github.com/ankane/ahoy#geocoding
10
10
  Ahoy.geocode = false
@@ -2,7 +2,7 @@
2
2
  * Ahoy.js
3
3
  * Simple, powerful JavaScript analytics
4
4
  * https://github.com/ankane/ahoy.js
5
- * v0.3.9
5
+ * v0.4.0
6
6
  * MIT License
7
7
  */
8
8
 
@@ -26,7 +26,7 @@
26
26
  if (domain) {
27
27
  cookieDomain = "; domain=" + domain;
28
28
  }
29
- document.cookie = name + "=" + escape(value) + expires + cookieDomain + "; path=/";
29
+ document.cookie = name + "=" + escape(value) + expires + cookieDomain + "; path=/; samesite=lax";
30
30
  },
31
31
  get: function (name) {
32
32
  var i, c;
@@ -478,8 +478,7 @@
478
478
 
479
479
  ahoy.trackClicks = function (selector) {
480
480
  if (selector === undefined) {
481
- log("trackClicks will require a selector in 0.4.0");
482
- selector = "a, button, input[type=submit]";
481
+ throw new Error("Missing selector");
483
482
  }
484
483
  onEvent("click", selector, function (e) {
485
484
  var properties = eventProperties.call(this, e);
@@ -491,8 +490,7 @@
491
490
 
492
491
  ahoy.trackSubmits = function (selector) {
493
492
  if (selector === undefined) {
494
- log("trackSubmits will require a selector in 0.4.0");
495
- selector = "form";
493
+ throw new Error("Missing selector");
496
494
  }
497
495
  onEvent("submit", selector, function (e) {
498
496
  var properties = eventProperties.call(this, e);
@@ -501,10 +499,9 @@
501
499
  };
502
500
 
503
501
  ahoy.trackChanges = function (selector) {
502
+ log("trackChanges is deprecated and will be removed in 0.5.0");
504
503
  if (selector === undefined) {
505
- // put here instead of above to prevent message with trackAll
506
- log("trackChanges is deprecated and will be removed in 0.4.0");
507
- selector = "input, textarea, select";
504
+ throw new Error("Missing selector");
508
505
  }
509
506
  onEvent("change", selector, function (e) {
510
507
  var properties = eventProperties.call(this, e);
@@ -512,14 +509,6 @@
512
509
  });
513
510
  };
514
511
 
515
- ahoy.trackAll = function() {
516
- log("trackAll is deprecated and will be removed in 0.4.0");
517
- ahoy.trackView();
518
- ahoy.trackClicks("a, button, input[type=submit]");
519
- ahoy.trackSubmits("form");
520
- ahoy.trackChanges("input, textarea, select");
521
- };
522
-
523
512
  // push events from queue
524
513
  try {
525
514
  eventQueue = JSON.parse(getCookie("ahoy_events") || "[]");
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: 3.3.0
4
+ version: 4.0.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Andrew Kane
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-08-13 00:00:00.000000000 Z
11
+ date: 2022-01-15 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -16,28 +16,14 @@ dependencies:
16
16
  requirements:
17
17
  - - ">="
18
18
  - !ruby/object:Gem::Version
19
- version: '5'
19
+ version: '5.2'
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: '5'
27
- - !ruby/object:Gem::Dependency
28
- name: geocoder
29
- requirement: !ruby/object:Gem::Requirement
30
- requirements:
31
- - - ">="
32
- - !ruby/object:Gem::Version
33
- version: 1.4.5
34
- type: :runtime
35
- prerelease: false
36
- version_requirements: !ruby/object:Gem::Requirement
37
- requirements:
38
- - - ">="
39
- - !ruby/object:Gem::Version
40
- version: 1.4.5
26
+ version: '5.2'
41
27
  - !ruby/object:Gem::Dependency
42
28
  name: safely_block
43
29
  requirement: !ruby/object:Gem::Requirement
@@ -120,14 +106,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
120
106
  requirements:
121
107
  - - ">="
122
108
  - !ruby/object:Gem::Version
123
- version: '2.4'
109
+ version: '2.6'
124
110
  required_rubygems_version: !ruby/object:Gem::Requirement
125
111
  requirements:
126
112
  - - ">="
127
113
  - !ruby/object:Gem::Version
128
114
  version: '0'
129
115
  requirements: []
130
- rubygems_version: 3.2.22
116
+ rubygems_version: 3.3.3
131
117
  signing_key:
132
118
  specification_version: 4
133
119
  summary: Simple, powerful, first-party analytics for Rails