ahoy_matey 4.2.1 → 5.0.0

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: fc5fc1f8ed102bd4a3fa7e78a5404c7d40b698d59cbbc644c5322e2bcb1b2e52
4
- data.tar.gz: 7100ab100ed3a6ae66a4c4aa6b14c3c2e817c273ab677b7befbc6350fec5cff8
3
+ metadata.gz: 621c76868e3082cd139423009777a21f805b65815f099f1a9d69d08a81a2a69e
4
+ data.tar.gz: 6575071548c3d0b326a8ca10fb3b9b26a8e61fdc02db0235353beca1d3db3b59
5
5
  SHA512:
6
- metadata.gz: a41dd47317ab2932e0ddcc9231f3cca78887cdf2cf98ca3506cb0ccd8f1f70ed050dafe8e17e764224fe29018ba5cb35afab5068059338f63e832298d98547cd
7
- data.tar.gz: f170800b1f7490aec5be31dab5e59f5824ab0a261ceb4fac9b5a1ad31fd8525c7f424c3f2080c8e75f9564763a69c9c6a56a854c848d1453cc3299b5f5c822f0
6
+ metadata.gz: f24ebcfd4d199cfebde1de163bcbca36f5c47115710d63260cc168bce075e629881cd61ed07babacba36fb6502fdebfcad20ada9c318e2c31d26a2b1ba9efdbc
7
+ data.tar.gz: ffa84f157d902da8f02f16d3c80bb558d7951ae51194325dee6aca5e622a651a3b681a17612788eb49399ffdc5739dbef4d41d661737c28eda164ab5c0a3462a
data/CHANGELOG.md CHANGED
@@ -1,3 +1,11 @@
1
+ ## 5.0.0 (2023-10-01)
2
+
3
+ - Changed visits to expire with anonymity sets
4
+ - Fixed error when Active Job is not available
5
+ - Fixed deprecation warning with Rails 7.1
6
+ - Dropped support for Ruby < 3 and Rails < 6.1
7
+ - Dropped support for Mongoid 6
8
+
1
9
  ## 4.2.1 (2023-02-23)
2
10
 
3
11
  - Updated Ahoy.js to 0.4.2
data/README.md CHANGED
@@ -46,7 +46,7 @@ And restart your web server.
46
46
 
47
47
  ### JavaScript
48
48
 
49
- For Rails 7 / Importmap, add to `config/importmap.rb`:
49
+ For Importmap (Rails 7 default), add to `config/importmap.rb`:
50
50
 
51
51
  ```ruby
52
52
  pin "ahoy", to: "ahoy.js"
@@ -58,7 +58,7 @@ And add to `app/javascript/application.js`:
58
58
  import "ahoy"
59
59
  ```
60
60
 
61
- For Rails 6 / Webpacker, run:
61
+ For Webpacker (Rails 6 default), run:
62
62
 
63
63
  ```sh
64
64
  yarn add ahoy.js
@@ -70,7 +70,7 @@ And add to `app/javascript/packs/application.js`:
70
70
  import ahoy from "ahoy.js"
71
71
  ```
72
72
 
73
- For Rails 5 / Sprockets, add to `app/assets/javascripts/application.js`:
73
+ For Sprockets, add to `app/assets/javascripts/application.js`:
74
74
 
75
75
  ```javascript
76
76
  //= require ahoy
@@ -210,7 +210,7 @@ visitable :sign_up_visit
210
210
 
211
211
  ### Users
212
212
 
213
- Ahoy automatically attaches the `current_user` to the visit. With [Devise](https://github.com/plataformatec/devise), it attaches the user even if they sign in after the visit starts.
213
+ Ahoy automatically attaches the `current_user` to the visit. With [Devise](https://github.com/heartcombo/devise), it attaches the user even if they sign in after the visit starts.
214
214
 
215
215
  With other authentication frameworks, add this to the end of your sign in method:
216
216
 
@@ -260,28 +260,6 @@ class ApplicationController < ActionController::Base
260
260
  end
261
261
  ```
262
262
 
263
- #### Knock
264
-
265
- To attach the user with [Knock](https://github.com/nsarno/knock), either include `Knock::Authenticable`in `ApplicationController`:
266
-
267
- ```ruby
268
- class ApplicationController < ActionController::API
269
- include Knock::Authenticable
270
- end
271
- ```
272
-
273
- Or include it in Ahoy:
274
-
275
- ```ruby
276
- Ahoy::BaseController.include Knock::Authenticable
277
- ```
278
-
279
- And use:
280
-
281
- ```ruby
282
- Ahoy.user_method = ->(controller) { controller.send(:authenticate_entity, "user") }
283
- ```
284
-
285
263
  ### Exclusions
286
264
 
287
265
  Bots are excluded from tracking by default. To include them, use:
@@ -306,6 +284,14 @@ By default, a new visit is created after 4 hours of inactivity. Change this with
306
284
  Ahoy.visit_duration = 30.minutes
307
285
  ```
308
286
 
287
+ ### Visitor Duration
288
+
289
+ By default, a new `visitor_token` is generated after 2 years. Change this with:
290
+
291
+ ```ruby
292
+ Ahoy.visitor_duration = 30.days
293
+ ```
294
+
309
295
  ### Cookies
310
296
 
311
297
  To track visits across multiple subdomains, use:
@@ -324,15 +310,15 @@ You can also [disable cookies](#anonymity-sets--cookies)
324
310
 
325
311
  ### Token Generation
326
312
 
327
- Ahoy uses random UUIDs for visit and visitor tokens by default, but you can use your own generator like [Druuid](https://github.com/recurly/druuid).
313
+ Ahoy uses random UUIDs for visit and visitor tokens by default, but you can use your own generator like [ULID](https://github.com/rafaelsales/ulid).
328
314
 
329
315
  ```ruby
330
- Ahoy.token_generator = -> { Druuid.gen }
316
+ Ahoy.token_generator = -> { ULID.generate }
331
317
  ```
332
318
 
333
319
  ### Throttling
334
320
 
335
- You can use [Rack::Attack](https://github.com/kickstarter/rack-attack) to throttle requests to the API.
321
+ You can use [Rack::Attack](https://github.com/rack/rack-attack) to throttle requests to the API.
336
322
 
337
323
  ```ruby
338
324
  class Rack::Attack
@@ -376,13 +362,17 @@ Ahoy.job_queue = :low_priority
376
362
 
377
363
  ### Local Geocoding
378
364
 
379
- For privacy and performance, we recommend geocoding locally. Add this line to your application’s Gemfile:
365
+ For privacy and performance, we recommend geocoding locally.
366
+
367
+ For city-level geocoding, download the [GeoLite2 City database](https://dev.maxmind.com/geoip/geolite2-free-geolocation-data).
368
+
369
+ Add this line to your application’s Gemfile:
380
370
 
381
371
  ```ruby
382
372
  gem "maxminddb"
383
373
  ```
384
374
 
385
- For city-level geocoding, download the [GeoLite2 City database](https://dev.maxmind.com/geoip/geoip2/geolite2/) and create `config/initializers/geocoder.rb` with:
375
+ And create `config/initializers/geocoder.rb` with:
386
376
 
387
377
  ```ruby
388
378
  Geocoder.configure(
@@ -399,6 +389,12 @@ For country-level geocoding, install the `geoip-database` package. It’s preins
399
389
  sudo apt-get install geoip-database
400
390
  ```
401
391
 
392
+ Add this line to your application’s Gemfile:
393
+
394
+ ```ruby
395
+ gem "geoip"
396
+ ```
397
+
402
398
  And create `config/initializers/geocoder.rb` with:
403
399
 
404
400
  ```ruby
@@ -448,7 +444,7 @@ class Ahoy::Store < Ahoy::DatabaseStore
448
444
  end
449
445
 
450
446
  Ahoy.mask_ips = true
451
- Ahoy.cookies = false
447
+ Ahoy.cookies = :none
452
448
  ```
453
449
 
454
450
  This:
@@ -486,20 +482,20 @@ end
486
482
 
487
483
  ### Anonymity Sets & Cookies
488
484
 
489
- Ahoy can switch from cookies to [anonymity sets](https://privacypatterns.org/patterns/Anonymity-set). Instead of cookies, visitors with the same IP mask and user agent are grouped together in an anonymity set.
485
+ Ahoy can switch from cookies to [anonymity sets](https://privacypatterns.org/patterns/Anonymity-set). Instead of cookies, visitors with the same IP mask and user agent are grouped together in an anonymity set.
490
486
 
491
487
  ```ruby
492
- Ahoy.cookies = false
488
+ Ahoy.cookies = :none
493
489
  ```
494
490
 
491
+ Note: If Ahoy was installed before v5, [add an index](#5-0) before making this change.
492
+
495
493
  Previously set cookies are automatically deleted. If you use JavaScript tracking, also set:
496
494
 
497
495
  ```javascript
498
496
  ahoy.configure({cookies: false});
499
497
  ```
500
498
 
501
- Note: With anonymity sets, visits no longer expire after 4 hours of inactivity. A new visit is only created when the IP mask or user agent changes (for instance, when a user updates their browser). There are plans to address this in the next major version.
502
-
503
499
  ## Data Retention
504
500
 
505
501
  Data should only be retained for as long as it’s needed. Delete older data with:
@@ -637,7 +633,7 @@ end
637
633
 
638
634
  [Blazer](https://github.com/ankane/blazer) is a great tool for exploring your data.
639
635
 
640
- With ActiveRecord, you can do:
636
+ With Active Record, you can do:
641
637
 
642
638
  ```ruby
643
639
  Ahoy::Visit.group(:search_keyword).count
@@ -775,19 +771,29 @@ Send a `POST` request to `/ahoy/events` with `Content-Type: application/json` an
775
771
 
776
772
  ## Upgrading
777
773
 
778
- ### 4.0
774
+ ### 5.0
775
+
776
+ Visits now expire with anonymity sets. If using `Ahoy.cookies = false`, a new index is needed.
777
+
778
+ For Active Record, create a migration with:
779
779
 
780
- There are two notable changes to geocoding:
780
+ ```ruby
781
+ add_index :ahoy_visits, [:visitor_token, :started_at]
782
+ ```
781
783
 
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).
784
+ For Mongoid, set:
783
785
 
784
- 2. The `geocoder` gem is now an optional dependency. To use geocoding, add it to your Gemfile:
786
+ ```ruby
787
+ class Ahoy::Visit
788
+ index({visitor_token: 1, started_at: 1})
789
+ end
790
+ ```
785
791
 
786
- ```ruby
787
- gem "geocoder"
788
- ```
792
+ Create the index before upgrading, and set:
789
793
 
790
- Also, check out the [upgrade notes](https://github.com/ankane/ahoy.js#upgrading) for Ahoy.js.
794
+ ```ruby
795
+ Ahoy.cookies = :none
796
+ ```
791
797
 
792
798
  ## History
793
799
 
@@ -3,6 +3,7 @@ module Ahoy
3
3
  attr_writer :user
4
4
 
5
5
  def initialize(options)
6
+ @user = options[:user]
6
7
  @options = options
7
8
  end
8
9
 
@@ -5,9 +5,8 @@ module Ahoy
5
5
  base.helper_method :current_visit
6
6
  base.helper_method :ahoy
7
7
  end
8
- base.before_action :set_ahoy_cookies, unless: -> { Ahoy.api_only }
9
8
  base.before_action :track_ahoy_visit, unless: -> { Ahoy.api_only }
10
- base.around_action :set_ahoy_request_store
9
+ base.around_action :set_ahoy_request_store, unless: -> { Ahoy.api_only }
11
10
  end
12
11
 
13
12
  def ahoy
@@ -19,7 +18,7 @@ module Ahoy
19
18
  end
20
19
 
21
20
  def set_ahoy_cookies
22
- if Ahoy.cookies
21
+ if Ahoy.cookies?
23
22
  ahoy.set_visitor_cookie
24
23
  ahoy.set_visit_cookie
25
24
  else
@@ -31,11 +30,17 @@ module Ahoy
31
30
  def track_ahoy_visit
32
31
  defer = Ahoy.server_side_visits != true
33
32
 
34
- if defer && !Ahoy.cookies
33
+ if defer && !Ahoy.cookies?
35
34
  # avoid calling new_visit?, which triggers a database call
35
+ elsif !Ahoy.cookies? && ahoy.exclude?
36
+ # avoid calling new_visit?, which triggers a database call
37
+ # may or may not be a new visit
38
+ Ahoy.log("Request excluded")
36
39
  elsif ahoy.new_visit?
37
40
  ahoy.track_visit(defer: defer)
38
41
  end
42
+
43
+ set_ahoy_cookies
39
44
  end
40
45
 
41
46
  def set_ahoy_request_store
@@ -53,11 +53,13 @@ module Ahoy
53
53
 
54
54
  def visit
55
55
  unless defined?(@visit)
56
- if defined?(Mongoid::Document) && visit_model < Mongoid::Document
57
- # find_by raises error by default when not found
58
- @visit = visit_model.where(visit_token: ahoy.visit_token).first if ahoy.visit_token
56
+ if ahoy.send(:existing_visit_token)
57
+ # find_by raises error by default with Mongoid when not found
58
+ @visit = visit_model.where(visit_token: ahoy.visit_token).take if ahoy.visit_token
59
+ elsif !Ahoy.cookies? && ahoy.visitor_token
60
+ @visit = visit_model.where(visitor_token: ahoy.visitor_token).where(started_at: Ahoy.visit_duration.ago..).order(started_at: :desc).first
59
61
  else
60
- @visit = visit_model.find_by(visit_token: ahoy.visit_token) if ahoy.visit_token
62
+ @visit = nil
61
63
  end
62
64
  end
63
65
  @visit
data/lib/ahoy/tracker.rb CHANGED
@@ -99,7 +99,7 @@ module Ahoy
99
99
  end
100
100
 
101
101
  def new_visit?
102
- Ahoy.cookies ? !existing_visit_token : visit.nil?
102
+ Ahoy.cookies? ? !existing_visit_token : visit.nil?
103
103
  end
104
104
 
105
105
  def new_visitor?
@@ -145,6 +145,13 @@ module Ahoy
145
145
  delete_cookie("ahoy_track")
146
146
  end
147
147
 
148
+ def exclude?
149
+ unless defined?(@exclude)
150
+ @exclude = @store.exclude?
151
+ end
152
+ @exclude
153
+ end
154
+
148
155
  protected
149
156
 
150
157
  def api?
@@ -153,7 +160,7 @@ module Ahoy
153
160
 
154
161
  # private, but used by API
155
162
  def missing_params?
156
- if Ahoy.cookies && api? && Ahoy.protect_from_forgery
163
+ if Ahoy.cookies? && api? && Ahoy.protect_from_forgery
157
164
  !(existing_visit_token && existing_visitor_token)
158
165
  else
159
166
  false
@@ -162,7 +169,7 @@ module Ahoy
162
169
 
163
170
  def set_cookie(name, value, duration = nil, use_domain = true)
164
171
  # safety net
165
- return unless Ahoy.cookies && request
172
+ return unless Ahoy.cookies? && request
166
173
 
167
174
  cookie = Ahoy.cookie_options.merge(value: value)
168
175
  cookie[:expires] = duration.from_now if duration
@@ -184,13 +191,6 @@ module Ahoy
184
191
  end
185
192
  end
186
193
 
187
- def exclude?
188
- unless defined?(@exclude)
189
- @exclude = @store.exclude?
190
- end
191
- @exclude
192
- end
193
-
194
194
  def report_exception(e)
195
195
  if defined?(ActionDispatch::RemoteIp::IpSpoofAttackError) && e.is_a?(ActionDispatch::RemoteIp::IpSpoofAttackError)
196
196
  debug "Tracking excluded due to IP spoofing"
@@ -207,7 +207,7 @@ module Ahoy
207
207
  def visit_token_helper
208
208
  @visit_token_helper ||= begin
209
209
  token = existing_visit_token
210
- token ||= visit_anonymity_set unless Ahoy.cookies
210
+ token ||= visit&.visit_token unless Ahoy.cookies?
211
211
  token ||= generate_id unless Ahoy.api_only
212
212
  token
213
213
  end
@@ -216,7 +216,7 @@ module Ahoy
216
216
  def visitor_token_helper
217
217
  @visitor_token_helper ||= begin
218
218
  token = existing_visitor_token
219
- token ||= visitor_anonymity_set unless Ahoy.cookies
219
+ token ||= visitor_anonymity_set unless Ahoy.cookies?
220
220
  token ||= generate_id unless Ahoy.api_only
221
221
  token
222
222
  end
@@ -225,7 +225,7 @@ module Ahoy
225
225
  def existing_visit_token
226
226
  @existing_visit_token ||= begin
227
227
  token = visit_header
228
- token ||= visit_cookie if Ahoy.cookies && !(api? && Ahoy.protect_from_forgery)
228
+ token ||= visit_cookie if Ahoy.cookies? && !(api? && Ahoy.protect_from_forgery)
229
229
  token ||= visit_param if api?
230
230
  token
231
231
  end
@@ -234,16 +234,12 @@ module Ahoy
234
234
  def existing_visitor_token
235
235
  @existing_visitor_token ||= begin
236
236
  token = visitor_header
237
- token ||= visitor_cookie if Ahoy.cookies && !(api? && Ahoy.protect_from_forgery)
237
+ token ||= visitor_cookie if Ahoy.cookies? && !(api? && Ahoy.protect_from_forgery)
238
238
  token ||= visitor_param if api?
239
239
  token
240
240
  end
241
241
  end
242
242
 
243
- def visit_anonymity_set
244
- @visit_anonymity_set ||= Digest::UUID.uuid_v5(UUID_NAMESPACE, ["visit", Ahoy.mask_ip(request.remote_ip), request.user_agent].join("/"))
245
- end
246
-
247
243
  def visitor_anonymity_set
248
244
  @visitor_anonymity_set ||= Digest::UUID.uuid_v5(UUID_NAMESPACE, ["visitor", Ahoy.mask_ip(request.remote_ip), request.user_agent].join("/"))
249
245
  end
data/lib/ahoy/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Ahoy
2
- VERSION = "4.2.1"
2
+ VERSION = "5.0.0"
3
3
  end
data/lib/ahoy.rb CHANGED
@@ -21,13 +21,45 @@ require_relative "ahoy/visit_properties"
21
21
  require_relative "ahoy/engine" if defined?(Rails)
22
22
 
23
23
  module Ahoy
24
+ # activejob optional
25
+ autoload :GeocodeV2Job, "ahoy/geocode_v2_job"
26
+
24
27
  mattr_accessor :visit_duration
25
28
  self.visit_duration = 4.hours
26
29
 
27
30
  mattr_accessor :visitor_duration
28
31
  self.visitor_duration = 2.years
29
32
 
30
- mattr_accessor :cookies
33
+ def self.cookies=(value)
34
+ if value == false
35
+ if defined?(Mongoid::Document) && defined?(Ahoy::Visit) && Ahoy::Visit < Mongoid::Document
36
+ raise <<~EOS
37
+ This feature requires a new index in Ahoy 5. Set:
38
+
39
+ class Ahoy::Visit
40
+ index({visitor_token: 1, started_at: 1})
41
+ end
42
+
43
+ Create the index before upgrading, and set:
44
+
45
+ Ahoy.cookies = :none
46
+ EOS
47
+ else
48
+ raise <<~EOS
49
+ This feature requires a new index in Ahoy 5. Create a migration with:
50
+
51
+ add_index :ahoy_visits, [:visitor_token, :started_at]
52
+
53
+ Run it before upgrading, and set:
54
+
55
+ Ahoy.cookies = :none
56
+ EOS
57
+ end
58
+ end
59
+ @@cookies = value
60
+ end
61
+
62
+ mattr_reader :cookies
31
63
  self.cookies = true
32
64
 
33
65
  # TODO deprecate in favor of cookie_options
@@ -94,6 +126,10 @@ module Ahoy
94
126
  logger.info { "[ahoy] #{message}" } if logger
95
127
  end
96
128
 
129
+ def self.cookies?
130
+ cookies && cookies != :none
131
+ end
132
+
97
133
  def self.mask_ip(ip)
98
134
  addr = IPAddr.new(ip)
99
135
  if addr.ipv4?
@@ -33,6 +33,10 @@ module Ahoy
33
33
  properties_type == "text" || (properties_type == "json" && ActiveRecord::Base.connection.try(:mariadb?))
34
34
  end
35
35
 
36
+ def serialize_options
37
+ ActiveRecord::VERSION::STRING.to_f >= 7.1 ? "coder: JSON" : "JSON"
38
+ end
39
+
36
40
  # use connection_config instead of connection.adapter
37
41
  # so database connection isn't needed
38
42
  def adapter
@@ -43,10 +47,6 @@ module Ahoy
43
47
  end
44
48
  end
45
49
 
46
- def rails52?
47
- ActiveRecord::VERSION::STRING.to_f >= 5.2
48
- end
49
-
50
50
  def migration_version
51
51
  "[#{ActiveRecord::VERSION::MAJOR}.#{ActiveRecord::VERSION::MINOR}]"
52
52
  end
@@ -6,5 +6,5 @@ class Ahoy::Event < ApplicationRecord
6
6
  belongs_to :visit
7
7
  belongs_to :user, optional: true<% if serialize_properties? %>
8
8
 
9
- serialize :properties, JSON<% end %>
9
+ serialize :properties, <%= serialize_options %><% end %>
10
10
  end
@@ -45,6 +45,7 @@ class <%= migration_class_name %> < ActiveRecord::Migration<%= migration_version
45
45
  end
46
46
 
47
47
  add_index :ahoy_visits, :visit_token, unique: true
48
+ add_index :ahoy_visits, [:visitor_token, :started_at]
48
49
 
49
50
  create_table :ahoy_events<%= primary_key_type %> do |t|
50
51
  t.references :visit<%= foreign_key_type %>
@@ -55,8 +56,7 @@ class <%= migration_class_name %> < ActiveRecord::Migration<%= migration_version
55
56
  t.datetime :time
56
57
  end
57
58
 
58
- add_index :ahoy_events, [:name, :time]<% if properties_type == "jsonb" %><% if rails52? %>
59
- add_index :ahoy_events, :properties, using: :gin, opclass: :jsonb_path_ops<% else %>
60
- add_index :ahoy_events, "properties jsonb_path_ops", using: "gin"<% end %><% end %>
59
+ add_index :ahoy_events, [:name, :time]<% if properties_type == "jsonb" %>
60
+ add_index :ahoy_events, :properties, using: :gin, opclass: :jsonb_path_ops<% end %>
61
61
  end
62
62
  end
@@ -46,4 +46,5 @@ class Ahoy::Visit
46
46
  field :started_at, type: Time
47
47
 
48
48
  index({visit_token: 1}, {unique: true})
49
+ index({visitor_token: 1, started_at: 1})
49
50
  end
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: 4.2.1
4
+ version: 5.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Andrew Kane
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2023-02-23 00:00:00.000000000 Z
11
+ date: 2023-10-02 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -16,42 +16,42 @@ dependencies:
16
16
  requirements:
17
17
  - - ">="
18
18
  - !ruby/object:Gem::Version
19
- version: '5.2'
19
+ version: '6.1'
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.2'
26
+ version: '6.1'
27
27
  - !ruby/object:Gem::Dependency
28
- name: safely_block
28
+ name: device_detector
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
31
  - - ">="
32
32
  - !ruby/object:Gem::Version
33
- version: 0.2.1
33
+ version: '1'
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - ">="
39
39
  - !ruby/object:Gem::Version
40
- version: 0.2.1
40
+ version: '1'
41
41
  - !ruby/object:Gem::Dependency
42
- name: device_detector
42
+ name: safely_block
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
45
  - - ">="
46
46
  - !ruby/object:Gem::Version
47
- version: '0'
47
+ version: '0.4'
48
48
  type: :runtime
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
52
  - - ">="
53
53
  - !ruby/object:Gem::Version
54
- version: '0'
54
+ version: '0.4'
55
55
  description:
56
56
  email: andrew@ankane.org
57
57
  executables: []
@@ -65,14 +65,13 @@ files:
65
65
  - app/controllers/ahoy/base_controller.rb
66
66
  - app/controllers/ahoy/events_controller.rb
67
67
  - app/controllers/ahoy/visits_controller.rb
68
- - app/jobs/ahoy/geocode_job.rb
69
- - app/jobs/ahoy/geocode_v2_job.rb
70
68
  - config/routes.rb
71
69
  - lib/ahoy.rb
72
70
  - lib/ahoy/base_store.rb
73
71
  - lib/ahoy/controller.rb
74
72
  - lib/ahoy/database_store.rb
75
73
  - lib/ahoy/engine.rb
74
+ - lib/ahoy/geocode_v2_job.rb
76
75
  - lib/ahoy/helper.rb
77
76
  - lib/ahoy/model.rb
78
77
  - lib/ahoy/query_methods.rb
@@ -106,14 +105,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
106
105
  requirements:
107
106
  - - ">="
108
107
  - !ruby/object:Gem::Version
109
- version: '2.6'
108
+ version: '3'
110
109
  required_rubygems_version: !ruby/object:Gem::Requirement
111
110
  requirements:
112
111
  - - ">="
113
112
  - !ruby/object:Gem::Version
114
113
  version: '0'
115
114
  requirements: []
116
- rubygems_version: 3.4.6
115
+ rubygems_version: 3.4.10
117
116
  signing_key:
118
117
  specification_version: 4
119
118
  summary: Simple, powerful, first-party analytics for Rails
@@ -1,11 +0,0 @@
1
- # for smooth update from Ahoy 1 -> 2
2
- # TODO remove in 5.0
3
- module Ahoy
4
- class GeocodeJob < ActiveJob::Base
5
- queue_as { Ahoy.job_queue }
6
-
7
- def perform(visit)
8
- Ahoy::GeocodeV2Job.perform_now(visit.visit_token, visit.ip)
9
- end
10
- end
11
- end
File without changes