Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 0 additions & 1 deletion Gemfile
Original file line number Diff line number Diff line change
Expand Up @@ -68,7 +68,6 @@ gem 'stringex', require: false
gem 'strong_migrations', '>= 0.4.2'
gem 'subprocess', require: false
gem 'uglifier', '~> 4.2'
gem 'user_agent_parser'
gem 'valid_email', '>= 0.1.3'
gem 'view_component', '~> 2.40.0', require: 'view_component/engine'
gem 'webauthn', '~> 2.1'
Expand Down
2 changes: 0 additions & 2 deletions Gemfile.lock
Original file line number Diff line number Diff line change
Expand Up @@ -632,7 +632,6 @@ GEM
execjs (>= 0.3.0, < 3)
unicode-display_width (2.0.0)
uniform_notifier (1.14.2)
user_agent_parser (2.7.0)
uuid (2.3.9)
macaddr (~> 1.0)
valid_email (0.1.3)
Expand Down Expand Up @@ -792,7 +791,6 @@ DEPENDENCIES
strong_migrations (>= 0.4.2)
subprocess
uglifier (~> 4.2)
user_agent_parser
valid_email (>= 0.1.3)
view_component (~> 2.40.0)
webauthn (~> 2.1)
Expand Down
2 changes: 1 addition & 1 deletion app/models/device.rb
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,6 @@ def decorate
end

def device_name
DeviceTracking::DeviceName.call(UserAgentParser::Parser.new, self)
DeviceTracking::DeviceName.call(self)
end
end
22 changes: 4 additions & 18 deletions app/services/device_tracking/device_name.rb
Original file line number Diff line number Diff line change
@@ -1,26 +1,12 @@
module DeviceTracking
class DeviceName
def self.call(parser, device)
device_user_agent = device.user_agent
user_agent = parser.parse(device_user_agent)
def self.call(device)
browser = BrowserCache.parse(device.user_agent)
I18n.t(
'account.index.device',
browser: browser(user_agent),
os: os(user_agent),
browser: "#{browser.name} #{browser.version}",
os: "#{browser.platform.name} #{browser.platform.version.split('.').first}",
)
end

def self.browser(user_agent)
version = user_agent.version
"#{user_agent.family} #{version ? version.major : ''}"
end
private_class_method :browser

def self.os(user_agent)
user_agent_os = user_agent.os
version = user_agent_os.version
"#{user_agent_os.family} #{version ? version.major : ''}"
end
private_class_method :os
end
end
4 changes: 1 addition & 3 deletions app/services/device_tracking/list_devices.rb
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,7 @@ class ListDevices
def self.call(user_id, offset, limit)
devices = Device.where(user_id: user_id).order(last_used_at: :desc).offset(offset).
limit(limit)
# heavy cost to load; instantiate once and parse in bulk
parser = UserAgentParser::Parser.new
devices.each { |device| device.nice_name = DeviceName.call(parser, device) }
devices.each { |device| device.nice_name = DeviceName.call(device) }
end
end
end
2 changes: 1 addition & 1 deletion spec/features/account/device_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,6 @@
end

scenario 'viewing devices' do
expect(page).to have_content('Chrome 71 on Mac OS X 10')
expect(page).to have_content('Chrome 71 on macOS 10')
end
end
3 changes: 1 addition & 2 deletions spec/services/device_tracking/device_name_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,10 @@

describe DeviceTracking::DeviceName do
subject { described_class }
let(:parser) { UserAgentParser::Parser }
let(:device) { create(:device) }

it 'gives a shortened os and browser name' do
result = subject.call(parser.new, device)
result = subject.call(device)

expect(result).to eq('Chrome 58 on Windows 10')
end
Expand Down