browser_sniffer 1.0.13 → 1.1.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 +4 -4
- data/.github/probots.yml +2 -0
- data/browser_sniffer.gemspec +1 -0
- data/lib/browser_sniffer/patterns.rb +87 -0
- data/lib/browser_sniffer/version.rb +1 -1
- data/test/browser_sniffer_test.rb +6 -3
- data/test/shopify_agents_test.rb +365 -0
- data/test/test_helper.rb +1 -2
- metadata +19 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: cf033cc654dff84bed444330cf7d072b32dc0293
|
4
|
+
data.tar.gz: '096ac9e8880a0bf1cc824901a905d88f0b86225d'
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 9f505b862e380c86fbe8bb5642298ecf9726215725ce1efb9b90fb921549363c505da096691d6f73cf51babc11d0f6b481e5bb6db3fca7ef8af9e685083e44ff
|
7
|
+
data.tar.gz: 5c44d0be93014a810d7183eac1fc4ed0fc81669b943bfde6ee3e4cf8988b319cc61e5c83b96717b0fe9692ece44b72ad43ee5652e137500f1d7a3348d92aca19
|
data/.github/probots.yml
ADDED
data/browser_sniffer.gemspec
CHANGED
@@ -45,6 +45,39 @@ class BrowserSniffer
|
|
45
45
|
REGEX_MAP = {
|
46
46
|
:browser => [
|
47
47
|
[
|
48
|
+
# Shopify Mobile for iPhone or iPad
|
49
|
+
%r{^Shopify/\d+\s\((iPhone|iPad)\;\siOS\s[\d\.]+}i
|
50
|
+
], [[:name, 'Shopify Mobile']], [
|
51
|
+
# Shopify Mobile for Android
|
52
|
+
%r{^Dalvik/[a-z0-9\.]+.*Shopify\s[\d+\.\/]+}i
|
53
|
+
], [[:name, 'Shopify Mobile']], [
|
54
|
+
# Shopify POS for iOS
|
55
|
+
%r{.*(Shopify\sPOS)\/([\d\.]+)\s\((iPhone|iPad|iPod\stouch)\;}i,
|
56
|
+
], [:name, :version], [
|
57
|
+
# Old Shopify POS for Android
|
58
|
+
%r{^Dalvik/[a-z0-9\.]+.*(Shopify\sPOS)\s(\d(?:\.\d+)*)(\/\d*)*}i,
|
59
|
+
], [:name, :version], [
|
60
|
+
# Shopify POS for Android (Native App)
|
61
|
+
%r{.*(\sPOS\s-).*\s([\d+\.]+)(\/\d*)*\s}i,
|
62
|
+
], [[:name, 'Shopify POS'], :version], [
|
63
|
+
# Shopify POS for Android (SmartWebView)
|
64
|
+
%r{.*(Shopify\sPOS)\s.*Android.*\s([\d+\.]+)(\/\d*)*\s}i,
|
65
|
+
], [:name, :version], [
|
66
|
+
# Shopify POS uses this user agent
|
67
|
+
%r{^(okhttp)\/([\d\.]+)}i
|
68
|
+
], [:name, :version], [
|
69
|
+
# Shopify Mobile for iPhone or iPad
|
70
|
+
%r{^(Shopify Mobile)\/(?:iPhone\sOS|iOS)\/([\d\.]+) \((iPhone|iPad|iPod)}i
|
71
|
+
], [[:name, 'Shopify Mobile'], :version], [
|
72
|
+
# Shopify Mobile for Android
|
73
|
+
%r{^(Shopify Mobile)\/Android\/([\d\.]+(?: \(debug(?:|-push)\))?) \(Build (\d+) with API (\d+)}i
|
74
|
+
], [[:name, 'Shopify Mobile'], :version, :build, :sdk_version], [
|
75
|
+
# ShopifyFoundation shared library
|
76
|
+
/^(ShopifyFoundation)/i,
|
77
|
+
], [:name], [
|
78
|
+
# Shopify Ping iOS
|
79
|
+
%r{^(Shopify Ping)\/(?:iPhone\sOS|iOS)\/([\d\.]+) \((iPhone|iPad|iPod)}i
|
80
|
+
], [[:name, 'Shopify Ping'], :version], [
|
48
81
|
# Presto based
|
49
82
|
/(opera\smini)\/((\d+)?[\w\.-]+)/i, # Opera Mini
|
50
83
|
/(opera\s[mobiletab]+).+:version\/((\d+)?[\w\.-]+)/i, # Opera Mobi/Tablet
|
@@ -117,6 +150,36 @@ class BrowserSniffer
|
|
117
150
|
],
|
118
151
|
:device => [
|
119
152
|
[
|
153
|
+
# Shopify Mobile for iPhone
|
154
|
+
%r{^Shopify Mobile/(?:iPhone\sOS|iOS)/[\d\.]+ \((iPhone)([\d,]+)}i
|
155
|
+
], [[:type, :handheld], :model], [
|
156
|
+
# Shopify Mobile for iPad
|
157
|
+
%r{^Shopify Mobile/(?:iPhone\sOS|iOS)/[\d\.]+ \((iPad)([\d,]+)}i
|
158
|
+
], [[:type, :tablet], :model], [
|
159
|
+
# Shopify Mobile for iPod touch
|
160
|
+
%r{^Shopify Mobile/(?:iPhone\sOS|iOS)/[\d\.]+ \((iPod)([\d,]+)}i
|
161
|
+
], [[:type, :handheld], :model], [
|
162
|
+
# Shopify Ping for iPhone
|
163
|
+
%r{^Shopify Ping/(?:iPhone\sOS|iOS)/[\d\.]+ \((iPhone)([\d,]+)}i
|
164
|
+
], [[:type, :handheld], :model], [
|
165
|
+
# Shopify Mobile for Android
|
166
|
+
%r{^Shopify Mobile\/(Android)\/[\d\.]+(?: \(debug(?:|-push)\))? \(Build \d+ with API \d+ on (.*?) (.*)\)}i
|
167
|
+
], [[:type, :handheld], :vendor, :model], [
|
168
|
+
# Shopify POS for iPhone
|
169
|
+
%r{.*Shopify POS\/[\d\.]+ \((iPhone)\;.*Scale/([\d\.]+)}i,
|
170
|
+
], [[:type, :handheld], :scale], [
|
171
|
+
# Shopify POS for iPad
|
172
|
+
%r{.*Shopify POS\/[\d\.]+ \((iPad)\;.*Scale/([\d\.]+)}i,
|
173
|
+
], [[:type, :tablet], :scale], [
|
174
|
+
# Shopify POS for iPod touch
|
175
|
+
%r{.*Shopify POS\/[\d\.]+ \((iPod touch)\;.*Scale/([\d\.]+)}i,
|
176
|
+
], [[:type, :handheld], :scale], [
|
177
|
+
# Shopify POS for Android (SmartWebView)
|
178
|
+
%r{.*Shopify\sPOS.*\(.*(Android)\s[\d\.]+\;\s(.*)\sBuild/.*\)\sPOS.*[\d+\.]+}i,
|
179
|
+
], [[:type, :handheld], :model], [
|
180
|
+
# Shopify POS for Android (Native App)
|
181
|
+
%r{.*\(.*(Android)\s[\d\.]+\;\s(.*)\sBuild/.*\)\sPOS.*[\d+\.]+}i,
|
182
|
+
], [[:type, :handheld], :model], [
|
120
183
|
/\((playbook);[\w\s\);-]+(rim)/i # PlayBook
|
121
184
|
], [:model, :vendor, [:type, :tablet]], [
|
122
185
|
/\((ipad);[\w\s\);-]+(apple)/i # iPad
|
@@ -198,6 +261,30 @@ class BrowserSniffer
|
|
198
261
|
],
|
199
262
|
:os => [
|
200
263
|
[
|
264
|
+
# Shopify Mobile for iOS
|
265
|
+
%r{^Shopify/\d+\s\((?:iPhone|iPad)\;\s(iOS)\s([\d\.]+)}i
|
266
|
+
], [[:type, :ios], :version, [:name, 'iOS']], [
|
267
|
+
# Shopify POS for iOS
|
268
|
+
%r{.*Shopify\sPOS/[\d\.]+\s\((?:iPhone|iPad|iPod\stouch)\;\s(iOS)\s([\d\.]+)}i,
|
269
|
+
], [[:type, :ios], :version, [:name, 'iOS']], [
|
270
|
+
# Old Shopify POS for Android
|
271
|
+
/^Dalvik.*(Android)\s([\d\.]+)\;\s.*\s[\d+\.]+/i,
|
272
|
+
], [[:type, :android], :version, [:name, 'Android']], [
|
273
|
+
# Shopify POS for Android
|
274
|
+
/.*Shopify\sPOS\s.*(Android)\s([\d\.]+)\;\s.*\s[\d+\.]+\s/i,
|
275
|
+
], [[:type, :android], :version, [:name, 'Android']], [
|
276
|
+
# Shopify Mobile for iOS
|
277
|
+
%r{^Shopify Mobile\/(iPhone\sOS|iOS)\/[\d\.]+ \(.*\/OperatingSystemVersion\((.*)\)}i
|
278
|
+
], [[:type, :ios], [:version, lambda { |str| str && str.scan(/\d+/).join(".") }], [:name, 'iOS']], [
|
279
|
+
# Shopify Mobile for iPhone or iPad
|
280
|
+
%r{^(Shopify Mobile)\/(?:iPhone\sOS|iOS)[\/\d\.]* \((iPhone|iPad|iPod).*\/([\d\.]+)}i
|
281
|
+
], [[:type, :ios], [:name, 'iOS'], :version], [
|
282
|
+
# Shopify Ping for iOS
|
283
|
+
%r{^Shopify Ping\/(iOS)\/[\d\.]+ \(.* Simulator\/.*\/([\d\.]+)\)}i
|
284
|
+
], [[:type, :ios], :version, [:name, 'iOS']], [
|
285
|
+
# Shopify Mobile for Android
|
286
|
+
%r{^Shopify Mobile\/(Android)\/[\d\.]+ }i
|
287
|
+
], [:name, [:type, :android]], [
|
201
288
|
# Windows based
|
202
289
|
/(windows)\snt\s6\.2;\s(arm)/i, # Windows RT
|
203
290
|
/(windows\sphone(?:\sos)*|windows\smobile|windows)[\s\/]?([ntce\d\.\s]+\w)/i,
|
@@ -1,6 +1,6 @@
|
|
1
1
|
require 'test_helper'
|
2
2
|
|
3
|
-
class BrowserSnifferTest <
|
3
|
+
class BrowserSnifferTest < Minitest::Test
|
4
4
|
AGENTS = {
|
5
5
|
:ipad_old => {
|
6
6
|
:user_agent => "Mozilla/5.0(iPad; U; CPU iPhone OS 3_2 like Mac OS X; en-us) AppleWebKit/531.21.10 (KHTML, like Gecko) Version/4.0.4 Mobile/7B314 Safari/531.21.10",
|
@@ -221,7 +221,6 @@ class BrowserSnifferTest < MiniTest::Unit::TestCase
|
|
221
221
|
:major_engine_version => 528,
|
222
222
|
:os => :android,
|
223
223
|
:os_version => '1.6',
|
224
|
-
:os => :android,
|
225
224
|
:major_browser_version => 3
|
226
225
|
},
|
227
226
|
:hp_ipaq => {
|
@@ -552,7 +551,11 @@ class BrowserSnifferTest < MiniTest::Unit::TestCase
|
|
552
551
|
define_method "test_sniff_#{agent}_correctly" do
|
553
552
|
sniffer = BrowserSniffer.new(attributes[:user_agent])
|
554
553
|
attributes.reject{|attr| attr == :user_agent}.each do |attribute, value|
|
555
|
-
|
554
|
+
if value.nil?
|
555
|
+
assert_nil sniffer.send(attribute), "#{attribute.to_s} did not match"
|
556
|
+
else
|
557
|
+
assert_equal value, sniffer.send(attribute), "#{attribute.to_s} did not match"
|
558
|
+
end
|
556
559
|
end
|
557
560
|
end
|
558
561
|
end
|
@@ -0,0 +1,365 @@
|
|
1
|
+
require "test_helper"
|
2
|
+
|
3
|
+
describe "Shopify agents" do
|
4
|
+
it "Shopify Mobile on iOS can be sniffed" do
|
5
|
+
user_agent = "Shopify Mobile/iOS/5.4.4 "\
|
6
|
+
"(iPhone9,3/com.jadedpixel.shopify/OperatingSystemVersion(majorVersion: 10, minorVersion: 3, patchVersion: 2))"
|
7
|
+
sniffer = BrowserSniffer.new(user_agent)
|
8
|
+
|
9
|
+
assert_equal ({
|
10
|
+
name: 'Shopify Mobile',
|
11
|
+
version: '5.4.4',
|
12
|
+
}), sniffer.browser_info
|
13
|
+
|
14
|
+
assert_equal ({
|
15
|
+
type: :handheld,
|
16
|
+
model: '9,3',
|
17
|
+
}), sniffer.device_info
|
18
|
+
|
19
|
+
assert_equal ({
|
20
|
+
type: :ios,
|
21
|
+
version: '10.3.2',
|
22
|
+
name: 'iOS',
|
23
|
+
}), sniffer.os_info
|
24
|
+
end
|
25
|
+
|
26
|
+
it "Shopify Mobile on iPod touch can be sniffed" do
|
27
|
+
user_agent = "Shopify Mobile/iPhone OS/5.4.4 "\
|
28
|
+
"(iPod5,1/com.jadedpixel.shopify/OperatingSystemVersion(majorVersion: 9, minorVersion: 3, patchVersion: 5))"
|
29
|
+
sniffer = BrowserSniffer.new(user_agent)
|
30
|
+
|
31
|
+
assert_equal ({
|
32
|
+
name: 'Shopify Mobile',
|
33
|
+
version: '5.4.4',
|
34
|
+
}), sniffer.browser_info
|
35
|
+
|
36
|
+
assert_equal ({
|
37
|
+
type: :handheld,
|
38
|
+
model: '5,1',
|
39
|
+
}), sniffer.device_info
|
40
|
+
|
41
|
+
assert_equal ({
|
42
|
+
type: :ios,
|
43
|
+
version: '9.3.5',
|
44
|
+
name: 'iOS',
|
45
|
+
}), sniffer.os_info
|
46
|
+
end
|
47
|
+
|
48
|
+
it "Shopify Mobile on iPhone is detected as handheld" do
|
49
|
+
user_agent = "Shopify Mobile/iOS/5.4.4 "\
|
50
|
+
"(iPhone9,3/com.jadedpixel.shopify/OperatingSystemVersion(majorVersion: 10, minorVersion: 3, patchVersion: 2))"
|
51
|
+
sniffer = BrowserSniffer.new(user_agent)
|
52
|
+
assert_equal :handheld, sniffer.form_factor
|
53
|
+
assert sniffer.handheld?
|
54
|
+
end
|
55
|
+
|
56
|
+
it "Shopify Mobile on iPad is detected as tablet" do
|
57
|
+
user_agent = "Shopify Mobile/iOS/5.4.4 "\
|
58
|
+
"(iPad9,3/com.jadedpixel.shopify/OperatingSystemVersion(majorVersion: 10, minorVersion: 3, patchVersion: 2))"
|
59
|
+
sniffer = BrowserSniffer.new(user_agent)
|
60
|
+
assert_equal :tablet, sniffer.form_factor
|
61
|
+
assert sniffer.tablet?
|
62
|
+
end
|
63
|
+
|
64
|
+
it "Shopify Mobile on iPhone OS is detected as iOS" do
|
65
|
+
user_agent = "Shopify Mobile/iPhone OS/5.4.4 "\
|
66
|
+
"(iPad2,4/com.jadedpixel.shopify/OperatingSystemVersion(majorVersion: 9, minorVersion: 3, patchVersion: 5))"
|
67
|
+
sniffer = BrowserSniffer.new(user_agent)
|
68
|
+
assert_equal :ios, sniffer.os
|
69
|
+
assert sniffer.ios?
|
70
|
+
end
|
71
|
+
|
72
|
+
it "Shopify Mobile version is delected on iPhone OS" do
|
73
|
+
user_agent = "Shopify Mobile/iOS/6.6.2 (iPhone10,1/com.jadedpixel.shopify/11.0.2)"
|
74
|
+
sniffer = BrowserSniffer.new(user_agent)
|
75
|
+
assert_equal "6.6.2", sniffer.browser_version
|
76
|
+
assert_equal "11.0.2", sniffer.os_version
|
77
|
+
assert sniffer.ios?
|
78
|
+
end
|
79
|
+
|
80
|
+
it "Shopify Mobile on Android can be sniffed" do
|
81
|
+
user_agent = "Shopify Mobile/Android/5.4.4 (Build 12005 with API 25 on OnePlus ONEPLUS A3003)"
|
82
|
+
sniffer = BrowserSniffer.new(user_agent)
|
83
|
+
|
84
|
+
assert_equal ({
|
85
|
+
name: 'Shopify Mobile',
|
86
|
+
version: '5.4.4',
|
87
|
+
build: '12005',
|
88
|
+
sdk_version: '25',
|
89
|
+
}), sniffer.browser_info
|
90
|
+
|
91
|
+
assert_equal ({
|
92
|
+
type: :handheld,
|
93
|
+
vendor: 'OnePlus',
|
94
|
+
model: 'ONEPLUS A3003',
|
95
|
+
}), sniffer.device_info
|
96
|
+
|
97
|
+
assert_equal ({
|
98
|
+
name: 'Android',
|
99
|
+
type: :android,
|
100
|
+
}), sniffer.os_info
|
101
|
+
end
|
102
|
+
|
103
|
+
it "Shopify Mobile on Android simulator can be sniffed" do
|
104
|
+
user_agent = "Shopify Mobile/Android/6.2.0 "\
|
105
|
+
"(debug) (Build 1 with API 25 on Unknown Android "\
|
106
|
+
"SDK built for x86) Mozilla/5.0 (Linux; Android 7.1.1; Android SDK built for x86 Build/NYC; wv) "\
|
107
|
+
"AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/55.0.2883.91 Mobile Safari/537.36"
|
108
|
+
sniffer = BrowserSniffer.new(user_agent)
|
109
|
+
|
110
|
+
assert_equal ({
|
111
|
+
name: 'Shopify Mobile',
|
112
|
+
version: '6.2.0 (debug)',
|
113
|
+
build: '1',
|
114
|
+
sdk_version: '25',
|
115
|
+
}), sniffer.browser_info
|
116
|
+
|
117
|
+
assert_equal ({
|
118
|
+
name: 'Android',
|
119
|
+
type: :android,
|
120
|
+
}), sniffer.os_info
|
121
|
+
end
|
122
|
+
|
123
|
+
it "Shopify POS on Android MAL can be sniffed" do
|
124
|
+
user_agent = "Dalvik/2.1.0 (Linux; U; Android 7.1.1; Android SDK built for x86 Build/NYC) "\
|
125
|
+
"Shopify POS 2.4.11.mal/18038"
|
126
|
+
sniffer = BrowserSniffer.new(user_agent)
|
127
|
+
|
128
|
+
assert_equal ({
|
129
|
+
name: 'Shopify POS',
|
130
|
+
version: '2.4.11',
|
131
|
+
}), sniffer.browser_info
|
132
|
+
|
133
|
+
assert_equal ({
|
134
|
+
name: 'Android',
|
135
|
+
type: :android,
|
136
|
+
version: '7.1.1',
|
137
|
+
}), sniffer.os_info
|
138
|
+
end
|
139
|
+
|
140
|
+
it "Shopify POS on iPhone can be sniffed" do
|
141
|
+
user_agent = "Shopify POS/3.12.1 (iPhone; iOS 10.3.1; Scale/2.00)"
|
142
|
+
sniffer = BrowserSniffer.new(user_agent)
|
143
|
+
|
144
|
+
assert_equal ({
|
145
|
+
name: 'Shopify POS',
|
146
|
+
version: '3.12.1',
|
147
|
+
}), sniffer.browser_info
|
148
|
+
|
149
|
+
assert_equal ({
|
150
|
+
type: :handheld,
|
151
|
+
scale: '2.00',
|
152
|
+
}), sniffer.device_info
|
153
|
+
|
154
|
+
assert_equal ({
|
155
|
+
type: :ios,
|
156
|
+
version: '10.3.1',
|
157
|
+
name: 'iOS',
|
158
|
+
}), sniffer.os_info
|
159
|
+
end
|
160
|
+
|
161
|
+
it "Shopify POS on iPod touch can be sniffed" do
|
162
|
+
user_agent = "Shopify POS/3.12.1 (iPod touch; iOS 9.3.5; Scale/2.00)"
|
163
|
+
sniffer = BrowserSniffer.new(user_agent)
|
164
|
+
|
165
|
+
assert_equal ({
|
166
|
+
name: 'Shopify POS',
|
167
|
+
version: '3.12.1',
|
168
|
+
}), sniffer.browser_info
|
169
|
+
|
170
|
+
assert_equal ({
|
171
|
+
type: :handheld,
|
172
|
+
scale: '2.00',
|
173
|
+
}), sniffer.device_info
|
174
|
+
|
175
|
+
assert_equal ({
|
176
|
+
type: :ios,
|
177
|
+
version: '9.3.5',
|
178
|
+
name: 'iOS',
|
179
|
+
}), sniffer.os_info
|
180
|
+
end
|
181
|
+
|
182
|
+
it "Shopify POS on iPad is detected as tablet" do
|
183
|
+
user_agent = "Shopify POS/3.10.12 (iPad; iOS 10.3.1; Scale/2.00)"
|
184
|
+
sniffer = BrowserSniffer.new(user_agent)
|
185
|
+
|
186
|
+
assert_equal :tablet, sniffer.form_factor
|
187
|
+
end
|
188
|
+
|
189
|
+
it "Shopify POS with okhttp user agent can be parsed" do
|
190
|
+
user_agent = "okhttp/3.6.0"
|
191
|
+
sniffer = BrowserSniffer.new(user_agent)
|
192
|
+
|
193
|
+
assert_equal ({
|
194
|
+
name: 'okhttp',
|
195
|
+
version: '3.6.0',
|
196
|
+
}), sniffer.browser_info
|
197
|
+
end
|
198
|
+
|
199
|
+
it "Shopify POS on Android can be sniffed (SmartWebView)" do
|
200
|
+
user_agent = "com.jadedpixel.pos Shopify POS Dalvik/2.1.0 (Linux; U; Android 7.1.1; " \
|
201
|
+
"SM-T560NU Build/NMF26X) POS - Debug 2.4.10 (1a5a407d00)/3405 Mozilla/5.0 " \
|
202
|
+
"(Linux; Android 7.1.1; SM-T560NU Build/NMF26X; wv) AppleWebKit/537.36 " \
|
203
|
+
"(KHTML, like Gecko) Version/4.0 Chrome/67.0.3396.87 Safari/537.36"
|
204
|
+
sniffer = BrowserSniffer.new(user_agent)
|
205
|
+
|
206
|
+
user_agent_with_suffix = "com.jadedpixel.pos Shopify POS Dalvik/2.1.0 (Linux; U; Android 7.1.1; " \
|
207
|
+
"SM-T560NU Build/NMF26X) POS - Debug 2.4.10/1337 (1a5a407d00)/3405 Mozilla/5.0 " \
|
208
|
+
"(Linux; Android 7.1.1; SM-T560NU Build/NMF26X; wv) AppleWebKit/537.36 " \
|
209
|
+
"(KHTML, like Gecko) Version/4.0 Chrome/67.0.3396.87 Safari/537.36"
|
210
|
+
sniffer_with_suffix = BrowserSniffer.new(user_agent_with_suffix)
|
211
|
+
|
212
|
+
assert_equal ({
|
213
|
+
name: 'Shopify POS',
|
214
|
+
version: '2.4.10',
|
215
|
+
}), sniffer.browser_info
|
216
|
+
|
217
|
+
assert_equal ({
|
218
|
+
type: :handheld,
|
219
|
+
model: 'SM-T560NU',
|
220
|
+
}), sniffer.device_info
|
221
|
+
|
222
|
+
assert_equal ({
|
223
|
+
type: :android,
|
224
|
+
version: '7.1.1',
|
225
|
+
name: 'Android',
|
226
|
+
}), sniffer.os_info
|
227
|
+
|
228
|
+
assert_equal sniffer.browser_info, sniffer_with_suffix.browser_info
|
229
|
+
assert_equal sniffer.device_info, sniffer_with_suffix.device_info
|
230
|
+
assert_equal sniffer.os_info, sniffer_with_suffix.os_info
|
231
|
+
end
|
232
|
+
|
233
|
+
it "Shopify POS on Android can be sniffed (Native App)" do
|
234
|
+
user_agent = "Dalvik/2.1.0 (Linux; U; Android 7.1.1; SM-T560NU Build/NMF26X) " \
|
235
|
+
"POS - Debug 2.4.10 (1a5a407d00)/3405"
|
236
|
+
sniffer = BrowserSniffer.new(user_agent)
|
237
|
+
|
238
|
+
user_agent_with_suffix = "Dalvik/2.1.0 (Linux; U; Android 7.1.1; SM-T560NU Build/NMF26X) " \
|
239
|
+
"POS - Debug 2.4.10/1337 (1a5a407d00)/3405"
|
240
|
+
sniffer_with_suffix = BrowserSniffer.new(user_agent_with_suffix)
|
241
|
+
|
242
|
+
assert_equal ({
|
243
|
+
name: 'Shopify POS',
|
244
|
+
version: '2.4.10',
|
245
|
+
}), sniffer.browser_info
|
246
|
+
|
247
|
+
assert_equal ({
|
248
|
+
type: :handheld,
|
249
|
+
model: 'SM-T560NU',
|
250
|
+
}), sniffer.device_info
|
251
|
+
|
252
|
+
assert_equal ({
|
253
|
+
type: :android,
|
254
|
+
version: '7.1.1',
|
255
|
+
name: 'Android',
|
256
|
+
}), sniffer.os_info
|
257
|
+
|
258
|
+
assert_equal sniffer.browser_info, sniffer_with_suffix.browser_info
|
259
|
+
assert_equal sniffer.device_info, sniffer_with_suffix.device_info
|
260
|
+
assert_equal sniffer.os_info, sniffer_with_suffix.os_info
|
261
|
+
end
|
262
|
+
|
263
|
+
it "Shopify Mobile in debug mode can be parsed" do
|
264
|
+
user_agent = "Shopify Mobile/Android/6.0.0 (debug) (Build 1 with API 25 on Unknown Android SDK built for x86)"
|
265
|
+
sniffer = BrowserSniffer.new(user_agent)
|
266
|
+
|
267
|
+
assert_equal ({
|
268
|
+
name: 'Shopify Mobile',
|
269
|
+
version: '6.0.0 (debug)',
|
270
|
+
build: '1',
|
271
|
+
sdk_version: '25',
|
272
|
+
}), sniffer.browser_info
|
273
|
+
|
274
|
+
assert_equal ({
|
275
|
+
type: :handheld,
|
276
|
+
vendor: 'Unknown',
|
277
|
+
model: 'Android SDK built for x86',
|
278
|
+
}), sniffer.device_info
|
279
|
+
|
280
|
+
assert_equal ({
|
281
|
+
name: 'Android',
|
282
|
+
type: :android,
|
283
|
+
}), sniffer.os_info
|
284
|
+
end
|
285
|
+
|
286
|
+
it "Shopify Mobile in debug-push mode can be parsed" do
|
287
|
+
user_agent = "Shopify Mobile/Android/6.0.0 (debug-push) (Build 1 with API 25 on Unknown Android SDK built for x86)"
|
288
|
+
sniffer = BrowserSniffer.new(user_agent)
|
289
|
+
|
290
|
+
assert_equal ({
|
291
|
+
name: 'Shopify Mobile',
|
292
|
+
version: '6.0.0 (debug-push)',
|
293
|
+
build: '1',
|
294
|
+
sdk_version: '25',
|
295
|
+
}), sniffer.browser_info
|
296
|
+
|
297
|
+
assert_equal ({
|
298
|
+
type: :handheld,
|
299
|
+
vendor: 'Unknown',
|
300
|
+
model: 'Android SDK built for x86',
|
301
|
+
}), sniffer.device_info
|
302
|
+
|
303
|
+
assert_equal ({
|
304
|
+
name: 'Android',
|
305
|
+
type: :android,
|
306
|
+
}), sniffer.os_info
|
307
|
+
end
|
308
|
+
|
309
|
+
it "ShopifyFoundation user agent can be parsed" do
|
310
|
+
user_agent = "ShopifyFoundation"
|
311
|
+
sniffer = BrowserSniffer.new(user_agent)
|
312
|
+
|
313
|
+
assert_equal ({ name: 'ShopifyFoundation' }), sniffer.browser_info
|
314
|
+
assert_predicate sniffer.device_info, :empty?
|
315
|
+
assert_predicate sniffer.os_info, :empty?
|
316
|
+
end
|
317
|
+
|
318
|
+
it "old Shopify POS user agent can be parsed" do
|
319
|
+
user_agent = "Dalvik/2.1.0 (Linux; U; Android 5.1; KUAIKABAO/R5100 Build/LMY47I) Shopify POS 0.9.4"
|
320
|
+
sniffer = BrowserSniffer.new(user_agent)
|
321
|
+
|
322
|
+
user_agent_with_suffix = "Dalvik/2.1.0 (Linux; U; Android 5.1; KUAIKABAO/R5100 Build/LMY47I) Shopify POS 0.9.4/7"
|
323
|
+
sniffer_with_suffix = BrowserSniffer.new(user_agent_with_suffix)
|
324
|
+
|
325
|
+
assert_equal ({
|
326
|
+
name: 'Shopify POS',
|
327
|
+
version: '0.9.4',
|
328
|
+
}), sniffer.browser_info
|
329
|
+
|
330
|
+
assert_equal ({
|
331
|
+
type: :handheld,
|
332
|
+
}), sniffer.device_info
|
333
|
+
|
334
|
+
assert_equal ({
|
335
|
+
name: 'Android',
|
336
|
+
type: :android,
|
337
|
+
version: '5.1',
|
338
|
+
}), sniffer.os_info
|
339
|
+
|
340
|
+
assert_equal sniffer.browser_info, sniffer_with_suffix.browser_info
|
341
|
+
assert_equal sniffer.device_info, sniffer_with_suffix.device_info
|
342
|
+
assert_equal sniffer.os_info, sniffer_with_suffix.os_info
|
343
|
+
end
|
344
|
+
|
345
|
+
it "Shopify Ping on iOS can be sniffed" do
|
346
|
+
user_agent = "Shopify Ping/iOS/1.0.0 (iPhone9,1 Simulator/com.shopify.ping/11.1.0)"
|
347
|
+
sniffer = BrowserSniffer.new(user_agent)
|
348
|
+
|
349
|
+
assert_equal ({
|
350
|
+
name: 'Shopify Ping',
|
351
|
+
version: '1.0.0',
|
352
|
+
}), sniffer.browser_info
|
353
|
+
|
354
|
+
assert_equal ({
|
355
|
+
type: :handheld,
|
356
|
+
model: '9,1',
|
357
|
+
}), sniffer.device_info
|
358
|
+
|
359
|
+
assert_equal ({
|
360
|
+
type: :ios,
|
361
|
+
version: '11.1.0',
|
362
|
+
name: 'iOS',
|
363
|
+
}), sniffer.os_info
|
364
|
+
end
|
365
|
+
end
|
data/test/test_helper.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: browser_sniffer
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0
|
4
|
+
version: 1.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Shopify
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2018-11-12 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -24,6 +24,20 @@ dependencies:
|
|
24
24
|
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: '1.3'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: minitest
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ">="
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
27
41
|
- !ruby/object:Gem::Dependency
|
28
42
|
name: rake
|
29
43
|
requirement: !ruby/object:Gem::Requirement
|
@@ -45,6 +59,7 @@ executables: []
|
|
45
59
|
extensions: []
|
46
60
|
extra_rdoc_files: []
|
47
61
|
files:
|
62
|
+
- ".github/probots.yml"
|
48
63
|
- ".gitignore"
|
49
64
|
- ".travis.yml"
|
50
65
|
- Gemfile
|
@@ -58,6 +73,7 @@ files:
|
|
58
73
|
- lib/browser_sniffer/version.rb
|
59
74
|
- shipit.rubygems.yml
|
60
75
|
- test/browser_sniffer_test.rb
|
76
|
+
- test/shopify_agents_test.rb
|
61
77
|
- test/test_helper.rb
|
62
78
|
homepage: https://github.com/Shopify/browser_sniffer
|
63
79
|
licenses:
|
@@ -80,7 +96,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
80
96
|
version: '0'
|
81
97
|
requirements: []
|
82
98
|
rubyforge_project:
|
83
|
-
rubygems_version: 2.
|
99
|
+
rubygems_version: 2.6.14
|
84
100
|
signing_key:
|
85
101
|
specification_version: 4
|
86
102
|
summary: Parses user agent strings and boils it all down to a few simple classifications.
|