device_detector 1.0.2 → 1.0.6
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 +5 -5
- data/.rubocop.yml +49 -0
- data/.ruby-version +1 -0
- data/.travis.yml +5 -6
- data/CHANGELOG.md +11 -0
- data/README.md +8 -7
- data/Rakefile +7 -4
- data/device_detector.gemspec +1 -0
- data/lib/device_detector/bot.rb +2 -2
- data/lib/device_detector/browser.rb +364 -0
- data/lib/device_detector/client.rb +11 -2
- data/lib/device_detector/device.rb +1168 -22
- data/lib/device_detector/memory_cache.rb +5 -5
- data/lib/device_detector/metadata_extractor.rb +7 -8
- data/lib/device_detector/model_extractor.rb +3 -3
- data/lib/device_detector/name_extractor.rb +2 -2
- data/lib/device_detector/os.rb +148 -116
- data/lib/device_detector/parser.rb +22 -9
- data/lib/device_detector/version.rb +1 -1
- data/lib/device_detector/version_extractor.rb +10 -2
- data/lib/device_detector.rb +73 -40
- data/regexes/bots.yml +909 -59
- data/regexes/client/browser_engine.yml +14 -2
- data/regexes/client/browsers.yml +1356 -241
- data/regexes/client/feed_readers.yml +10 -10
- data/regexes/client/libraries.yml +75 -1
- data/regexes/client/mediaplayers.yml +39 -3
- data/regexes/client/mobile_apps.yml +524 -45
- data/regexes/client/pim.yml +55 -2
- data/regexes/device/cameras.yml +6 -6
- data/regexes/device/car_browsers.yml +23 -3
- data/regexes/device/consoles.yml +9 -3
- data/regexes/device/mobiles.yml +16903 -3199
- data/regexes/device/notebooks.yml +114 -0
- data/regexes/device/portable_media_player.yml +20 -3
- data/regexes/device/shell_tv.yml +117 -0
- data/regexes/device/televisions.yml +440 -35
- data/regexes/oss.yml +603 -165
- data/regexes/vendorfragments.yml +6 -2
- data/spec/device_detector/concrete_user_agent_spec.rb +38 -51
- data/spec/device_detector/detector_fixtures_spec.rb +36 -37
- data/spec/device_detector/device_spec.rb +52 -56
- data/spec/device_detector/memory_cache_spec.rb +19 -19
- data/spec/device_detector/model_extractor_spec.rb +3 -3
- data/spec/device_detector/version_extractor_spec.rb +5 -6
- data/spec/device_detector_spec.rb +26 -26
- data/spec/fixtures/client/browser.yml +2617 -555
- data/spec/fixtures/client/feed_reader.yml +34 -52
- data/spec/fixtures/client/library.yml +129 -38
- data/spec/fixtures/client/mediaplayer.yml +59 -28
- data/spec/fixtures/client/mobile_app.yml +589 -20
- data/spec/fixtures/client/pim.yml +92 -19
- data/spec/fixtures/detector/bots.yml +1749 -458
- data/spec/fixtures/detector/camera.yml +30 -24
- data/spec/fixtures/detector/car_browser.yml +199 -3
- data/spec/fixtures/detector/console.yml +107 -45
- data/spec/fixtures/detector/desktop.yml +3216 -758
- data/spec/fixtures/detector/feature_phone.yml +935 -181
- data/spec/fixtures/detector/feed_reader.yml +181 -193
- data/spec/fixtures/detector/mediaplayer.yml +157 -60
- data/spec/fixtures/detector/mobile_apps.yml +914 -136
- data/spec/fixtures/detector/peripheral.yml +271 -0
- data/spec/fixtures/detector/phablet.yml +5593 -1533
- data/spec/fixtures/detector/portable_media_player.yml +398 -32
- data/spec/fixtures/detector/smart_display.yml +183 -9
- data/spec/fixtures/detector/smart_speaker.yml +60 -0
- data/spec/fixtures/detector/smartphone-1.yml +3930 -4239
- data/spec/fixtures/detector/smartphone-10.yml +3985 -7366
- data/spec/fixtures/detector/smartphone-11.yml +5083 -3784
- data/spec/fixtures/detector/smartphone-12.yml +8989 -0
- data/spec/fixtures/detector/smartphone-13.yml +9412 -0
- data/spec/fixtures/detector/smartphone-14.yml +9477 -0
- data/spec/fixtures/detector/smartphone-15.yml +9281 -0
- data/spec/fixtures/detector/smartphone-16.yml +9678 -0
- data/spec/fixtures/detector/smartphone-17.yml +9965 -0
- data/spec/fixtures/detector/smartphone-18.yml +9806 -0
- data/spec/fixtures/detector/smartphone-19.yml +9965 -0
- data/spec/fixtures/detector/smartphone-2.yml +6670 -4375
- data/spec/fixtures/detector/smartphone-20.yml +9710 -0
- data/spec/fixtures/detector/smartphone-21.yml +8693 -0
- data/spec/fixtures/detector/smartphone-22.yml +10178 -0
- data/spec/fixtures/detector/smartphone-23.yml +9453 -0
- data/spec/fixtures/detector/smartphone-24.yml +9843 -0
- data/spec/fixtures/detector/smartphone-25.yml +9703 -0
- data/spec/fixtures/detector/smartphone-26.yml +10007 -0
- data/spec/fixtures/detector/smartphone-27.yml +4927 -0
- data/spec/fixtures/detector/smartphone-3.yml +4656 -4711
- data/spec/fixtures/detector/smartphone-4.yml +3518 -4479
- data/spec/fixtures/detector/smartphone-5.yml +3805 -4803
- data/spec/fixtures/detector/smartphone-6.yml +3745 -4693
- data/spec/fixtures/detector/smartphone-7.yml +3721 -4645
- data/spec/fixtures/detector/smartphone-8.yml +4564 -4699
- data/spec/fixtures/detector/smartphone-9.yml +3897 -4888
- data/spec/fixtures/detector/smartphone.yml +3154 -4141
- data/spec/fixtures/detector/tablet-1.yml +4742 -4576
- data/spec/fixtures/detector/tablet-2.yml +3803 -4731
- data/spec/fixtures/detector/tablet-3.yml +6210 -2309
- data/spec/fixtures/detector/tablet-4.yml +9062 -0
- data/spec/fixtures/detector/tablet-5.yml +9273 -0
- data/spec/fixtures/detector/tablet-6.yml +4588 -0
- data/spec/fixtures/detector/tablet.yml +3629 -4613
- data/spec/fixtures/detector/tv-1.yml +2501 -0
- data/spec/fixtures/detector/tv.yml +8856 -2064
- data/spec/fixtures/detector/unknown.yml +412 -587
- data/spec/fixtures/detector/wearable.yml +915 -0
- data/spec/fixtures/device/camera.yml +4 -3
- data/spec/fixtures/device/car_browser.yml +9 -2
- data/spec/fixtures/device/console.yml +15 -14
- data/spec/fixtures/device/notebook.yml +7 -0
- data/spec/fixtures/parser/oss.yml +1392 -21
- data/spec/fixtures/parser/vendorfragments.yml +57 -51
- metadata +70 -4
data/regexes/vendorfragments.yml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
###############
|
|
2
2
|
# Device Detector - The Universal Device Detection library for parsing User Agents
|
|
3
3
|
#
|
|
4
|
-
# @link
|
|
4
|
+
# @link https://matomo.org
|
|
5
5
|
# @license http://www.gnu.org/licenses/lgpl.html LGPL v3 or later
|
|
6
6
|
###############
|
|
7
7
|
|
|
@@ -20,7 +20,7 @@ Sony:
|
|
|
20
20
|
|
|
21
21
|
Asus:
|
|
22
22
|
- 'MAAU'
|
|
23
|
-
- 'NP0[
|
|
23
|
+
- 'NP0[26789]'
|
|
24
24
|
- 'ASJB'
|
|
25
25
|
- 'ASU2(JS)?'
|
|
26
26
|
|
|
@@ -69,3 +69,7 @@ HP:
|
|
|
69
69
|
|
|
70
70
|
Hyrican:
|
|
71
71
|
- 'MANM(JS)?'
|
|
72
|
+
|
|
73
|
+
Ordissimo:
|
|
74
|
+
- 'Ordissimo'
|
|
75
|
+
- 'webissimo3'
|
|
@@ -1,136 +1,123 @@
|
|
|
1
1
|
require_relative '../spec_helper'
|
|
2
2
|
|
|
3
3
|
describe DeviceDetector do
|
|
4
|
-
|
|
5
4
|
subject { DeviceDetector.new(user_agent) }
|
|
6
5
|
|
|
7
|
-
|
|
6
|
+
alias_method :client, :subject
|
|
8
7
|
|
|
9
8
|
describe 'mobile iPhone 5S' do
|
|
10
|
-
|
|
11
|
-
|
|
9
|
+
let(:user_agent) do
|
|
10
|
+
'Mozilla/5.0 (iPhone; CPU iPhone OS 8_1_2 like Mac OS X) AppleWebKit/600.1.4 (KHTML, like Gecko) Mobile/12B440 [FBDV/iPhone6,1]'
|
|
11
|
+
end
|
|
12
12
|
|
|
13
13
|
describe '#device_name' do
|
|
14
|
-
|
|
15
14
|
it 'returns device name' do
|
|
16
|
-
client.device_name.must_equal 'iPhone 5S'
|
|
15
|
+
value(client.device_name).must_equal 'iPhone 5S'
|
|
17
16
|
end
|
|
18
|
-
|
|
19
17
|
end
|
|
20
18
|
|
|
21
19
|
describe '#device_type' do
|
|
22
|
-
|
|
23
20
|
it 'returns the device type' do
|
|
24
|
-
client.device_type.must_equal 'smartphone'
|
|
21
|
+
value(client.device_type).must_equal 'smartphone'
|
|
25
22
|
end
|
|
26
|
-
|
|
27
23
|
end
|
|
28
|
-
|
|
29
24
|
end
|
|
30
25
|
|
|
31
26
|
describe 'Ubuntu 10' do
|
|
32
|
-
|
|
33
|
-
|
|
27
|
+
let(:user_agent) do
|
|
28
|
+
'Mozilla/5.0 (X11; U; Linux i686; en-US) AppleWebKit/534.16 (KHTML, like Gecko) Ubuntu/10.10 Chromium/10.0.648.133 Chrome/10.0.648.133 Safari/534.16'
|
|
29
|
+
end
|
|
34
30
|
|
|
35
31
|
describe '#os_name' do
|
|
36
|
-
|
|
37
32
|
it 'returns the OS name' do
|
|
38
|
-
client.os_name.must_equal 'Ubuntu'
|
|
33
|
+
value(client.os_name).must_equal 'Ubuntu'
|
|
39
34
|
end
|
|
40
|
-
|
|
41
35
|
end
|
|
42
|
-
|
|
43
36
|
end
|
|
44
37
|
|
|
45
38
|
describe 'Mac OS X' do
|
|
46
|
-
|
|
47
|
-
|
|
39
|
+
let(:user_agent) do
|
|
40
|
+
'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2227.1 Safari/537.36'
|
|
41
|
+
end
|
|
48
42
|
|
|
49
43
|
describe '#full_version' do
|
|
50
|
-
|
|
51
44
|
it 'returns the correct OS version' do
|
|
52
|
-
client.os_full_version.must_equal '10.10.1'
|
|
45
|
+
value(client.os_full_version).must_equal '10.10.1'
|
|
53
46
|
end
|
|
54
|
-
|
|
55
47
|
end
|
|
56
|
-
|
|
57
48
|
end
|
|
58
49
|
|
|
59
50
|
describe 'Chrome on Windows' do
|
|
60
|
-
|
|
61
51
|
describe '32bit' do
|
|
62
|
-
|
|
63
|
-
|
|
52
|
+
let(:user_agent) do
|
|
53
|
+
'Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2062.103 Safari/537.36'
|
|
54
|
+
end
|
|
64
55
|
|
|
65
56
|
it 'returns the correct client name' do
|
|
66
|
-
client.name.must_equal 'Chrome'
|
|
57
|
+
value(client.name).must_equal 'Chrome'
|
|
67
58
|
end
|
|
68
59
|
|
|
69
60
|
it 'recognizes the device name' do
|
|
70
|
-
client.device_name.must_be_nil
|
|
61
|
+
value(client.device_name).must_be_nil
|
|
71
62
|
end
|
|
72
63
|
|
|
73
64
|
it 'recognizes the device type' do
|
|
74
|
-
client.device_type.must_equal
|
|
65
|
+
value(client.device_type).must_equal 'desktop'
|
|
75
66
|
end
|
|
76
|
-
|
|
77
67
|
end
|
|
78
68
|
|
|
79
69
|
describe '64bit' do
|
|
80
|
-
|
|
81
|
-
|
|
70
|
+
let(:user_agent) do
|
|
71
|
+
'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.36'
|
|
72
|
+
end
|
|
82
73
|
|
|
83
74
|
it 'returns the correct client name' do
|
|
84
|
-
client.name.must_equal 'Chrome'
|
|
75
|
+
value(client.name).must_equal 'Chrome'
|
|
85
76
|
end
|
|
86
77
|
|
|
87
78
|
it 'recognizes the device name' do
|
|
88
|
-
client.device_name.must_be_nil
|
|
79
|
+
value(client.device_name).must_be_nil
|
|
89
80
|
end
|
|
90
81
|
|
|
91
82
|
it 'recognizes the device type' do
|
|
92
|
-
client.device_type.must_equal
|
|
83
|
+
value(client.device_type).must_equal 'desktop'
|
|
93
84
|
end
|
|
94
|
-
|
|
95
85
|
end
|
|
96
|
-
|
|
97
86
|
end
|
|
98
87
|
|
|
99
88
|
describe 'recognize and ignore sprd- prefix' do
|
|
100
|
-
|
|
101
|
-
|
|
89
|
+
let(:user_agent) do
|
|
90
|
+
'sprd-Galaxy-S5/1.0 Linux/2.6.35.7 Android/4.4.4 Release/11.29.2014 Browser/AppleWebKit533.1 (KHTML, like Gecko) Mozilla/5.0 Mobile'
|
|
91
|
+
end
|
|
102
92
|
|
|
103
93
|
it 'returns the correct client name' do
|
|
104
|
-
client.name.must_equal
|
|
94
|
+
value(client.name).must_equal 'Android Browser'
|
|
105
95
|
end
|
|
106
96
|
|
|
107
97
|
it 'recognizes the device name' do
|
|
108
|
-
client.device_name.must_equal
|
|
98
|
+
value(client.device_name).must_equal 'Galaxy S5'
|
|
109
99
|
end
|
|
110
100
|
|
|
111
101
|
it 'recognizes the device type' do
|
|
112
|
-
client.device_type.must_equal
|
|
102
|
+
value(client.device_type).must_equal 'smartphone'
|
|
113
103
|
end
|
|
114
|
-
|
|
115
104
|
end
|
|
116
105
|
|
|
117
106
|
describe 'remove TD suffix from model' do
|
|
118
|
-
|
|
119
|
-
|
|
107
|
+
let(:user_agent) do
|
|
108
|
+
'Lenovo-A398t+_TD/S100 Linux/3.4.5 Android/4.1.2 Release/09.10.2013 Browser/AppleWebKit534.30 Mobile Safari/534.30'
|
|
109
|
+
end
|
|
120
110
|
|
|
121
111
|
it 'returns the correct client name' do
|
|
122
|
-
client.name.must_equal
|
|
112
|
+
value(client.name).must_equal 'Android Browser'
|
|
123
113
|
end
|
|
124
114
|
|
|
125
115
|
it 'recognizes the device name' do
|
|
126
|
-
client.device_name.must_equal
|
|
116
|
+
value(client.device_name).must_equal 'A398t+'
|
|
127
117
|
end
|
|
128
118
|
|
|
129
119
|
it 'recognizes the device type' do
|
|
130
|
-
client.device_type.must_equal
|
|
120
|
+
value(client.device_type).must_equal 'smartphone'
|
|
131
121
|
end
|
|
132
|
-
|
|
133
122
|
end
|
|
134
|
-
|
|
135
123
|
end
|
|
136
|
-
|
|
@@ -1,71 +1,73 @@
|
|
|
1
1
|
require_relative '../spec_helper'
|
|
2
2
|
|
|
3
3
|
describe DeviceDetector do
|
|
4
|
-
|
|
5
|
-
fixture_dir = File.expand_path('../../fixtures/detector', __FILE__)
|
|
4
|
+
fixture_dir = File.expand_path('../fixtures/detector', __dir__)
|
|
6
5
|
fixture_files = Dir["#{fixture_dir}/*.yml"]
|
|
7
6
|
fixture_files.each do |fixture_file|
|
|
8
|
-
|
|
9
7
|
describe File.basename(fixture_file) do
|
|
10
|
-
|
|
11
8
|
fixtures = nil
|
|
12
9
|
begin
|
|
13
10
|
fixtures = YAML.load(File.read(fixture_file))
|
|
14
11
|
rescue Psych::SyntaxError => e
|
|
15
|
-
|
|
12
|
+
raise "Failed to parse #{fixture_file}, reason: #{e}"
|
|
16
13
|
end
|
|
17
14
|
|
|
18
15
|
def str_or_nil(string)
|
|
16
|
+
return nil if string.nil?
|
|
19
17
|
return nil if string == ''
|
|
20
|
-
|
|
18
|
+
|
|
19
|
+
string.to_s
|
|
21
20
|
end
|
|
22
21
|
|
|
23
22
|
fixtures.each do |f|
|
|
24
|
-
|
|
25
|
-
user_agent = f["user_agent"]
|
|
23
|
+
user_agent = f['user_agent']
|
|
26
24
|
detector = DeviceDetector.new(user_agent)
|
|
27
25
|
os = detector.send(:os)
|
|
28
26
|
|
|
29
27
|
describe user_agent do
|
|
30
|
-
it
|
|
28
|
+
it 'should be detected' do
|
|
31
29
|
if detector.bot?
|
|
32
|
-
assert_equal str_or_nil(f[
|
|
30
|
+
assert_equal str_or_nil(f['bot']['name']), detector.bot_name,
|
|
31
|
+
'failed bot name detection'
|
|
33
32
|
else
|
|
34
|
-
if f[
|
|
35
|
-
assert_equal str_or_nil(f[
|
|
33
|
+
if f['client']
|
|
34
|
+
assert_equal str_or_nil(f['client']['name']), detector.name,
|
|
35
|
+
'failed client name detection'
|
|
36
36
|
end
|
|
37
37
|
|
|
38
|
-
os_family = str_or_nil(f[
|
|
39
|
-
if os_family !=
|
|
38
|
+
os_family = str_or_nil(f['os_family'])
|
|
39
|
+
if os_family != 'Unknown'
|
|
40
40
|
if os_family.nil?
|
|
41
|
-
assert_nil os.family,
|
|
41
|
+
assert_nil os.family, 'failed os family detection'
|
|
42
42
|
else
|
|
43
|
-
assert_equal os_family, os.family,
|
|
43
|
+
assert_equal os_family, os.family, 'failed os family detection'
|
|
44
44
|
end
|
|
45
45
|
|
|
46
|
-
name = str_or_nil(f[
|
|
46
|
+
name = str_or_nil(f['os']['name'])
|
|
47
47
|
if name.nil?
|
|
48
|
-
assert_nil os.name,
|
|
48
|
+
assert_nil os.name, 'failed os name detection'
|
|
49
49
|
else
|
|
50
|
-
assert_equal name, os.name,
|
|
50
|
+
assert_equal name, os.name, 'failed os name detection'
|
|
51
51
|
end
|
|
52
52
|
|
|
53
|
-
short_name = str_or_nil(f[
|
|
54
|
-
if short_name.nil?
|
|
55
|
-
|
|
56
|
-
else
|
|
57
|
-
assert_equal short_name, os.short_name, "failed os short name detection"
|
|
53
|
+
short_name = str_or_nil(f['os']['short_name'])
|
|
54
|
+
if short_name.nil? && f['os']['name']
|
|
55
|
+
short_name = DeviceDetector::OS::OPERATING_SYSTEMS[f['os']['name']]
|
|
58
56
|
end
|
|
59
57
|
|
|
60
|
-
|
|
58
|
+
unless short_name.nil?
|
|
59
|
+
assert_equal short_name, os.short_name, 'failed os short name detection'
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
os_version = str_or_nil(f['os']['version'])
|
|
61
63
|
if os_version.nil?
|
|
62
|
-
assert_nil os.full_version,
|
|
64
|
+
assert_nil os.full_version, 'failed os version detection'
|
|
63
65
|
else
|
|
64
|
-
assert_equal os_version, os.full_version,
|
|
66
|
+
assert_equal os_version, os.full_version, 'failed os version detection'
|
|
65
67
|
end
|
|
66
68
|
end
|
|
67
|
-
if f[
|
|
68
|
-
expected_type = str_or_nil(f[
|
|
69
|
+
if f['device']
|
|
70
|
+
expected_type = str_or_nil(f['device']['type'])
|
|
69
71
|
actual_type = detector.device_type
|
|
70
72
|
|
|
71
73
|
if expected_type != actual_type
|
|
@@ -74,27 +76,24 @@ describe DeviceDetector do
|
|
|
74
76
|
# detector.device_type
|
|
75
77
|
end
|
|
76
78
|
if expected_type.nil?
|
|
77
|
-
assert_nil actual_type,
|
|
79
|
+
assert_nil actual_type, 'failed device type detection'
|
|
78
80
|
else
|
|
79
|
-
assert_equal expected_type, actual_type,
|
|
81
|
+
assert_equal expected_type, actual_type, 'failed device type detection'
|
|
80
82
|
end
|
|
81
83
|
|
|
82
|
-
model = str_or_nil(f[
|
|
84
|
+
model = str_or_nil(f['device']['model'])
|
|
83
85
|
model = model.to_s unless model.nil?
|
|
84
86
|
|
|
85
87
|
if model.nil?
|
|
86
|
-
assert_nil detector.device_name,
|
|
88
|
+
assert_nil detector.device_name, 'failed device name detection'
|
|
87
89
|
else
|
|
88
|
-
assert_equal model, detector.device_name,
|
|
90
|
+
assert_equal model, detector.device_name, 'failed device name detection'
|
|
89
91
|
end
|
|
90
92
|
end
|
|
91
93
|
end
|
|
92
94
|
end
|
|
93
95
|
end
|
|
94
96
|
end
|
|
95
|
-
|
|
96
97
|
end
|
|
97
|
-
|
|
98
98
|
end
|
|
99
|
-
|
|
100
99
|
end
|
|
@@ -1,18 +1,20 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
1
3
|
require_relative '../spec_helper'
|
|
2
4
|
|
|
3
5
|
describe DeviceDetector::Device do
|
|
4
|
-
|
|
5
6
|
subject { DeviceDetector::Device.new(user_agent) }
|
|
6
7
|
|
|
7
|
-
|
|
8
|
+
alias_method :device, :subject
|
|
8
9
|
|
|
9
10
|
describe '#name' do
|
|
10
|
-
|
|
11
11
|
describe 'when models are nested' do
|
|
12
|
-
let(:user_agent)
|
|
12
|
+
let(:user_agent) do
|
|
13
|
+
'Mozilla/5.0 (iPhone; CPU iPhone OS 8_1_3 like Mac OS X) AppleWebKit/600.1.4 (KHTML, like Gecko) Mobile/12B466 [FBDV/iPhone7,2]'
|
|
14
|
+
end
|
|
13
15
|
|
|
14
16
|
it 'finds an Apple iPhone 6' do
|
|
15
|
-
device.name.must_equal 'iPhone 6'
|
|
17
|
+
value(device.name).must_equal 'iPhone 6'
|
|
16
18
|
end
|
|
17
19
|
end
|
|
18
20
|
|
|
@@ -20,7 +22,7 @@ describe DeviceDetector::Device do
|
|
|
20
22
|
let(:user_agent) { 'AIRNESS-AIR99/REV 2.2.1/Teleca Q03B1' }
|
|
21
23
|
|
|
22
24
|
it 'finds an Airness AIR99' do
|
|
23
|
-
device.name.must_equal 'AIR99'
|
|
25
|
+
value(device.name).must_equal 'AIR99'
|
|
24
26
|
end
|
|
25
27
|
end
|
|
26
28
|
|
|
@@ -28,19 +30,19 @@ describe DeviceDetector::Device do
|
|
|
28
30
|
let(:user_agent) { 'UNKNOWN MODEL NAME' }
|
|
29
31
|
|
|
30
32
|
it 'returns nil' do
|
|
31
|
-
device.name.must_be_nil
|
|
33
|
+
value(device.name).must_be_nil
|
|
32
34
|
end
|
|
33
35
|
end
|
|
34
|
-
|
|
35
36
|
end
|
|
36
37
|
|
|
37
38
|
describe '#type' do
|
|
38
|
-
|
|
39
39
|
describe 'when models are nested' do
|
|
40
|
-
let(:user_agent)
|
|
40
|
+
let(:user_agent) do
|
|
41
|
+
'Mozilla/5.0 (iPhone; CPU iPhone OS 8_1_3 like Mac OS X) AppleWebKit/600.1.4 (KHTML, like Gecko) Mobile/12B466 [FBDV/iPhone7,2]'
|
|
42
|
+
end
|
|
41
43
|
|
|
42
44
|
it 'finds device of Apple iPhone 6' do
|
|
43
|
-
device.type.must_equal 'smartphone'
|
|
45
|
+
value(device.type).must_equal 'smartphone'
|
|
44
46
|
end
|
|
45
47
|
end
|
|
46
48
|
|
|
@@ -48,7 +50,7 @@ describe DeviceDetector::Device do
|
|
|
48
50
|
let(:user_agent) { 'AIRNESS-AIR99/REV 2.2.1/Teleca Q03B1' }
|
|
49
51
|
|
|
50
52
|
it 'finds the device of Airness AIR99' do
|
|
51
|
-
device.type.must_equal 'feature phone'
|
|
53
|
+
value(device.type).must_equal 'feature phone'
|
|
52
54
|
end
|
|
53
55
|
end
|
|
54
56
|
|
|
@@ -56,96 +58,90 @@ describe DeviceDetector::Device do
|
|
|
56
58
|
let(:user_agent) { 'UNKNOWN MODEL TYPE' }
|
|
57
59
|
|
|
58
60
|
it 'returns nil' do
|
|
59
|
-
device.type.must_be_nil
|
|
61
|
+
value(device.type).must_be_nil
|
|
60
62
|
end
|
|
61
|
-
|
|
62
63
|
end
|
|
63
64
|
|
|
64
65
|
describe 'device not specified in nested block' do
|
|
65
|
-
|
|
66
|
-
|
|
66
|
+
let(:user_agent) do
|
|
67
|
+
'Mozilla/5.0 (Linux; Android 4.4.2; es-us; SAMSUNG SM-G900F Build/KOT49H) AppleWebKit/537.36 (KHTML, like Gecko)'
|
|
68
|
+
end
|
|
67
69
|
|
|
68
70
|
it 'falls back to top-level device' do
|
|
69
|
-
device.type.must_equal 'smartphone'
|
|
71
|
+
value(device.type).must_equal 'smartphone'
|
|
70
72
|
end
|
|
71
|
-
|
|
72
73
|
end
|
|
73
|
-
|
|
74
74
|
end
|
|
75
75
|
|
|
76
76
|
describe 'concrete device types' do
|
|
77
|
-
|
|
78
77
|
describe 'mobiles' do
|
|
79
|
-
|
|
80
|
-
|
|
78
|
+
let(:user_agent) do
|
|
79
|
+
'Mozilla/5.0 (Linux; Android 4.4.2; es-us; SAMSUNG SM-G900F Build/KOT49H) AppleWebKit/537.36 (KHTML, like Gecko)'
|
|
80
|
+
end
|
|
81
81
|
|
|
82
82
|
it 'identifies the device' do
|
|
83
|
-
device.name.must_equal '
|
|
84
|
-
device.type.must_equal 'smartphone'
|
|
85
|
-
device.brand.must_equal 'Samsung'
|
|
83
|
+
value(device.name).must_equal 'Galaxy S5'
|
|
84
|
+
value(device.type).must_equal 'smartphone'
|
|
85
|
+
value(device.brand).must_equal 'Samsung'
|
|
86
86
|
end
|
|
87
|
-
|
|
88
87
|
end
|
|
89
88
|
|
|
90
89
|
describe 'cameras' do
|
|
91
|
-
|
|
92
|
-
|
|
90
|
+
let(:user_agent) do
|
|
91
|
+
'Mozilla/5.0 (Linux; U; Android 4.0; xx-xx; EK-GC100 Build/IMM76D) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30'
|
|
92
|
+
end
|
|
93
93
|
|
|
94
94
|
it 'identifies the device' do
|
|
95
|
-
device.name.must_equal '
|
|
96
|
-
device.type.must_equal 'camera'
|
|
97
|
-
device.brand.must_equal 'Samsung'
|
|
95
|
+
value(device.name).must_equal 'Galaxy Camera'
|
|
96
|
+
value(device.type).must_equal 'camera'
|
|
97
|
+
value(device.brand).must_equal 'Samsung'
|
|
98
98
|
end
|
|
99
|
-
|
|
100
99
|
end
|
|
101
100
|
|
|
102
101
|
describe 'car browsers' do
|
|
103
|
-
|
|
104
|
-
|
|
102
|
+
let(:user_agent) do
|
|
103
|
+
'Mozilla/5.0 (X11; Linux) AppleWebKit/534.34 (KHTML, like Gecko) QtCarBrowser Safari/534.34'
|
|
104
|
+
end
|
|
105
105
|
|
|
106
106
|
it 'identifies the device' do
|
|
107
|
-
device.name.must_equal 'Model S'
|
|
108
|
-
device.type.must_equal 'car browser'
|
|
109
|
-
device.brand.
|
|
107
|
+
value(device.name).must_equal 'Model S'
|
|
108
|
+
value(device.type).must_equal 'car browser'
|
|
109
|
+
value(device.brand).must_equal 'Tesla'
|
|
110
110
|
end
|
|
111
|
-
|
|
112
111
|
end
|
|
113
112
|
|
|
114
113
|
describe '(gaming) consoles' do
|
|
115
|
-
|
|
116
114
|
let(:user_agent) { 'Opera/9.30 (Nintendo Wii; U; ; 2047-7;en)' }
|
|
117
115
|
|
|
118
116
|
it 'identifies the device' do
|
|
119
|
-
device.name.must_equal 'Wii'
|
|
120
|
-
device.type.must_equal 'console'
|
|
121
|
-
device.brand.must_be_nil
|
|
117
|
+
value(device.name).must_equal 'Wii'
|
|
118
|
+
value(device.type).must_equal 'console'
|
|
119
|
+
value(device.brand).must_be_nil
|
|
122
120
|
end
|
|
123
|
-
|
|
124
121
|
end
|
|
125
122
|
|
|
126
123
|
describe 'portable media players' do
|
|
127
|
-
|
|
128
|
-
|
|
124
|
+
let(:user_agent) do
|
|
125
|
+
'Mozilla/5.0 (iPod touch; CPU iPhone OS 7_0_6 like Mac OS X) AppleWebKit/537.51.1 (KHTML, like Gecko) Version/7.0 Mobile/11B651 Safari/9537.53'
|
|
126
|
+
end
|
|
129
127
|
|
|
130
128
|
it 'identifies the device' do
|
|
131
|
-
device.name.must_equal 'iPod Touch'
|
|
132
|
-
device.type.must_equal 'portable media player'
|
|
133
|
-
device.brand.must_equal 'Apple'
|
|
129
|
+
value(device.name).must_equal 'iPod Touch'
|
|
130
|
+
value(device.type).must_equal 'portable media player'
|
|
131
|
+
value(device.brand).must_equal 'Apple'
|
|
134
132
|
end
|
|
135
|
-
|
|
136
133
|
end
|
|
137
134
|
|
|
138
135
|
describe 'televisions' do
|
|
139
|
-
|
|
140
|
-
|
|
136
|
+
let(:user_agent) do
|
|
137
|
+
'Mozilla/5.0 (Unknown; Linux armv7l) AppleWebKit/537.1+ (KHTML, like Gecko) Safari/537.1+ HbbTV/1.1.1 ( ;LGE ;NetCast 4.0 ;03.10.81 ;1.0M ;)'
|
|
138
|
+
end
|
|
141
139
|
|
|
142
140
|
it 'identifies the device' do
|
|
143
|
-
device.name.must_equal 'NetCast 4.0'
|
|
144
|
-
device.type.must_equal 'tv'
|
|
145
|
-
device.brand.must_equal 'LG'
|
|
141
|
+
value(device.name).must_equal 'NetCast 4.0'
|
|
142
|
+
value(device.type).must_equal 'tv'
|
|
143
|
+
value(device.brand).must_equal 'LG'
|
|
146
144
|
end
|
|
147
|
-
|
|
148
145
|
end
|
|
149
146
|
end
|
|
150
|
-
|
|
151
147
|
end
|
|
@@ -14,12 +14,12 @@ describe DeviceDetector::MemoryCache do
|
|
|
14
14
|
it 'sets the value under the key' do
|
|
15
15
|
subject.set(key, 'value')
|
|
16
16
|
|
|
17
|
-
subject.data[key].must_equal 'value'
|
|
17
|
+
value(subject.data[key]).must_equal 'value'
|
|
18
18
|
end
|
|
19
19
|
|
|
20
20
|
it 'returns the value' do
|
|
21
|
-
subject.set(key, 'value').must_equal 'value'
|
|
22
|
-
subject.set(key, false).must_equal false
|
|
21
|
+
value(subject.set(key, 'value')).must_equal 'value'
|
|
22
|
+
value(subject.set(key, false)).must_equal false
|
|
23
23
|
assert_nil subject.set(key, nil)
|
|
24
24
|
end
|
|
25
25
|
end
|
|
@@ -30,7 +30,7 @@ describe DeviceDetector::MemoryCache do
|
|
|
30
30
|
it 'sets the value under the key' do
|
|
31
31
|
subject.set(key, 'value')
|
|
32
32
|
|
|
33
|
-
subject.data[String(key)].must_equal 'value'
|
|
33
|
+
value(subject.data[String(key)]).must_equal 'value'
|
|
34
34
|
end
|
|
35
35
|
end
|
|
36
36
|
|
|
@@ -41,14 +41,14 @@ describe DeviceDetector::MemoryCache do
|
|
|
41
41
|
it 'sets the value under the key' do
|
|
42
42
|
subject.set(key, nil)
|
|
43
43
|
|
|
44
|
-
subject.data[String(key)].must_equal internal_value
|
|
44
|
+
value(subject.data[String(key)]).must_equal internal_value
|
|
45
45
|
assert_nil subject.get(key)
|
|
46
46
|
end
|
|
47
47
|
|
|
48
48
|
it 'sets the value under the key' do
|
|
49
49
|
subject.get_or_set(key, nil)
|
|
50
50
|
|
|
51
|
-
subject.data[String(key)].must_equal internal_value
|
|
51
|
+
value(subject.data[String(key)]).must_equal internal_value
|
|
52
52
|
assert_nil subject.get(key)
|
|
53
53
|
end
|
|
54
54
|
end
|
|
@@ -59,15 +59,15 @@ describe DeviceDetector::MemoryCache do
|
|
|
59
59
|
it 'sets the value under the key' do
|
|
60
60
|
subject.set(key, false)
|
|
61
61
|
|
|
62
|
-
subject.data[String(key)].must_equal false
|
|
63
|
-
subject.get(key).must_equal false
|
|
62
|
+
value(subject.data[String(key)]).must_equal false
|
|
63
|
+
value(subject.get(key)).must_equal false
|
|
64
64
|
end
|
|
65
65
|
|
|
66
66
|
it 'sets the value under the key' do
|
|
67
67
|
subject.get_or_set(key, false)
|
|
68
68
|
|
|
69
|
-
subject.data[String(key)].must_equal false
|
|
70
|
-
subject.get(key).must_equal false
|
|
69
|
+
value(subject.data[String(key)]).must_equal false
|
|
70
|
+
value(subject.get(key)).must_equal false
|
|
71
71
|
end
|
|
72
72
|
end
|
|
73
73
|
end
|
|
@@ -79,7 +79,7 @@ describe DeviceDetector::MemoryCache do
|
|
|
79
79
|
it 'gets the value for the key' do
|
|
80
80
|
subject.data[key] = 'value'
|
|
81
81
|
|
|
82
|
-
subject.get(key).must_equal 'value'
|
|
82
|
+
value(subject.get(key)).must_equal 'value'
|
|
83
83
|
end
|
|
84
84
|
end
|
|
85
85
|
|
|
@@ -89,7 +89,7 @@ describe DeviceDetector::MemoryCache do
|
|
|
89
89
|
it 'gets the value for the key' do
|
|
90
90
|
subject.data[String(key)] = 'value'
|
|
91
91
|
|
|
92
|
-
subject.get(key).must_equal 'value'
|
|
92
|
+
value(subject.get(key)).must_equal 'value'
|
|
93
93
|
end
|
|
94
94
|
end
|
|
95
95
|
end
|
|
@@ -106,13 +106,13 @@ describe DeviceDetector::MemoryCache do
|
|
|
106
106
|
block_called = true
|
|
107
107
|
end
|
|
108
108
|
|
|
109
|
-
value.must_equal 'value'
|
|
110
|
-
block_called.must_equal false
|
|
109
|
+
value(value).must_equal 'value'
|
|
110
|
+
value(block_called).must_equal false
|
|
111
111
|
end
|
|
112
112
|
|
|
113
113
|
it 'returns the value' do
|
|
114
114
|
subject.data[key] = 'value2'
|
|
115
|
-
subject.get_or_set(key, 'value').must_equal 'value2'
|
|
115
|
+
value(subject.get_or_set(key, 'value')).must_equal 'value2'
|
|
116
116
|
end
|
|
117
117
|
end
|
|
118
118
|
|
|
@@ -123,12 +123,12 @@ describe DeviceDetector::MemoryCache do
|
|
|
123
123
|
block_called = true
|
|
124
124
|
end
|
|
125
125
|
|
|
126
|
-
block_called.must_equal true
|
|
127
|
-
subject.data[key].must_equal true
|
|
126
|
+
value(block_called).must_equal true
|
|
127
|
+
value(subject.data[key]).must_equal true
|
|
128
128
|
end
|
|
129
129
|
|
|
130
130
|
it 'returns the value' do
|
|
131
|
-
subject.get_or_set(key, 'value').must_equal 'value'
|
|
131
|
+
value(subject.get_or_set(key, 'value')).must_equal 'value'
|
|
132
132
|
end
|
|
133
133
|
end
|
|
134
134
|
end
|
|
@@ -142,7 +142,7 @@ describe DeviceDetector::MemoryCache do
|
|
|
142
142
|
subject.set('3', 'baz')
|
|
143
143
|
subject.set('4', 'boz')
|
|
144
144
|
|
|
145
|
-
subject.data.keys.size.must_equal 3
|
|
145
|
+
value(subject.data.keys.size).must_equal 3
|
|
146
146
|
end
|
|
147
147
|
end
|
|
148
148
|
end
|