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 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