Added user_agent_parser option, with support for Device Detector

Andrew committed May 05, 2018
commit 888c37157be855b605242dee4d6efbb5b915eeb0
Showing 6 changed files with 58 additions and 25 deletions
CHANGELOG.md +1 -0
@@ @@ -2,6 +2,7 @@
- Added option for IP masking
- Added option to use anonymity sets instead of cookies
+ - Added `user_agent_parser` option
- Fixed `visitable` for Rails 4.2
- Removed `search_keyword` from new installs
ahoy_matey.gemspec +1 -0
@@ @@ -25,6 +25,7 @@ Gem::Specification.new do |spec|
spec.add_dependency "user_agent_parser"
spec.add_dependency "request_store"
spec.add_dependency "safely_block", ">= 0.2.1"
+ spec.add_dependency "device_detector"
spec.add_development_dependency "bundler"
spec.add_development_dependency "rake"
ahoy.rb b/lib/ahoy.rb +3 -0
@@ @@ -75,6 +75,9 @@ module Ahoy
mattr_accessor :mask_ips
self.mask_ips = false
+ mattr_accessor :user_agent_parser
+ self.user_agent_parser = :legacy
+
def self.log(message)
Rails.logger.info { "[ahoy] #{message}" }
end
ahoy/base_store.rb b/lib/ahoy/base_store.rb +15 -1
@@ @@ -46,7 +46,21 @@ module Ahoy
protected
def bot?
- @bot ||= request ? Browser.new(request.user_agent).bot? : false
+ unless defined?(@bot)
+ @bot = begin
+ if request
+ if Ahoy.user_agent_parser == :device_detector
+ DeviceDetector.new(request.user_agent).bot?
+ else
+ Browser.new(request.user_agent).bot?
+ end
+ else
+ false
+ end
+ end
+ end
+
+ @bot
end
def exclude_by_method?
ahoy/visit_properties.rb b/lib/ahoy/visit_properties.rb +35 -24
@@ @@ -1,4 +1,5 @@
require "browser"
+ require "device_detector"
require "referer-parser"
require "user_agent_parser"
@@ @@ -41,32 +42,42 @@ module Ahoy
end
def tech_properties
- # cache for performance
- @@user_agent_parser ||= UserAgentParser::Parser.new
+ if Ahoy.user_agent_parser == :device_detector
+ client = DeviceDetector.new(request.user_agent)
- user_agent = request.user_agent
- agent = @@user_agent_parser.parse(user_agent)
- browser = Browser.new(user_agent)
- device_type =
- if browser.bot?
- "Bot"
- elsif browser.device.tv?
- "TV"
- elsif browser.device.console?
- "Console"
- elsif browser.device.tablet?
- "Tablet"
- elsif browser.device.mobile?
- "Mobile"
- else
- "Desktop"
- end
+ {
+ browser: client.name,
+ os: client.os_name,
+ device_type: client.device_type.try(:titleize)
+ }
+ else
+ # cache for performance
+ @@user_agent_parser ||= UserAgentParser::Parser.new
- {
- browser: agent.name,
- os: agent.os.name,
- device_type: device_type,
- }
+ user_agent = request.user_agent
+ agent = @@user_agent_parser.parse(user_agent)
+ browser = Browser.new(user_agent)
+ device_type =
+ if browser.bot?
+ "Bot"
+ elsif browser.device.tv?
+ "TV"
+ elsif browser.device.console?
+ "Console"
+ elsif browser.device.tablet?
+ "Tablet"
+ elsif browser.device.mobile?
+ "Mobile"
+ else
+ "Desktop"
+ end
+
+ {
+ browser: agent.name,
+ os: agent.os.name,
+ device_type: device_type
+ }
+ end
end
# masking based on Google Analytics anonymization
generators/ahoy/templates/database_store_initializer.rb b/lib/generators/ahoy/templates/database_store_initializer.rb +3 -0
@@ @@ -3,3 +3,6 @@ end
# set to true for JavaScript tracking
Ahoy.api = false
+
+ # better user agent parsing
+ Ahoy.user_agent_parser = :device_detector