From b79c191c3c84973ce69757b40f83de891c15b869 Mon Sep 17 00:00:00 2001 From: Sergey Fursov Date: Fri, 30 Sep 2022 12:38:24 +0300 Subject: [PATCH 01/31] Add regex for the PingdomPageSpeed bot --- regexes.yaml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/regexes.yaml b/regexes.yaml index 9ce784b0..684779f2 100644 --- a/regexes.yaml +++ b/regexes.yaml @@ -78,6 +78,9 @@ user_agent_parsers: # 'Mozilla/5.0 (Unknown; Linux x86_64) AppleWebKit/534.34 (KHTML, like Gecko) PingdomTMS/0.8.5 Safari/534.34' - regex: '(PingdomTMS)/(\d+)\.(\d+)\.(\d+)' family_replacement: 'PingdomBot' + # '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/)' + - regex: '(PingdomPageSpeed)/(\d+)\.(\d+)' + family_replacement: 'PingdomBot' # PTST / WebPageTest.org crawlers - regex: ' (PTST)/(\d+)(?:\.(\d+)|)$' From 948bd79b54f138194c885a02b42fddee430f5676 Mon Sep 17 00:00:00 2001 From: Karisse Khoo Date: Wed, 26 Oct 2022 10:52:42 +0800 Subject: [PATCH 02/31] handle firefox version without patch segment --- regexes.yaml | 4 ++-- test_resources/firefox_user_agent_strings.yaml | 6 ++++++ 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/regexes.yaml b/regexes.yaml index 9ce784b0..e9c6d0b8 100644 --- a/regexes.yaml +++ b/regexes.yaml @@ -921,7 +921,7 @@ user_agent_parsers: # AFTER THE EDGE CASES ABOVE! # AFTER IE11 # BEFORE all other IE - - regex: '(Firefox)/(\d+)\.(\d+)\.(\d+)' + - regex: '(Firefox)/(\d+)\.(\d+)(?:\.(\d+)|)' - regex: '(Firefox)/(\d+)\.(\d+)(pre|[ab]\d+[a-z]*|)' @@ -5549,7 +5549,7 @@ device_parsers: device_replacement: 'Motorola$2' brand_replacement: 'Motorola' model_replacement: '$2' - + ########## # nintendo diff --git a/test_resources/firefox_user_agent_strings.yaml b/test_resources/firefox_user_agent_strings.yaml index 391a8138..f8a1c884 100644 --- a/test_resources/firefox_user_agent_strings.yaml +++ b/test_resources/firefox_user_agent_strings.yaml @@ -1234,6 +1234,12 @@ test_cases: minor: '0' patch: '1' + - user_agent_string: 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:104.0) Gecko/20100101 Firefox/104.0' + family: 'Firefox' + major: '104' + minor: '0' + patch: + - user_agent_string: 'Mozilla/5.0 (X11; Linux armv7l; rv:2.1.1) Gecko/ Firefox/5.0.1' family: 'Firefox' major: '5' From ed34ecdbc28a4350506120784743967b81335a49 Mon Sep 17 00:00:00 2001 From: Karisse Khoo Date: Wed, 26 Oct 2022 10:56:43 +0800 Subject: [PATCH 03/31] remove unnecessary line space --- regexes.yaml | 1 - 1 file changed, 1 deletion(-) diff --git a/regexes.yaml b/regexes.yaml index e9c6d0b8..7b082d9a 100644 --- a/regexes.yaml +++ b/regexes.yaml @@ -5550,7 +5550,6 @@ device_parsers: brand_replacement: 'Motorola' model_replacement: '$2' - ########## # nintendo ########## From c8e6439d061d3cbe9672d5bcab558cbc5e68cb34 Mon Sep 17 00:00:00 2001 From: Karisse Khoo Date: Wed, 26 Oct 2022 12:30:21 +0800 Subject: [PATCH 04/31] update regex --- regexes.yaml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/regexes.yaml b/regexes.yaml index 7b082d9a..8bd20053 100644 --- a/regexes.yaml +++ b/regexes.yaml @@ -921,7 +921,7 @@ user_agent_parsers: # AFTER THE EDGE CASES ABOVE! # AFTER IE11 # BEFORE all other IE - - regex: '(Firefox)/(\d+)\.(\d+)(?:\.(\d+)|)' + - regex: '(Firefox)/(\d+)\.(\d+)(?:\.(\d+)|\z)' - regex: '(Firefox)/(\d+)\.(\d+)(pre|[ab]\d+[a-z]*|)' @@ -5550,6 +5550,7 @@ device_parsers: brand_replacement: 'Motorola' model_replacement: '$2' + ########## # nintendo ########## From 33762aa08a8b420f836128c96977881fa3d1a4c2 Mon Sep 17 00:00:00 2001 From: Karisse Khoo Date: Wed, 11 Jan 2023 15:58:27 +0800 Subject: [PATCH 05/31] use $ instead of \z --- regexes.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/regexes.yaml b/regexes.yaml index 8bd20053..8832d237 100644 --- a/regexes.yaml +++ b/regexes.yaml @@ -921,7 +921,7 @@ user_agent_parsers: # AFTER THE EDGE CASES ABOVE! # AFTER IE11 # BEFORE all other IE - - regex: '(Firefox)/(\d+)\.(\d+)(?:\.(\d+)|\z)' + - regex: '(Firefox)/(\d+)\.(\d+)(?:\.(\d+)|$)' - regex: '(Firefox)/(\d+)\.(\d+)(pre|[ab]\d+[a-z]*|)' From ff55fbd9a899d31605a34a32d60f8f7e348ef446 Mon Sep 17 00:00:00 2001 From: Sergey Fursov Date: Fri, 13 Jan 2023 19:16:30 +0300 Subject: [PATCH 06/31] add a test for parsing PingdomPageSpeed user agent --- tests/test_ua.yaml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/tests/test_ua.yaml b/tests/test_ua.yaml index 01060ec9..52bf3c2b 100644 --- a/tests/test_ua.yaml +++ b/tests/test_ua.yaml @@ -959,6 +959,12 @@ test_cases: minor: '8' patch: '5' + - user_agent_string: '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/)' + family: 'PingdomBot' + major: '1' + minor: '0' + patch: + - user_agent_string: 'NewRelicPinger/1.0 (1025794)' family: 'NewRelicPingerBot' major: '1' From 57adae11d3794ca2694d9f6b9406f66e01fc0cf0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jouni=20K=2E=20Sepp=C3=A4nen?= Date: Sun, 29 Jan 2023 15:36:35 +0200 Subject: [PATCH 07/31] Add PetalBot Fixes #525 --- regexes.yaml | 14 +++++++------- tests/test_device.yaml | 10 ++++++++++ 2 files changed, 17 insertions(+), 7 deletions(-) diff --git a/regexes.yaml b/regexes.yaml index 5f1119ac..d5f9738d 100644 --- a/regexes.yaml +++ b/regexes.yaml @@ -217,11 +217,11 @@ user_agent_parsers: - regex: 'Mozilla.{1,200}Mobile.{1,100}(Phantom\/ios|android).(\d+)\.(\d+)\.(\d+)' family_replacement: 'Phantom' - # aspiegel.com spider (owned by Huawei) - - regex: 'Mozilla.{1,100}Mobile.{1,100}AspiegelBot' + # aspiegel.com spider (owned by Huawei, later called PetalBot) + - regex: 'Mozilla.{1,100}Mobile.{1,100}(AspiegelBot|PetalBot)' family_replacement: 'Spider' - - regex: 'AspiegelBot' + - regex: 'AspiegelBot|PetalBot' family_replacement: 'Spider' # Basilisk @@ -1077,8 +1077,8 @@ os_parsers: # generic HbbTV, hoping to catch manufacturer name (always after 2nd comma) and the first string that looks like a 2011-2019 year - regex: 'HbbTV/\d+\.\d+\.\d+ \(.{0,30}; ?([a-zA-Z]+) ?;.{0,30}(201[1-9]).{0,30}\)' - # aspiegel.com spider (owned by Huawei) - - regex: 'AspiegelBot' + # aspiegel.com spider (owned by Huawei, later renamed PetalBot) + - regex: 'AspiegelBot|PetalBot' os_replacement: 'Other' ########## @@ -1823,11 +1823,11 @@ device_parsers: brand_replacement: 'Spider' # aspiegel.com spider (owned by Huawei) - - regex: 'Mozilla.{1,100}Mobile.{1,100}AspiegelBot' + - regex: 'Mozilla.{1,100}Mobile.{1,100}(AspiegelBot|PetalBot)' device_replacement: 'Spider' brand_replacement: 'Spider' model_replacement: 'Smartphone' - - regex: 'Mozilla.{0,200}AspiegelBot' + - regex: 'Mozilla.{0,200}(AspiegelBot|PetalBot)' device_replacement: 'Spider' brand_replacement: 'Spider' model_replacement: 'Desktop' diff --git a/tests/test_device.yaml b/tests/test_device.yaml index bb43f59b..0c6bea3f 100644 --- a/tests/test_device.yaml +++ b/tests/test_device.yaml @@ -80444,6 +80444,16 @@ test_cases: brand: 'Spider' model: 'Desktop' + - user_agent_string: 'Mozilla/5.0 (Linux; Android 7.0;) AppleWebKit/537.36 (KHTML, like Gecko) Mobile Safari/537.36 (compatible; PetalBot;+https://webmaster.petalsearch.com/site/petalbot)' + family: 'Spider' + brand: 'Spider' + model: 'Smartphone' + + - user_agent_string: 'Mozilla/5.0 (compatible;PetalBot;+https://webmaster.petalsearch.com/site/petalbot)' + family: 'Spider' + brand: 'Spider' + model: 'Desktop' + - user_agent_string: 'Mozilla/5.0 (Linux; Android 7.0;) AppleWebKit/537.36 (KHTML, like Gecko) Mobile Safari/537.36 (compatible; AspiegelBot)' family: 'Spider' brand: 'Spider' From bc170c577f5db0c64aeded4211c2993fe7ff120f Mon Sep 17 00:00:00 2001 From: geoada Date: Wed, 29 Mar 2023 10:43:10 -0700 Subject: [PATCH 08/31] Add Oculus Browser This is the browser used by Meta's Quest line of headsets --- regexes.yaml | 29 +++++++++++++++++++++++++++++ tests/test_device.yaml | 15 +++++++++++++++ tests/test_os.yaml | 7 +++++++ tests/test_ua.yaml | 6 ++++++ 4 files changed, 57 insertions(+) diff --git a/regexes.yaml b/regexes.yaml index 5f1119ac..cacf0311 100644 --- a/regexes.yaml +++ b/regexes.yaml @@ -388,6 +388,10 @@ user_agent_parsers: - regex: '(EdgiOS|EdgA)/(\d+)\.(\d+)\.(\d+)(?:\.(\d+)|)' family_replacement: 'Edge Mobile' + # Oculus Browser, should go before Samsung Internet + - regex: '(OculusBrowser)/(\d+)\.(\d+).0.0(?:\.([0-9\-]+)|)' + family_replacement: 'Oculus Browser' + # Samsung Internet (based on Chrome, but lacking some features) - regex: '(SamsungBrowser)/(\d+)\.(\d+)' family_replacement: 'Samsung Internet' @@ -1145,6 +1149,12 @@ os_parsers: - regex: '(android)\s(?:mobile\/)(\d+)(?:\.(\d+)(?:\.(\d+)|)|)' os_replacement: 'Android' + ########## + # Meta Quest + ########## + - regex: 'Quest' + os_replacement: 'Android' + ########## # Kindle Android ########## @@ -3540,6 +3550,25 @@ device_parsers: brand_replacement: 'Meizu' model_replacement: '$1' + ######### + # Meta + # @ref: https://www.meta.com + ######### + - regex: 'Quest 2' + device_replacement: 'Quest' + brand_replacement: 'Meta' + model_replacement: 'Quest 2' + + - regex: 'Quest Pro' + device_replacement: 'Quest' + brand_replacement: 'Meta' + model_replacement: 'Quest Pro' + + - regex: 'Quest' + device_replacement: 'Quest' + brand_replacement: 'Meta' + model_replacement: 'Quest' + ######### # Micromax # @ref: http://www.micromaxinfo.com diff --git a/tests/test_device.yaml b/tests/test_device.yaml index bb43f59b..faa45c22 100644 --- a/tests/test_device.yaml +++ b/tests/test_device.yaml @@ -145,6 +145,21 @@ test_cases: brand: 'Apple' model: 'iPod' + - user_agent_string: 'Mozilla/5.0 (X11; Linux x86_64; Quest) AppleWebKit/537.36 (KHTML, like Gecko) OculusBrowser/26.2.0.0.10 SamsungBrowser/4.0 Chrome/110.0.5481.192 VR Safari/537.36' + family: 'Quest' + brand: 'Meta' + model: 'Quest' + + - user_agent_string: 'Mozilla/5.0 (X11; Linux x86_64; Quest 2) AppleWebKit/537.36 (KHTML, like Gecko) OculusBrowser/26.2.0.0.10 SamsungBrowser/4.0 Chrome/110.0.5481.192 VR Safari/537.36' + family: 'Quest' + brand: 'Meta' + model: 'Quest 2' + + - user_agent_string: 'Mozilla/5.0 (X11; Linux x86_64; Quest Pro) AppleWebKit/537.36 (KHTML, like Gecko) OculusBrowser/26.2.0.0.10 SamsungBrowser/4.0 Chrome/110.0.5481.192 VR Safari/537.36' + family: 'Quest' + brand: 'Meta' + model: 'Quest Pro' + - user_agent_string: 'Mozilla/4.0 (compatible; Linux 2.6.10) NetFront/3.3 Kindle/1.0 (screen 600x800)' family: 'Kindle' brand: 'Amazon' diff --git a/tests/test_os.yaml b/tests/test_os.yaml index 0e71e611..5570df5f 100644 --- a/tests/test_os.yaml +++ b/tests/test_os.yaml @@ -28,6 +28,13 @@ test_cases: patch: '2' patch_minor: + - user_agent_string: 'Mozilla/5.0 (X11; Linux x86_64; Quest 2) AppleWebKit/537.36 (KHTML, like Gecko) OculusBrowser/26.2.0.0.10 SamsungBrowser/4.0 Chrome/110.0.5481.192 VR Safari/537.36' + family: 'Android' + major: + minor: + patch: + patch_minor: + - user_agent_string: 'Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_3; en-us; Silk/1.1.0-80) AppleWebKit/533.16 (KHTML, like Gecko) Version/5.0 Safari/533.16 Silk-Accelerated=true' family: 'Android' major: diff --git a/tests/test_ua.yaml b/tests/test_ua.yaml index eccafee9..a478ae7d 100644 --- a/tests/test_ua.yaml +++ b/tests/test_ua.yaml @@ -83,6 +83,12 @@ test_cases: minor: '5' patch: '1' + - user_agent_string: 'Mozilla/5.0 (X11; Linux x86_64; Quest 2) AppleWebKit/537.36 (KHTML, like Gecko) OculusBrowser/26.2.0.0.10 SamsungBrowser/4.0 Chrome/110.0.5481.192 VR Safari/537.36' + family: 'Oculus Browser' + major: '26' + minor: '2' + patch: '10' + - user_agent_string: 'Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_3; en-us; Silk/1.1.0-80) AppleWebKit/533.16 (KHTML, like Gecko) Version/5.0 Safari/533.16 Silk-Accelerated=true' family: 'Amazon Silk' major: '1' From c5405ddaff71c8c7ad2e456ebb782a8a19a149a5 Mon Sep 17 00:00:00 2001 From: Long Zheng Date: Tue, 4 Apr 2023 19:28:25 +1000 Subject: [PATCH 09/31] iOS 16 Darwin --- regexes.yaml | 23 +++++++++++++++++++++++ tests/test_os.yaml | 35 +++++++++++++++++++++++++++++++++++ 2 files changed, 58 insertions(+) diff --git a/regexes.yaml b/regexes.yaml index 5f1119ac..3ce6d05f 100644 --- a/regexes.yaml +++ b/regexes.yaml @@ -1595,6 +1595,29 @@ os_parsers: - regex: 'CFNetwork/.{0,100} Darwin/(21)\.\d+' os_replacement: 'iOS' os_v1_replacement: '15' + - regex: 'CFNetwork/.{0,100} Darwin/22\.0\.\d+' + os_replacement: 'iOS' + os_v1_replacement: '16' + os_v2_replacement: '0' + - regex: 'CFNetwork/.{0,100} Darwin/22\.1\.\d+' + os_replacement: 'iOS' + os_v1_replacement: '16' + os_v2_replacement: '1' + - regex: 'CFNetwork/.{0,100} Darwin/22\.2\.\d+' + os_replacement: 'iOS' + os_v1_replacement: '16' + os_v2_replacement: '2' + - regex: 'CFNetwork/.{0,100} Darwin/22\.3\.\d+' + os_replacement: 'iOS' + os_v1_replacement: '16' + os_v2_replacement: '3' + - regex: 'CFNetwork/.{0,100} Darwin/22\.4\.\d+' + os_replacement: 'iOS' + os_v1_replacement: '16' + os_v2_replacement: '4' + - regex: 'CFNetwork/.{0,100} Darwin/(22)\.\d+' + os_replacement: 'iOS' + os_v1_replacement: '16' - regex: 'CFNetwork/.{0,100} Darwin/' os_replacement: 'iOS' diff --git a/tests/test_os.yaml b/tests/test_os.yaml index 0e71e611..773e5579 100644 --- a/tests/test_os.yaml +++ b/tests/test_os.yaml @@ -2418,6 +2418,41 @@ test_cases: patch: patch_minor: + - user_agent_string: 'App/0 CFNetwork/1390 Darwin/22.0.0' + family: 'iOS' + major: '16' + minor: '0' + patch: + patch_minor: + + - user_agent_string: 'App/0 CFNetwork/1399 Darwin/22.1.0' + family: 'iOS' + major: '16' + minor: '1' + patch: + patch_minor: + + - user_agent_string: 'App/0 CFNetwork/1402 Darwin/22.2.0' + family: 'iOS' + major: '16' + minor: '2' + patch: + patch_minor: + + - user_agent_string: 'App/0 CFNetwork/1404.0.5 Darwin/22.3.0' + family: 'iOS' + major: '16' + minor: '3' + patch: + patch_minor: + + - user_agent_string: 'App/0 CFNetwork/1406.0.4 Darwin/22.4.0' + family: 'iOS' + major: '16' + minor: '4' + patch: + patch_minor: + - user_agent_string: 'Mozilla/5.0 (iPhone; CPU 7_0_6 like Mac OS X; en_GB) AppleWebKit (KHTML, like Gecko) Mobile [OKMagazine/4.0.1 (iOS/7.0.6)] [LiteApps]' family: 'iOS' major: '7' From 140976513a86794b054f5934915b9c85a6dd4a83 Mon Sep 17 00:00:00 2001 From: anthon Date: Thu, 20 Apr 2023 00:42:40 +0300 Subject: [PATCH 10/31] To correctly parse modern Java agents like "Java/17.0.6" and legacy agents like "Java/1.8.0_362" --- regexes.yaml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/regexes.yaml b/regexes.yaml index 5f1119ac..a691d4ea 100644 --- a/regexes.yaml +++ b/regexes.yaml @@ -961,7 +961,9 @@ user_agent_parsers: - regex: '(Python/3\.\d{1,3} aiohttp)/(\d+)\.(\d+)\.(\d+)' family_replacement: 'Python aiohttp' - - regex: '(Java)[/ ]?\d+\.(\d+)\.(\d+)[_-]*([a-zA-Z0-9]+|)' + - regex: '(Java)[/ ]?\d{1}\.(\d+)\.(\d+)[_-]*([a-zA-Z0-9]+|)' + + - regex: '(Java)[/ ]?(\d+)\.(\d+)\.(\d+)' # minio-go (https://github.com/minio/minio-go) - regex: '(minio-go)/v(\d+)\.(\d+)\.(\d+)' From 578e59a863d5bd031924cb88154ded655b82a8dd Mon Sep 17 00:00:00 2001 From: anthon Date: Thu, 20 Apr 2023 00:45:31 +0300 Subject: [PATCH 11/31] to correctly parse modern Java --- tests/test_ua.yaml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/tests/test_ua.yaml b/tests/test_ua.yaml index eccafee9..753cfbf0 100644 --- a/tests/test_ua.yaml +++ b/tests/test_ua.yaml @@ -551,6 +551,12 @@ test_cases: minor: '0' patch: '25' + - user_agent_string: 'Java/17.0.6' + family: 'Java' + major: '17' + minor: '0' + patch: '6' + - user_agent_string: 'Mozilla/5.0 (Linux; U; en-US) AppleWebKit/528.5+ (KHTML, like Gecko, Safari/528.5+) Version/4.0 Kindle/3.0 (screen 600x800; rotate)' family: 'Kindle' major: '3' From fa0bbecebcb452659a40af4f0549df9285c27fae Mon Sep 17 00:00:00 2001 From: commenthol Date: Sat, 20 May 2023 10:03:41 +0200 Subject: [PATCH 12/31] chore: bump mocha@10 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index b0d0d1a3..daf19188 100644 --- a/package.json +++ b/package.json @@ -25,7 +25,7 @@ } ], "devDependencies": { - "mocha": "^9.2.2", + "mocha": "^10.2.0", "safe-regex": "^2.1.1", "uap-ref-impl": "git+https://github.com/ua-parser/uap-ref-impl#master", "yamlparser": "^0.0.2" From 90737bd5fc8345ac75432cbeb9d8436537392168 Mon Sep 17 00:00:00 2001 From: commenthol Date: Sat, 20 May 2023 10:05:03 +0200 Subject: [PATCH 13/31] chore(actions): adding node@20 while deprecating node@14 --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 5cdbf5c4..267499ef 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -16,7 +16,7 @@ jobs: strategy: matrix: - node-version: [14.x, 16.x, 18.x] + node-version: [16.x, 18.x, 20.x] # See supported Node.js release schedule at https://nodejs.org/en/about/releases/ steps: From 44a33af62d3d2089bafc30316f4c30dabd38ac9a Mon Sep 17 00:00:00 2001 From: commenthol Date: Sat, 20 May 2023 10:07:05 +0200 Subject: [PATCH 14/31] 0.17.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index daf19188..bb4340ea 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "uap-core", "description": "The regex file necessary to build language ports of Browserscope's user agent parser.", - "version": "0.16.0", + "version": "0.17.0", "maintainers": [ { "name": "Tobie Langel", From cee1e793b4b5595ebd2720eeb925a3dd985a6b04 Mon Sep 17 00:00:00 2001 From: commenthol Date: Sat, 20 May 2023 10:09:49 +0200 Subject: [PATCH 15/31] chore(actions): upgrade to checkout@v3 --- .github/workflows/ci.yml | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 267499ef..91302ed2 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -1,5 +1,5 @@ # This workflow will do a clean install of node dependencies, cache/restore them, build the source code and run tests across different versions of node -# For more information see: https://help.github.com/actions/language-and-framework-guides/using-nodejs-with-github-actions +# For more information see: https://github.com/marketplace/actions/setup-node-js-environment name: CI @@ -11,18 +11,15 @@ on: jobs: build: - runs-on: ubuntu-latest - strategy: matrix: node-version: [16.x, 18.x, 20.x] # See supported Node.js release schedule at https://nodejs.org/en/about/releases/ - steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v3 - name: Use Node.js ${{ matrix.node-version }} - uses: actions/setup-node@v2 + uses: actions/setup-node@v3 with: node-version: ${{ matrix.node-version }} # cache: 'npm' From d668d6c6157db7737edfc0280adc6610c1b88029 Mon Sep 17 00:00:00 2001 From: commenthol Date: Sat, 20 May 2023 10:14:58 +0200 Subject: [PATCH 16/31] 0.18.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index bb4340ea..1f73caa8 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "uap-core", "description": "The regex file necessary to build language ports of Browserscope's user agent parser.", - "version": "0.17.0", + "version": "0.18.0", "maintainers": [ { "name": "Tobie Langel", From 6eef3d4516daa2807995af32d61f2513f9e2f321 Mon Sep 17 00:00:00 2001 From: Louis Barthonet Date: Wed, 25 Oct 2023 15:22:15 +0100 Subject: [PATCH 17/31] feat: add support for Ecosia iOS & Ecosia Android --- regexes.yaml | 6 ++++++ tests/test_ua.yaml | 12 ++++++++++++ 2 files changed, 18 insertions(+) diff --git a/regexes.yaml b/regexes.yaml index a8f8e097..cc475fbc 100644 --- a/regexes.yaml +++ b/regexes.yaml @@ -457,6 +457,12 @@ user_agent_parsers: - regex: '(Tenta/)(\d+)\.(\d+)\.(\d+)' family_replacement: 'Tenta Browser' + # Ecosia on iOS / Android + - regex: '(Ecosia) ios@(\d+)\.(\d+)\.(\d+)\.(\d+)' + family_replacement: 'Ecosia iOS' + - regex: '(Ecosia) android@(\d+)\.(\d+)\.(\d+)\.(\d+)' + family_replacement: 'Ecosia Android' + # Chrome Mobile - regex: 'Version/.{1,300}(Chrome)/(\d+)\.(\d+)\.(\d+)\.(\d+)' family_replacement: 'Chrome Mobile WebView' diff --git a/tests/test_ua.yaml b/tests/test_ua.yaml index 2b2bee8c..82edc67c 100644 --- a/tests/test_ua.yaml +++ b/tests/test_ua.yaml @@ -8681,3 +8681,15 @@ test_cases: major: '3' minor: '2' patch: '1' + + - user_agent_string: 'Mozilla/5.0 (iPhone; CPU iPhone OS 16_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 Safari/605.1.15 (Ecosia ios@8.1.3.72)' + family: 'Ecosia iOS' + major: '8' + minor: '1' + patch: '3' + + - user_agent_string: 'Mozilla/5.0 (Linux; Android 9; Redmi 8) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.4951.41 Mobile Safari/537.36 (Ecosia android@101.0.4951.41)' + family: 'Ecosia Android' + major: '101' + minor: '0' + patch: '4951' \ No newline at end of file From d7d11c8bd4121fcd06603e4f5c63c693db85bd42 Mon Sep 17 00:00:00 2001 From: Louis Barthonet Date: Wed, 25 Oct 2023 15:28:39 +0100 Subject: [PATCH 18/31] fix: ensure regex for Phantom on Android matches the string properly With how the regex was written before, it was matching either Phantom/ios or android, instead of Phantom/android. The test worked as expected, but this broke the newly introduced test for Ecosia, as it would match aswell. --- regexes.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/regexes.yaml b/regexes.yaml index cc475fbc..e6855d5e 100644 --- a/regexes.yaml +++ b/regexes.yaml @@ -217,7 +217,7 @@ user_agent_parsers: family_replacement: 'Twitter' # Phantom app - - regex: 'Mozilla.{1,200}Mobile.{1,100}(Phantom\/ios|android).(\d+)\.(\d+)\.(\d+)' + - regex: 'Mozilla.{1,200}Mobile.{1,100}(Phantom\/ios|Phantom\/android).(\d+)\.(\d+)\.(\d+)' family_replacement: 'Phantom' # aspiegel.com spider (owned by Huawei, later called PetalBot) From 785a6d57fa813a0db0a6a1104db0ef9b5a520785 Mon Sep 17 00:00:00 2001 From: Louis Barthonet Date: Wed, 25 Oct 2023 16:00:18 +0100 Subject: [PATCH 19/31] feat: add support for MullvadBrowser --- regexes.yaml | 3 +++ tests/test_ua.yaml | 6 ++++++ 2 files changed, 9 insertions(+) diff --git a/regexes.yaml b/regexes.yaml index a8f8e097..c6c6eb6c 100644 --- a/regexes.yaml +++ b/regexes.yaml @@ -1027,6 +1027,9 @@ user_agent_parsers: - regex: 'SerenityOS' family_replacement: 'SerenityOS Browser' + # MullvadBrowser (https://mullvad.net/en/browser) + - regex: '(MullvadBrowser)/(\d+)(?:\.(\d+)|)(?:\.(\d+)|)' + os_parsers: ########## # HbbTV vendors diff --git a/tests/test_ua.yaml b/tests/test_ua.yaml index 2b2bee8c..0b008329 100644 --- a/tests/test_ua.yaml +++ b/tests/test_ua.yaml @@ -8681,3 +8681,9 @@ test_cases: major: '3' minor: '2' patch: '1' + + - user_agent_string: 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:102.0) Gecko/20100101 MullvadBrowser/102.13.0' + family: 'MullvadBrowser' + major: '102' + minor: '13' + patch: '0' \ No newline at end of file From ff278a9b3cb36930da7b5903d2614e2653813851 Mon Sep 17 00:00:00 2001 From: Louis Barthonet Date: Wed, 25 Oct 2023 15:08:01 +0100 Subject: [PATCH 20/31] fix: parse Edge on iPad OS properly The UA for Edge on iPad OS doesn't specify the full edge version, but only the major. This changes the regex so that both minor & patch versions are optional. --- regexes.yaml | 2 +- tests/test_ua.yaml | 6 ++++++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/regexes.yaml b/regexes.yaml index e753443e..51fd6a7f 100644 --- a/regexes.yaml +++ b/regexes.yaml @@ -388,7 +388,7 @@ user_agent_parsers: # Edge Mobile - regex: 'Windows Phone .{0,200}(Edge)/(\d+)\.(\d+)' family_replacement: 'Edge Mobile' - - regex: '(EdgiOS|EdgA)/(\d+)\.(\d+)\.(\d+)(?:\.(\d+)|)' + - regex: '(EdgiOS|EdgA)/(\d+)(?:\.(\d+)|)(?:\.(\d+)|)(?:\.(\d+)|)' family_replacement: 'Edge Mobile' # Oculus Browser, should go before Samsung Internet diff --git a/tests/test_ua.yaml b/tests/test_ua.yaml index 7e48b64f..1aa47902 100644 --- a/tests/test_ua.yaml +++ b/tests/test_ua.yaml @@ -8699,3 +8699,9 @@ test_cases: major: '102' minor: '13' patch: '0' + + - user_agent_string: 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/605.1.15 (KHTML, like Gecko) EdgiOS/108 Version/13.0.3 Safari/605.1.15' + family: 'Edge Mobile' + major: '108' + minor: + patch: From 88e4cbc43a5ba0c47391bbde9ffabdee3bd0d6d3 Mon Sep 17 00:00:00 2001 From: Louis Date: Wed, 21 Feb 2024 16:45:13 +0100 Subject: [PATCH 21/31] fix: parse properly Chrome on iOS with request desktop (#559) The UA for Chrome on iOS doesn't specify the full Chrome version, but only the major. This changes the regex so that both minor & patch versions are optional. --- regexes.yaml | 2 +- tests/test_ua.yaml | 6 ++++++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/regexes.yaml b/regexes.yaml index 51fd6a7f..ae4fee2f 100644 --- a/regexes.yaml +++ b/regexes.yaml @@ -470,7 +470,7 @@ user_agent_parsers: family_replacement: 'Chrome Mobile WebView' - regex: '(CrMo)/(\d+)\.(\d+)\.(\d+)\.(\d+)' family_replacement: 'Chrome Mobile' - - regex: '(CriOS)/(\d+)\.(\d+)\.(\d+)\.(\d+)' + - regex: '(CriOS)/(\d+)(?:\.(\d+)|)(?:\.(\d+)|)(?:\.(\d+)|)' family_replacement: 'Chrome Mobile iOS' - regex: '(Chrome)/(\d+)\.(\d+)\.(\d+)\.(\d+) Mobile(?:[ /]|$)' family_replacement: 'Chrome Mobile' diff --git a/tests/test_ua.yaml b/tests/test_ua.yaml index 1aa47902..d87d17be 100644 --- a/tests/test_ua.yaml +++ b/tests/test_ua.yaml @@ -8705,3 +8705,9 @@ test_cases: major: '108' minor: patch: + + - user_agent_string: 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/605.1.15 (KHTML, like Gecko) CriOS/102 Version/11.1.1 Safari/605.1.15' + family: 'Chrome Mobile iOS' + major: '102' + minor: + patch: From d00cd602904f84d342325a10891ef4ec71460907 Mon Sep 17 00:00:00 2001 From: Louis Date: Wed, 21 Feb 2024 16:45:48 +0100 Subject: [PATCH 22/31] fix: Update nintendo regex to handle Nintendo Switch (#557) Before this change, the Nintendo Switch UA wasn't being fully parsed, so the OS was considered to be "Other", which is the default value. This fixes it, by updating the Nintendo regex to handle it properly. --- regexes.yaml | 2 +- tests/test_device.yaml | 5 +++++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/regexes.yaml b/regexes.yaml index ae4fee2f..ef9fff04 100644 --- a/regexes.yaml +++ b/regexes.yaml @@ -5624,7 +5624,7 @@ device_parsers: device_replacement: 'Nintendo Wii U' brand_replacement: 'Nintendo' model_replacement: 'Wii U' - - regex: 'Nintendo (DS|3DS|DSi|Wii);' + - regex: 'Nintendo (Switch|DS|3DS|DSi|Wii);' device_replacement: 'Nintendo $1' brand_replacement: 'Nintendo' model_replacement: '$1' diff --git a/tests/test_device.yaml b/tests/test_device.yaml index 990c2208..f868d927 100644 --- a/tests/test_device.yaml +++ b/tests/test_device.yaml @@ -42605,6 +42605,11 @@ test_cases: brand: 'Nintendo' model: 'Wii' + - user_agent_string: 'Mozilla/5.0 (Nintendo Switch; WifiWebAuthApplet) AppleWebKit/609.4 (KHTML, like Gecko) NF/6.0.2.23.6 NintendoBrowser/5.1.0.23620' + family: 'Nintendo Switch' + brand: 'Nintendo' + model: 'Switch' + - user_agent_string: 'Mozilla/5.0 (Linux; U; Android 5.0 kitkat; en-US; Nokia-1100 Build/GINGERBREAD) AppleWebKit/534.31 (KHTML, like Gecko) UCBrowser/9.3.0.321 U3/0.8.0 Mobile Safari/534.31' family: 'Nokia-1100' brand: 'Nokia' From 8144b0360313d8b8645145d1f4281f049c2648a5 Mon Sep 17 00:00:00 2001 From: Benjamin Maxwell Date: Wed, 21 Feb 2024 16:23:11 +0000 Subject: [PATCH 23/31] Update UA for Ladybird Browser (previously SerenityOS Browser) (#546) --- regexes.yaml | 7 +++---- tests/test_os.yaml | 2 +- tests/test_ua.yaml | 8 ++++---- 3 files changed, 8 insertions(+), 9 deletions(-) diff --git a/regexes.yaml b/regexes.yaml index ef9fff04..cea1ea13 100644 --- a/regexes.yaml +++ b/regexes.yaml @@ -1028,10 +1028,9 @@ user_agent_parsers: # HTTrack crawler - regex: '\b(HTTrack) (\d+)\.(\d+)(?:[\.\-](\d+)|)' - # SerenityOS (https://serenityos.org) - # https://github.com/SerenityOS/serenity/blob/2e1bbcb0faeae92d7595b8e0b022a8cdcecca07e/Userland/Libraries/LibWeb/Loader/ResourceLoader.h#L27 - - regex: 'SerenityOS' - family_replacement: 'SerenityOS Browser' + # Ladybird Browser (https://ladybird.dev) + # https://github.com/SerenityOS/serenity/blob/8da9ff24e4e720b1e80a027f09c419ac9503f896/Userland/Libraries/LibWeb/Loader/ResourceLoader.h#L52 + - regex: 'LibWeb\+LibJS\/\d+\.\d+ (Ladybird)\/(\d+)\.(\d+)' # MullvadBrowser (https://mullvad.net/en/browser) - regex: '(MullvadBrowser)/(\d+)(?:\.(\d+)|)(?:\.(\d+)|)' diff --git a/tests/test_os.yaml b/tests/test_os.yaml index eafd1092..5fbf17a7 100644 --- a/tests/test_os.yaml +++ b/tests/test_os.yaml @@ -3217,7 +3217,7 @@ test_cases: patch: patch_minor: - - user_agent_string: 'Mozilla/4.0 (SerenityOS; x86_64) LibWeb+LibJS (Not KHTML, nor Gecko) LibWeb' + - user_agent_string: 'Mozilla/5.0 (SerenityOS; x86_64) LibWeb+LibJS/1.0 Ladybird/1.0' family: 'SerenityOS' major: minor: diff --git a/tests/test_ua.yaml b/tests/test_ua.yaml index d87d17be..5ae67802 100644 --- a/tests/test_ua.yaml +++ b/tests/test_ua.yaml @@ -8664,10 +8664,10 @@ test_cases: minor: '20' patch: '1' - - user_agent_string: 'Mozilla/4.0 (SerenityOS; x86_64) LibWeb+LibJS (Not KHTML, nor Gecko) LibWeb' - family: 'SerenityOS Browser' - major: - minor: + - user_agent_string: 'Mozilla/5.0 (Linux; x86_64) LibWeb+LibJS/1.0 Ladybird/1.0' + family: 'Ladybird' + major: '1' + minor: '0' patch: - user_agent_string: 'surveyon/2.7.6 Mobile (Android: 11; MODEL:CPH2127; PRODUCT:CPH2127T2; MANUFACTURER:OPPO;)' From d3450bbe77fe49eb3a234ed6184065260e44d747 Mon Sep 17 00:00:00 2001 From: Louis Date: Wed, 21 Feb 2024 17:50:36 +0100 Subject: [PATCH 24/31] fix: ensure Ladybird regex works with newer UAs (#573) --- regexes.yaml | 4 ++-- tests/test_ua.yaml | 6 ++++++ 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/regexes.yaml b/regexes.yaml index cea1ea13..f09bbbee 100644 --- a/regexes.yaml +++ b/regexes.yaml @@ -1029,8 +1029,8 @@ user_agent_parsers: - regex: '\b(HTTrack) (\d+)\.(\d+)(?:[\.\-](\d+)|)' # Ladybird Browser (https://ladybird.dev) - # https://github.com/SerenityOS/serenity/blob/8da9ff24e4e720b1e80a027f09c419ac9503f896/Userland/Libraries/LibWeb/Loader/ResourceLoader.h#L52 - - regex: 'LibWeb\+LibJS\/\d+\.\d+ (Ladybird)\/(\d+)\.(\d+)' + # https://github.com/SerenityOS/serenity/blob/6a662e0d43810c1dbd56fbf0c123f258aa1d694e/Userland/Libraries/LibWeb/Loader/ResourceLoader.h#L64 + - regex: '(Ladybird)\/(\d+)\.(\d+)' # MullvadBrowser (https://mullvad.net/en/browser) - regex: '(MullvadBrowser)/(\d+)(?:\.(\d+)|)(?:\.(\d+)|)' diff --git a/tests/test_ua.yaml b/tests/test_ua.yaml index 5ae67802..1a6c8f8e 100644 --- a/tests/test_ua.yaml +++ b/tests/test_ua.yaml @@ -8670,6 +8670,12 @@ test_cases: minor: '0' patch: + - user_agent_string: 'Mozilla/5.0 (Linux; x86_64) Ladybird/1.0' + family: 'Ladybird' + major: '1' + minor: '0' + patch: + - user_agent_string: 'surveyon/2.7.6 Mobile (Android: 11; MODEL:CPH2127; PRODUCT:CPH2127T2; MANUFACTURER:OPPO;)' family: 'Surveyon' major: '2' From 1cb1bf80ce8c2560775f7d870c48cc5e965dfeee Mon Sep 17 00:00:00 2001 From: geoadaMeta <129231092+geoadaMeta@users.noreply.github.com> Date: Wed, 28 Feb 2024 07:11:31 -0800 Subject: [PATCH 25/31] Add Meta Quest 3 (#572) Also removes SamsungBrowser from the Meta Quest tests as this is no longer part of the UA Co-authored-by: geoada --- regexes.yaml | 5 +++++ tests/test_device.yaml | 7 ++++++- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/regexes.yaml b/regexes.yaml index f09bbbee..0a1c0b95 100644 --- a/regexes.yaml +++ b/regexes.yaml @@ -3590,6 +3590,11 @@ device_parsers: # Meta # @ref: https://www.meta.com ######### + - regex: 'Quest 3' + device_replacement: 'Quest' + brand_replacement: 'Meta' + model_replacement: 'Quest 3' + - regex: 'Quest 2' device_replacement: 'Quest' brand_replacement: 'Meta' diff --git a/tests/test_device.yaml b/tests/test_device.yaml index f868d927..6e058b30 100644 --- a/tests/test_device.yaml +++ b/tests/test_device.yaml @@ -155,7 +155,12 @@ test_cases: brand: 'Meta' model: 'Quest 2' - - user_agent_string: 'Mozilla/5.0 (X11; Linux x86_64; Quest Pro) AppleWebKit/537.36 (KHTML, like Gecko) OculusBrowser/26.2.0.0.10 SamsungBrowser/4.0 Chrome/110.0.5481.192 VR Safari/537.36' + - user_agent_string: 'Mozilla/5.0 (X11; Linux x86_64; Quest 3) AppleWebKit/537.36 (KHTML, like Gecko) OculusBrowser/26.2.0.0.10 Chrome/110.0.5481.192 VR Safari/537.36' + family: 'Quest' + brand: 'Meta' + model: 'Quest 3' + + - user_agent_string: 'Mozilla/5.0 (X11; Linux x86_64; Quest Pro) AppleWebKit/537.36 (KHTML, like Gecko) OculusBrowser/26.2.0.0.10 Chrome/110.0.5481.192 VR Safari/537.36' family: 'Quest' brand: 'Meta' model: 'Quest Pro' From 0cf88c5274e61d373fe4625c97654af3cd459c06 Mon Sep 17 00:00:00 2001 From: Carlos Azevedo Date: Tue, 9 Apr 2024 14:05:36 +0100 Subject: [PATCH 26/31] fix: update yandex browser regex (#578) * update yandex browser regex * Update test_ua.yaml * fix yandex browser test --------- Co-authored-by: Carlos Azevedo Co-authored-by: Louis --- regexes.yaml | 2 ++ tests/test_ua.yaml | 30 ++++++++++++++++++++++++------ 2 files changed, 26 insertions(+), 6 deletions(-) diff --git a/regexes.yaml b/regexes.yaml index 0a1c0b95..ef40e24e 100644 --- a/regexes.yaml +++ b/regexes.yaml @@ -502,6 +502,8 @@ user_agent_parsers: # Yandex Browser - regex: '(YaBrowser)/(\d+)\.(\d+)\.(\d+)' family_replacement: 'Yandex Browser' + - regex: '(YaSearchBrowser)/(\d+)\.(\d+)\.(\d+)' + family_replacement: 'Yandex Browser' # Mail.ru Amigo/Internet Browser (Chromium-based) - regex: '(Chrome)/(\d+)\.(\d+)\.(\d+).{0,100} MRCHROME' diff --git a/tests/test_ua.yaml b/tests/test_ua.yaml index 1a6c8f8e..3478be69 100644 --- a/tests/test_ua.yaml +++ b/tests/test_ua.yaml @@ -1325,6 +1325,30 @@ test_cases: minor: '5' patch: '1104' + - user_agent_string: 'Mozilla/5.0 (Linux; Android 5.0.1; GT-I9505 Build/LRX22C) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.111 YaBrowser/16.2.1.1239.00 Mobile Safari/537.36' + family: 'Yandex Browser' + major: '16' + minor: '2' + patch: '1' + + - user_agent_string: 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.5993.771 YaBrowser/23.11.2.771 Yowser/2.5 Safari/537.36' + family: 'Yandex Browser' + major: '23' + minor: '11' + patch: '2' + + - user_agent_string: 'Mozilla/5.0 (Linux; arm; Android 10; M2006C3MNG) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.0.0 YaApp_Android/23.36.1 YaSearchBrowser/23.36.1 BroPP/1.0 SA/3 Mobile Safari/537.36' + family: 'Yandex Browser' + major: '23' + minor: '36' + patch: '1' + + - user_agent_string: 'Mozilla/5.0 (Linux; arm_64; Android 13; 23053RN02Y) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.5993.98 YaBrowser/23.11.5.98.00 SA/3 Mobile Safari/537.36' + family: 'Yandex Browser' + major: '23' + minor: '11' + patch: '5' + - user_agent_string: 'Mozilla/5.0 YottaaMonitor;' family: 'YottaaMonitor' major: @@ -7100,12 +7124,6 @@ test_cases: minor: patch: - - user_agent_string: 'Mozilla/5.0 (Linux; Android 5.0.1; GT-I9505 Build/LRX22C) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.111 YaBrowser/16.2.1.1239.00 Mobile Safari/537.36' - family: 'Yandex Browser' - major: '16' - minor: '2' - patch: '1' - - user_agent_string: 'Mozilla/5.0 (Linux; Android 4.4.2; SM-G800F Build/KOT49H) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.135 MobileIron/1.6.0 Mobile Safari/537.36' family: 'MobileIron' major: '1' From 7f417c8f9e8af80910dacb4ff9b2482cda83fd6e Mon Sep 17 00:00:00 2001 From: Carlos Azevedo Date: Tue, 9 Apr 2024 14:05:58 +0100 Subject: [PATCH 27/31] update vivaldi browser regex to match multiple versioning structures (#575) Co-authored-by: Carlos Azevedo --- regexes.yaml | 4 ++-- tests/test_ua.yaml | 18 ++++++++++++++++++ 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/regexes.yaml b/regexes.yaml index ef40e24e..f0861bfa 100644 --- a/regexes.yaml +++ b/regexes.yaml @@ -608,8 +608,8 @@ user_agent_parsers: - regex: 'Superhuman' family_replacement: 'Superhuman' - # Vivaldi uses "Vivaldi" - - regex: '(Vivaldi)/(\d+)\.(\d+)\.(\d+)' + # Vivaldi + - regex: '(Vivaldi)/(\d+)(?:\.(\d+)|)(?:\.(\d+)|)(?:\.(\d+)|)' # Edge/major_version.minor_version # Edge with chromium Edg/major_version.minor_version.patch.minor_patch diff --git a/tests/test_ua.yaml b/tests/test_ua.yaml index 3478be69..15353880 100644 --- a/tests/test_ua.yaml +++ b/tests/test_ua.yaml @@ -1409,6 +1409,24 @@ test_cases: minor: '0' patch: '83' + - user_agent_string: 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.105 Safari/537.36 Vivaldi/1.0.162.9' + family: 'Vivaldi' + major: '1' + minor: '0' + patch: '162' + + - user_agent_string: 'Mozilla/5.0 (iPhone; U; CPU iPhone OS 4_3_2 like Mac OS X) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36 Vivaldi/114' + family: 'Vivaldi' + major: '114' + minor: + patch: + + - user_agent_string: 'Mozilla/5.0 (Macintosh; Intel Mac OS X 11_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.93 Safari/537.36 Vivaldi/3.7' + family: 'Vivaldi' + major: '3' + minor: '7' + patch: + - user_agent_string: 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.135 Safari/537.36 Edge/12.9600' family: 'Edge' major: '12' From cfa516404cbc9dbb4e258fa3676b5d4af0a6ad75 Mon Sep 17 00:00:00 2001 From: Carlos Azevedo Date: Tue, 19 Mar 2024 10:33:38 +0000 Subject: [PATCH 28/31] feat: add support to new DuckDuckGo user-agents --- regexes.yaml | 8 +++++++- tests/test_ua.yaml | 12 ++++++++++++ 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/regexes.yaml b/regexes.yaml index f0861bfa..2fa28251 100644 --- a/regexes.yaml +++ b/regexes.yaml @@ -450,8 +450,14 @@ user_agent_parsers: family_replacement: 'QQ Browser' # DuckDuckGo - - regex: 'Mobile.{0,200}(DuckDuckGo)/(\d+)' + - regex: 'Mozilla.{1,200}Mobile.{1,100}(DuckDuckGo)/(\d+)' family_replacement: 'DuckDuckGo Mobile' + - regex: 'Mozilla.{1,200}(DuckDuckGo)/(\d+)' + family_replacement: 'DuckDuckGo' + - regex: 'Mozilla.{1,200}Mobile.{1,100}(Ddg)/(\d+)(?:\.(\d+)|)' + family_replacement: 'DuckDuckGo Mobile' + - regex: 'Mozilla.{1,200}(Ddg)/(\d+)(?:\.(\d+)|)' + family_replacement: 'DuckDuckGo' # Tenta Browser - regex: '(Tenta/)(\d+)\.(\d+)\.(\d+)' diff --git a/tests/test_ua.yaml b/tests/test_ua.yaml index 15353880..47740af4 100644 --- a/tests/test_ua.yaml +++ b/tests/test_ua.yaml @@ -8442,6 +8442,18 @@ test_cases: minor: patch: + - user_agent_string: 'Mozilla/5.0 (iPhone; CPU iPhone OS 17_2_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.2 Mobile/15E148 Safari/604.1 Ddg/17.2' + family: 'DuckDuckGo Mobile' + major: '17' + minor: '2' + patch: + + - user_agent_string: 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.5 Safari/605.1.15 Ddg/17.2' + family: 'DuckDuckGo' + major: '17' + minor: '2' + patch: + - user_agent_string: 'Mozilla/5.0 [en] (X11, U; OpenVAS-VT 8.0.9)' family: 'OpenVAS Scanner' major: '8' From c10ae3faa28117c061ade5ea7b3745fa5fdd54f2 Mon Sep 17 00:00:00 2001 From: Carlos Azevedo Date: Tue, 9 Apr 2024 14:08:22 +0100 Subject: [PATCH 29/31] fix: update Brave Browser regex (#577) * fix: update Brave Browser regex * fix brave browser regex --------- Co-authored-by: Carlos Azevedo --- regexes.yaml | 8 ++++---- tests/test_ua.yaml | 40 +++++++++++++++++++++++++++++++++++----- 2 files changed, 39 insertions(+), 9 deletions(-) diff --git a/regexes.yaml b/regexes.yaml index 2fa28251..27723d94 100644 --- a/regexes.yaml +++ b/regexes.yaml @@ -378,6 +378,10 @@ user_agent_parsers: - regex: '(Nintendo 3DS)' family_replacement: 'NetFront NX' + # Brave Browser https://brave.com/ , should go before Safari and Chrome Mobile + - regex: '((?:B|b)rave(?:\sChrome)?)/(\d+)(?:\.(\d+)|)(?:\.(\d+)|)(?:\.(\d+)|)' + family_replacement: 'Brave' + # Amazon Silk, should go before Safari and Chrome Mobile - regex: '(Silk)/(\d+)\.(\d+)(?:\.([0-9\-]+)|)' family_replacement: 'Amazon Silk' @@ -622,10 +626,6 @@ user_agent_parsers: - regex: '(Edge?)/(\d+)(?:\.(\d+)|)(?:\.(\d+)|)(?:\.(\d+)|)' family_replacement: 'Edge' - # Brave Browser https://brave.com/ - - regex: '(brave)/(\d+)\.(\d+)\.(\d+) Chrome' - family_replacement: 'Brave' - # Iron Browser ~since version 50 - regex: '(Chrome)/(\d+)\.(\d+)\.(\d+)[\d.]{0,100} Iron[^/]' family_replacement: 'Iron' diff --git a/tests/test_ua.yaml b/tests/test_ua.yaml index 47740af4..27fd4b12 100644 --- a/tests/test_ua.yaml +++ b/tests/test_ua.yaml @@ -7016,17 +7016,47 @@ test_cases: minor: '7' patch: '11' - - user_agent_string: 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) brave/0.7.12 Chrome/47.0.2526.110 Brave/0.36.7 Safari/537.36 ' + - user_agent_string: 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) brave/0.7.12 Chrome/47.0.2526.110 Brave/0.36.7 Safari/537.36' family: 'Brave' major: '0' minor: '7' patch: '12' - - user_agent_string: 'Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) brave/0.7.10 Chrome/47.0.2526.110 Brave/0.36.5 Safari/537.36' + - user_agent_string: 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_3) AppleWebKit/537.36 (KHTML, like Gecko) Brave Chrome/80.0.3987.87 Safari/537.36' family: 'Brave' - major: '0' - minor: '7' - patch: '10' + major: '80' + minor: '0' + patch: '3987' + + - user_agent_string: 'Mozilla/5.0 (Linux; Android 12; SM-G991B) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/117.0.4577.63 Brave/117.1.4577.63 Mobile Safari/537.36' + family: 'Brave' + major: '117' + minor: '1' + patch: '4577' + + - user_agent_string: 'Mozilla/5.0 (iPhone; U; CPU iPhone OS 4_3_2 like Mac OS X) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.0.0 Safari/537.36 Brave/101' + family: 'Brave' + major: '101' + minor: + patch: + + - user_agent_string: 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Brave/537.36' + family: 'Brave' + major: '537' + minor: '36' + patch: + + - user_agent_string: 'Mozilla/5.0 (Linux; Android 12; Pixel 6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.84 Mobile Safari/537.36 Brave/1.40.128' + family: 'Brave' + major: '1' + minor: '40' + patch: '128' + + - user_agent_string: 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.4472.124 Safari/537.3 brave/5035' + family: 'Brave' + major: '5035' + minor: + patch: - user_agent_string: 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome Safari/537.36' family: 'HeadlessChrome' From 959e106754828ae557b0dbcfaf8eeee938d3c824 Mon Sep 17 00:00:00 2001 From: Carlos Azevedo Date: Tue, 9 Apr 2024 16:49:08 +0100 Subject: [PATCH 30/31] feat: add multiple new browsers (#576) * update vivaldi browser regex to match multiple versioning structures * feat: add Huawei Browser * feat: add AVG * feat: add Avast Secure Browser * feat: add Instabridge browser * feat: add Aloha Browser * fix AVG browser test * fix: remove unnecessary capturing group --------- Co-authored-by: Carlos Azevedo --- regexes.yaml | 21 ++++++++++++++- tests/test_ua.yaml | 67 ++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 87 insertions(+), 1 deletion(-) diff --git a/regexes.yaml b/regexes.yaml index 27723d94..14412307 100644 --- a/regexes.yaml +++ b/regexes.yaml @@ -378,6 +378,25 @@ user_agent_parsers: - regex: '(Nintendo 3DS)' family_replacement: 'NetFront NX' + # Huawei Browser, should go before Safari and Chrome Mobile + - regex: '(HuaweiBrowser)/(\d+)\.(\d+)\.(\d+)\.\d+' + family_replacement: 'Huawei Browser' + + # AVG + - regex: '(AVG)/(\d+)\.(\d+)\.(\d+)\.\d+' + family_replacement: 'AVG' + + # Avast + - regex: '(AvastSecureBrowser|Avast)/(\d+)\.(\d+)\.(\d+)' + family_replacement: 'Avast Secure Browser' + + # Instabridge + - regex: '(Instabridge)/(\d+)(?:\.(\d+)|)(?:\.(\d+)|)' + + # Aloha Browser + - regex: '(AlohaBrowser)/(\d+)\.(\d+)\.(\d+)(?:\.(\d+)|)' + family_replacement: 'Aloha Browser' + # Brave Browser https://brave.com/ , should go before Safari and Chrome Mobile - regex: '((?:B|b)rave(?:\sChrome)?)/(\d+)(?:\.(\d+)|)(?:\.(\d+)|)(?:\.(\d+)|)' family_replacement: 'Brave' @@ -619,7 +638,7 @@ user_agent_parsers: family_replacement: 'Superhuman' # Vivaldi - - regex: '(Vivaldi)/(\d+)(?:\.(\d+)|)(?:\.(\d+)|)(?:\.(\d+)|)' + - regex: '(Vivaldi)/(\d+)(?:\.(\d+)|)(?:\.(\d+)|)' # Edge/major_version.minor_version # Edge with chromium Edg/major_version.minor_version.patch.minor_patch diff --git a/tests/test_ua.yaml b/tests/test_ua.yaml index 27fd4b12..28d9d1c1 100644 --- a/tests/test_ua.yaml +++ b/tests/test_ua.yaml @@ -8795,3 +8795,70 @@ test_cases: major: '102' minor: patch: + + - user_agent_string: 'Mozilla/5.0 (Linux; Android 13; LGE-AN00; HMSCore 6.12.2.302) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.88 HuaweiBrowser/14.0.5.301 Mobile Safari/537.36' + family: 'Huawei Browser' + major: '14' + minor: '0' + patch: '5' + + - user_agent_string: 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36 AVG/121.0.0.0' + family: 'AVG' + major: '121' + minor: '0' + patch: '0' + + - user_agent_string: 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 Avast/120.0.0.0' + family: 'Avast Secure Browser' + major: '120' + minor: '0' + patch: '0' + + - user_agent_string: 'Mozilla/5.0 (Linux; Android 8.1.0; B43du7I2fV; U; in) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.5563.115 Mobile AvastSecureBrowser/7.5.2 Safari/537.36' + family: 'Avast Secure Browser' + major: '7' + minor: '5' + patch: '2' + + + - user_agent_string: 'Mozilla/5.0 (Linux; Android 13; 0LpRiWjrpo; U; en) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/117.0.5938.153 Mobile Avast/7.7.5 Safari/537.36' + family: 'Avast Secure Browser' + major: '7' + minor: '7' + patch: '5' + + - user_agent_string: 'Mozilla/5.0 (iPhone; CPU iPhone OS 17_2_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) AvastSecureBrowser/5.3.1 Mobile/15E148 Version/17.0 Safari/605.1.15' + family: 'Avast Secure Browser' + major: '5' + minor: '3' + patch: '1' + + - user_agent_string: 'Mozilla/5.0 (Linux; Android 11; SM-A225M) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/85.0.4183.127 Mobile Safari/537.36 Instabridge/22' + family: 'Instabridge' + major: '22' + minor: + patch: + + - user_agent_string: 'Mozilla/5.0 (Linux; Android 11; SM-J400F) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.127 Mobile Safari/537.36 Instabridge/21.9.0' + family: 'Instabridge' + major: '21' + minor: '9' + patch: '0' + + - user_agent_string: 'Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/117.0.0.0 Mobile Safari/537.36 AlohaBrowser/5.6.1' + family: 'Aloha Browser' + major: '5' + minor: '6' + patch: '1' + + - user_agent_string: 'Mozilla/5.0 (iPhone; CPU iPhone OS 17_2_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 Version/17.2.1 Safari/605.1.15 AlohaBrowser/5.4.1' + family: 'Aloha Browser' + major: '5' + minor: '4' + patch: '1' + + - user_agent_string: 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.102 AlohaBrowser/1.3.0.0 Safari/537.36' + family: 'Aloha Browser' + major: '1' + minor: '3' + patch: '0' From cd5291016e6764b509776ad4206cff1c8b035280 Mon Sep 17 00:00:00 2001 From: masklinn Date: Sat, 20 Apr 2024 21:07:08 +0200 Subject: [PATCH 31/31] fix missing and extra `patch_minor` in ua tests `patch_minor` was added to regexes and some test_ua entries in #322. Neither spec nor reference implementation were ever updated for it, so many regexes were merged (?) with a capture for `patch_minor` but without correctly asserting it, and a pair of cases specify a `patch_minor` which is not captured: - the facebook regex[^1] only has 4 capturing groups - same for the AWS regex[^2] [^1]: https://github.com/ua-parser/uap-core/blob/959e106754828ae557b0dbcfaf8eeee938d3c824/regexes.yaml#L176 [^2]: https://github.com/ua-parser/uap-core/blob/959e106754828ae557b0dbcfaf8eeee938d3c824/regexes.yaml#L155 --- tests/test_ua.yaml | 26 +++++++++++++++++++++++--- 1 file changed, 23 insertions(+), 3 deletions(-) diff --git a/tests/test_ua.yaml b/tests/test_ua.yaml index 28d9d1c1..d27a6f1f 100644 --- a/tests/test_ua.yaml +++ b/tests/test_ua.yaml @@ -190,12 +190,14 @@ test_cases: major: '6' minor: '13' patch: '13719' + patch_minor: '201' - user_agent_string: 'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; WOW64; Trident/6.0; QQBrowser/7.6.21433.400)' family: 'QQ Browser' major: '7' minor: '6' patch: '21433' + patch_minor: '400' - user_agent_string: 'Mozilla/5.0 (Linux; U; Android 4.1.1; zh-cn; MI 2S Build/JRO03L) AppleWebKit/537.36 (KHTML, like Gecko)Version/4.0 MQQBrowser/5.0 Mobile Safari/537.36' family: 'QQ Browser Mobile' @@ -304,6 +306,7 @@ test_cases: major: '68' minor: '0' patch: '3440' + patch_minor: '85' - user_agent_string: 'Mozilla/5.0 (Linux; Android 7.1.2; Nexus 5X Build/N2G47W; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/58.0.3029.83 Mobile Safari/537.36' family: 'Chrome Mobile WebView' @@ -760,6 +763,7 @@ test_cases: major: '7' minor: '4' patch: '1' + patch_minor: '14' - user_agent_string: 'Mozilla/5.0 (MeeGo; NokiaN9) AppleWebKit/534.13 (KHTML, like Gecko) NokiaBrowser/8.5.0 Mobile Safari/534.13' family: 'Nokia Browser' @@ -922,12 +926,14 @@ test_cases: major: '2' minor: '2' patch: '0' + patch_minor: '0' - user_agent_string: 'Mozilla/5.0 (Series40; NokiaX2-05/08.35; Profile/MIDP-2.1 Configuration/CLDC-1.1) Gecko/20100401 S40OviBrowser/2.0.2.68.14' family: 'Ovi Browser' major: '2' minor: '0' patch: '2' + patch_minor: '68' - user_agent_string: 'Mozilla/5.0 (Windows NT 5.1; rv:2.0) Gecko/20110407 Firefox/4.0.3 PaleMoon/4.0.3' family: 'Pale Moon' @@ -1198,24 +1204,28 @@ test_cases: major: '0' minor: '9' patch: '1' + patch_minor: '679' - user_agent_string: 'Mozilla/5.0 (Linux; Android 6.0.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.113 Whale/0.9.5.0 Mobile Safari/537.36' family: 'Whale' major: '0' minor: '9' patch: '5' + patch_minor: '0' - user_agent_string: 'Mozilla/5.0 (Linux; Android 7.1.2; Nexus 6P Build/WHALE) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.220 Whale/1.3.50.3 Mobile Safari/537.36 sidebar webpanel' family: 'Whale' major: '1' minor: '3' patch: '50' + patch_minor: '3' - user_agent_string: 'Mozilla/5.0 (Linux; Android 7.1.2; Nexus 6P Build/WHALE) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.220 Whale/1.3.50.3 Mobile Safari/537.36' family: 'Whale' major: '1' minor: '3' patch: '50' + patch_minor: '3' - user_agent_string: 'J2ME/UCWEB7.0.3.45/139/7682' family: 'UC Browser' @@ -1522,7 +1532,7 @@ test_cases: major: '2' minor: '2' patch: '0' - patch_minor: + patch_minor: '0' - user_agent_string: 'iRAPP/1.16.0 NokiaN95_8GB/31.0.015; Series60/3.1 Profile/MIDP-2.0 Configuration/CLDC-1.' family: 'iRAPP' @@ -6798,7 +6808,7 @@ test_cases: major: '194' minor: '0' patch: '0' - patch_minor: '38' + patch_minor: - user_agent_string: 'Mozilla/5.0 (iPhone; CPU iPhone OS 6_1_4 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Mobile/10B350 [Pinterest/iOS]' family: 'Pinterest' @@ -6997,6 +7007,7 @@ test_cases: major: '44' minor: '5' patch: '0' + patch_minor: '10' - user_agent_string: 'Mozilla/5.0 (iPad; CPU OS 12_5_5 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/12.0 EdgiOS/46.3.26 Mobile/15E148 Safari/605.1.15' family: 'Edge Mobile' @@ -7009,6 +7020,7 @@ test_cases: major: '42' minor: '0' patch: '0' + patch_minor: '2057' - user_agent_string: 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_2) AppleWebKit/537.36 (KHTML, like Gecko) brave/0.7.11 Chrome/47.0.2526.110 Brave/0.36.5 Safari/537.36' family: 'Brave' @@ -7027,12 +7039,14 @@ test_cases: major: '80' minor: '0' patch: '3987' + patch_minor: '87' - user_agent_string: 'Mozilla/5.0 (Linux; Android 12; SM-G991B) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/117.0.4577.63 Brave/117.1.4577.63 Mobile Safari/537.36' family: 'Brave' major: '117' minor: '1' patch: '4577' + patch_minor: '63' - user_agent_string: 'Mozilla/5.0 (iPhone; U; CPU iPhone OS 4_3_2 like Mac OS X) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.0.0 Safari/537.36 Brave/101' family: 'Brave' @@ -7183,12 +7197,14 @@ test_cases: major: '14' minor: '43' patch: '343' + patch_minor: '17' - user_agent_string: 'Mozilla/5.0 (Linux; Android 6.0.1; Z831 Build/MMB29M) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.94 Mobile Crosswalk/11.45.2454.20160425 Mobile Safari/537.36' family: 'Crosswalk' major: '11' minor: '45' patch: '2454' + patch_minor: '20160425' - user_agent_string: 'Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Mobile/15A372 Safari Line/7.12.0' family: 'LINE' @@ -7955,7 +7971,6 @@ test_cases: major: '3' minor: '3' patch: '11' - patch_minor: '0' - user_agent_string: 'Boto/2.48.0 Python/2.7.14 Linux/4.2.0-41-generic' family: 'Boto' @@ -8131,6 +8146,7 @@ test_cases: major: '4' minor: '2' patch: '2' + patch_minor: '38484' - user_agent_string: 'Mozilla/5.0 (iPhone; CPU iPhone OS 11_0_2 like Mac OS X) AppleWebKit/604.1.34 (KHTML, like Gecko) GSA/36.0.169645775 Mobile/15A421 Safari/604.1' family: 'Google' @@ -8235,6 +8251,7 @@ test_cases: major: '10' minor: '29' patch: '1' + patch_minor: '0' - user_agent_string: 'OgScrper/1.0.0' family: 'OgScrper' @@ -8771,12 +8788,14 @@ test_cases: major: '8' minor: '1' patch: '3' + patch_minor: '72' - user_agent_string: 'Mozilla/5.0 (Linux; Android 9; Redmi 8) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.4951.41 Mobile Safari/537.36 (Ecosia android@101.0.4951.41)' family: 'Ecosia Android' major: '101' minor: '0' patch: '4951' + patch_minor: '41' - user_agent_string: 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:102.0) Gecko/20100101 MullvadBrowser/102.13.0' family: 'MullvadBrowser' @@ -8862,3 +8881,4 @@ test_cases: major: '1' minor: '3' patch: '0' + patch_minor: '0'