user_agent_parser 2.9.0 → 2.12.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 +4 -4
- data/lib/user_agent_parser/parser.rb +16 -8
- data/lib/user_agent_parser/version.rb +8 -3
- data/vendor/uap-core/regexes.yaml +83 -9
- metadata +3 -3
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 7994324d50b5df6f804fbdb9af163f3f0f289d2e960c00ea4eacc3db560bba3e
|
|
4
|
+
data.tar.gz: 168efdf63dfacf1a687e33db092bd226428f3279d995d6bf6b8b89fdd9056121
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 275dfd67d2357655407fa09dcea6959d15bd184cba1f3cd1607108d0a72548c44a2e8d015bd230ed3adcec9036d79035c969a98eb499fe83efbab97360055fea
|
|
7
|
+
data.tar.gz: 708f4ce8447e4fa0474f5798c4e155699a85555191ffda29ec528c1dd3d835a968520ff9ea88af1c9e3c075bbf4603003a756d5e40b862f7ad8af6607d3e1570
|
|
@@ -38,16 +38,24 @@ module UserAgentParser
|
|
|
38
38
|
private
|
|
39
39
|
|
|
40
40
|
def load_patterns(path)
|
|
41
|
-
yml =
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
patterns.each do |pattern|
|
|
46
|
-
pattern[:regex] = Regexp.new(pattern['regex'], pattern['regex_flag'] == 'i')
|
|
47
|
-
end
|
|
41
|
+
yml = begin
|
|
42
|
+
YAML.load_file(path, freeze: true)
|
|
43
|
+
rescue ArgumentError
|
|
44
|
+
YAML.load_file(path)
|
|
48
45
|
end
|
|
46
|
+
[
|
|
47
|
+
parse_pattern(yml['user_agent_parsers']),
|
|
48
|
+
parse_pattern(yml['os_parsers']),
|
|
49
|
+
parse_pattern(yml['device_parsers']),
|
|
50
|
+
]
|
|
51
|
+
end
|
|
49
52
|
|
|
50
|
-
|
|
53
|
+
def parse_pattern(patterns)
|
|
54
|
+
patterns.map do |pattern|
|
|
55
|
+
pattern = pattern.dup
|
|
56
|
+
pattern[:regex] = Regexp.new(pattern.delete('regex'), pattern.delete('regex_flag') == 'i')
|
|
57
|
+
pattern
|
|
58
|
+
end
|
|
51
59
|
end
|
|
52
60
|
|
|
53
61
|
def parse_ua(user_agent, 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
|
-
|
|
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
|
|
@@ -213,6 +213,10 @@ user_agent_parsers:
|
|
|
213
213
|
- regex: '(Twitter for (?:iPhone|iPad)|TwitterAndroid)(?:\/(\d+)\.(\d+)|)'
|
|
214
214
|
family_replacement: 'Twitter'
|
|
215
215
|
|
|
216
|
+
# Phantom app
|
|
217
|
+
- regex: 'Mozilla.{1,200}Mobile.{1,100}(Phantom\/ios|android).(\d+)\.(\d+)\.(\d+)'
|
|
218
|
+
family_replacement: 'Phantom'
|
|
219
|
+
|
|
216
220
|
# aspiegel.com spider (owned by Huawei)
|
|
217
221
|
- regex: 'Mozilla.{1,100}Mobile.{1,100}AspiegelBot'
|
|
218
222
|
family_replacement: 'Spider'
|
|
@@ -381,7 +385,7 @@ user_agent_parsers:
|
|
|
381
385
|
# Edge Mobile
|
|
382
386
|
- regex: 'Windows Phone .{0,200}(Edge)/(\d+)\.(\d+)'
|
|
383
387
|
family_replacement: 'Edge Mobile'
|
|
384
|
-
- regex: '(EdgiOS|EdgA)/(\d+)\.(\d+)\.(\d+)
|
|
388
|
+
- regex: '(EdgiOS|EdgA)/(\d+)\.(\d+)\.(\d+)(?:\.(\d+)|)'
|
|
385
389
|
family_replacement: 'Edge Mobile'
|
|
386
390
|
|
|
387
391
|
# Samsung Internet (based on Chrome, but lacking some features)
|
|
@@ -517,6 +521,10 @@ user_agent_parsers:
|
|
|
517
521
|
# Palo Alto GlobalProtect Linux
|
|
518
522
|
- regex: 'PAN (GlobalProtect)/(\d+)\.(\d+)\.(\d+) .{1,100} \(X11; Linux x86_64\)'
|
|
519
523
|
|
|
524
|
+
# Surveyon https://www.surveyon.com/
|
|
525
|
+
- regex: '^(surveyon)/(\d+)\.(\d+)\.(\d+)'
|
|
526
|
+
family_replacement: 'Surveyon'
|
|
527
|
+
|
|
520
528
|
#### END SPECIAL CASES TOP ####
|
|
521
529
|
|
|
522
530
|
#### MAIN CASES - this catches > 50% of all browsers ####
|
|
@@ -1005,6 +1013,11 @@ user_agent_parsers:
|
|
|
1005
1013
|
# HTTrack crawler
|
|
1006
1014
|
- regex: '\b(HTTrack) (\d+)\.(\d+)(?:[\.\-](\d+)|)'
|
|
1007
1015
|
|
|
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'
|
|
1020
|
+
|
|
1008
1021
|
os_parsers:
|
|
1009
1022
|
##########
|
|
1010
1023
|
# HbbTV vendors
|
|
@@ -1115,6 +1128,7 @@ os_parsers:
|
|
|
1115
1128
|
|
|
1116
1129
|
# Android 9; Android 10;
|
|
1117
1130
|
- regex: '(Android) (\d+);'
|
|
1131
|
+
- regex: '(Android): (\d+)(?:\.(\d+)(?:\.(\d+)|)|);'
|
|
1118
1132
|
|
|
1119
1133
|
# UCWEB
|
|
1120
1134
|
- regex: '^UCWEB.{0,200}; (Adr) (\d+)\.(\d+)(?:[.\-]([a-z0-9]{1,100})|);'
|
|
@@ -1539,9 +1553,48 @@ os_parsers:
|
|
|
1539
1553
|
os_replacement: 'iOS'
|
|
1540
1554
|
os_v1_replacement: '14'
|
|
1541
1555
|
os_v2_replacement: '5'
|
|
1556
|
+
- regex: 'CFNetwork/12.{0,100} Darwin/20\.5\.\d+'
|
|
1557
|
+
os_replacement: 'iOS'
|
|
1558
|
+
os_v1_replacement: '14'
|
|
1559
|
+
os_v2_replacement: '6'
|
|
1560
|
+
- regex: 'CFNetwork/12.{0,100} Darwin/20\.6\.\d+'
|
|
1561
|
+
os_replacement: 'iOS'
|
|
1562
|
+
os_v1_replacement: '14'
|
|
1563
|
+
os_v2_replacement: '8'
|
|
1542
1564
|
- regex: 'CFNetwork/.{0,100} Darwin/(20)\.\d+'
|
|
1543
1565
|
os_replacement: 'iOS'
|
|
1544
1566
|
os_v1_replacement: '14'
|
|
1567
|
+
- regex: 'CFNetwork/13.{0,100} Darwin/21\.0\.\d+'
|
|
1568
|
+
os_replacement: 'iOS'
|
|
1569
|
+
os_v1_replacement: '15'
|
|
1570
|
+
os_v2_replacement: '0'
|
|
1571
|
+
- regex: 'CFNetwork/13.{0,100} Darwin/21\.1\.\d+'
|
|
1572
|
+
os_replacement: 'iOS'
|
|
1573
|
+
os_v1_replacement: '15'
|
|
1574
|
+
os_v2_replacement: '1'
|
|
1575
|
+
- regex: 'CFNetwork/13.{0,100} Darwin/21\.2\.\d+'
|
|
1576
|
+
os_replacement: 'iOS'
|
|
1577
|
+
os_v1_replacement: '15'
|
|
1578
|
+
os_v2_replacement: '2'
|
|
1579
|
+
- regex: 'CFNetwork/13.{0,100} Darwin/21\.3\.\d+'
|
|
1580
|
+
os_replacement: 'iOS'
|
|
1581
|
+
os_v1_replacement: '15'
|
|
1582
|
+
os_v2_replacement: '3'
|
|
1583
|
+
- regex: 'CFNetwork/13.{0,100} Darwin/21\.4\.\d+'
|
|
1584
|
+
os_replacement: 'iOS'
|
|
1585
|
+
os_v1_replacement: '15'
|
|
1586
|
+
os_v2_replacement: '4'
|
|
1587
|
+
- regex: 'CFNetwork/13.{0,100} Darwin/21\.5\.\d+'
|
|
1588
|
+
os_replacement: 'iOS'
|
|
1589
|
+
os_v1_replacement: '15'
|
|
1590
|
+
os_v2_replacement: '5'
|
|
1591
|
+
- regex: 'CFNetwork/13.{0,100} Darwin/21\.6\.\d+'
|
|
1592
|
+
os_replacement: 'iOS'
|
|
1593
|
+
os_v1_replacement: '15'
|
|
1594
|
+
os_v2_replacement: '6'
|
|
1595
|
+
- regex: 'CFNetwork/.{0,100} Darwin/(21)\.\d+'
|
|
1596
|
+
os_replacement: 'iOS'
|
|
1597
|
+
os_v1_replacement: '15'
|
|
1545
1598
|
- regex: 'CFNetwork/.{0,100} Darwin/'
|
|
1546
1599
|
os_replacement: 'iOS'
|
|
1547
1600
|
|
|
@@ -1724,7 +1777,7 @@ os_parsers:
|
|
|
1724
1777
|
|
|
1725
1778
|
# just os
|
|
1726
1779
|
- regex: '(Windows|Android|WeTab|Maemo|Web0S)'
|
|
1727
|
-
- regex: '(Ubuntu|Kubuntu|Arch Linux|CentOS|Slackware|Gentoo|openSUSE|SUSE|Red Hat|Fedora|PCLinuxOS|Mageia|(?:Free|Open|Net|\b)BSD)'
|
|
1780
|
+
- regex: '(Ubuntu|Kubuntu|Arch Linux|CentOS|Slackware|Gentoo|openSUSE|SUSE|Red Hat|Fedora|PCLinuxOS|Mageia|SerenityOS|(?:Free|Open|Net|\b)BSD)'
|
|
1728
1781
|
# Linux + Kernel Version
|
|
1729
1782
|
- regex: '(Linux)(?:[ /](\d+)\.(\d+)(?:\.(\d+)|)|)'
|
|
1730
1783
|
- regex: 'SunOS'
|
|
@@ -2456,10 +2509,6 @@ device_parsers:
|
|
|
2456
2509
|
device_replacement: 'Dell $1'
|
|
2457
2510
|
brand_replacement: 'Dell'
|
|
2458
2511
|
model_replacement: '$1'
|
|
2459
|
-
- regex: '; {0,2}Dell ([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
|
|
2460
|
-
device_replacement: 'Dell $1'
|
|
2461
|
-
brand_replacement: 'Dell'
|
|
2462
|
-
model_replacement: '$1'
|
|
2463
2512
|
|
|
2464
2513
|
#########
|
|
2465
2514
|
# Denver
|
|
@@ -2666,10 +2715,14 @@ device_parsers:
|
|
|
2666
2715
|
device_replacement: '$1'
|
|
2667
2716
|
brand_replacement: 'Google'
|
|
2668
2717
|
model_replacement: '$1'
|
|
2669
|
-
- regex: '; {0,2}(Pixel
|
|
2670
|
-
device_replacement: '$
|
|
2718
|
+
- regex: '; {0,2}([g|G]oogle)? (Pixel[ a-zA-z0-9]{1,100});(?: Build|.{0,50}\) AppleWebKit)'
|
|
2719
|
+
device_replacement: '$2'
|
|
2671
2720
|
brand_replacement: 'Google'
|
|
2672
|
-
model_replacement: '$
|
|
2721
|
+
model_replacement: '$2'
|
|
2722
|
+
- regex: '; {0,2}([g|G]oogle)? (Pixel.{0,200}?)(?: Build|\) AppleWebKit)'
|
|
2723
|
+
device_replacement: '$2'
|
|
2724
|
+
brand_replacement: 'Google'
|
|
2725
|
+
model_replacement: '$2'
|
|
2673
2726
|
|
|
2674
2727
|
#########
|
|
2675
2728
|
# Gigabyte
|
|
@@ -3796,6 +3849,18 @@ device_parsers:
|
|
|
3796
3849
|
device_replacement: 'OnePlus $1'
|
|
3797
3850
|
brand_replacement: 'OnePlus'
|
|
3798
3851
|
model_replacement: '$1'
|
|
3852
|
+
- regex: '; {0,2}(HD1903|GM1917|IN2025|LE2115|LE2127|HD1907|BE2012|BE2025|BE2026|BE2028|BE2029|DE2117|DE2118|EB2101|GM1900|GM1910|GM1915|HD1905|HD1925|IN2015|IN2017|IN2019|KB2005|KB2007|LE2117|LE2125|BE2015|GM1903|HD1900|HD1901|HD1910|HD1913|IN2010|IN2013|IN2020|LE2111|LE2120|LE2121|LE2123|BE2011|IN2023|KB2003|LE2113|NE2215|DN2101)(?: Build|\) AppleWebKit)'
|
|
3853
|
+
device_replacement: 'OnePlus $1'
|
|
3854
|
+
brand_replacement: 'OnePlus'
|
|
3855
|
+
model_replacement: 'OnePlus $1'
|
|
3856
|
+
- regex: '; (OnePlus[ a-zA-z0-9]{0,50});((?: Build|.{0,50}\) AppleWebKit))'
|
|
3857
|
+
device_replacement: '$1'
|
|
3858
|
+
brand_replacement: 'OnePlus'
|
|
3859
|
+
model_replacement: '$1'
|
|
3860
|
+
- regex: '; (OnePlus[ a-zA-z0-9]{0,50})((?: Build|\) AppleWebKit))'
|
|
3861
|
+
device_replacement: '$1'
|
|
3862
|
+
brand_replacement: 'OnePlus'
|
|
3863
|
+
model_replacement: '$1'
|
|
3799
3864
|
|
|
3800
3865
|
#########
|
|
3801
3866
|
# Orion
|
|
@@ -5476,6 +5541,15 @@ device_parsers:
|
|
|
5476
5541
|
device_replacement: 'Motorola $1'
|
|
5477
5542
|
brand_replacement: 'Motorola'
|
|
5478
5543
|
model_replacement: '$1'
|
|
5544
|
+
- regex: '; (moto[ a-zA-z0-9()]{0,50});((?: Build|.{0,50}\) AppleWebKit))'
|
|
5545
|
+
device_replacement: '$1'
|
|
5546
|
+
brand_replacement: 'Motorola'
|
|
5547
|
+
model_replacement: '$1'
|
|
5548
|
+
- regex: '; {0,2}(moto)(.{0,50})(?: Build|\) AppleWebKit)'
|
|
5549
|
+
device_replacement: 'Motorola$2'
|
|
5550
|
+
brand_replacement: 'Motorola'
|
|
5551
|
+
model_replacement: '$2'
|
|
5552
|
+
|
|
5479
5553
|
|
|
5480
5554
|
##########
|
|
5481
5555
|
# nintendo
|
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.
|
|
4
|
+
version: 2.12.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-
|
|
11
|
+
date: 2022-10-21 00:00:00.000000000 Z
|
|
12
12
|
dependencies: []
|
|
13
13
|
description: A simple, comprehensive Ruby gem for parsing user agent strings with
|
|
14
14
|
the help of BrowserScope's UA database
|
|
@@ -47,7 +47,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
47
47
|
- !ruby/object:Gem::Version
|
|
48
48
|
version: '0'
|
|
49
49
|
requirements: []
|
|
50
|
-
rubygems_version: 3.3.
|
|
50
|
+
rubygems_version: 3.3.24
|
|
51
51
|
signing_key:
|
|
52
52
|
specification_version: 4
|
|
53
53
|
summary: A simple, comprehensive Ruby gem for parsing user agent strings with the
|