Skip to content

Commit

Permalink
Update uap-core to 23bfabe3 + fix tests (#42)
Browse files Browse the repository at this point in the history
* Update uap-core to 23bfabe3

* Fix replacement code for OS and Family

* Fix Version parsing

* Simplify replacement

* Spelling
  • Loading branch information
wallin committed Oct 8, 2018
1 parent dd2de84 commit 90f213a
Show file tree
Hide file tree
Showing 3 changed files with 49 additions and 53 deletions.
96 changes: 45 additions & 51 deletions lib/user_agent_parser/parser.rb
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,25 @@
require 'yaml'

module UserAgentParser

class Parser
FAMILY_REPLACEMENT_KEYS = %w[
family_replacement
v1_replacement
v2_replacement
v3_replacement
v4_replacement
].freeze

OS_REPLACEMENT_KEYS = %w[
os_replacement
os_v1_replacement
os_v2_replacement
os_v3_replacement
os_v4_replacement
].freeze

private_constant :FAMILY_REPLACEMENT_KEYS, :OS_REPLACEMENT_KEYS

attr_reader :patterns_path

def initialize(options = {})
Expand Down Expand Up @@ -84,59 +101,15 @@ def first_pattern_match(patterns, value)
end

def user_agent_from_pattern_match(pattern, match, os = nil, device = nil)
family, v1, v2, v3, v4 = match[1], match[2], match[3], match[4], match[5]

if pattern['family_replacement']
family = pattern['family_replacement'].sub('$1', family || '')
end

if pattern['v1_replacement']
v1 = pattern['v1_replacement'].sub('$2', v1 || '')
end

if pattern['v2_replacement']
v2 = pattern['v2_replacement'].sub('$3', v2 || '')
end
family, *versions = from_pattern_match(FAMILY_REPLACEMENT_KEYS, pattern, match)

if pattern['v3_replacement']
v3 = pattern['v3_replacement'].sub('$4', v3 || '')
end

if pattern['v4_replacement']
v4 = pattern['v4_replacement'].sub('$5', v4 || '')
end

version = version_from_segments(v1, v2, v3, v4)

UserAgent.new(family, version, os, device)
UserAgent.new(family, version_from_segments(*versions), os, device)
end

def os_from_pattern_match(pattern, match)
os, v1, v2, v3, v4 = match[1], match[2], match[3], match[4], match[5]

if pattern['os_replacement']
os = pattern['os_replacement'].sub('$1', os || '')
end
os, *versions = from_pattern_match(OS_REPLACEMENT_KEYS, pattern, match)

if pattern['os_v1_replacement']
v1 = pattern['os_v1_replacement'].sub('$2', v1 || '')
end

if pattern['os_v2_replacement']
v2 = pattern['os_v2_replacement'].sub('$3', v2 || '')
end

if pattern['os_v3_replacement']
v3 = pattern['os_v3_replacement'].sub('$4', v3 || '')
end

if pattern['os_v4_replacement']
v4 = pattern['os_v4_replacement'].sub('$5', v4 || '')
end

version = version_from_segments(v1, v2, v3, v4)

OperatingSystem.new(os, version)
OperatingSystem.new(os, version_from_segments(*versions))
end

def device_from_pattern_match(pattern, match)
Expand All @@ -163,9 +136,30 @@ def device_from_pattern_match(pattern, match)
Device.new(family.strip, model, brand)
end

# Maps replacement keys to their values
def from_pattern_match(keys, pattern, match)
keys.each_with_index.map do |key, idx|
# Check if there is any replacement specified
if pattern[key]
interpolate(pattern[key], match)
else
# No replacement defined, just return correct match group
match[idx + 1]
end
end
end

# Interpolates a string with data from matches if specified
def interpolate(replacement, match)
group_idx = replacement.index('$')
return replacement if group_idx.nil?
group_nbr = replacement[group_idx + 1]
replacement.sub("$#{group_nbr}", match[group_nbr.to_i])
end

def version_from_segments(*segments)
segments = segments.compact
segments.empty? ? nil : Version.new(*segments)
return if segments.all?(&:nil?)
Version.new(*segments)
end
end
end
4 changes: 3 additions & 1 deletion lib/user_agent_parser/version.rb
Original file line number Diff line number Diff line change
Expand Up @@ -11,10 +11,12 @@ class Version
alias to_s version

def initialize(*args)
# If only one string argument is given, assume a complete version string
# and attempt to parse it
if args.length == 1 && args.first.is_a?(String)
@version = args.first.to_s.strip
else
@segments = args.map(&:to_s).map(&:strip)
@segments = args.compact.map(&:to_s).map(&:strip)
@version = segments.join('.')
end
end
Expand Down
2 changes: 1 addition & 1 deletion vendor/uap-core

0 comments on commit 90f213a

Please sign in to comment.