user_agent_parser 2.7.0 → 2.16.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: f36ea17c827ff0d9a4a57841e491bafed8ae2c3a5caea5af858d6cdbb580d897
4
- data.tar.gz: 48cce3afc9daaf42f180ce5564c9fc37c5fb288c115e93bb20b6291d43ae452f
3
+ metadata.gz: a48095209e88dd1c8b49954029334bddecbbb1facb44cbf3b2ed5e700b259541
4
+ data.tar.gz: 06b14639160f7cdc6f3b0cc0ffc88147cee9cd1b92dc8a10ad61a420edb4a5fb
5
5
  SHA512:
6
- metadata.gz: 4c695d6238bb7542309a94daaea5149109aca5c0f4a1205d7a078f5182eb2d02ea768bf0884803d59a0d2f4f4f57a5ddbb8750d523469f028fcdc0b88f3f56c4
7
- data.tar.gz: 39fa0993955155d19eabb8f31356173bfda97b2e430ce469d895713421c793ad047d327a50f1165e64861064ded84ae977a782fdbef078b6229f1c347b8f2113
6
+ metadata.gz: 94d1c6ad450918654bf5c6b9e9aaffd6ba3e28a01d17741a4443dc63110c30d310b81654de91297e9ce79ec31de3da40d8088d792cb100aca91d486b5410cf67
7
+ data.tar.gz: be73315646276e7ab2db8ce86cc54e5802fcd6cff84c8176c2af9db935911f853606edada097ac1ab471c5b9b4557363b27099412388599279790edf10882565
@@ -4,6 +4,8 @@ require 'yaml'
4
4
 
5
5
  module UserAgentParser
6
6
  class Parser
7
+ extend Gem::Deprecate
8
+
7
9
  FAMILY_REPLACEMENT_KEYS = %w[
8
10
  family_replacement
9
11
  v1_replacement
@@ -22,11 +24,13 @@ module UserAgentParser
22
24
 
23
25
  private_constant :FAMILY_REPLACEMENT_KEYS, :OS_REPLACEMENT_KEYS
24
26
 
25
- attr_reader :patterns_path
27
+ attr_reader :patterns_paths
28
+
29
+ def initialize(patterns_path: nil, patterns_paths: [])
30
+ @patterns_paths = [patterns_path, *patterns_paths].compact
31
+ @patterns_paths = [UserAgentParser::DefaultPatternsPath] if @patterns_paths.empty?
26
32
 
27
- def initialize(options = {})
28
- @patterns_path = options[:patterns_path] || UserAgentParser::DefaultPatternsPath
29
- @ua_patterns, @os_patterns, @device_patterns = load_patterns(patterns_path)
33
+ @ua_patterns, @os_patterns, @device_patterns = load_patterns(@patterns_paths)
30
34
  end
31
35
 
32
36
  def parse(user_agent)
@@ -35,19 +39,24 @@ module UserAgentParser
35
39
  parse_ua(user_agent, os, device)
36
40
  end
37
41
 
38
- private
39
-
40
- def load_patterns(path)
41
- yml = YAML.load_file(path)
42
+ def parse_os(user_agent)
43
+ pattern, match = first_pattern_match(@os_patterns, user_agent)
42
44
 
43
- # Parse all the regexs
44
- yml.each_pair do |_type, patterns|
45
- patterns.each do |pattern|
46
- pattern[:regex] = Regexp.new(pattern['regex'], pattern['regex_flag'] == 'i')
47
- end
45
+ if match
46
+ os_from_pattern_match(pattern, match)
47
+ else
48
+ OperatingSystem.new
48
49
  end
50
+ end
51
+
52
+ def parse_device(user_agent)
53
+ pattern, match = first_pattern_match(@device_patterns, user_agent)
49
54
 
50
- [yml['user_agent_parsers'], yml['os_parsers'], yml['device_parsers']]
55
+ if match
56
+ device_from_pattern_match(pattern, match)
57
+ else
58
+ Device.new
59
+ end
51
60
  end
52
61
 
53
62
  def parse_ua(user_agent, os = nil, device = nil)
@@ -60,44 +69,48 @@ module UserAgentParser
60
69
  end
61
70
  end
62
71
 
63
- def parse_os(user_agent)
64
- pattern, match = first_pattern_match(@os_patterns, user_agent)
72
+ def patterns_path
73
+ patterns_paths.first
74
+ end
75
+ deprecate :patterns_path, :patterns_paths, 2022, 12
65
76
 
66
- if match
67
- os_from_pattern_match(pattern, match)
68
- else
69
- OperatingSystem.new
77
+ private
78
+
79
+ def load_patterns(patterns_paths)
80
+ patterns_paths.each_with_object([[], [], []]) do |path, patterns|
81
+ ua_patterns, os_patterns, device_patterns = load_patterns_file(path)
82
+ patterns[0] += ua_patterns
83
+ patterns[1] += os_patterns
84
+ patterns[2] += device_patterns
70
85
  end
71
86
  end
72
87
 
73
- def parse_device(user_agent)
74
- pattern, match = first_pattern_match(@device_patterns, user_agent)
75
-
76
- if match
77
- device_from_pattern_match(pattern, match)
78
- else
79
- Device.new
88
+ def load_patterns_file(path)
89
+ yml = begin
90
+ YAML.load_file(path, freeze: true)
91
+ rescue ArgumentError
92
+ YAML.load_file(path)
80
93
  end
94
+ [
95
+ parse_pattern(yml['user_agent_parsers']),
96
+ parse_pattern(yml['os_parsers']),
97
+ parse_pattern(yml['device_parsers']),
98
+ ]
81
99
  end
82
100
 
83
- if Gem::Version.new(RUBY_VERSION) >= Gem::Version.new('2.4.0')
84
- def first_pattern_match(patterns, value)
85
- patterns.each do |pattern|
86
- if pattern[:regex].match?(value)
87
- return [pattern, pattern[:regex].match(value)]
88
- end
89
- end
90
- nil
101
+ def parse_pattern(patterns)
102
+ patterns.map do |pattern|
103
+ pattern = pattern.dup
104
+ pattern[:regex] = Regexp.new(pattern.delete('regex'), pattern.delete('regex_flag') == 'i')
105
+ pattern
91
106
  end
92
- else
93
- def first_pattern_match(patterns, value)
94
- patterns.each do |pattern|
95
- if (match = pattern[:regex].match(value))
96
- return [pattern, match]
97
- end
98
- end
99
- nil
107
+ end
108
+
109
+ def first_pattern_match(patterns, value)
110
+ patterns.each do |pattern|
111
+ return [pattern, pattern[:regex].match(value)] if pattern[:regex].match?(value)
100
112
  end
113
+ nil
101
114
  end
102
115
 
103
116
  def user_agent_from_pattern_match(pattern, match, os = nil, device = nil)
@@ -1,10 +1,14 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require 'rubygems/version'
4
+
3
5
  module UserAgentParser
4
6
  class Version
7
+ include Comparable
8
+
5
9
  # Private: Regex used to split string version string into major, minor,
6
10
  # patch, and patch_minor.
7
- SEGMENTS_REGEX = /\d+\-\d+|\d+[a-zA-Z]+$|\d+|[A-Za-z][0-9A-Za-z-]*$/
11
+ SEGMENTS_REGEX = /\d+\-\d+|\d+[a-zA-Z]+$|\d+|[A-Za-z][0-9A-Za-z-]*$/.freeze
8
12
 
9
13
  attr_reader :version
10
14
  alias to_s version
@@ -45,9 +49,10 @@ module UserAgentParser
45
49
  version == other.version
46
50
  end
47
51
 
48
- alias == eql?
52
+ def <=>(other)
53
+ Gem::Version.new(version).<=>(Gem::Version.new(other.to_s))
54
+ end
49
55
 
50
- # Private
51
56
  def segments
52
57
  @segments ||= version.scan(SEGMENTS_REGEX)
53
58
  end
@@ -10,7 +10,7 @@ module UserAgentParser
10
10
  DefaultPatternsPath = File.join(File.dirname(__FILE__), '../vendor/uap-core/regexes.yaml')
11
11
 
12
12
  # Parse the given +user_agent_string+, returning a +UserAgent+
13
- def self.parse(user_agent_string, options = {})
14
- Parser.new(options).parse(user_agent_string)
13
+ def self.parse(user_agent_string, **args)
14
+ Parser.new(**args).parse(user_agent_string)
15
15
  end
16
16
  end