Skip to content

Commit ff5e94d

Browse files
committed
Add DuckDuckGo browser.
1 parent b7496e1 commit ff5e94d

File tree

10 files changed

+86
-3
lines changed

10 files changed

+86
-3
lines changed

.rubocop.yml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,3 +27,9 @@ Style/Alias:
2727

2828
Lint/RedundantCopDisableDirective:
2929
Enabled: false
30+
31+
Metrics/AbcSize:
32+
Enabled: false
33+
34+
Metrics/CyclomaticComplexity:
35+
Enabled: false

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
- Detect Mac-based platforms differently, depending on the version; "Mac OS X"
88
will be returned for versions prior to 10.12, and "macOS" for newer versions.
99
- Remove `Browser.modern_rules` and `Browser::Base#modern?`.
10+
- Add DuckDuckGo browser.
1011

1112
# 3.0.3
1213

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ browser = Browser.new("Some User Agent", accept_language: "en-us")
2525
browser.bot?
2626
browser.chrome?
2727
browser.core_media?
28+
browser.duck_duck_go?
2829
browser.edge? # Newest MS browser
2930
browser.electron? # Electron Framework
3031
browser.firefox?

lib/browser/base.rb

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -187,6 +187,11 @@ def opera_mini?(expected_version = nil)
187187
ua =~ /Opera Mini/ && detect_version?(full_version, expected_version)
188188
end
189189

190+
# Detect if browser is DuckDuckGo.
191+
def duck_duck_go?(expected_version = nil)
192+
ua =~ /DuckDuckGo/ && detect_version?(full_version, expected_version)
193+
end
194+
190195
def webkit_full_version
191196
ua[%r{AppleWebKit/([\d.]+)}, 1] || "0.0"
192197
end

lib/browser/browser.rb

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
require_relative "yandex"
3131
require_relative "sputnik"
3232
require_relative "snapchat"
33+
require_relative "duck_duck_go"
3334

3435
require_relative "bot"
3536
require_relative "bot/empty_user_agent_matcher"
@@ -70,6 +71,7 @@ def self.matchers
7071
Electron, # must be placed before Chrome and Safari
7172
Yandex, # must be placed before Chrome and Safari
7273
Sputnik, # must be placed before Chrome and Safari
74+
DuckDuckGo, # must be placed before Chrome and Safari
7375
Chrome,
7476
Safari,
7577
MicroMessenger,

lib/browser/chrome.rb

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,9 +21,12 @@ def full_version
2121

2222
def match?
2323
ua =~ /Chrome|CriOS/ &&
24-
ua !~ /PhantomJS|FxiOS|YaBrowser|SputnikBrowser|ArchiveBot/ &&
24+
ua !~ /PhantomJS|FxiOS|ArchiveBot/ &&
2525
!opera? &&
26-
!edge?
26+
!edge? &&
27+
!duck_duck_go? &&
28+
!yandex? &&
29+
!sputnik?
2730
end
2831
end
2932
end

lib/browser/duck_duck_go.rb

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
# frozen_string_literal: true
2+
3+
module Browser
4+
class DuckDuckGo < Base
5+
def id
6+
:duckduckgo
7+
end
8+
9+
def name
10+
"DuckDuckGo"
11+
end
12+
13+
def full_version
14+
ua[%r{DuckDuckGo/([\d.]+)}, 1] ||
15+
"0.0"
16+
end
17+
18+
def match?
19+
ua =~ /DuckDuckGo/
20+
end
21+
end
22+
end

lib/browser/safari.rb

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,13 @@ def full_version
1818
end
1919

2020
def match?
21-
ua =~ /Safari/ && ua !~ /Chrome|CriOS|PhantomJS|FxiOS|YaBrowser/
21+
ua =~ /Safari/ &&
22+
ua !~ /PhantomJS|FxiOS/ &&
23+
!edge? &&
24+
!chrome? &&
25+
!duck_duck_go? &&
26+
!yandex? &&
27+
!sputnik?
2228
end
2329
end
2430
end

test/ua.yml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,8 @@ CHROME: "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_4; en-US) AppleWebKit/53
3232
CHROME_OS: "Mozilla/5.0 (X11; CrOS x86_64 3701.81.0) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.57 Safari/537.31."
3333
COREMEDIA: "Apple Mac OS X v10.6.4 CoreMedia v1.0.0.10F569"
3434
CUSTOM_APP: "Our App 0.0.1 (Linux; Android 4.0.3; HTC Ruby Build/IML74K; en_CA)"
35+
DUCKDUCKGO_BROWSER_IOS: "Mozilla/5.0 (iPhone; CPU iPhone OS 13_3_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 DuckDuckGo/7"
36+
DUCKDUCKGO_BROWSER_ANDROID: Mozilla/5.0 (Linux; Android 10) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/78.0.3904.96 Mobile Safari/537.36 DuckDuckGo/5"
3537
ELECTRON: "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.143 Electron/1.4.12 Safari/537.36"
3638
FACEBOOK: Mozilla/5.0 (iPhone; CPU iPhone OS 10_3_3 like Mac OS X) AppleWebKit/603.3.8 (KHTML, like Gecko) Mobile/14G60 [FBAN/FBIOS;FBAV/135.0.0.45.90;FBBV/66877072;FBDV/iPhone9,3;FBMD/iPhone;FBSN/iOS;FBSV/10.3.3;FBSS/2;FBCR/AT&T;FBID/phone;FBLC/en_US;FBOP/5;FBRV/0]
3739
FACEBOOK_ANDROID: "Mozilla/5.0 (Linux; Android 9; ONEPLUS A6003 Build/PKQ1.180716.001; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/73.0.3683.90 Mobile Safari/537.36 [FB_IAB/FB4A;FBAV/214.0.0.43.83;]"

test/unit/duck_duck_go_test.rb

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
# frozen_string_literal: true
2+
3+
require "test_helper"
4+
5+
class DuckDuckGoTest < Minitest::Test
6+
test "detects DuckDuckGo on iOS device" do
7+
browser = Browser.new(Browser["DUCKDUCKGO_BROWSER_IOS"])
8+
assert browser.duck_duck_go?
9+
refute browser.safari?
10+
refute browser.chrome?
11+
assert browser.webkit?
12+
assert_equal "DuckDuckGo", browser.name
13+
assert_equal :duckduckgo, browser.id
14+
end
15+
16+
test "detects DuckDuckGo on Android device" do
17+
browser = Browser.new(Browser["DUCKDUCKGO_BROWSER_ANDROID"])
18+
assert browser.duck_duck_go?
19+
refute browser.safari?
20+
refute browser.chrome?
21+
assert_equal "DuckDuckGo", browser.name
22+
assert_equal :duckduckgo, browser.id
23+
end
24+
25+
test "detects correct version" do
26+
browser = Browser.new(Browser["DUCKDUCKGO_BROWSER_IOS"])
27+
assert_equal "7", browser.full_version
28+
assert_equal "7", browser.version
29+
end
30+
31+
test "detects version by range" do
32+
browser = Browser.new(Browser["DUCKDUCKGO_BROWSER_IOS"])
33+
assert browser.duck_duck_go?(%w[>=7 <8])
34+
end
35+
end

0 commit comments

Comments
 (0)