device_detector 1.0.3 → 1.0.7
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/CHANGELOG.md +15 -0
- data/README.md +8 -7
- 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 +1247 -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 +150 -116
- data/lib/device_detector/parser.rb +23 -10
- data/lib/device_detector/version.rb +1 -1
- data/lib/device_detector/version_extractor.rb +29 -2
- data/lib/device_detector.rb +73 -40
- data/regexes/bots.yml +868 -62
- data/regexes/client/browser_engine.yml +11 -2
- data/regexes/client/browsers.yml +1132 -112
- data/regexes/client/feed_readers.yml +5 -11
- data/regexes/client/libraries.yml +86 -2
- data/regexes/client/mediaplayers.yml +39 -3
- data/regexes/client/mobile_apps.yml +940 -66
- data/regexes/client/pim.yml +66 -3
- data/regexes/device/cameras.yml +6 -6
- data/regexes/device/car_browsers.yml +23 -3
- data/regexes/device/consoles.yml +15 -3
- data/regexes/device/mobiles.yml +18351 -3566
- data/regexes/device/notebooks.yml +114 -0
- data/regexes/device/portable_media_player.yml +36 -9
- data/regexes/device/shell_tv.yml +117 -0
- data/regexes/device/televisions.yml +440 -35
- data/regexes/oss.yml +635 -284
- data/regexes/vendorfragments.yml +5 -1
- metadata +21 -118
- data/.gitignore +0 -14
- data/.travis.yml +0 -14
- data/Gemfile +0 -8
- data/Rakefile +0 -96
- data/device_detector.gemspec +0 -26
- data/spec/device_detector/bot_fixtures_spec.rb +0 -30
- data/spec/device_detector/client_fixtures_spec.rb +0 -31
- data/spec/device_detector/concrete_user_agent_spec.rb +0 -135
- data/spec/device_detector/detector_fixtures_spec.rb +0 -100
- data/spec/device_detector/device_fixtures_spec.rb +0 -36
- data/spec/device_detector/device_spec.rb +0 -151
- data/spec/device_detector/memory_cache_spec.rb +0 -148
- data/spec/device_detector/model_extractor_spec.rb +0 -63
- data/spec/device_detector/os_fixtures_spec.rb +0 -26
- data/spec/device_detector/version_extractor_spec.rb +0 -79
- data/spec/device_detector_spec.rb +0 -189
- data/spec/fixtures/client/browser.yml +0 -2206
- data/spec/fixtures/client/feed_reader.yml +0 -199
- data/spec/fixtures/client/library.yml +0 -175
- data/spec/fixtures/client/mediaplayer.yml +0 -163
- data/spec/fixtures/client/mobile_app.yml +0 -193
- data/spec/fixtures/client/pim.yml +0 -115
- data/spec/fixtures/detector/bots.yml +0 -3260
- data/spec/fixtures/detector/camera.yml +0 -121
- data/spec/fixtures/detector/car_browser.yml +0 -21
- data/spec/fixtures/detector/console.yml +0 -281
- data/spec/fixtures/detector/desktop.yml +0 -5361
- data/spec/fixtures/detector/feature_phone.yml +0 -891
- data/spec/fixtures/detector/feed_reader.yml +0 -551
- data/spec/fixtures/detector/mediaplayer.yml +0 -210
- data/spec/fixtures/detector/mobile_apps.yml +0 -456
- data/spec/fixtures/detector/phablet.yml +0 -3785
- data/spec/fixtures/detector/portable_media_player.yml +0 -178
- data/spec/fixtures/detector/smart_display.yml +0 -61
- data/spec/fixtures/detector/smartphone-1.yml +0 -9953
- data/spec/fixtures/detector/smartphone-10.yml +0 -9924
- data/spec/fixtures/detector/smartphone-11.yml +0 -9889
- data/spec/fixtures/detector/smartphone-12.yml +0 -8655
- data/spec/fixtures/detector/smartphone-2.yml +0 -9967
- data/spec/fixtures/detector/smartphone-3.yml +0 -9887
- data/spec/fixtures/detector/smartphone-4.yml +0 -9911
- data/spec/fixtures/detector/smartphone-5.yml +0 -9933
- data/spec/fixtures/detector/smartphone-6.yml +0 -9923
- data/spec/fixtures/detector/smartphone-7.yml +0 -9892
- data/spec/fixtures/detector/smartphone-8.yml +0 -9896
- data/spec/fixtures/detector/smartphone-9.yml +0 -9928
- data/spec/fixtures/detector/smartphone.yml +0 -9984
- data/spec/fixtures/detector/tablet-1.yml +0 -10023
- data/spec/fixtures/detector/tablet-2.yml +0 -9968
- data/spec/fixtures/detector/tablet-3.yml +0 -7787
- data/spec/fixtures/detector/tablet.yml +0 -9951
- data/spec/fixtures/detector/tv.yml +0 -3333
- data/spec/fixtures/detector/unknown.yml +0 -3283
- data/spec/fixtures/device/camera.yml +0 -19
- data/spec/fixtures/device/car_browser.yml +0 -7
- data/spec/fixtures/device/console.yml +0 -79
- data/spec/fixtures/parser/oss.yml +0 -1047
- data/spec/fixtures/parser/vendorfragments.yml +0 -162
- data/spec/spec_helper.rb +0 -9
@@ -1,36 +0,0 @@
|
|
1
|
-
require_relative '../spec_helper'
|
2
|
-
|
3
|
-
describe DeviceDetector::Device do
|
4
|
-
|
5
|
-
fixture_dir = File.expand_path('../../fixtures/devices', __FILE__)
|
6
|
-
fixture_files = Dir["#{fixture_dir}/*.yml"]
|
7
|
-
fixture_files.each do |fixture_file|
|
8
|
-
|
9
|
-
describe File.basename(fixture_file) do
|
10
|
-
|
11
|
-
fixtures = YAML.load_file(fixture_file)
|
12
|
-
fixtures.each do |f|
|
13
|
-
|
14
|
-
user_agent = f["user_agent"]
|
15
|
-
device = DeviceDetector::Device.new(user_agent)
|
16
|
-
|
17
|
-
describe user_agent do
|
18
|
-
|
19
|
-
it "should be known" do
|
20
|
-
assert device.known?, "isn't known as a device"
|
21
|
-
end
|
22
|
-
|
23
|
-
it "should have the expected model" do
|
24
|
-
assert_equal f["device"]["model"], device.name, "failed model detection"
|
25
|
-
end
|
26
|
-
|
27
|
-
it "should have the expected type" do
|
28
|
-
expected_device_type = DeviceDetector::Device::DEVICE_NAMES[f["device"]["type"]]
|
29
|
-
assert_equal expected_device_type, device.type, "failed device name detection"
|
30
|
-
end
|
31
|
-
|
32
|
-
end
|
33
|
-
end
|
34
|
-
end
|
35
|
-
end
|
36
|
-
end
|
@@ -1,151 +0,0 @@
|
|
1
|
-
require_relative '../spec_helper'
|
2
|
-
|
3
|
-
describe DeviceDetector::Device do
|
4
|
-
|
5
|
-
subject { DeviceDetector::Device.new(user_agent) }
|
6
|
-
|
7
|
-
alias :device :subject
|
8
|
-
|
9
|
-
describe '#name' do
|
10
|
-
|
11
|
-
describe 'when models are nested' do
|
12
|
-
let(:user_agent) { '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]' }
|
13
|
-
|
14
|
-
it 'finds an Apple iPhone 6' do
|
15
|
-
value(device.name).must_equal 'iPhone 6'
|
16
|
-
end
|
17
|
-
end
|
18
|
-
|
19
|
-
describe 'when models are NOT nested' do
|
20
|
-
let(:user_agent) { 'AIRNESS-AIR99/REV 2.2.1/Teleca Q03B1' }
|
21
|
-
|
22
|
-
it 'finds an Airness AIR99' do
|
23
|
-
value(device.name).must_equal 'AIR99'
|
24
|
-
end
|
25
|
-
end
|
26
|
-
|
27
|
-
describe 'when it cannot find a device name' do
|
28
|
-
let(:user_agent) { 'UNKNOWN MODEL NAME' }
|
29
|
-
|
30
|
-
it 'returns nil' do
|
31
|
-
value(device.name).must_be_nil
|
32
|
-
end
|
33
|
-
end
|
34
|
-
|
35
|
-
end
|
36
|
-
|
37
|
-
describe '#type' do
|
38
|
-
|
39
|
-
describe 'when models are nested' do
|
40
|
-
let(:user_agent) { '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]' }
|
41
|
-
|
42
|
-
it 'finds device of Apple iPhone 6' do
|
43
|
-
value(device.type).must_equal 'smartphone'
|
44
|
-
end
|
45
|
-
end
|
46
|
-
|
47
|
-
describe 'when models are NOT nested' do
|
48
|
-
let(:user_agent) { 'AIRNESS-AIR99/REV 2.2.1/Teleca Q03B1' }
|
49
|
-
|
50
|
-
it 'finds the device of Airness AIR99' do
|
51
|
-
value(device.type).must_equal 'feature phone'
|
52
|
-
end
|
53
|
-
end
|
54
|
-
|
55
|
-
describe 'when it cannot find a device type' do
|
56
|
-
let(:user_agent) { 'UNKNOWN MODEL TYPE' }
|
57
|
-
|
58
|
-
it 'returns nil' do
|
59
|
-
value(device.type).must_be_nil
|
60
|
-
end
|
61
|
-
|
62
|
-
end
|
63
|
-
|
64
|
-
describe 'device not specified in nested block' do
|
65
|
-
|
66
|
-
let(:user_agent) { 'Mozilla/5.0 (Linux; Android 4.4.2; es-us; SAMSUNG SM-G900F Build/KOT49H) AppleWebKit/537.36 (KHTML, like Gecko)' }
|
67
|
-
|
68
|
-
it 'falls back to top-level device' do
|
69
|
-
value(device.type).must_equal 'smartphone'
|
70
|
-
end
|
71
|
-
|
72
|
-
end
|
73
|
-
|
74
|
-
end
|
75
|
-
|
76
|
-
describe 'concrete device types' do
|
77
|
-
|
78
|
-
describe 'mobiles' do
|
79
|
-
|
80
|
-
let(:user_agent) { 'Mozilla/5.0 (Linux; Android 4.4.2; es-us; SAMSUNG SM-G900F Build/KOT49H) AppleWebKit/537.36 (KHTML, like Gecko)' }
|
81
|
-
|
82
|
-
it 'identifies the device' do
|
83
|
-
value(device.name).must_equal 'GALAXY S5'
|
84
|
-
value(device.type).must_equal 'smartphone'
|
85
|
-
value(device.brand).must_equal 'Samsung'
|
86
|
-
end
|
87
|
-
|
88
|
-
end
|
89
|
-
|
90
|
-
describe 'cameras' do
|
91
|
-
|
92
|
-
let(:user_agent) { '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' }
|
93
|
-
|
94
|
-
it 'identifies the device' do
|
95
|
-
value(device.name).must_equal 'GALAXY Camera'
|
96
|
-
value(device.type).must_equal 'camera'
|
97
|
-
value(device.brand).must_equal 'Samsung'
|
98
|
-
end
|
99
|
-
|
100
|
-
end
|
101
|
-
|
102
|
-
describe 'car browsers' do
|
103
|
-
|
104
|
-
let(:user_agent) { 'Mozilla/5.0 (X11; Linux) AppleWebKit/534.34 (KHTML, like Gecko) QtCarBrowser Safari/534.34' }
|
105
|
-
|
106
|
-
it 'identifies the device' do
|
107
|
-
value(device.name).must_equal 'Model S'
|
108
|
-
value(device.type).must_equal 'car browser'
|
109
|
-
value(device.brand).must_be_nil
|
110
|
-
end
|
111
|
-
|
112
|
-
end
|
113
|
-
|
114
|
-
describe '(gaming) consoles' do
|
115
|
-
|
116
|
-
let(:user_agent) { 'Opera/9.30 (Nintendo Wii; U; ; 2047-7;en)' }
|
117
|
-
|
118
|
-
it 'identifies the device' do
|
119
|
-
value(device.name).must_equal 'Wii'
|
120
|
-
value(device.type).must_equal 'console'
|
121
|
-
value(device.brand).must_be_nil
|
122
|
-
end
|
123
|
-
|
124
|
-
end
|
125
|
-
|
126
|
-
describe 'portable media players' do
|
127
|
-
|
128
|
-
let(:user_agent) { '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' }
|
129
|
-
|
130
|
-
it 'identifies the device' do
|
131
|
-
value(device.name).must_equal 'iPod Touch'
|
132
|
-
value(device.type).must_equal 'portable media player'
|
133
|
-
value(device.brand).must_equal 'Apple'
|
134
|
-
end
|
135
|
-
|
136
|
-
end
|
137
|
-
|
138
|
-
describe 'televisions' do
|
139
|
-
|
140
|
-
let(:user_agent) { '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 ;)' }
|
141
|
-
|
142
|
-
it 'identifies the device' do
|
143
|
-
value(device.name).must_equal 'NetCast 4.0'
|
144
|
-
value(device.type).must_equal 'tv'
|
145
|
-
value(device.brand).must_equal 'LG'
|
146
|
-
end
|
147
|
-
|
148
|
-
end
|
149
|
-
end
|
150
|
-
|
151
|
-
end
|
@@ -1,148 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require_relative '../spec_helper'
|
4
|
-
|
5
|
-
describe DeviceDetector::MemoryCache do
|
6
|
-
let(:subject) { DeviceDetector::MemoryCache.new(config) }
|
7
|
-
|
8
|
-
let(:config) { {} }
|
9
|
-
|
10
|
-
describe '#set' do
|
11
|
-
describe 'string key' do
|
12
|
-
let(:key) { 'string' }
|
13
|
-
|
14
|
-
it 'sets the value under the key' do
|
15
|
-
subject.set(key, 'value')
|
16
|
-
|
17
|
-
value(subject.data[key]).must_equal 'value'
|
18
|
-
end
|
19
|
-
|
20
|
-
it 'returns the value' do
|
21
|
-
value(subject.set(key, 'value')).must_equal 'value'
|
22
|
-
value(subject.set(key, false)).must_equal false
|
23
|
-
assert_nil subject.set(key, nil)
|
24
|
-
end
|
25
|
-
end
|
26
|
-
|
27
|
-
describe 'array key' do
|
28
|
-
let(:key) { %w[string1 string2] }
|
29
|
-
|
30
|
-
it 'sets the value under the key' do
|
31
|
-
subject.set(key, 'value')
|
32
|
-
|
33
|
-
value(subject.data[String(key)]).must_equal 'value'
|
34
|
-
end
|
35
|
-
end
|
36
|
-
|
37
|
-
describe 'nil value' do
|
38
|
-
let(:key) { 'string' }
|
39
|
-
let(:internal_value) { DeviceDetector::MemoryCache::STORES_NIL_VALUE }
|
40
|
-
|
41
|
-
it 'sets the value under the key' do
|
42
|
-
subject.set(key, nil)
|
43
|
-
|
44
|
-
value(subject.data[String(key)]).must_equal internal_value
|
45
|
-
assert_nil subject.get(key)
|
46
|
-
end
|
47
|
-
|
48
|
-
it 'sets the value under the key' do
|
49
|
-
subject.get_or_set(key, nil)
|
50
|
-
|
51
|
-
value(subject.data[String(key)]).must_equal internal_value
|
52
|
-
assert_nil subject.get(key)
|
53
|
-
end
|
54
|
-
end
|
55
|
-
|
56
|
-
describe 'false value' do
|
57
|
-
let(:key) { 'string' }
|
58
|
-
|
59
|
-
it 'sets the value under the key' do
|
60
|
-
subject.set(key, false)
|
61
|
-
|
62
|
-
value(subject.data[String(key)]).must_equal false
|
63
|
-
value(subject.get(key)).must_equal false
|
64
|
-
end
|
65
|
-
|
66
|
-
it 'sets the value under the key' do
|
67
|
-
subject.get_or_set(key, false)
|
68
|
-
|
69
|
-
value(subject.data[String(key)]).must_equal false
|
70
|
-
value(subject.get(key)).must_equal false
|
71
|
-
end
|
72
|
-
end
|
73
|
-
end
|
74
|
-
|
75
|
-
describe '#get' do
|
76
|
-
describe 'string key' do
|
77
|
-
let(:key) { 'string' }
|
78
|
-
|
79
|
-
it 'gets the value for the key' do
|
80
|
-
subject.data[key] = 'value'
|
81
|
-
|
82
|
-
value(subject.get(key)).must_equal 'value'
|
83
|
-
end
|
84
|
-
end
|
85
|
-
|
86
|
-
describe 'array key' do
|
87
|
-
let(:key) { %w[string1 string2] }
|
88
|
-
|
89
|
-
it 'gets the value for the key' do
|
90
|
-
subject.data[String(key)] = 'value'
|
91
|
-
|
92
|
-
value(subject.get(key)).must_equal 'value'
|
93
|
-
end
|
94
|
-
end
|
95
|
-
end
|
96
|
-
|
97
|
-
describe '#get_or_set' do
|
98
|
-
let(:key) { 'string' }
|
99
|
-
|
100
|
-
describe 'value already present' do
|
101
|
-
it 'gets the value for the key from cache' do
|
102
|
-
subject.data[key] = 'value'
|
103
|
-
|
104
|
-
block_called = false
|
105
|
-
value = subject.get_or_set(key) do
|
106
|
-
block_called = true
|
107
|
-
end
|
108
|
-
|
109
|
-
value(value).must_equal 'value'
|
110
|
-
value(block_called).must_equal false
|
111
|
-
end
|
112
|
-
|
113
|
-
it 'returns the value' do
|
114
|
-
subject.data[key] = 'value2'
|
115
|
-
value(subject.get_or_set(key, 'value')).must_equal 'value2'
|
116
|
-
end
|
117
|
-
end
|
118
|
-
|
119
|
-
describe 'value not yet present' do
|
120
|
-
it 'evaluates the block and sets the result' do
|
121
|
-
block_called = false
|
122
|
-
subject.get_or_set(key) do
|
123
|
-
block_called = true
|
124
|
-
end
|
125
|
-
|
126
|
-
value(block_called).must_equal true
|
127
|
-
value(subject.data[key]).must_equal true
|
128
|
-
end
|
129
|
-
|
130
|
-
it 'returns the value' do
|
131
|
-
value(subject.get_or_set(key, 'value')).must_equal 'value'
|
132
|
-
end
|
133
|
-
end
|
134
|
-
end
|
135
|
-
|
136
|
-
describe 'cache purging' do
|
137
|
-
let(:config) { { max_cache_keys: 3 } }
|
138
|
-
|
139
|
-
it 'purges the cache when key size arrives at max' do
|
140
|
-
subject.set('1', 'foo')
|
141
|
-
subject.set('2', 'bar')
|
142
|
-
subject.set('3', 'baz')
|
143
|
-
subject.set('4', 'boz')
|
144
|
-
|
145
|
-
value(subject.data.keys.size).must_equal 3
|
146
|
-
end
|
147
|
-
end
|
148
|
-
end
|
@@ -1,63 +0,0 @@
|
|
1
|
-
require_relative '../spec_helper'
|
2
|
-
|
3
|
-
describe DeviceDetector::ModelExtractor do
|
4
|
-
|
5
|
-
subject { DeviceDetector::ModelExtractor.new(user_agent, regex_meta) }
|
6
|
-
|
7
|
-
alias :extractor :subject
|
8
|
-
|
9
|
-
describe '#call' do
|
10
|
-
|
11
|
-
describe 'when matching against dynamic model' do
|
12
|
-
|
13
|
-
let(:regex_meta) do
|
14
|
-
{
|
15
|
-
:regex => '(?:Apple-)?iPhone ?(3GS?|4S?|5[CS]?|6(:? Plus)?)?',
|
16
|
-
:model => 'iPhone $1',
|
17
|
-
:device => 'smartphone'
|
18
|
-
}
|
19
|
-
end
|
20
|
-
|
21
|
-
describe 'when no dynamic match is found' do
|
22
|
-
let(:user_agent) { 'Mozilla/5.0 (iPhone; CPU iPhone OS 8_1_3 like Mac OS X) AppleWebKit/600.1.4 (KHTML, like Gecko) Version/8.0 Mobile/12B466 Safari/600.1.4' }
|
23
|
-
let(:device_name) { 'iPhone' }
|
24
|
-
|
25
|
-
it 'returns the textual portion without trailing whitespace' do
|
26
|
-
value(extractor.call).must_equal device_name
|
27
|
-
end
|
28
|
-
|
29
|
-
end
|
30
|
-
|
31
|
-
describe 'when a dynamic match is found' do
|
32
|
-
let(:user_agent) { 'Mozilla/5.0 (iPhone 5S; CPU iPhone OS 8_1_3 like Mac OS X) AppleWebKit/600.1.4 (KHTML, like Gecko) Version/8.0 Mobile/12B466 Safari/600.1.4' }
|
33
|
-
let(:device_name) { 'iPhone 5S' }
|
34
|
-
|
35
|
-
it 'returns the full device name' do
|
36
|
-
value(extractor.call).must_equal device_name
|
37
|
-
end
|
38
|
-
|
39
|
-
end
|
40
|
-
|
41
|
-
end
|
42
|
-
|
43
|
-
describe 'when matching against static model' do
|
44
|
-
|
45
|
-
let(:user_agent) { 'Mozilla/5.0 (iPhone; CPU iPhone OS 8_0 like Mac OS X) AppleWebKit/600.1.4 (KHTML, like Gecko) Mobile/12A365 Weibo (iPhone7,2)' }
|
46
|
-
let(:device_name) { 'iPhone 6' }
|
47
|
-
let(:regex_meta) do
|
48
|
-
{
|
49
|
-
:regex => '(?:Apple-)?iPhone7[C,]2',
|
50
|
-
:model => 'iPhone 6',
|
51
|
-
:device => 'smartphone'
|
52
|
-
}
|
53
|
-
end
|
54
|
-
|
55
|
-
it 'returns the model name' do
|
56
|
-
value(extractor.call).must_equal device_name
|
57
|
-
end
|
58
|
-
|
59
|
-
end
|
60
|
-
|
61
|
-
end
|
62
|
-
|
63
|
-
end
|
@@ -1,26 +0,0 @@
|
|
1
|
-
require_relative '../spec_helper'
|
2
|
-
|
3
|
-
describe DeviceDetector::OS do
|
4
|
-
|
5
|
-
fixture_dir = File.expand_path('../../fixtures/parser', __FILE__)
|
6
|
-
fixture_files = Dir["#{fixture_dir}/oss.yml"]
|
7
|
-
fixture_files.each do |fixture_file|
|
8
|
-
|
9
|
-
describe File.basename(fixture_file) do
|
10
|
-
|
11
|
-
fixtures = YAML.load(File.read(fixture_file))
|
12
|
-
fixtures.each do |f|
|
13
|
-
user_agent = f["user_agent"]
|
14
|
-
|
15
|
-
describe user_agent do
|
16
|
-
|
17
|
-
it "should have the expected name" do
|
18
|
-
os = DeviceDetector::OS.new(user_agent)
|
19
|
-
assert_equal f["os"]["name"], os.name, "failed OS name detection"
|
20
|
-
end
|
21
|
-
|
22
|
-
end
|
23
|
-
end
|
24
|
-
end
|
25
|
-
end
|
26
|
-
end
|
@@ -1,79 +0,0 @@
|
|
1
|
-
require_relative '../spec_helper'
|
2
|
-
|
3
|
-
describe DeviceDetector::VersionExtractor do
|
4
|
-
|
5
|
-
subject { DeviceDetector::VersionExtractor.new(user_agent, regex_meta) }
|
6
|
-
|
7
|
-
alias :extractor :subject
|
8
|
-
|
9
|
-
describe '#call' do
|
10
|
-
|
11
|
-
describe 'extractor without version' do
|
12
|
-
|
13
|
-
let(:user_agent) { 'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0; Avant Browser; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0)' }
|
14
|
-
|
15
|
-
let(:regex_meta) do
|
16
|
-
{
|
17
|
-
:regex => 'Avant Browser',
|
18
|
-
:name => 'Avant Browser',
|
19
|
-
:version => ''
|
20
|
-
}
|
21
|
-
end
|
22
|
-
|
23
|
-
it 'returns nil' do
|
24
|
-
value(extractor.call).must_equal ''
|
25
|
-
end
|
26
|
-
|
27
|
-
end
|
28
|
-
|
29
|
-
describe 'regex with dynamic matching' do
|
30
|
-
|
31
|
-
let(:user_agent) { 'Mozilla/5.0 (X11; U; Linux i686; nl; rv:1.8.1b2) Gecko/20060821 BonEcho/2.0b2 (Debian-1.99+2.0b2+dfsg-1)' }
|
32
|
-
let(:version) { 'BonEcho (2.0)' }
|
33
|
-
let(:regex_meta) do
|
34
|
-
{
|
35
|
-
:regex => '(BonEcho|GranParadiso|Lorentz|Minefield|Namoroka|Shiretoko)/(\d+[\.\d]+)',
|
36
|
-
:name => 'Firefox',
|
37
|
-
:version => '$1 ($2)'
|
38
|
-
}
|
39
|
-
end
|
40
|
-
|
41
|
-
it 'returns the correct version' do
|
42
|
-
value(extractor.call).must_equal version
|
43
|
-
end
|
44
|
-
|
45
|
-
it 'removes trailing white spaces' do
|
46
|
-
regex_meta[:version] = regex_meta[:version] + ' '
|
47
|
-
value(extractor.call).must_equal version
|
48
|
-
end
|
49
|
-
|
50
|
-
end
|
51
|
-
|
52
|
-
describe 'extractor with fixed version' do
|
53
|
-
|
54
|
-
let(:user_agent) { 'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0)' }
|
55
|
-
let(:regex_meta) do
|
56
|
-
{
|
57
|
-
:regex => 'MSIE.*Trident/4.0',
|
58
|
-
:version => '8.0'
|
59
|
-
}
|
60
|
-
end
|
61
|
-
|
62
|
-
it 'returns the correct version' do
|
63
|
-
value(extractor.call).must_equal '8.0'
|
64
|
-
end
|
65
|
-
|
66
|
-
end
|
67
|
-
|
68
|
-
describe 'unknown user agent' do
|
69
|
-
|
70
|
-
let(:user_agent) { 'garbage' }
|
71
|
-
let(:regex_meta) { {} }
|
72
|
-
|
73
|
-
it 'returns nil' do
|
74
|
-
value(extractor.call).must_be_nil
|
75
|
-
end
|
76
|
-
|
77
|
-
end
|
78
|
-
end
|
79
|
-
end
|
@@ -1,189 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require_relative 'spec_helper'
|
4
|
-
|
5
|
-
describe DeviceDetector do
|
6
|
-
subject { DeviceDetector.new(user_agent) }
|
7
|
-
|
8
|
-
alias_method :client, :subject
|
9
|
-
|
10
|
-
describe 'known user agent' do
|
11
|
-
describe 'desktop chrome browser' do
|
12
|
-
let(:user_agent) { 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/30.0.1599.69' }
|
13
|
-
|
14
|
-
describe '#name' do
|
15
|
-
it 'returns the name' do
|
16
|
-
value(client.name).must_equal 'Chrome'
|
17
|
-
end
|
18
|
-
end
|
19
|
-
|
20
|
-
describe '#full_version' do
|
21
|
-
it 'returns the full version' do
|
22
|
-
value(client.full_version).must_equal '30.0.1599.69'
|
23
|
-
end
|
24
|
-
end
|
25
|
-
|
26
|
-
describe '#os_family' do
|
27
|
-
it 'returns the operating system name' do
|
28
|
-
value(client.os_family).must_equal 'Mac'
|
29
|
-
end
|
30
|
-
end
|
31
|
-
|
32
|
-
describe '#os_name' do
|
33
|
-
it 'returns the operating system name' do
|
34
|
-
value(client.os_name).must_equal 'Mac'
|
35
|
-
end
|
36
|
-
end
|
37
|
-
|
38
|
-
describe '#os_full_version' do
|
39
|
-
it 'returns the operating system full version' do
|
40
|
-
value(client.os_full_version).must_equal '10.8.5'
|
41
|
-
end
|
42
|
-
end
|
43
|
-
|
44
|
-
describe '#known?' do
|
45
|
-
it 'returns true' do
|
46
|
-
value(client.known?).must_equal true
|
47
|
-
end
|
48
|
-
end
|
49
|
-
|
50
|
-
describe '#bot?' do
|
51
|
-
it 'returns false' do
|
52
|
-
value(client.bot?).must_equal false
|
53
|
-
end
|
54
|
-
end
|
55
|
-
|
56
|
-
describe '#bot_name' do
|
57
|
-
it 'returns nil' do
|
58
|
-
value(client.bot_name).must_be_nil
|
59
|
-
end
|
60
|
-
end
|
61
|
-
end
|
62
|
-
|
63
|
-
describe 'ubuntu linux' do
|
64
|
-
let(:user_agent) do
|
65
|
-
'Mozilla/5.0 (X11; Ubuntu; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.101 Safari/537.36'
|
66
|
-
end
|
67
|
-
|
68
|
-
describe '#os_family' do
|
69
|
-
it 'returns the operating system name' do
|
70
|
-
value(client.os_family).must_equal 'GNU/Linux'
|
71
|
-
end
|
72
|
-
end
|
73
|
-
|
74
|
-
describe '#os_name' do
|
75
|
-
it 'returns the operating system name' do
|
76
|
-
value(client.os_name).must_equal 'Ubuntu'
|
77
|
-
end
|
78
|
-
end
|
79
|
-
end
|
80
|
-
|
81
|
-
describe 'firefox mobile phone' do
|
82
|
-
let(:user_agent) { 'Mozilla/5.0 (Android 7.0; Mobile; rv:53.0) Gecko/53.0 Firefox/53.0' }
|
83
|
-
|
84
|
-
it 'detects smartphone' do
|
85
|
-
value(client.device_type).must_equal 'smartphone'
|
86
|
-
end
|
87
|
-
end
|
88
|
-
|
89
|
-
describe 'firefox mobile tablet' do
|
90
|
-
let(:user_agent) { 'Mozilla/5.0 (Android 6.0.1; Tablet; rv:47.0) Gecko/47.0 Firefox/47.0' }
|
91
|
-
|
92
|
-
it 'detects tablet' do
|
93
|
-
value(client.device_type).must_equal 'tablet'
|
94
|
-
end
|
95
|
-
end
|
96
|
-
end
|
97
|
-
|
98
|
-
describe 'unknown user agent' do
|
99
|
-
let(:user_agent) { 'garbage123' }
|
100
|
-
|
101
|
-
describe '#name' do
|
102
|
-
it 'returns nil' do
|
103
|
-
value(client.name).must_be_nil
|
104
|
-
end
|
105
|
-
end
|
106
|
-
|
107
|
-
describe '#full_version' do
|
108
|
-
it 'returns nil' do
|
109
|
-
value(client.full_version).must_be_nil
|
110
|
-
end
|
111
|
-
end
|
112
|
-
|
113
|
-
describe '#os_name' do
|
114
|
-
it 'returns nil' do
|
115
|
-
value(client.os_name).must_be_nil
|
116
|
-
end
|
117
|
-
end
|
118
|
-
|
119
|
-
describe '#os_full_version' do
|
120
|
-
it 'returns nil' do
|
121
|
-
value(client.os_full_version).must_be_nil
|
122
|
-
end
|
123
|
-
end
|
124
|
-
|
125
|
-
describe '#known?' do
|
126
|
-
it 'returns false' do
|
127
|
-
value(client.known?).must_equal false
|
128
|
-
end
|
129
|
-
end
|
130
|
-
|
131
|
-
describe '#bot?' do
|
132
|
-
it 'returns false' do
|
133
|
-
value(client.bot?).must_equal false
|
134
|
-
end
|
135
|
-
end
|
136
|
-
|
137
|
-
describe '#bot_name' do
|
138
|
-
it 'returns nil' do
|
139
|
-
value(client.bot_name).must_be_nil
|
140
|
-
end
|
141
|
-
end
|
142
|
-
end
|
143
|
-
|
144
|
-
describe 'bot' do
|
145
|
-
let(:user_agent) { 'Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)' }
|
146
|
-
|
147
|
-
describe '#name' do
|
148
|
-
it 'returns nil' do
|
149
|
-
value(client.name).must_be_nil
|
150
|
-
end
|
151
|
-
end
|
152
|
-
|
153
|
-
describe '#full_version' do
|
154
|
-
it 'returns nil' do
|
155
|
-
value(client.full_version).must_be_nil
|
156
|
-
end
|
157
|
-
end
|
158
|
-
|
159
|
-
describe '#os_name' do
|
160
|
-
it 'returns nil' do
|
161
|
-
value(client.os_name).must_be_nil
|
162
|
-
end
|
163
|
-
end
|
164
|
-
|
165
|
-
describe '#os_full_version' do
|
166
|
-
it 'returns nil' do
|
167
|
-
value(client.os_full_version).must_be_nil
|
168
|
-
end
|
169
|
-
end
|
170
|
-
|
171
|
-
describe '#known?' do
|
172
|
-
it 'returns false' do
|
173
|
-
value(client.known?).must_equal false
|
174
|
-
end
|
175
|
-
end
|
176
|
-
|
177
|
-
describe '#bot?' do
|
178
|
-
it 'returns true' do
|
179
|
-
value(client.bot?).must_equal true
|
180
|
-
end
|
181
|
-
end
|
182
|
-
|
183
|
-
describe '#bot_name' do
|
184
|
-
it 'returns the name of the bot' do
|
185
|
-
value(client.bot_name).must_equal 'Googlebot'
|
186
|
-
end
|
187
|
-
end
|
188
|
-
end
|
189
|
-
end
|