user_agent_parser 2.13.0 → 2.17.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 5f014ae2d784eb25f63242a361c9c9186ad108c7199fd1655944da1dcfeaff28
4
- data.tar.gz: 36357407d451f17dada0fa4115f5f19e8a69af6932a1c3fc999ecd55abc958a0
3
+ metadata.gz: fdc5b924cd5f11fa40712079c1bfa1aeed05171fcfe764293891d5692c0279c2
4
+ data.tar.gz: fc490168e565d73ad85f278780536641ce519a1b45ab9a52391b85d33c45b171
5
5
  SHA512:
6
- metadata.gz: 1dfc2207de8b2345dcf21a0f271122f96259165fe115397ecb290f9fb07a9924e399554a5f23110c27f24976feae5b189a9a482386bb9f60d74ce542625eda61
7
- data.tar.gz: 7abd96ee88bcca1d800323d3d9fd2f508b0b36dc20885a79e5bdfb58154a48a00ed60b0f7750e3eb0fd6570bbbebaac48355f5ba250c35f05ace615c41baa5d5
6
+ metadata.gz: f6cbf21d3149089e420a32e2f97f205eac6ef6189767bd3b28e42f9c9189dbbcf46c83b02ebaad5916d621a1494e4300339bfc8e2da688c7017a810cab6430a2
7
+ data.tar.gz: 967b44d72866580bbc24dcd772547e53b13def915207c3848c68035d07a621ffec3bd4da76e95218fe1639316cca3458b89206dd19a1e90b497d2cc5a3957a3a
@@ -39,6 +39,36 @@ module UserAgentParser
39
39
  parse_ua(user_agent, os, device)
40
40
  end
41
41
 
42
+ def parse_os(user_agent)
43
+ pattern, match = first_pattern_match(@os_patterns, user_agent)
44
+
45
+ if match
46
+ os_from_pattern_match(pattern, match)
47
+ else
48
+ OperatingSystem.new
49
+ end
50
+ end
51
+
52
+ def parse_device(user_agent)
53
+ pattern, match = first_pattern_match(@device_patterns, user_agent)
54
+
55
+ if match
56
+ device_from_pattern_match(pattern, match)
57
+ else
58
+ Device.new
59
+ end
60
+ end
61
+
62
+ def parse_ua(user_agent, os = nil, device = nil)
63
+ pattern, match = first_pattern_match(@ua_patterns, user_agent)
64
+
65
+ if match
66
+ user_agent_from_pattern_match(pattern, match, os, device)
67
+ else
68
+ UserAgent.new(nil, nil, os, device)
69
+ end
70
+ end
71
+
42
72
  def patterns_path
43
73
  patterns_paths.first
44
74
  end
@@ -76,36 +106,6 @@ module UserAgentParser
76
106
  end
77
107
  end
78
108
 
79
- def parse_ua(user_agent, os = nil, device = nil)
80
- pattern, match = first_pattern_match(@ua_patterns, user_agent)
81
-
82
- if match
83
- user_agent_from_pattern_match(pattern, match, os, device)
84
- else
85
- UserAgent.new(nil, nil, os, device)
86
- end
87
- end
88
-
89
- def parse_os(user_agent)
90
- pattern, match = first_pattern_match(@os_patterns, user_agent)
91
-
92
- if match
93
- os_from_pattern_match(pattern, match)
94
- else
95
- OperatingSystem.new
96
- end
97
- end
98
-
99
- def parse_device(user_agent)
100
- pattern, match = first_pattern_match(@device_patterns, user_agent)
101
-
102
- if match
103
- device_from_pattern_match(pattern, match)
104
- else
105
- Device.new
106
- end
107
- end
108
-
109
109
  def first_pattern_match(patterns, value)
110
110
  patterns.each do |pattern|
111
111
  return [pattern, pattern[:regex].match(value)] if pattern[:regex].match?(value)
@@ -78,6 +78,9 @@ user_agent_parsers:
78
78
  # 'Mozilla/5.0 (Unknown; Linux x86_64) AppleWebKit/534.34 (KHTML, like Gecko) PingdomTMS/0.8.5 Safari/534.34'
79
79
  - regex: '(PingdomTMS)/(\d+)\.(\d+)\.(\d+)'
80
80
  family_replacement: 'PingdomBot'
81
+ # 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Ubuntu Chromium/61.0.3163.100 Chrome/61.0.3163.100 Safari/537.36 PingdomPageSpeed/1.0 (pingbot/2.0; +http://www.pingdom.com/)'
82
+ - regex: '(PingdomPageSpeed)/(\d+)\.(\d+)'
83
+ family_replacement: 'PingdomBot'
81
84
 
82
85
  # PTST / WebPageTest.org crawlers
83
86
  - regex: ' (PTST)/(\d+)(?:\.(\d+)|)$'
@@ -214,14 +217,14 @@ user_agent_parsers:
214
217
  family_replacement: 'Twitter'
215
218
 
216
219
  # Phantom app
217
- - regex: 'Mozilla.{1,200}Mobile.{1,100}(Phantom\/ios|android).(\d+)\.(\d+)\.(\d+)'
220
+ - regex: 'Mozilla.{1,200}Mobile.{1,100}(Phantom\/ios|Phantom\/android).(\d+)\.(\d+)\.(\d+)'
218
221
  family_replacement: 'Phantom'
219
222
 
220
- # aspiegel.com spider (owned by Huawei)
221
- - regex: 'Mozilla.{1,100}Mobile.{1,100}AspiegelBot'
223
+ # aspiegel.com spider (owned by Huawei, later called PetalBot)
224
+ - regex: 'Mozilla.{1,100}Mobile.{1,100}(AspiegelBot|PetalBot)'
222
225
  family_replacement: 'Spider'
223
226
 
224
- - regex: 'AspiegelBot'
227
+ - regex: 'AspiegelBot|PetalBot'
225
228
  family_replacement: 'Spider'
226
229
 
227
230
  # Basilisk
@@ -385,9 +388,13 @@ user_agent_parsers:
385
388
  # Edge Mobile
386
389
  - regex: 'Windows Phone .{0,200}(Edge)/(\d+)\.(\d+)'
387
390
  family_replacement: 'Edge Mobile'
388
- - regex: '(EdgiOS|EdgA)/(\d+)\.(\d+)\.(\d+)(?:\.(\d+)|)'
391
+ - regex: '(EdgiOS|EdgA)/(\d+)(?:\.(\d+)|)(?:\.(\d+)|)(?:\.(\d+)|)'
389
392
  family_replacement: 'Edge Mobile'
390
393
 
394
+ # Oculus Browser, should go before Samsung Internet
395
+ - regex: '(OculusBrowser)/(\d+)\.(\d+).0.0(?:\.([0-9\-]+)|)'
396
+ family_replacement: 'Oculus Browser'
397
+
391
398
  # Samsung Internet (based on Chrome, but lacking some features)
392
399
  - regex: '(SamsungBrowser)/(\d+)\.(\d+)'
393
400
  family_replacement: 'Samsung Internet'
@@ -450,6 +457,12 @@ user_agent_parsers:
450
457
  - regex: '(Tenta/)(\d+)\.(\d+)\.(\d+)'
451
458
  family_replacement: 'Tenta Browser'
452
459
 
460
+ # Ecosia on iOS / Android
461
+ - regex: '(Ecosia) ios@(\d+)\.(\d+)\.(\d+)\.(\d+)'
462
+ family_replacement: 'Ecosia iOS'
463
+ - regex: '(Ecosia) android@(\d+)\.(\d+)\.(\d+)\.(\d+)'
464
+ family_replacement: 'Ecosia Android'
465
+
453
466
  # Chrome Mobile
454
467
  - regex: 'Version/.{1,300}(Chrome)/(\d+)\.(\d+)\.(\d+)\.(\d+)'
455
468
  family_replacement: 'Chrome Mobile WebView'
@@ -457,7 +470,7 @@ user_agent_parsers:
457
470
  family_replacement: 'Chrome Mobile WebView'
458
471
  - regex: '(CrMo)/(\d+)\.(\d+)\.(\d+)\.(\d+)'
459
472
  family_replacement: 'Chrome Mobile'
460
- - regex: '(CriOS)/(\d+)\.(\d+)\.(\d+)\.(\d+)'
473
+ - regex: '(CriOS)/(\d+)(?:\.(\d+)|)(?:\.(\d+)|)(?:\.(\d+)|)'
461
474
  family_replacement: 'Chrome Mobile iOS'
462
475
  - regex: '(Chrome)/(\d+)\.(\d+)\.(\d+)\.(\d+) Mobile(?:[ /]|$)'
463
476
  family_replacement: 'Chrome Mobile'
@@ -921,7 +934,7 @@ user_agent_parsers:
921
934
  # AFTER THE EDGE CASES ABOVE!
922
935
  # AFTER IE11
923
936
  # BEFORE all other IE
924
- - regex: '(Firefox)/(\d+)\.(\d+)\.(\d+)'
937
+ - regex: '(Firefox)/(\d+)\.(\d+)(?:\.(\d+)|$)'
925
938
  - regex: '(Firefox)/(\d+)\.(\d+)(pre|[ab]\d+[a-z]*|)'
926
939
 
927
940
 
@@ -932,7 +945,7 @@ user_agent_parsers:
932
945
  family_replacement: 'Python Requests'
933
946
 
934
947
  # headless user-agents
935
- - regex: '\b(Windows-Update-Agent|WindowsPowerShell|Microsoft-CryptoAPI|SophosUpdateManager|SophosAgent|Debian APT-HTTP|Ubuntu APT-HTTP|libcurl-agent|libwww-perl|urlgrabber|curl|PycURL|Wget|wget2|aria2|Axel|OpenBSD ftp|lftp|jupdate|insomnia|fetch libfetch|akka-http|got|CloudCockpitBackend|ReactorNetty|axios|Jersey|Vert.x-WebClient|Apache-CXF|Go-CF-client|go-resty|AHC)(?:[ /](\d+)(?:\.(\d+)|)(?:\.(\d+)|)|)'
948
+ - regex: '\b(Windows-Update-Agent|WindowsPowerShell|Microsoft-CryptoAPI|SophosUpdateManager|SophosAgent|Debian APT-HTTP|Ubuntu APT-HTTP|libcurl-agent|libwww-perl|urlgrabber|curl|PycURL|Wget|wget2|aria2|Axel|OpenBSD ftp|lftp|jupdate|insomnia|fetch libfetch|akka-http|got|CloudCockpitBackend|ReactorNetty|axios|Jersey|Vert.x-WebClient|Apache-CXF|Go-CF-client|go-resty|AHC|HTTPie)(?:[ /](\d+)(?:\.(\d+)|)(?:\.(\d+)|)|)'
936
949
 
937
950
  # CloudFoundry
938
951
  - regex: '^(cf)\/(\d+)\.(\d+)\.(\S+)'
@@ -961,7 +974,9 @@ user_agent_parsers:
961
974
  - regex: '(Python/3\.\d{1,3} aiohttp)/(\d+)\.(\d+)\.(\d+)'
962
975
  family_replacement: 'Python aiohttp'
963
976
 
964
- - regex: '(Java)[/ ]?\d+\.(\d+)\.(\d+)[_-]*([a-zA-Z0-9]+|)'
977
+ - regex: '(Java)[/ ]?\d{1}\.(\d+)\.(\d+)[_-]*([a-zA-Z0-9]+|)'
978
+
979
+ - regex: '(Java)[/ ]?(\d+)\.(\d+)\.(\d+)'
965
980
 
966
981
  # minio-go (https://github.com/minio/minio-go)
967
982
  - regex: '(minio-go)/v(\d+)\.(\d+)\.(\d+)'
@@ -1013,10 +1028,12 @@ user_agent_parsers:
1013
1028
  # HTTrack crawler
1014
1029
  - regex: '\b(HTTrack) (\d+)\.(\d+)(?:[\.\-](\d+)|)'
1015
1030
 
1016
- # SerenityOS (https://serenityos.org)
1017
- # https://github.com/SerenityOS/serenity/blob/2e1bbcb0faeae92d7595b8e0b022a8cdcecca07e/Userland/Libraries/LibWeb/Loader/ResourceLoader.h#L27
1018
- - regex: 'SerenityOS'
1019
- family_replacement: 'SerenityOS Browser'
1031
+ # Ladybird Browser (https://ladybird.dev)
1032
+ # https://github.com/SerenityOS/serenity/blob/6a662e0d43810c1dbd56fbf0c123f258aa1d694e/Userland/Libraries/LibWeb/Loader/ResourceLoader.h#L64
1033
+ - regex: '(Ladybird)\/(\d+)\.(\d+)'
1034
+
1035
+ # MullvadBrowser (https://mullvad.net/en/browser)
1036
+ - regex: '(MullvadBrowser)/(\d+)(?:\.(\d+)|)(?:\.(\d+)|)'
1020
1037
 
1021
1038
  os_parsers:
1022
1039
  ##########
@@ -1077,8 +1094,8 @@ os_parsers:
1077
1094
  # generic HbbTV, hoping to catch manufacturer name (always after 2nd comma) and the first string that looks like a 2011-2019 year
1078
1095
  - regex: 'HbbTV/\d+\.\d+\.\d+ \(.{0,30}; ?([a-zA-Z]+) ?;.{0,30}(201[1-9]).{0,30}\)'
1079
1096
 
1080
- # aspiegel.com spider (owned by Huawei)
1081
- - regex: 'AspiegelBot'
1097
+ # aspiegel.com spider (owned by Huawei, later renamed PetalBot)
1098
+ - regex: 'AspiegelBot|PetalBot'
1082
1099
  os_replacement: 'Other'
1083
1100
 
1084
1101
  ##########
@@ -1145,6 +1162,12 @@ os_parsers:
1145
1162
  - regex: '(android)\s(?:mobile\/)(\d+)(?:\.(\d+)(?:\.(\d+)|)|)'
1146
1163
  os_replacement: 'Android'
1147
1164
 
1165
+ ##########
1166
+ # Meta Quest
1167
+ ##########
1168
+ - regex: 'Quest'
1169
+ os_replacement: 'Android'
1170
+
1148
1171
  ##########
1149
1172
  # Kindle Android
1150
1173
  ##########
@@ -1595,6 +1618,29 @@ os_parsers:
1595
1618
  - regex: 'CFNetwork/.{0,100} Darwin/(21)\.\d+'
1596
1619
  os_replacement: 'iOS'
1597
1620
  os_v1_replacement: '15'
1621
+ - regex: 'CFNetwork/.{0,100} Darwin/22\.0\.\d+'
1622
+ os_replacement: 'iOS'
1623
+ os_v1_replacement: '16'
1624
+ os_v2_replacement: '0'
1625
+ - regex: 'CFNetwork/.{0,100} Darwin/22\.1\.\d+'
1626
+ os_replacement: 'iOS'
1627
+ os_v1_replacement: '16'
1628
+ os_v2_replacement: '1'
1629
+ - regex: 'CFNetwork/.{0,100} Darwin/22\.2\.\d+'
1630
+ os_replacement: 'iOS'
1631
+ os_v1_replacement: '16'
1632
+ os_v2_replacement: '2'
1633
+ - regex: 'CFNetwork/.{0,100} Darwin/22\.3\.\d+'
1634
+ os_replacement: 'iOS'
1635
+ os_v1_replacement: '16'
1636
+ os_v2_replacement: '3'
1637
+ - regex: 'CFNetwork/.{0,100} Darwin/22\.4\.\d+'
1638
+ os_replacement: 'iOS'
1639
+ os_v1_replacement: '16'
1640
+ os_v2_replacement: '4'
1641
+ - regex: 'CFNetwork/.{0,100} Darwin/(22)\.\d+'
1642
+ os_replacement: 'iOS'
1643
+ os_v1_replacement: '16'
1598
1644
  - regex: 'CFNetwork/.{0,100} Darwin/'
1599
1645
  os_replacement: 'iOS'
1600
1646
 
@@ -1823,11 +1869,11 @@ device_parsers:
1823
1869
  brand_replacement: 'Spider'
1824
1870
 
1825
1871
  # aspiegel.com spider (owned by Huawei)
1826
- - regex: 'Mozilla.{1,100}Mobile.{1,100}AspiegelBot'
1872
+ - regex: 'Mozilla.{1,100}Mobile.{1,100}(AspiegelBot|PetalBot)'
1827
1873
  device_replacement: 'Spider'
1828
1874
  brand_replacement: 'Spider'
1829
1875
  model_replacement: 'Smartphone'
1830
- - regex: 'Mozilla.{0,200}AspiegelBot'
1876
+ - regex: 'Mozilla.{0,200}(AspiegelBot|PetalBot)'
1831
1877
  device_replacement: 'Spider'
1832
1878
  brand_replacement: 'Spider'
1833
1879
  model_replacement: 'Desktop'
@@ -3540,6 +3586,25 @@ device_parsers:
3540
3586
  brand_replacement: 'Meizu'
3541
3587
  model_replacement: '$1'
3542
3588
 
3589
+ #########
3590
+ # Meta
3591
+ # @ref: https://www.meta.com
3592
+ #########
3593
+ - regex: 'Quest 2'
3594
+ device_replacement: 'Quest'
3595
+ brand_replacement: 'Meta'
3596
+ model_replacement: 'Quest 2'
3597
+
3598
+ - regex: 'Quest Pro'
3599
+ device_replacement: 'Quest'
3600
+ brand_replacement: 'Meta'
3601
+ model_replacement: 'Quest Pro'
3602
+
3603
+ - regex: 'Quest'
3604
+ device_replacement: 'Quest'
3605
+ brand_replacement: 'Meta'
3606
+ model_replacement: 'Quest'
3607
+
3543
3608
  #########
3544
3609
  # Micromax
3545
3610
  # @ref: http://www.micromaxinfo.com
@@ -5549,7 +5614,7 @@ device_parsers:
5549
5614
  device_replacement: 'Motorola$2'
5550
5615
  brand_replacement: 'Motorola'
5551
5616
  model_replacement: '$2'
5552
-
5617
+
5553
5618
 
5554
5619
  ##########
5555
5620
  # nintendo
@@ -5558,7 +5623,7 @@ device_parsers:
5558
5623
  device_replacement: 'Nintendo Wii U'
5559
5624
  brand_replacement: 'Nintendo'
5560
5625
  model_replacement: 'Wii U'
5561
- - regex: 'Nintendo (DS|3DS|DSi|Wii);'
5626
+ - regex: 'Nintendo (Switch|DS|3DS|DSi|Wii);'
5562
5627
  device_replacement: 'Nintendo $1'
5563
5628
  brand_replacement: 'Nintendo'
5564
5629
  model_replacement: '$1'
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: user_agent_parser
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.13.0
4
+ version: 2.17.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Tim Lucas
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-10-21 00:00:00.000000000 Z
11
+ date: 2024-02-24 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: |
14
14
  A simple, comprehensive Ruby gem for parsing user agent strings
@@ -48,7 +48,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
48
48
  - !ruby/object:Gem::Version
49
49
  version: '0'
50
50
  requirements: []
51
- rubygems_version: 3.3.24
51
+ rubygems_version: 3.5.6
52
52
  signing_key:
53
53
  specification_version: 4
54
54
  summary: Parsing user agent strings with the help of BrowserScope's UA database