user_agent_parser 2.9.0 → 2.12.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: e146a340177d9e5da3ebff10e71ade5807ad18df7bca416bd26a61411a6fdb29
4
- data.tar.gz: 83cdf6802012c7dc13ae4903f48cf2067eb0c1628a0b9d47d7ae7e637dc184c3
3
+ metadata.gz: 7994324d50b5df6f804fbdb9af163f3f0f289d2e960c00ea4eacc3db560bba3e
4
+ data.tar.gz: 168efdf63dfacf1a687e33db092bd226428f3279d995d6bf6b8b89fdd9056121
5
5
  SHA512:
6
- metadata.gz: 3218daf983c026c182e73e175d8a54db89460001a1e7665e13ccaf0965d6821fb9bd3ab3002651b11ffab9bfc154fd54c41a9f3ba6c7325c6ee9abb6cf05b2fd
7
- data.tar.gz: 16d18d0459dca3388272e07b917933d21a1d2738b5bba308782e9723086f697ede72d8ae5badcb229d65a5eda94449a7cfd3b6c04c41b9482950167188f51cda
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 = YAML.load_file(path)
42
-
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
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
- [yml['user_agent_parsers'], yml['os_parsers'], yml['device_parsers']]
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
- 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
@@ -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+)\.(\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.{0,200}?)(?: Build|\) AppleWebKit)'
2670
- device_replacement: '$1'
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: '$1'
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.9.0
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-01-28 00:00:00.000000000 Z
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.6
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