device_detector 1.0.5 → 1.0.6

Sign up to get free protection for your applications and to get access to all the features.
Files changed (90) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +7 -6
  3. data/lib/device_detector/browser.rb +364 -0
  4. data/lib/device_detector/client.rb +8 -0
  5. data/lib/device_detector/device.rb +1124 -4
  6. data/lib/device_detector/os.rb +36 -11
  7. data/lib/device_detector/version.rb +1 -1
  8. data/lib/device_detector/version_extractor.rb +9 -0
  9. data/lib/device_detector.rb +57 -13
  10. data/regexes/bots.yml +551 -58
  11. data/regexes/client/browser_engine.yml +7 -1
  12. data/regexes/client/browsers.yml +594 -71
  13. data/regexes/client/feed_readers.yml +4 -10
  14. data/regexes/client/libraries.yml +47 -2
  15. data/regexes/client/mediaplayers.yml +25 -1
  16. data/regexes/client/mobile_apps.yml +447 -77
  17. data/regexes/client/pim.yml +49 -1
  18. data/regexes/device/cameras.yml +5 -5
  19. data/regexes/device/car_browsers.yml +16 -0
  20. data/regexes/device/consoles.yml +6 -0
  21. data/regexes/device/mobiles.yml +12905 -4561
  22. data/regexes/device/portable_media_player.yml +20 -3
  23. data/regexes/device/shell_tv.yml +117 -0
  24. data/regexes/device/televisions.yml +426 -35
  25. data/regexes/oss.yml +567 -139
  26. data/spec/device_detector/concrete_user_agent_spec.rb +30 -42
  27. data/spec/device_detector/detector_fixtures_spec.rb +9 -5
  28. data/spec/device_detector/device_spec.rb +26 -10
  29. data/spec/fixtures/client/browser.yml +1463 -391
  30. data/spec/fixtures/client/feed_reader.yml +0 -12
  31. data/spec/fixtures/client/library.yml +91 -37
  32. data/spec/fixtures/client/mediaplayer.yml +30 -0
  33. data/spec/fixtures/client/mobile_app.yml +498 -45
  34. data/spec/fixtures/client/pim.yml +60 -0
  35. data/spec/fixtures/detector/bots.yml +1189 -568
  36. data/spec/fixtures/detector/camera.yml +12 -26
  37. data/spec/fixtures/detector/car_browser.yml +151 -15
  38. data/spec/fixtures/detector/console.yml +70 -48
  39. data/spec/fixtures/detector/desktop.yml +2041 -916
  40. data/spec/fixtures/detector/feature_phone.yml +895 -189
  41. data/spec/fixtures/detector/feed_reader.yml +50 -77
  42. data/spec/fixtures/detector/mediaplayer.yml +79 -26
  43. data/spec/fixtures/detector/mobile_apps.yml +726 -72
  44. data/spec/fixtures/detector/peripheral.yml +271 -0
  45. data/spec/fixtures/detector/phablet.yml +3635 -1596
  46. data/spec/fixtures/detector/portable_media_player.yml +355 -46
  47. data/spec/fixtures/detector/smart_display.yml +183 -9
  48. data/spec/fixtures/detector/smart_speaker.yml +13 -8
  49. data/spec/fixtures/detector/smartphone-1.yml +4002 -4286
  50. data/spec/fixtures/detector/smartphone-10.yml +3771 -4763
  51. data/spec/fixtures/detector/smartphone-11.yml +3615 -4692
  52. data/spec/fixtures/detector/smartphone-12.yml +3856 -4764
  53. data/spec/fixtures/detector/smartphone-13.yml +4213 -4713
  54. data/spec/fixtures/detector/smartphone-14.yml +4039 -4497
  55. data/spec/fixtures/detector/smartphone-15.yml +5642 -2956
  56. data/spec/fixtures/detector/smartphone-16.yml +4739 -5082
  57. data/spec/fixtures/detector/smartphone-17.yml +4832 -4275
  58. data/spec/fixtures/detector/smartphone-18.yml +9806 -0
  59. data/spec/fixtures/detector/smartphone-19.yml +9965 -0
  60. data/spec/fixtures/detector/smartphone-2.yml +4842 -2589
  61. data/spec/fixtures/detector/smartphone-20.yml +9710 -0
  62. data/spec/fixtures/detector/smartphone-21.yml +8693 -0
  63. data/spec/fixtures/detector/smartphone-22.yml +10178 -0
  64. data/spec/fixtures/detector/smartphone-23.yml +9453 -0
  65. data/spec/fixtures/detector/smartphone-24.yml +9843 -0
  66. data/spec/fixtures/detector/smartphone-25.yml +9703 -0
  67. data/spec/fixtures/detector/smartphone-26.yml +10007 -0
  68. data/spec/fixtures/detector/smartphone-27.yml +4927 -0
  69. data/spec/fixtures/detector/smartphone-3.yml +4387 -4427
  70. data/spec/fixtures/detector/smartphone-4.yml +3597 -4582
  71. data/spec/fixtures/detector/smartphone-5.yml +4066 -5022
  72. data/spec/fixtures/detector/smartphone-6.yml +3455 -4621
  73. data/spec/fixtures/detector/smartphone-7.yml +3574 -4574
  74. data/spec/fixtures/detector/smartphone-8.yml +4617 -4704
  75. data/spec/fixtures/detector/smartphone-9.yml +4080 -5035
  76. data/spec/fixtures/detector/smartphone.yml +3244 -4234
  77. data/spec/fixtures/detector/tablet-1.yml +4652 -4492
  78. data/spec/fixtures/detector/tablet-2.yml +3515 -4434
  79. data/spec/fixtures/detector/tablet-3.yml +3418 -4351
  80. data/spec/fixtures/detector/tablet-4.yml +5149 -3200
  81. data/spec/fixtures/detector/tablet-5.yml +9273 -0
  82. data/spec/fixtures/detector/tablet-6.yml +4588 -0
  83. data/spec/fixtures/detector/tablet.yml +1621 -2613
  84. data/spec/fixtures/detector/tv-1.yml +2501 -0
  85. data/spec/fixtures/detector/tv.yml +7826 -3114
  86. data/spec/fixtures/detector/unknown.yml +370 -531
  87. data/spec/fixtures/detector/wearable.yml +863 -9
  88. data/spec/fixtures/parser/oss.yml +1350 -21
  89. data/spec/fixtures/parser/vendorfragments.yml +53 -53
  90. metadata +35 -5
@@ -1,66 +1,57 @@
1
1
  require_relative '../spec_helper'
2
2
 
3
3
  describe DeviceDetector do
4
-
5
4
  subject { DeviceDetector.new(user_agent) }
6
5
 
7
- alias :client :subject
6
+ alias_method :client, :subject
8
7
 
9
8
  describe 'mobile iPhone 5S' do
10
-
11
- let(:user_agent) { '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]' }
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
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
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
- let(:user_agent) { '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' }
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
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
- let(:user_agent) { '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' }
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
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
- let(:user_agent) { 'Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2062.103 Safari/537.36' }
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
57
  value(client.name).must_equal 'Chrome'
@@ -71,14 +62,14 @@ describe DeviceDetector do
71
62
  end
72
63
 
73
64
  it 'recognizes the device type' do
74
- value(client.device_type).must_equal "desktop"
65
+ value(client.device_type).must_equal 'desktop'
75
66
  end
76
-
77
67
  end
78
68
 
79
69
  describe '64bit' do
80
-
81
- let(:user_agent) { 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.36' }
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
75
  value(client.name).must_equal 'Chrome'
@@ -89,47 +80,44 @@ describe DeviceDetector do
89
80
  end
90
81
 
91
82
  it 'recognizes the device type' do
92
- value(client.device_type).must_equal "desktop"
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
- let(:user_agent) { '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' }
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
- value(client.name).must_equal "Android Browser"
94
+ value(client.name).must_equal 'Android Browser'
105
95
  end
106
96
 
107
97
  it 'recognizes the device name' do
108
- value(client.device_name).must_equal "GALAXY S5"
98
+ value(client.device_name).must_equal 'Galaxy S5'
109
99
  end
110
100
 
111
101
  it 'recognizes the device type' do
112
- value(client.device_type).must_equal "smartphone"
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
- let(:user_agent) { 'Lenovo-A398t+_TD/S100 Linux/3.4.5 Android/4.1.2 Release/09.10.2013 Browser/AppleWebKit534.30 Mobile Safari/534.30' }
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
- value(client.name).must_equal "Android Browser"
112
+ value(client.name).must_equal 'Android Browser'
123
113
  end
124
114
 
125
115
  it 'recognizes the device name' do
126
- value(client.device_name).must_equal "A398t+"
116
+ value(client.device_name).must_equal 'A398t+'
127
117
  end
128
118
 
129
119
  it 'recognizes the device type' do
130
- value(client.device_type).must_equal "smartphone"
120
+ value(client.device_type).must_equal 'smartphone'
131
121
  end
132
-
133
122
  end
134
-
135
123
  end
@@ -27,10 +27,12 @@ describe DeviceDetector do
27
27
  describe user_agent do
28
28
  it 'should be detected' do
29
29
  if detector.bot?
30
- assert_equal str_or_nil(f['bot']['name']), detector.bot_name, 'failed bot name detection'
30
+ assert_equal str_or_nil(f['bot']['name']), detector.bot_name,
31
+ 'failed bot name detection'
31
32
  else
32
33
  if f['client']
33
- assert_equal str_or_nil(f['client']['name']), detector.name, 'failed client name detection'
34
+ assert_equal str_or_nil(f['client']['name']), detector.name,
35
+ 'failed client name detection'
34
36
  end
35
37
 
36
38
  os_family = str_or_nil(f['os_family'])
@@ -49,9 +51,11 @@ describe DeviceDetector do
49
51
  end
50
52
 
51
53
  short_name = str_or_nil(f['os']['short_name'])
52
- if short_name.nil?
53
- assert_nil os.short_name, 'failed os short name detection'
54
- else
54
+ if short_name.nil? && f['os']['name']
55
+ short_name = DeviceDetector::OS::OPERATING_SYSTEMS[f['os']['name']]
56
+ end
57
+
58
+ unless short_name.nil?
55
59
  assert_equal short_name, os.short_name, 'failed os short name detection'
56
60
  end
57
61
 
@@ -9,7 +9,9 @@ describe DeviceDetector::Device do
9
9
 
10
10
  describe '#name' do
11
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]' }
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
17
  value(device.name).must_equal 'iPhone 6'
@@ -35,7 +37,9 @@ describe DeviceDetector::Device do
35
37
 
36
38
  describe '#type' do
37
39
  describe 'when models are nested' do
38
- 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]' }
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
39
43
 
40
44
  it 'finds device of Apple iPhone 6' do
41
45
  value(device.type).must_equal 'smartphone'
@@ -59,7 +63,9 @@ describe DeviceDetector::Device do
59
63
  end
60
64
 
61
65
  describe 'device not specified in nested block' do
62
- let(:user_agent) { 'Mozilla/5.0 (Linux; Android 4.4.2; es-us; SAMSUNG SM-G900F Build/KOT49H) AppleWebKit/537.36 (KHTML, like Gecko)' }
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
63
69
 
64
70
  it 'falls back to top-level device' do
65
71
  value(device.type).must_equal 'smartphone'
@@ -69,27 +75,33 @@ describe DeviceDetector::Device do
69
75
 
70
76
  describe 'concrete device types' do
71
77
  describe 'mobiles' do
72
- let(:user_agent) { 'Mozilla/5.0 (Linux; Android 4.4.2; es-us; SAMSUNG SM-G900F Build/KOT49H) AppleWebKit/537.36 (KHTML, like Gecko)' }
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
73
81
 
74
82
  it 'identifies the device' do
75
- value(device.name).must_equal 'GALAXY S5'
83
+ value(device.name).must_equal 'Galaxy S5'
76
84
  value(device.type).must_equal 'smartphone'
77
85
  value(device.brand).must_equal 'Samsung'
78
86
  end
79
87
  end
80
88
 
81
89
  describe 'cameras' do
82
- 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' }
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
83
93
 
84
94
  it 'identifies the device' do
85
- value(device.name).must_equal 'GALAXY Camera'
95
+ value(device.name).must_equal 'Galaxy Camera'
86
96
  value(device.type).must_equal 'camera'
87
97
  value(device.brand).must_equal 'Samsung'
88
98
  end
89
99
  end
90
100
 
91
101
  describe 'car browsers' do
92
- let(:user_agent) { 'Mozilla/5.0 (X11; Linux) AppleWebKit/534.34 (KHTML, like Gecko) QtCarBrowser Safari/534.34' }
102
+ let(:user_agent) do
103
+ 'Mozilla/5.0 (X11; Linux) AppleWebKit/534.34 (KHTML, like Gecko) QtCarBrowser Safari/534.34'
104
+ end
93
105
 
94
106
  it 'identifies the device' do
95
107
  value(device.name).must_equal 'Model S'
@@ -109,7 +121,9 @@ describe DeviceDetector::Device do
109
121
  end
110
122
 
111
123
  describe 'portable media players' do
112
- 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' }
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
113
127
 
114
128
  it 'identifies the device' do
115
129
  value(device.name).must_equal 'iPod Touch'
@@ -119,7 +133,9 @@ describe DeviceDetector::Device do
119
133
  end
120
134
 
121
135
  describe 'televisions' do
122
- 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 ;)' }
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
123
139
 
124
140
  it 'identifies the device' do
125
141
  value(device.name).must_equal 'NetCast 4.0'