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 |