browser 4.1.0 → 5.3.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.
Files changed (101) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/tests.yml +57 -0
  3. data/.rubocop.yml +3 -0
  4. data/CHANGELOG.md +46 -3
  5. data/FUNDING.yml +3 -0
  6. data/README.md +101 -50
  7. data/bots.yml +299 -298
  8. data/browser.gemspec +5 -4
  9. data/lib/browser/accept_language.rb +4 -4
  10. data/lib/browser/alipay.rb +1 -1
  11. data/lib/browser/base.rb +72 -13
  12. data/lib/browser/blackberry.rb +1 -1
  13. data/lib/browser/bot/keyword_matcher.rb +1 -1
  14. data/lib/browser/browser.rb +21 -2
  15. data/lib/browser/chrome.rb +9 -3
  16. data/lib/browser/device.rb +12 -5
  17. data/lib/browser/device/android.rb +1 -1
  18. data/lib/browser/device/blackberry_playbook.rb +1 -1
  19. data/lib/browser/device/ipad.rb +1 -1
  20. data/lib/browser/device/iphone.rb +1 -1
  21. data/lib/browser/device/ipod_touch.rb +1 -1
  22. data/lib/browser/device/kindle.rb +1 -1
  23. data/lib/browser/device/kindle_fire.rb +1 -1
  24. data/lib/browser/device/playstation3.rb +1 -1
  25. data/lib/browser/device/playstation4.rb +1 -1
  26. data/lib/browser/device/psp.rb +1 -1
  27. data/lib/browser/device/psvita.rb +1 -1
  28. data/lib/browser/device/samsung.rb +33 -0
  29. data/lib/browser/device/surface.rb +1 -1
  30. data/lib/browser/device/switch.rb +1 -1
  31. data/lib/browser/device/tv.rb +1 -1
  32. data/lib/browser/device/unknown.rb +1 -1
  33. data/lib/browser/device/wii.rb +1 -1
  34. data/lib/browser/device/wiiu.rb +1 -1
  35. data/lib/browser/device/xbox_360.rb +1 -1
  36. data/lib/browser/device/xbox_one.rb +1 -1
  37. data/lib/browser/duck_duck_go.rb +1 -1
  38. data/lib/browser/edge.rb +2 -2
  39. data/lib/browser/electron.rb +1 -1
  40. data/lib/browser/facebook.rb +1 -1
  41. data/lib/browser/firefox.rb +1 -1
  42. data/lib/browser/google_search_app.rb +21 -0
  43. data/lib/browser/huawei_browser.rb +21 -0
  44. data/lib/browser/instagram.rb +1 -1
  45. data/lib/browser/internet_explorer.rb +2 -2
  46. data/lib/browser/maxthon.rb +21 -0
  47. data/lib/browser/micro_messenger.rb +1 -1
  48. data/lib/browser/miui_browser.rb +21 -0
  49. data/lib/browser/nokia.rb +1 -1
  50. data/lib/browser/opera.rb +1 -1
  51. data/lib/browser/otter.rb +1 -1
  52. data/lib/browser/phantom_js.rb +1 -1
  53. data/lib/browser/platform.rb +21 -15
  54. data/lib/browser/platform/adobe_air.rb +1 -1
  55. data/lib/browser/platform/android.rb +1 -1
  56. data/lib/browser/platform/blackberry.rb +1 -1
  57. data/lib/browser/platform/chrome_os.rb +1 -1
  58. data/lib/browser/platform/firefox_os.rb +1 -1
  59. data/lib/browser/platform/ios.rb +2 -2
  60. data/lib/browser/platform/kai_os.rb +23 -0
  61. data/lib/browser/platform/linux.rb +1 -1
  62. data/lib/browser/platform/mac.rb +2 -2
  63. data/lib/browser/platform/{other.rb → unknown.rb} +3 -3
  64. data/lib/browser/platform/windows.rb +2 -2
  65. data/lib/browser/platform/windows_mobile.rb +1 -1
  66. data/lib/browser/platform/windows_phone.rb +1 -1
  67. data/lib/browser/qq.rb +1 -1
  68. data/lib/browser/safari.rb +12 -3
  69. data/lib/browser/samsung_browser.rb +1 -1
  70. data/lib/browser/snapchat.rb +1 -1
  71. data/lib/browser/sougou_browser.rb +24 -0
  72. data/lib/browser/sputnik.rb +1 -1
  73. data/lib/browser/uc_browser.rb +1 -1
  74. data/lib/browser/{generic.rb → unknown.rb} +3 -3
  75. data/lib/browser/version.rb +1 -1
  76. data/lib/browser/weibo.rb +1 -1
  77. data/lib/browser/yandex.rb +1 -1
  78. data/samsung.yml +138 -0
  79. data/test/browser_test.rb +37 -6
  80. data/test/ua.yml +18 -4
  81. data/test/ua_bots.yml +3 -2
  82. data/test/unit/adobe_air_test.rb +1 -1
  83. data/test/unit/alipay_test.rb +6 -0
  84. data/test/unit/bots_test.rb +1 -1
  85. data/test/unit/console_test.rb +2 -2
  86. data/test/unit/device_test.rb +30 -3
  87. data/test/unit/duck_duck_go_test.rb +2 -0
  88. data/test/unit/google_search_app_test.rb +54 -0
  89. data/test/unit/huawei_browser_test.rb +25 -0
  90. data/test/unit/kai_os_test.rb +31 -0
  91. data/test/unit/maxthon_test.rb +25 -0
  92. data/test/unit/meta_test.rb +10 -1
  93. data/test/unit/miui_browser_test.rb +25 -0
  94. data/test/unit/opera_test.rb +1 -0
  95. data/test/unit/platform_test.rb +7 -7
  96. data/test/unit/qq_test.rb +12 -0
  97. data/test/unit/safari_test.rb +12 -7
  98. data/test/unit/samsung_browser_test.rb +1 -0
  99. data/test/unit/sougou_browser_test.rb +41 -0
  100. metadata +37 -16
  101. data/.travis.yml +0 -23
@@ -4,7 +4,7 @@ module Browser
4
4
  class Platform
5
5
  class AdobeAir < Base
6
6
  def match?
7
- ua =~ /AdobeAIR/
7
+ ua.include?("AdobeAIR")
8
8
  end
9
9
 
10
10
  def version
@@ -4,7 +4,7 @@ module Browser
4
4
  class Platform
5
5
  class Android < Base
6
6
  def match?
7
- ua =~ /Android/
7
+ ua.include?("Android") && !ua.include?("KAIOS")
8
8
  end
9
9
 
10
10
  def name
@@ -4,7 +4,7 @@ module Browser
4
4
  class Platform
5
5
  class BlackBerry < Base
6
6
  def match?
7
- ua =~ /BB10|BlackBerry/
7
+ ua.match?(/BB10|BlackBerry/)
8
8
  end
9
9
 
10
10
  def name
@@ -4,7 +4,7 @@ module Browser
4
4
  class Platform
5
5
  class ChromeOS < Base
6
6
  def match?
7
- ua =~ /CrOS/
7
+ ua.include?("CrOS")
8
8
  end
9
9
 
10
10
  def name
@@ -16,7 +16,7 @@ module Browser
16
16
  end
17
17
 
18
18
  def match?
19
- ua !~ /(Android|Linux|BlackBerry|Windows|Mac)/ && ua =~ /Firefox/
19
+ ua !~ /(Android|Linux|BlackBerry|Windows|Mac)/ && ua.include?("Firefox")
20
20
  end
21
21
  end
22
22
  end
@@ -5,7 +5,7 @@ module Browser
5
5
  class IOS < Base
6
6
  MATCHER = /(iPhone|iPad|iPod)/.freeze
7
7
  VERSION_MATCHER =
8
- /OS ((?<major>\d+)_(?<minor>\d+)_?(?<patch>\d+)?)/.freeze
8
+ /OS (?<major>\d+)_(?<minor>\d+)_?(?<patch>\d+)?/.freeze
9
9
 
10
10
  def version
11
11
  matches = VERSION_MATCHER.match(ua)
@@ -32,7 +32,7 @@ module Browser
32
32
  end
33
33
 
34
34
  def match?
35
- ua =~ MATCHER
35
+ ua.match?(MATCHER)
36
36
  end
37
37
 
38
38
  def device
@@ -0,0 +1,23 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Browser
4
+ class Platform
5
+ class KaiOS < Base
6
+ def version
7
+ ua[%r{KAIOS/([\d.]+)}, 1]
8
+ end
9
+
10
+ def name
11
+ "KaiOS"
12
+ end
13
+
14
+ def id
15
+ :kai_os
16
+ end
17
+
18
+ def match?
19
+ ua.include?("KAIOS")
20
+ end
21
+ end
22
+ end
23
+ end
@@ -16,7 +16,7 @@ module Browser
16
16
  end
17
17
 
18
18
  def match?
19
- ua =~ /Linux/
19
+ ua.include?("Linux")
20
20
  end
21
21
  end
22
22
  end
@@ -4,7 +4,7 @@ module Browser
4
4
  class Platform
5
5
  class Mac < Base
6
6
  def version
7
- (ua[/Mac OS X\s*([0-9_\.]+)?/, 1] || "0").tr("_", ".")
7
+ (ua[/Mac OS X\s*([0-9_.]+)?/, 1] || "0").tr("_", ".")
8
8
  end
9
9
 
10
10
  def name
@@ -18,7 +18,7 @@ module Browser
18
18
  end
19
19
 
20
20
  def match?
21
- ua =~ /Mac/
21
+ ua.include?("Mac")
22
22
  end
23
23
  end
24
24
  end
@@ -2,17 +2,17 @@
2
2
 
3
3
  module Browser
4
4
  class Platform
5
- class Other < Base
5
+ class Unknown < Base
6
6
  def version
7
7
  "0"
8
8
  end
9
9
 
10
10
  def name
11
- "Other"
11
+ "Unknown"
12
12
  end
13
13
 
14
14
  def id
15
- :other
15
+ :unknown_platform
16
16
  end
17
17
 
18
18
  def match?
@@ -4,7 +4,7 @@ module Browser
4
4
  class Platform
5
5
  class Windows < Base
6
6
  def version
7
- ua[/Windows NT\s*([0-9_\.]+)?/, 1] || "0"
7
+ ua[/Windows NT\s*([0-9_.]+)?/, 1] || "0"
8
8
  end
9
9
 
10
10
  def name
@@ -16,7 +16,7 @@ module Browser
16
16
  end
17
17
 
18
18
  def match?
19
- ua =~ /Windows/
19
+ ua.include?("Windows")
20
20
  end
21
21
  end
22
22
  end
@@ -16,7 +16,7 @@ module Browser
16
16
  end
17
17
 
18
18
  def match?
19
- ua =~ /Windows CE/
19
+ ua.include?("Windows CE")
20
20
  end
21
21
  end
22
22
  end
@@ -16,7 +16,7 @@ module Browser
16
16
  end
17
17
 
18
18
  def match?
19
- ua =~ /Windows Phone/
19
+ ua.include?("Windows Phone")
20
20
  end
21
21
  end
22
22
  end
@@ -19,7 +19,7 @@ module Browser
19
19
  end
20
20
 
21
21
  def match?
22
- ua =~ %r{QQ/|QQBrowser}i
22
+ ua.match?(%r{QQ/|QQBrowser}i)
23
23
  end
24
24
  end
25
25
  end
@@ -18,13 +18,22 @@ module Browser
18
18
  end
19
19
 
20
20
  def match?
21
- ua =~ /Safari/ &&
22
- ua !~ /PhantomJS|FxiOS/ &&
21
+ ua.include?("Safari") &&
22
+ !ua.match?(/PhantomJS|FxiOS/) &&
23
23
  !edge? &&
24
24
  !chrome? &&
25
+ !opera? &&
26
+ !samsung_browser? &&
27
+ !huawei_browser? &&
28
+ !miui_browser? &&
25
29
  !duck_duck_go? &&
26
30
  !yandex? &&
27
- !sputnik?
31
+ !sputnik? &&
32
+ !maxthon? &&
33
+ !qq? &&
34
+ !alipay? &&
35
+ !sougou_browser? &&
36
+ !google_search_app?
28
37
  end
29
38
  end
30
39
  end
@@ -15,7 +15,7 @@ module Browser
15
15
  end
16
16
 
17
17
  def match?
18
- ua =~ /SamsungBrowser/
18
+ ua.include?("SamsungBrowser")
19
19
  end
20
20
  end
21
21
  end
@@ -15,7 +15,7 @@ module Browser
15
15
  end
16
16
 
17
17
  def match?
18
- ua =~ /Snapchat/
18
+ ua.include?("Snapchat")
19
19
  end
20
20
  end
21
21
  end
@@ -0,0 +1,24 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Browser
4
+ class SougouBrowser < Base
5
+ def id
6
+ :sougou_browser
7
+ end
8
+
9
+ def name
10
+ "Sougou Browser"
11
+ end
12
+
13
+ # We can't get the real version on desktop device from the ua string
14
+ def full_version
15
+ ua[%r{(?:SogouMobileBrowser)/([\d.]+)}, 1] || "0.0"
16
+ end
17
+
18
+ # SogouMobileBrowser for mobile device
19
+ # SE for desktop device
20
+ def match?
21
+ ua.match?(/SogouMobileBrowser/i) || ua.match?(/\bSE\b/)
22
+ end
23
+ end
24
+ end
@@ -15,7 +15,7 @@ module Browser
15
15
  end
16
16
 
17
17
  def match?
18
- ua =~ /SputnikBrowser/
18
+ ua.include?("SputnikBrowser")
19
19
  end
20
20
  end
21
21
  end
@@ -15,7 +15,7 @@ module Browser
15
15
  end
16
16
 
17
17
  def match?
18
- ua =~ /UCBrowser/
18
+ ua.include?("UCBrowser")
19
19
  end
20
20
  end
21
21
  end
@@ -1,18 +1,18 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Browser
4
- class Generic < Base
4
+ class Unknown < Base
5
5
  NAMES = {
6
6
  "QuickTime" => "QuickTime",
7
7
  "CoreMedia" => "Apple CoreMedia"
8
8
  }.freeze
9
9
 
10
10
  def id
11
- :generic
11
+ :unknown_browser
12
12
  end
13
13
 
14
14
  def name
15
- infer_name || "Generic Browser"
15
+ infer_name || "Unknown Browser"
16
16
  end
17
17
 
18
18
  def full_version
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Browser
4
- VERSION = "4.1.0"
4
+ VERSION = "5.3.0"
5
5
  end
@@ -15,7 +15,7 @@ module Browser
15
15
  end
16
16
 
17
17
  def match?
18
- ua =~ /__weibo__/i
18
+ ua.match?(/__weibo__/i)
19
19
  end
20
20
  end
21
21
  end
@@ -15,7 +15,7 @@ module Browser
15
15
  end
16
16
 
17
17
  def match?
18
- ua =~ /YaBrowser/
18
+ ua.include?("YaBrowser")
19
19
  end
20
20
  end
21
21
  end
@@ -0,0 +1,138 @@
1
+ # Source: https://en.wikipedia.org/wiki/Samsung_Galaxy
2
+ SM-G900H: Galaxy S5 Exynos
3
+ SM-A320FL: Galaxy A3
4
+ SM-G780F: Galaxy S20 Fan Edition
5
+ SM-G781B: Galaxy S20 Fan Edition
6
+ SM-F196B: Galaxy Z Fold2 5G
7
+ SM-G928A: Galaxy S6 Edge+
8
+ SM-G928AZ: Galaxy S6 Edge+
9
+ SM-G928D: Galaxy S6 Edge+
10
+ SM-G928F: Galaxy S6 Edge+
11
+ SM-G928FD: Galaxy S6 Edge+
12
+ SM-G928I: Galaxy S6 Edge+
13
+ SM-G928K: Galaxy S6 Edge+
14
+ SM-G928L: Galaxy S6 Edge+
15
+ SM-G928P: Galaxy S6 Edge+
16
+ SM-G928PZ: Galaxy S6 Edge+
17
+ SM-G928R4: Galaxy S6 Edge+
18
+ SM-G928R7: Galaxy S6 Edge+
19
+ SM-G928S: Galaxy S6 Edge+
20
+ SM-G928T: Galaxy S6 Edge+
21
+ SM-G928T1: Galaxy S6 Edge+
22
+ SM-G928TR: Galaxy S6 Edge+
23
+ SM-G928V: Galaxy S6 Edge+
24
+ SM-G9280: Galaxy S6 Edge+
25
+ SM-G9288: Galaxy S6 Edge+
26
+ SM-G9289: Galaxy S6 Edge+
27
+ SM-A8000: Galaxy A8
28
+ SM-A800F: Galaxy A8
29
+ SM-A800I: Galaxy A8
30
+ SM-A800S: Galaxy A8
31
+ SM-A800Y: Galaxy A8
32
+ SM-N9200: Galaxy Note 5
33
+ SM-N920C: Galaxy Note 5
34
+ SM-N920T: Galaxy Note 5
35
+ SM-N920A: Galaxy Note 5
36
+ SM-N920I: Galaxy Note 5
37
+ SM-N9208: Galaxy Note 5
38
+ SM-G903FP: Galaxy S5 Neo
39
+ SM-G903WP: Galaxy S5 Neo
40
+ SM-G925A: Galaxy S6 Edge
41
+ SM-G925AZ: Galaxy S6 Edge
42
+ SM-G925F: Galaxy S6 Edge
43
+ SM-G925I: Galaxy S6 Edge
44
+ SM-G925K: Galaxy S6 Edge
45
+ SM-G925L: Galaxy S6 Edge
46
+ SM-G925P: Galaxy S6 Edge
47
+ SM-G925PZ: Galaxy S6 Edge
48
+ SM-G925R4: Galaxy S6 Edge
49
+ SM-G925R7: Galaxy S6 Edge
50
+ SM-G925S: Galaxy S6 Edge
51
+ SM-G925T: Galaxy S6 Edge
52
+ SM-G925T1: Galaxy S6 Edge
53
+ SM-G925TR: Galaxy S6 Edge
54
+ SM-G925V: Galaxy S6 Edge
55
+ SM-G9250: Galaxy S6 Edge
56
+ SM-G9258: Galaxy S6 Edge
57
+ SM-G9259: Galaxy S6 Edge
58
+ SM-G920A: Galaxy S6
59
+ SM-G920AZ: Galaxy S6
60
+ SM-G920D: Galaxy S6
61
+ SM-G920F: Galaxy S6
62
+ SM-G920FD: Galaxy S6
63
+ SM-G920I: Galaxy S6
64
+ SM-G920K: Galaxy S6
65
+ SM-G920L: Galaxy S6
66
+ SM-G920P: Galaxy S6
67
+ SM-G920PZ: Galaxy S6
68
+ SM-G920R4: Galaxy S6
69
+ SM-G920R7: Galaxy S6
70
+ SM-G920S: Galaxy S6
71
+ SM-G920T: Galaxy S6
72
+ SM-G920T1: Galaxy S6
73
+ SM-G920TR: Galaxy S6
74
+ SM-G920V: Galaxy S6
75
+ SM-G9200: Galaxy S6
76
+ SM-G9208: Galaxy S6
77
+ SM-G9209: Galaxy S6
78
+ SM-A700F: Galaxy A7
79
+ SM-A700FD: Galaxy A7
80
+ SM-A700FQ: Galaxy A7
81
+ SM-A700H: Galaxy A7
82
+ SM-A700K: Galaxy A7
83
+ SM-A700L: Galaxy A7
84
+ SM-A700M: Galaxy A7
85
+ SM-A700S: Galaxy A7
86
+ SM-A700X: Galaxy A7
87
+ SM-A700YD: Galaxy A7
88
+ SM-A700YZ: Galaxy A7
89
+ SM-A7000: Galaxy A7
90
+ SM-A7009: Galaxy A7
91
+ SM-A7009W: Galaxy A7
92
+ SM-G530BT: Galaxy Grand Prime
93
+ SM-G530F: Galaxy Grand Prime
94
+ SM-G530FQ: Galaxy Grand Prime
95
+ SM-G530FZ: Galaxy Grand Prime
96
+ SM-G530H: Galaxy Grand Prime
97
+ SM-G530M: Galaxy Grand Prime
98
+ SM-G530MU: Galaxy Grand Prime
99
+ SM-G530P: Galaxy Grand Prime
100
+ SM-G530R4: Galaxy Grand Prime
101
+ SM-G530R7: Galaxy Grand Prime
102
+ SM-G530T: Galaxy Grand Prime
103
+ SM-G530W: Galaxy Grand Prime
104
+ SM-G530Y: Galaxy Grand Prime
105
+ SM-G5306W: Galaxy Grand Prime
106
+ SM-G5308W: Galaxy Grand Prime
107
+ SM-G5309W: Galaxy Grand Prime
108
+ SM-J7109: Galaxy J7
109
+ SM-J710F: Galaxy J7
110
+ SM-J710FN: Galaxy J7
111
+ SM-J710H: Galaxy J7
112
+ SM-J710MN: Galaxy J7
113
+ SM-J710FQ: Galaxy J7
114
+ SM-J710K: Galaxy J7
115
+ SM-J710K: Galaxy J7
116
+ SM-J710GN: Galaxy J7
117
+ SM-J5109: Galaxy J5
118
+ SM-J510F: Galaxy J5
119
+ SM-J510FN: Galaxy J5
120
+ SM-J510H: Galaxy J5
121
+ SM-J510G: Galaxy J5
122
+ SM-J510MN: Galaxy J5
123
+ SM-J510Y: Galaxy J5
124
+ SM-J5108: Galaxy J5
125
+ SM-J510K: Galaxy J5
126
+ SM-J510L: Galaxy J5
127
+ SM-J510S: Galaxy J5
128
+ SM-J510UN: Galaxy J5
129
+ SM-G570F: Galaxy J2 Prime
130
+ SM-G570M: Galaxy J2 Prime
131
+ SM-G532F: Galaxy J2 Prime
132
+ SM-G532M: Galaxy J2 Prime
133
+ SM-G532G: Galaxy J2 Prime
134
+ SM-G610F: Galaxy J7 Prime
135
+ SM-G610M: Galaxy J7 Prime
136
+ SM-G975F: Galaxy S10+
137
+ SM-G960F: Galaxy S9
138
+ SM-F700F: Galaxy Z Flip