device_detector 1.0.6 → 1.0.7

Sign up to get free protection for your applications and to get access to all the features.
Files changed (103) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +7 -0
  3. data/README.md +5 -5
  4. data/lib/device_detector/device.rb +82 -3
  5. data/lib/device_detector/os.rb +4 -2
  6. data/lib/device_detector/parser.rb +1 -1
  7. data/lib/device_detector/version.rb +1 -1
  8. data/lib/device_detector/version_extractor.rb +20 -1
  9. data/regexes/bots.yml +49 -6
  10. data/regexes/client/browsers.yml +170 -16
  11. data/regexes/client/libraries.yml +20 -1
  12. data/regexes/client/mediaplayers.yml +2 -2
  13. data/regexes/client/mobile_apps.yml +447 -13
  14. data/regexes/client/pim.yml +16 -1
  15. data/regexes/device/consoles.yml +7 -1
  16. data/regexes/device/mobiles.yml +3169 -912
  17. data/regexes/device/portable_media_player.yml +16 -6
  18. data/regexes/oss.yml +380 -467
  19. metadata +3 -164
  20. data/.gitignore +0 -14
  21. data/.rubocop.yml +0 -49
  22. data/.ruby-version +0 -1
  23. data/.travis.yml +0 -14
  24. data/Gemfile +0 -8
  25. data/Rakefile +0 -86
  26. data/device_detector.gemspec +0 -27
  27. data/spec/device_detector/bot_fixtures_spec.rb +0 -30
  28. data/spec/device_detector/client_fixtures_spec.rb +0 -31
  29. data/spec/device_detector/concrete_user_agent_spec.rb +0 -123
  30. data/spec/device_detector/detector_fixtures_spec.rb +0 -99
  31. data/spec/device_detector/device_fixtures_spec.rb +0 -36
  32. data/spec/device_detector/device_spec.rb +0 -147
  33. data/spec/device_detector/memory_cache_spec.rb +0 -148
  34. data/spec/device_detector/model_extractor_spec.rb +0 -63
  35. data/spec/device_detector/os_fixtures_spec.rb +0 -26
  36. data/spec/device_detector/version_extractor_spec.rb +0 -79
  37. data/spec/device_detector_spec.rb +0 -189
  38. data/spec/fixtures/client/browser.yml +0 -3935
  39. data/spec/fixtures/client/feed_reader.yml +0 -187
  40. data/spec/fixtures/client/library.yml +0 -253
  41. data/spec/fixtures/client/mediaplayer.yml +0 -193
  42. data/spec/fixtures/client/mobile_app.yml +0 -703
  43. data/spec/fixtures/client/pim.yml +0 -175
  44. data/spec/fixtures/detector/bots.yml +0 -4434
  45. data/spec/fixtures/detector/camera.yml +0 -127
  46. data/spec/fixtures/detector/car_browser.yml +0 -217
  47. data/spec/fixtures/detector/console.yml +0 -343
  48. data/spec/fixtures/detector/desktop.yml +0 -7580
  49. data/spec/fixtures/detector/feature_phone.yml +0 -1597
  50. data/spec/fixtures/detector/feed_reader.yml +0 -524
  51. data/spec/fixtures/detector/mediaplayer.yml +0 -306
  52. data/spec/fixtures/detector/mobile_apps.yml +0 -1233
  53. data/spec/fixtures/detector/peripheral.yml +0 -271
  54. data/spec/fixtures/detector/phablet.yml +0 -7366
  55. data/spec/fixtures/detector/portable_media_player.yml +0 -527
  56. data/spec/fixtures/detector/smart_display.yml +0 -235
  57. data/spec/fixtures/detector/smart_speaker.yml +0 -60
  58. data/spec/fixtures/detector/smartphone-1.yml +0 -9622
  59. data/spec/fixtures/detector/smartphone-10.yml +0 -8981
  60. data/spec/fixtures/detector/smartphone-11.yml +0 -8938
  61. data/spec/fixtures/detector/smartphone-12.yml +0 -8989
  62. data/spec/fixtures/detector/smartphone-13.yml +0 -9412
  63. data/spec/fixtures/detector/smartphone-14.yml +0 -9477
  64. data/spec/fixtures/detector/smartphone-15.yml +0 -9281
  65. data/spec/fixtures/detector/smartphone-16.yml +0 -9678
  66. data/spec/fixtures/detector/smartphone-17.yml +0 -9965
  67. data/spec/fixtures/detector/smartphone-18.yml +0 -9806
  68. data/spec/fixtures/detector/smartphone-19.yml +0 -9965
  69. data/spec/fixtures/detector/smartphone-2.yml +0 -12242
  70. data/spec/fixtures/detector/smartphone-20.yml +0 -9710
  71. data/spec/fixtures/detector/smartphone-21.yml +0 -8693
  72. data/spec/fixtures/detector/smartphone-22.yml +0 -10178
  73. data/spec/fixtures/detector/smartphone-23.yml +0 -9453
  74. data/spec/fixtures/detector/smartphone-24.yml +0 -9843
  75. data/spec/fixtures/detector/smartphone-25.yml +0 -9703
  76. data/spec/fixtures/detector/smartphone-26.yml +0 -10007
  77. data/spec/fixtures/detector/smartphone-27.yml +0 -4927
  78. data/spec/fixtures/detector/smartphone-3.yml +0 -9909
  79. data/spec/fixtures/detector/smartphone-4.yml +0 -8954
  80. data/spec/fixtures/detector/smartphone-5.yml +0 -8981
  81. data/spec/fixtures/detector/smartphone-6.yml +0 -8948
  82. data/spec/fixtures/detector/smartphone-7.yml +0 -8975
  83. data/spec/fixtures/detector/smartphone-8.yml +0 -9810
  84. data/spec/fixtures/detector/smartphone-9.yml +0 -8925
  85. data/spec/fixtures/detector/smartphone.yml +0 -9001
  86. data/spec/fixtures/detector/tablet-1.yml +0 -10155
  87. data/spec/fixtures/detector/tablet-2.yml +0 -9064
  88. data/spec/fixtures/detector/tablet-3.yml +0 -9035
  89. data/spec/fixtures/detector/tablet-4.yml +0 -9062
  90. data/spec/fixtures/detector/tablet-5.yml +0 -9273
  91. data/spec/fixtures/detector/tablet-6.yml +0 -4588
  92. data/spec/fixtures/detector/tablet.yml +0 -8979
  93. data/spec/fixtures/detector/tv-1.yml +0 -2501
  94. data/spec/fixtures/detector/tv.yml +0 -10045
  95. data/spec/fixtures/detector/unknown.yml +0 -3071
  96. data/spec/fixtures/detector/wearable.yml +0 -915
  97. data/spec/fixtures/device/camera.yml +0 -19
  98. data/spec/fixtures/device/car_browser.yml +0 -13
  99. data/spec/fixtures/device/console.yml +0 -79
  100. data/spec/fixtures/device/notebook.yml +0 -7
  101. data/spec/fixtures/parser/oss.yml +0 -2418
  102. data/spec/fixtures/parser/vendorfragments.yml +0 -168
  103. data/spec/spec_helper.rb +0 -9
@@ -54,6 +54,7 @@ class DeviceDetector
54
54
  '1A' => 'Alba',
55
55
  'AL' => 'Alcatel',
56
56
  '20' => 'Alcor',
57
+ 'XY' => 'Alps',
57
58
  '7L' => 'ALDI NORD',
58
59
  '6L' => 'ALDI SÜD',
59
60
  '3L' => 'Alfawise',
@@ -69,6 +70,7 @@ class DeviceDetector
69
70
  'AG' => 'AMGOO',
70
71
  '9A' => 'Amigoo',
71
72
  'AO' => 'Amoi',
73
+ '3J' => 'Amino',
72
74
  '54' => 'AMCV',
73
75
  '60' => 'Andowl',
74
76
  '7A' => 'Anry',
@@ -78,6 +80,7 @@ class DeviceDetector
78
80
  'O8' => 'AOC',
79
81
  'J2' => 'AOYODKG',
80
82
  '55' => 'AOpen',
83
+ '9Y' => 'Aocos',
81
84
  'AP' => 'Apple',
82
85
  'AR' => 'Archos',
83
86
  'AB' => 'Arian Space',
@@ -88,6 +91,7 @@ class DeviceDetector
88
91
  'AQ' => 'Aspera',
89
92
  '40' => 'Artel',
90
93
  '21' => 'Artizlee',
94
+ '59' => 'ArtLine',
91
95
  '8A' => 'Asano',
92
96
  '90' => 'Asanzo',
93
97
  '1U' => 'Astro',
@@ -105,11 +109,13 @@ class DeviceDetector
105
109
  'AY' => 'Axxion',
106
110
  'XA' => 'Axioo',
107
111
  'AM' => 'Azumi Mobile',
112
+ 'WW' => 'Awow',
108
113
  'BO' => 'BangOlufsen',
109
114
  'BN' => 'Barnes & Noble',
110
115
  'BB' => 'BBK',
111
116
  '0B' => 'BB Mobile',
112
117
  'B6' => 'BDF',
118
+ 'QD' => 'BDQ',
113
119
  'BE' => 'Becker',
114
120
  'B5' => 'Beeline',
115
121
  'B0' => 'Beelink',
@@ -156,6 +162,7 @@ class DeviceDetector
156
162
  'BJ' => 'BrightSign',
157
163
  'B1' => 'Bush',
158
164
  '4Q' => 'Bundy',
165
+ 'Y8' => 'Bubblegum',
159
166
  'C9' => 'CAGI',
160
167
  'CT' => 'Capitel',
161
168
  'G3' => 'CG Mobile',
@@ -172,15 +179,16 @@ class DeviceDetector
172
179
  '34' => 'CellAllure',
173
180
  '7C' => 'Celcus',
174
181
  'CE' => 'Celkon',
182
+ 'CG' => 'Cellution',
175
183
  '62' => 'Centric',
176
184
  'C2' => 'Changhong',
177
185
  'CH' => 'Cherry Mobile',
178
186
  'C3' => 'China Mobile',
179
187
  'CI' => 'Chico Mobile',
180
- 'HG' => 'CHIA',
181
188
  '1C' => 'Chuwi',
182
189
  'L8' => 'Clarmin',
183
190
  '25' => 'Claresta',
191
+ '1J' => 'Cloud',
184
192
  'CD' => 'Cloudfone',
185
193
  '6C' => 'Cloudpad',
186
194
  'C0' => 'Clout',
@@ -222,12 +230,14 @@ class DeviceDetector
222
230
  '7D' => 'Datamini',
223
231
  '6D' => 'Datalogic',
224
232
  'D1' => 'Datsun',
233
+ 'DZ' => 'Dazen',
225
234
  'DB' => 'Dbtel',
226
235
  'DL' => 'Dell',
227
236
  'DE' => 'Denver',
228
237
  'DS' => 'Desay',
229
238
  'DW' => 'DeWalt',
230
239
  'DX' => 'DEXP',
240
+ '8D' => 'DF',
231
241
  'DG' => 'Dialog',
232
242
  'DI' => 'Dicam',
233
243
  'D4' => 'Digi',
@@ -235,6 +245,7 @@ class DeviceDetector
235
245
  'DH' => 'Digihome',
236
246
  'DD' => 'Digiland',
237
247
  'Q0' => 'DIGIFORS',
248
+ 'DQ' => 'DISH',
238
249
  '9D' => 'Ditecma',
239
250
  'D2' => 'Digma',
240
251
  '1D' => 'Diva',
@@ -253,7 +264,9 @@ class DeviceDetector
253
264
  'DR' => 'Doro',
254
265
  'D8' => 'Droxio',
255
266
  'DJ' => 'Dragon Touch',
267
+ 'DY' => 'Dreamgate',
256
268
  'DU' => 'Dune HD',
269
+ 'UD' => 'DUNNS Mobile',
257
270
  'EB' => 'E-Boda',
258
271
  'EJ' => 'Engel',
259
272
  '2E' => 'E-Ceros',
@@ -268,6 +281,7 @@ class DeviceDetector
268
281
  'EK' => 'EKO',
269
282
  'EY' => 'Einstein',
270
283
  'EM' => 'Eks Mobility',
284
+ 'UE' => 'Ematic',
271
285
  '4K' => 'EKT',
272
286
  '7E' => 'ELARI',
273
287
  '03' => 'Electroneum',
@@ -281,6 +295,7 @@ class DeviceDetector
281
295
  'E1' => 'Energy Sistem',
282
296
  '3E' => 'Enot',
283
297
  '8E' => 'Epik One',
298
+ 'XP' => 'Epson',
284
299
  'E7' => 'Ergo',
285
300
  'EC' => 'Ericsson',
286
301
  '05' => 'Erisson',
@@ -296,6 +311,7 @@ class DeviceDetector
296
311
  'EV' => 'Evertek',
297
312
  'E3' => 'Evolio',
298
313
  'EO' => 'Evolveo',
314
+ '0Q' => 'Evoo',
299
315
  'E0' => 'EvroMedia',
300
316
  'XE' => 'ExMobile',
301
317
  '4Z' => 'Exmart',
@@ -315,7 +331,9 @@ class DeviceDetector
315
331
  'FB' => 'Fantec',
316
332
  'FE' => 'Fengxiang',
317
333
  'F7' => 'Fero',
334
+ '67' => 'FEONAL',
318
335
  'FI' => 'FiGO',
336
+ 'F9' => 'FiiO',
319
337
  'F1' => 'FinePower',
320
338
  'FX' => 'Finlux',
321
339
  'F3' => 'FireFly Mobile',
@@ -352,14 +370,18 @@ class DeviceDetector
352
370
  'Q4' => 'Geotex',
353
371
  'GH' => 'Ghia',
354
372
  '2C' => 'Ghong',
373
+ 'GJ' => 'Ghost',
355
374
  'GG' => 'Gigabyte',
356
375
  'GS' => 'Gigaset',
357
376
  'GZ' => 'Ginzzu',
358
377
  '1G' => 'Gini',
359
378
  'GI' => 'Gionee',
360
379
  'G4' => 'Globex',
380
+ '38' => 'GLONYX',
381
+ 'U6' => 'Glofiish',
361
382
  'G7' => 'GoGEN',
362
383
  'GC' => 'GOCLEVER',
384
+ '5G' => 'Gocomma',
363
385
  'GB' => 'Gol Mobile',
364
386
  'GL' => 'Goly',
365
387
  'GX' => 'GLX',
@@ -375,12 +397,15 @@ class DeviceDetector
375
397
  'GF' => 'Gretel',
376
398
  '82' => 'Gresso',
377
399
  'GU' => 'Grundig',
400
+ 'GV' => 'Gtel',
401
+ '9Z' => 'H96',
378
402
  'HF' => 'Hafury',
379
403
  'HA' => 'Haier',
380
404
  'HE' => 'HannSpree',
381
405
  'HK' => 'Hardkernel',
382
406
  'HS' => 'Hasee',
383
407
  'H6' => 'Helio',
408
+ 'HQ' => 'HERO',
384
409
  'ZH' => 'Hezire',
385
410
  'HL' => 'Hi-Level',
386
411
  '3H' => 'Hi',
@@ -404,6 +429,7 @@ class DeviceDetector
404
429
  'HP' => 'HP',
405
430
  'HT' => 'HTC',
406
431
  'HD' => 'Huadoo',
432
+ 'HG' => 'Huavi',
407
433
  'HU' => 'Huawei',
408
434
  'HX' => 'Humax',
409
435
  'HR' => 'Hurricane',
@@ -448,6 +474,7 @@ class DeviceDetector
448
474
  'IQ' => 'INQ',
449
475
  'QN' => 'iQ&T',
450
476
  'IS' => 'Insignia',
477
+ 'YI' => 'INSYS',
451
478
  'IT' => 'Intek',
452
479
  'IX' => 'Intex',
453
480
  'IV' => 'Inverto',
@@ -478,6 +505,7 @@ class DeviceDetector
478
505
  'VJ' => 'Jivi',
479
506
  'JK' => 'JKL',
480
507
  'JO' => 'Jolla',
508
+ 'UJ' => 'Juniper Systems',
481
509
  'J5' => 'Just5',
482
510
  'JV' => 'JVC',
483
511
  'JS' => 'Jesy',
@@ -490,6 +518,7 @@ class DeviceDetector
490
518
  'K5' => 'KATV1',
491
519
  'K0' => 'Kata',
492
520
  'KZ' => 'Kazam',
521
+ '9K' => 'Kazuna',
493
522
  'KD' => 'KDDI',
494
523
  'KS' => 'Kempler & Strauss',
495
524
  'K3' => 'Keneksi',
@@ -515,6 +544,7 @@ class DeviceDetector
515
544
  'K2' => 'KRONO',
516
545
  'KE' => 'Krüger&Matz',
517
546
  '5K' => 'KREZ',
547
+ 'WK' => 'KRIP',
518
548
  'KH' => 'KT-Tech',
519
549
  'Z6' => 'KUBO',
520
550
  'K8' => 'Kuliao',
@@ -538,6 +568,7 @@ class DeviceDetector
538
568
  'L1' => 'LeEco',
539
569
  '4B' => 'Leff',
540
570
  'L4' => 'Lemhoov',
571
+ 'W9' => 'LEMFO',
541
572
  'LN' => 'Lenco',
542
573
  'LE' => 'Lenovo',
543
574
  'LT' => 'Leotec',
@@ -547,10 +578,11 @@ class DeviceDetector
547
578
  'L3' => 'Lexand',
548
579
  'LX' => 'Lexibook',
549
580
  'LG' => 'LG',
581
+ '39' => 'Liberton',
582
+ '5L' => 'Linsar',
550
583
  'LF' => 'Lifemaxx',
551
- 'LJ' => 'L-Max',
552
584
  'LI' => 'Lingwin',
553
- '5L' => 'Linsar',
585
+ 'LJ' => 'L-Max',
554
586
  'LW' => 'Linnex',
555
587
  'LO' => 'Loewe',
556
588
  'YL' => 'Loview',
@@ -568,6 +600,7 @@ class DeviceDetector
568
600
  'XM' => 'Macoox',
569
601
  '92' => 'MAC AUDIO',
570
602
  'MJ' => 'Majestic',
603
+ 'FQ' => 'Mafe',
571
604
  '23' => 'Magnus',
572
605
  'NH' => 'Manhattan',
573
606
  '5M' => 'Mann',
@@ -584,7 +617,9 @@ class DeviceDetector
584
617
  'M0' => 'Maze',
585
618
  'YM' => 'Maze Speed',
586
619
  '87' => 'Malata',
620
+ '28' => 'MBOX',
587
621
  '3D' => 'MDC Store',
622
+ '1Y' => 'MDTV',
588
623
  '09' => 'meanIT',
589
624
  'M3' => 'Mecer',
590
625
  '0M' => 'Mecool',
@@ -605,9 +640,11 @@ class DeviceDetector
605
640
  '1X' => 'Minix',
606
641
  'OM' => 'Mintt',
607
642
  'MO' => 'Mio',
643
+ 'X7' => 'Mione',
608
644
  'M7' => 'Miray',
609
645
  '8M' => 'Mito',
610
646
  'MT' => 'Mitsubishi',
647
+ '0Y' => 'Mitsui',
611
648
  'M5' => 'MIXC',
612
649
  '2D' => 'MIVO',
613
650
  '1Z' => 'MiXzo',
@@ -617,6 +654,7 @@ class DeviceDetector
617
654
  'M6' => 'Mobiistar',
618
655
  'MH' => 'Mobiola',
619
656
  'MB' => 'Mobistel',
657
+ 'ID' => 'MobiIoT',
620
658
  '6W' => 'MobiWire',
621
659
  '9M' => 'Mobo',
622
660
  'M4' => 'Modecom',
@@ -639,17 +677,20 @@ class DeviceDetector
639
677
  '3T' => 'MyTab',
640
678
  'MG' => 'MyWigo',
641
679
  'J3' => 'Mymaga',
680
+ '07' => 'MyGica',
642
681
  '08' => 'Nabi',
643
682
  'N7' => 'National',
644
683
  'NC' => 'Navcity',
645
684
  '6N' => 'Navitech',
646
685
  '7V' => 'Navitel',
647
686
  'N3' => 'Navon',
687
+ '7R' => 'NavRoad',
648
688
  'NP' => 'Naomi Phone',
649
689
  'NE' => 'NEC',
650
690
  '8N' => 'Necnot',
651
691
  'NF' => 'Neffos',
652
692
  '1N' => 'Neomi',
693
+ '7Q' => 'Neon IQ',
653
694
  'NA' => 'Netgear',
654
695
  'NU' => 'NeuImage',
655
696
  'NW' => 'Newgen',
@@ -674,6 +715,7 @@ class DeviceDetector
674
715
  '57' => 'Nubia',
675
716
  'JN' => 'NOBUX',
676
717
  'NB' => 'Noblex',
718
+ 'OG' => 'NOGA',
677
719
  'NK' => 'Nokia',
678
720
  'NM' => 'Nomi',
679
721
  '2N' => 'Nomu',
@@ -692,6 +734,7 @@ class DeviceDetector
692
734
  'O7' => 'Oale',
693
735
  'OC' => 'OASYS',
694
736
  'OB' => 'Obi',
737
+ 'OQ' => 'Oculus',
695
738
  'O1' => 'Odys',
696
739
  'O9' => 'Ok',
697
740
  'OA' => 'Okapia',
@@ -706,10 +749,12 @@ class DeviceDetector
706
749
  'OO' => 'Opsson',
707
750
  'OR' => 'Orange',
708
751
  'O5' => 'Orbic',
752
+ 'Y6' => 'Orbita',
709
753
  'OS' => 'Ordissimo',
710
754
  'OK' => 'Ouki',
711
755
  '0O' => 'OINOM',
712
756
  'QK' => 'OKWU',
757
+ '56' => 'OKSI',
713
758
  'OE' => 'Oukitel',
714
759
  'OU' => 'OUYA',
715
760
  'OV' => 'Overmax',
@@ -719,11 +764,13 @@ class DeviceDetector
719
764
  'O6' => 'Oyyu',
720
765
  'OZ' => 'OzoneHD',
721
766
  '7P' => 'P-UP',
767
+ 'YP' => 'Paladin',
722
768
  'PM' => 'Palm',
723
769
  'PN' => 'Panacom',
724
770
  'PA' => 'Panasonic',
725
771
  'PT' => 'Pantech',
726
772
  '94' => 'Packard Bell',
773
+ 'H9' => 'Parrot Mobile',
727
774
  'PB' => 'PCBOX',
728
775
  'PC' => 'PCD',
729
776
  'PD' => 'PCD Argentina',
@@ -750,12 +797,16 @@ class DeviceDetector
750
797
  '0P' => 'POCO',
751
798
  'PV' => 'Point of View',
752
799
  'PL' => 'Polaroid',
800
+ 'Q6' => 'Polar',
801
+ '97' => 'PolarLine',
753
802
  'PP' => 'PolyPad',
754
803
  'P5' => 'Polytron',
755
804
  'P2' => 'Pomp',
756
805
  'P0' => 'Poppox',
806
+ '0X' => 'POPTEL',
757
807
  'PS' => 'Positivo',
758
808
  '3P' => 'Positivo BGH',
809
+ '3F' => 'Porsche',
759
810
  'P3' => 'PPTV',
760
811
  'FP' => 'Premio',
761
812
  'PR' => 'Prestigio',
@@ -764,15 +815,19 @@ class DeviceDetector
764
815
  '2P' => 'Prixton',
765
816
  'PF' => 'PROFiLO',
766
817
  'P6' => 'Proline',
818
+ '5O' => 'Prology',
767
819
  'P1' => 'ProScan',
768
820
  'P7' => 'Protruly',
769
821
  'R0' => 'ProVision',
822
+ '7O' => 'Polestar',
770
823
  'PU' => 'PULID',
824
+ 'Q7' => 'Q-Box',
771
825
  'QH' => 'Q-Touch',
772
826
  'QB' => 'Q.Bell',
773
827
  'QI' => 'Qilive',
774
828
  'QM' => 'QMobile',
775
829
  'QT' => 'Qtek',
830
+ 'Q9' => 'QTECH',
776
831
  'QA' => 'Quantum',
777
832
  'QU' => 'Quechua',
778
833
  'QO' => 'Qumo',
@@ -791,6 +846,7 @@ class DeviceDetector
791
846
  'R8' => 'RED',
792
847
  'RD' => 'Reeder',
793
848
  'Z9' => 'REGAL',
849
+ 'RH' => 'Remdun',
794
850
  'RP' => 'Revo',
795
851
  'RI' => 'Rikomagic',
796
852
  'RM' => 'RIM',
@@ -815,6 +871,7 @@ class DeviceDetector
815
871
  'X5' => 'Saba',
816
872
  '8L' => 'S-TELL',
817
873
  '89' => 'Seatel',
874
+ 'Y7' => 'Saiet',
818
875
  'X1' => 'Safaricom',
819
876
  'SG' => 'Sagem',
820
877
  '4L' => 'Salora',
@@ -828,6 +885,7 @@ class DeviceDetector
828
885
  'CZ' => 'Schneider',
829
886
  'G8' => 'SEG',
830
887
  'SD' => 'Sega',
888
+ '0U' => 'Selecline',
831
889
  '9G' => 'Selenga',
832
890
  'SV' => 'Selevision',
833
891
  'SL' => 'Selfix',
@@ -842,6 +900,7 @@ class DeviceDetector
842
900
  'SX' => 'SFR',
843
901
  'SH' => 'Sharp',
844
902
  '7S' => 'Shift Phones',
903
+ '78' => 'Shivaki',
845
904
  'RS' => 'Shtrikh-M',
846
905
  '3S' => 'Shuttle',
847
906
  '13' => 'Sico',
@@ -866,6 +925,8 @@ class DeviceDetector
866
925
  '80' => 'SMARTEC',
867
926
  'SC' => 'Smartfren',
868
927
  'S7' => 'Smartisan',
928
+ '3Y' => 'Smarty',
929
+ 'HH' => 'Smooth Mobile',
869
930
  '1Q' => 'Smotreshka',
870
931
  'SF' => 'Softbank',
871
932
  '9L' => 'SOLE',
@@ -877,6 +938,7 @@ class DeviceDetector
877
938
  'X2' => 'Soundmax',
878
939
  '8S' => 'Soyes',
879
940
  '77' => 'SONOS',
941
+ '68' => 'Soho Style',
880
942
  'PK' => 'Spark',
881
943
  'FS' => 'SPC',
882
944
  '6S' => 'Spectrum',
@@ -895,6 +957,7 @@ class DeviceDetector
895
957
  'S2' => 'Stonex',
896
958
  'ST' => 'Storex',
897
959
  '71' => 'StrawBerry',
960
+ '96' => 'STRONG',
898
961
  '69' => 'Stylo',
899
962
  '9S' => 'Sugar',
900
963
  '06' => 'Subor',
@@ -903,10 +966,12 @@ class DeviceDetector
903
966
  'S3' => 'SunVan',
904
967
  '5S' => 'Sunvell',
905
968
  '5Y' => 'Sunny',
969
+ 'W8' => 'SUNWIND',
906
970
  'SU' => 'SuperSonic',
907
971
  '79' => 'SuperTab',
908
972
  'S5' => 'Supra',
909
973
  'ZS' => 'Suzuki',
974
+ '2J' => 'Sunmi',
910
975
  '0W' => 'Swipe',
911
976
  'SS' => 'SWISSMOBILITY',
912
977
  '1W' => 'Swisstone',
@@ -917,6 +982,8 @@ class DeviceDetector
917
982
  'TK' => 'Takara',
918
983
  '73' => 'Tambo',
919
984
  '9N' => 'Tanix',
985
+ 'U5' => 'Taiga System',
986
+ '7G' => 'TAG Tech',
920
987
  'T5' => 'TB Touch',
921
988
  'TC' => 'TCL',
922
989
  'T0' => 'TD Systems',
@@ -935,6 +1002,7 @@ class DeviceDetector
935
1002
  'T2' => 'Telenor',
936
1003
  'TE' => 'Telit',
937
1004
  '65' => 'Telia',
1005
+ 'PW' => 'Telpo',
938
1006
  'TD' => 'Tesco',
939
1007
  'TA' => 'Tesla',
940
1008
  '9T' => 'Tetratab',
@@ -954,6 +1022,7 @@ class DeviceDetector
954
1022
  '0T' => 'Tone',
955
1023
  'TY' => 'Tooky',
956
1024
  'T9' => 'Top House',
1025
+ 'DK' => 'Topelotek',
957
1026
  '42' => 'Topway',
958
1027
  'TO' => 'Toplux',
959
1028
  '7T' => 'Torex',
@@ -963,6 +1032,7 @@ class DeviceDetector
963
1032
  'T6' => 'TrekStor',
964
1033
  'T3' => 'Trevi',
965
1034
  'TJ' => 'Trifone',
1035
+ 'Q5' => 'Trident',
966
1036
  '4T' => 'Tronsmart',
967
1037
  '11' => 'True',
968
1038
  'JT' => 'True Slim',
@@ -973,6 +1043,9 @@ class DeviceDetector
973
1043
  'TR' => 'Turbo-X',
974
1044
  '5X' => 'TurboPad',
975
1045
  '5T' => 'TurboKids',
1046
+ 'UR' => 'Turkcell',
1047
+ '4U' => 'TuCEL',
1048
+ '2U' => 'Türk Telekom',
976
1049
  'TV' => 'TVC',
977
1050
  'TW' => 'TWM',
978
1051
  'Z1' => 'TWZ',
@@ -997,12 +1070,15 @@ class DeviceDetector
997
1070
  '3U' => 'IUNI',
998
1071
  'UT' => 'UTStarcom',
999
1072
  '6U' => 'UTime',
1073
+ '9U' => 'Urovo',
1000
1074
  '5V' => 'VAIO',
1001
1075
  'WV' => 'VAVA',
1002
1076
  'VA' => 'Vastking',
1003
1077
  'VP' => 'Vargo',
1078
+ 'VC' => 'Vankyo',
1004
1079
  'VB' => 'VC',
1005
1080
  'VN' => 'Venso',
1081
+ 'UV' => 'Venturer',
1006
1082
  'VQ' => 'Vega',
1007
1083
  '4V' => 'Verico',
1008
1084
  'V4' => 'Verizon',
@@ -1020,6 +1096,7 @@ class DeviceDetector
1020
1096
  'V7' => 'Vinga',
1021
1097
  'V3' => 'Vinsoc',
1022
1098
  '0V' => 'Vipro',
1099
+ 'ZV' => 'Virzo',
1023
1100
  'VI' => 'Vitelcom',
1024
1101
  '8V' => 'Viumee',
1025
1102
  'V5' => 'Vivax',
@@ -1066,6 +1143,7 @@ class DeviceDetector
1066
1143
  'W4' => 'WIWA',
1067
1144
  'WL' => 'Wolder',
1068
1145
  'WG' => 'Wolfgang',
1146
+ 'WQ' => 'Wolki',
1069
1147
  'WO' => 'Wonu',
1070
1148
  'W1' => 'Woo',
1071
1149
  'WR' => 'Wortmann',
@@ -1114,6 +1192,7 @@ class DeviceDetector
1114
1192
  'ZT' => 'ZTE',
1115
1193
  'ZU' => 'Zuum',
1116
1194
  'ZY' => 'Zync',
1195
+ 'ZR' => 'Zyrex',
1117
1196
  'ZQ' => 'ZYQ',
1118
1197
  'Z4' => 'ZH&K',
1119
1198
  'OW' => 'öwn',
@@ -108,12 +108,14 @@ class DeviceDetector
108
108
  'OS2' => 'OS/2',
109
109
  'T64' => 'OSF1',
110
110
  'OBS' => 'OpenBSD',
111
+ 'OWR' => 'OpenWrt',
111
112
  'ORD' => 'Ordissimo',
112
113
  'PCL' => 'PCLinuxOS',
113
114
  'PSP' => 'PlayStation Portable',
114
115
  'PS3' => 'PlayStation',
115
116
  'RHT' => 'Red Hat',
116
117
  'ROS' => 'RISC OS',
118
+ 'ROK' => 'Roku OS',
117
119
  'RSO' => 'Rosa',
118
120
  'REM' => 'Remix OS',
119
121
  'REX' => 'REX',
@@ -145,7 +147,7 @@ class DeviceDetector
145
147
  'WRT' => 'Windows RT',
146
148
  'XBX' => 'Xbox',
147
149
  'XBT' => 'Xubuntu',
148
- 'YNS' => 'YunOs',
150
+ 'YNS' => 'YunOS',
149
151
  'IOS' => 'iOS',
150
152
  'POS' => 'palmOS',
151
153
  'WOS' => 'webOS'
@@ -172,7 +174,7 @@ class DeviceDetector
172
174
  LIN ARL DEB KNO MIN UBT KBT XBT LBT FED
173
175
  RHT VLN MDR GNT SAB SLW SSE CES BTR SAF
174
176
  ORD TOS RSO DEE FRE MAG FEN CAI PCL HAS
175
- LOS DVK
177
+ LOS DVK ROK OWR
176
178
  ],
177
179
  'Mac' => ['MAC'],
178
180
  'Mobile Gaming Console' => %w[PSP NDS XBX],
@@ -85,7 +85,7 @@ class DeviceDetector
85
85
  end
86
86
 
87
87
  def build_regex(src)
88
- Regexp.new('(?:^|[^A-Z0-9\-_]|[^A-Z0-9\-]_|sprd-)(?:' + src + ')', Regexp::IGNORECASE)
88
+ Regexp.new('(?:^|[^A-Z0-9\-_]|[^A-Z0-9\-]_|sprd-|MZ-)(?:' + src + ')', Regexp::IGNORECASE)
89
89
  end
90
90
 
91
91
  def from_cache(key)
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  class DeviceDetector
4
- VERSION = '1.0.6'
4
+ VERSION = '1.0.7'
5
5
  end
@@ -8,11 +8,30 @@ class DeviceDetector
8
8
  MAJOR_VERSION_8 = Gem::Version.new('8.0')
9
9
 
10
10
  def call
11
- super&.chomp('.')
11
+ simple_version = super&.chomp('.')
12
+
13
+ return simple_version unless simple_version&.empty?
14
+
15
+ os_version_by_regexes
12
16
  end
13
17
 
14
18
  private
15
19
 
20
+ def os_version_by_regexes
21
+ version_matches = regex_meta[:versions]
22
+ return '' unless version_matches
23
+
24
+ version_matches.detect do |matcher|
25
+ user_agent.match(matcher[:regex]) do |match_data|
26
+ return matcher[:version].gsub(/\$(\d)/) do
27
+ match_data[Regexp.last_match(1).to_i].to_s
28
+ end.strip
29
+ end
30
+ end
31
+
32
+ ''
33
+ end
34
+
16
35
  def metadata_string
17
36
  String(regex_meta[:version])
18
37
  end