phony 2.19.11 → 2.20.13

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: d971b51de8e8d0581c884f90238d00bbdeeee7ca248ae3b93ce75e5b759114fd
4
- data.tar.gz: d37f03c8ca22a2fcf76b046a38cfd6cc6334d79cd377bb221e1610352b331ee7
3
+ metadata.gz: a8a3040e536d7eba5507cc4ca91be6ea1acbf1706a31ad54d3fadc9baadbffd2
4
+ data.tar.gz: 7646e570c51156f9a931af73c75ea5548d27e802663647517a31bf0f64278047
5
5
  SHA512:
6
- metadata.gz: '028169288dfdcd908210a144add1c6d6eb082703602fd4eaa069c9ca952fe8e3e8c0c46764244af569cf90ba5fb535681369b700e3f273bebde591c534e544d3'
7
- data.tar.gz: dc281117fa228352a099b3dc28e77d13c7d8145ef93f50ab721817e6b0a6024a32e4f4587c191529142ba987498b62d9a1bd3b9c4cfbf3ae72f2537b70e375ab
6
+ metadata.gz: 5339eca176062f10c68f27e7174fb91ddb8df1a3133f452f02b5262bdca14a1bbfe7074375a231e0dabceaee25bf83210ce755c561982c97d1f27dae11b786f3
7
+ data.tar.gz: 4b40657f420fd789a95c0ed9903cb911d9829a1822cdcc283498380aa816812637dddadf429a040c1ae1d65c2c69823682698d27437819c4451eb884373423b0
data/README.textile CHANGED
@@ -104,7 +104,11 @@ For example, when just loading the NANP CC, the retained memory usage is ~63kB.
104
104
 
105
105
  h2. List of Handled Countries
106
106
 
107
- Mildly unmaintained list: Abhas, Afghan, Algerian, Argentina, Austrian, Australian, Azerbaijani, Belgian, Brazilian, Cambodian, Chilean, Chinese, Croatian, Cuban, Cypriot, Czech, Danish, Dutch, Egyptian, El Salvadorian, Estonian, French, German, Ghanan, Gibraltar, Greek, Haiti, Hong Kong, Hungarian, Indian, Iran, Irish, Israel, Italian, Japanese, Kazakh, Liberian, Lithuanian, Luxembourgian, Malaysian, Malta, Mexican, Monaco, Morocco, New Zealand, Nigerian, Norwegian, Peruvian, Polish, Romanian, Russian, Rwandan, Seychelles, Singapore, Slovakian, South African, South Korean, South Osetian, Spanish, Sri Lankan, Sudan, Swedish, Swiss, Thailand, Tunisian, Turkish, Liechtenstein, UK, US, Venezuelan, Vietnamese, and Zambian numbers.
107
+ Mildly unmaintained list: Abhas, Afghan, Algerian, Argentina, Austrian, Australian, Azerbaijani, Belgian, Brazilian, Cambodian, Chilean, Chinese, Croatian, Cuban, Cypriot, Czech, Danish, Dutch, Egyptian, El Salvadorian, Estonian, French, German, Ghanan, Gibraltar, Greek, Haiti, Hong Kong, Hungarian, Indian, Iran, Irish, Israel, Italian, Japanese, Kazakh, Liberian, Lithuanian, Luxembourgian, Malaysian, Malta, Mauritian, Mexican, Monaco, Morocco, New Zealand, Nigerian, Norwegian, Peruvian, Polish, Romanian, Russian, Rwandan, Seychelles, Singapore, Slovakian, South African, South Korean, South Osetian, Spanish, Sri Lankan, Sudan, Swedish, Swiss, Thailand, Tunisian, Turkish, Liechtenstein, UK, US, Venezuelan, Vietnamese, and Zambian numbers.
108
+
109
+ h2. Proud Sponsors
110
+
111
+ * Renuo AG (July 22 –): "Github":https://github.com/renuo, "Homepage":https://www.renuo.ch
108
112
 
109
113
  h2. License
110
114
 
@@ -4,7 +4,7 @@
4
4
  #
5
5
  #
6
6
  # NDC Reference
7
- # http://www.anatel.gov.br/hotsites/CodigosNacionaisLocalidade/TelefoneCelular-CodigosDeArea.htm
7
+ # https://www.gov.br/anatel/pt-br/regulado/numeracao/plano-de-numeracao-brasileiro
8
8
 
9
9
  # 11 #Sao Paulo
10
10
  # 12 #Sao Paulo
@@ -99,7 +99,7 @@ special_numbers_4 = %w{ 3003 4003 4004 4020 }
99
99
  Phony.define do
100
100
  country '55',
101
101
  match(/^#{ndcs}9\d{8}$/) >> split(5,4) |
102
- match(/^#{ndcs}\d{8}$/) >> split(4,4) |
102
+ match(/^#{ndcs}[2-5]\d{7}$/) >> split(4,4) |
103
103
  one_of(special_numbers_3_4) >> split(3,4) |
104
104
  one_of(special_numbers_4) >> split(4) |
105
105
  one_of(service) >> split(3) |
@@ -3,14 +3,14 @@
3
3
  # Italian phone numbers.
4
4
  #
5
5
  # http://en.wikipedia.org/wiki/Telephone_numbers_in_Italy
6
- #
6
+ # https://www.itu.int/dms_pub/itu-t/oth/02/02/T020200006B0001PDFE.pdf
7
7
 
8
- ndcs_2digit = [
8
+ ndcs_1digit = [
9
9
  '02', # Milan
10
10
  '06', # Rome (including State of Vatican City) and Aprilia
11
11
  ]
12
12
 
13
- ndcs_3digit = [
13
+ ndcs_2digit = [
14
14
  '010', # Genoa
15
15
  '011', # Turin
16
16
  '015', # Biella
@@ -42,7 +42,7 @@ ndcs_3digit = [
42
42
  '099', # Taranto
43
43
  ]
44
44
 
45
- ndcs_4digit = [
45
+ ndcs_3digit = [
46
46
  '0121', # Pinerolo
47
47
  '0122', # Sestrieres, Bardonecchia and other Susa Valley mountain resorts
48
48
  '0123', # Lanzo Torinese
@@ -256,7 +256,8 @@ ndcs_4digit = [
256
256
  # but this was not frozen so easily.
257
257
  mobile = %w(300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399)
258
258
 
259
- service = [ # Not exhaustive.
259
+ # Not exhaustive.
260
+ service = [
260
261
  '112',
261
262
  '113',
262
263
  '115',
@@ -268,22 +269,38 @@ service = [ # Not exhaustive.
268
269
  '1530'
269
270
  ]
270
271
 
272
+ # Not exhaustive. Unused below - just for info purposes.
273
+ free_of_charge_services = [
274
+ '800',
275
+ '803'
276
+ ]
277
+
271
278
  Phony.define do
279
+ # Note: The 0 does not count towards NDC number length.
272
280
  country '39', trunk('', normalize: false) |
273
281
  one_of(*service) >> split(3,3) |
274
282
  one_of(*mobile) >> split(3,4,-1..1) |
275
- one_of(*ndcs_2digit) >> split(4, 2..4) |
276
- one_of(*ndcs_3digit) >> matched_split(
277
- /^1\d{6}$/ => [7],
278
- /^1\d{7}$/ => [8],
279
- /^[^1]\d{5}$/ => [6],
280
- /^[^1]\d{6}$/ => [7]
283
+ match(/^(800)\d{6}$/) >> split(6) | # 3-6, Special handling for 800 numbers.
284
+ match(/^(803)\d{3}$/) >> split(3) | # 3-3, Special handling for 803 numbers.
285
+ one_of(*ndcs_1digit) >> matched_split(
286
+ /\A\d{5}\z/ => [5],
287
+ /\A\d{6}\z/ => [4,2],
288
+ /\A\d{7}\z/ => [4,3],
289
+ /\A\d{8}\z/ => [4,4],
290
+ /\A\d{9}\z/ => [4,5]
281
291
  ) |
282
- one_of(*ndcs_4digit) >> matched_split(
283
- /\A\d{4}\z/ => [4],
284
- /^1\d{5}$/ => [6],
285
- /^1\d{6}$/ => [7],
286
- /^[^1]\d{4}$/ => [5],
287
- /^[^1]\d{5}$/ => [3,3]
292
+ one_of(*ndcs_2digit) >> matched_split(
293
+ /\A\d{4}\z/ => [4],
294
+ /\A\d{5}\z/ => [5],
295
+ /\A\d{6}\z/ => [6],
296
+ /\A\d{7}\z/ => [7],
297
+ /\A\d{8}\z/ => [8]
298
+ ) |
299
+ one_of(*ndcs_3digit) >> matched_split(
300
+ /\A\d{4}\z/ => [4],
301
+ /\A1\d{5}\z/ => [6],
302
+ /\A1\d{6}\z/ => [7],
303
+ /\A[^1]\d{4}\z/ => [5],
304
+ /\A[^1]\d{5}\z/ => [3,3]
288
305
  )
289
306
  end
@@ -403,7 +403,56 @@ Phony.define do
403
403
  country '81',
404
404
  trunk('0', normalize: true, format: true, split: true) |
405
405
  one_of(%w(20 50 60 70 90)) >> split(4,4) | # mobile, VoIP telephony
406
+ match(/\A(597)9[0178]\d+\z/) >> split(2,4) |
406
407
  one_of(ndcs_with_5_subscriber_numbers) >> split(1,4) |
408
+ match(/\A(4)70[019]\d+\z/) >> split(4,4) |
409
+ match(/\A(4)71\d+\z/) >> split(4,4) |
410
+ match(/\A(4)20\d+\z/) >> split(4,4) |
411
+ match(/\A(4)29[02-69]\d+\z/) >> split(4,4) |
412
+ match(/\A(15)4[018]\d+\z/) >> split(3,4) |
413
+ match(/\A(22)3[014-9]\d+\z/) >> split(3,4) |
414
+ match(/\A(25)[04][01]\d+\z/) >> split(3,4) |
415
+ match(/\A(25)5[0-69]\d+\z/) >> split(3,4) |
416
+ match(/\A(25)[68][01]\d+\z/) >> split(3,4) |
417
+ match(/\A(25)7[015-9]\d+\z/) >> split(3,4) |
418
+ match(/\A(25)917\d+\z/) >> split(3,4) |
419
+ match(/\A(25)999\d+\z/) >> split(3,4) |
420
+ match(/\A(26)4[016-9]\d+\z/) >> split(3,4) |
421
+ match(/\A(28)3[0134]\d+\z/) >> split(3,4) |
422
+ match(/\A(28)9[0-5]\d+\z/) >> split(3,4) |
423
+ match(/\A(29)17\d+\z/) >> split(3,4) |
424
+ match(/\A(29)3[015-9]\d+\z/) >> split(3,4) |
425
+ match(/\A(42)21\d+\z/) >> split(3,4) |
426
+ match(/\A(42)8[01456]\d+\z/) >> split(3,4) |
427
+ match(/\A(47)5[019]\d+\z/) >> split(3,4) |
428
+ match(/\A(47)9[019]\d+\z/) >> split(3,4) |
429
+ match(/\A(59)8[019]\d+\z/) >> split(3,4) |
430
+ match(/\A(59)9[01]\d+\z/) >> split(3,4) |
431
+ match(/\A(79)4[0-59]\d+\z/) >> split(3,4) |
432
+ match(/\A(79)5[01569]\d+\z/) >> split(3,4) |
433
+ match(/\A(79)6[0167]\d+\z/) >> split(3,4) |
434
+ match(/\A(82)4[0-39]\d+\z/) >> split(3,4) |
435
+ match(/\A(82)9[019]\d+\z/) >> split(3,4) |
436
+ match(/\A(82)92[1-9]\d+\z/) >> split(3,4) |
437
+ match(/\A(82)94[1-3]\d+\z/) >> split(3,4) |
438
+ match(/\A(82)96[0-47-9]\d+\z/) >> split(3,4) |
439
+ match(/\A(82)965[01346-9]\d+\z/) >> split(3,4) |
440
+ match(/\A(82)966[1-9]\d+\z/) >> split(3,4) |
441
+ match(/\A(83)76[6-8]\d+\z/) >> split(3,4) |
442
+ match(/\A(83)7[01789]\d+\z/) >> split(3,4) |
443
+ match(/\A(83)8[01]\d+\z/) >> split(3,4) |
444
+ match(/\A(86)36[23]\d+\z/) >> split(3,4) |
445
+ match(/\A(86)5[0-389]\d+\z/) >> split(3,4) |
446
+ match(/\A(86)55[23]\d+\z/) >> split(3,4) |
447
+ match(/\A(86)[01]\d+\z/) >> split(3,4) |
448
+ match(/\A(86)9[178]\d+\z/) >> split(3,4) |
449
+ match(/\A(86)72\d+\z/) >> split(3,4) |
450
+ match(/\A(86)8[019]\d+\z/) >> split(3,4) |
451
+ match(/\A(86)9[0145]\d+\z/) >> split(3,4) |
452
+ match(/\A(86)99[014-9]\d+\z/) >> split(3,4) |
453
+ match(/\A(99)331\d+\z/) >> split(3,4) |
454
+ match(/\A(99)34[357]\d+\z/) >> split(3,4) |
455
+ match(/\A(99)4[0178]\d+\z/) >> split(3,4) |
407
456
  one_of(ndcs_with_6_subscriber_numbers) >> split(2,4) |
408
457
  one_of(%w(120)) >> split(3,3) | # freephone
409
458
  one_of(%w(800)) >> split(3,4) | # freephone
@@ -414,6 +463,6 @@ Phony.define do
414
463
  one_of(ndcs_with_8_subscriber_numbers) >> split(4,4) |
415
464
  # TODO: 91(NDC) N(S)N length: 5-13 - Non-geographic number (Direct subscriber telephone service (legacy))
416
465
  fixed(2) >> split(4,4),
417
- :local_space => :- ,
418
- :space => :-
466
+ local_space: :-,
467
+ space: :-
419
468
  end
@@ -127,6 +127,9 @@ Phony.define do
127
127
  one_of(ndcs_with_7_subscriber_digits) >> split(3,4) |
128
128
  one_of(ndcs_with_8_subscriber_digits) >> split(4,4) |
129
129
  one_of(mobile_with_trunk) >> split(5..8)|
130
+ one_of('1900') >> matched_split(
131
+ /\A\d{4}\z/ => [4],
132
+ /\A\d{6}\z/ => [6]) | # Premium rate
130
133
  # Govt reserved
131
134
  fixed(80) >> split(5) |
132
135
  fixed(69) >> split(1,5)
@@ -232,6 +232,7 @@ Phony.define do
232
232
  # http://www.itu.int/oth/T020200002C/en
233
233
  country '57',
234
234
  match(/\A(3\d\d)\d+\z/) >> split(3,4) | # mobile (300 310 311 312 313 315 316)
235
+ match(/\A(60\d)\d+\z/) >> split(3,4) |
235
236
  fixed(1) >> split(3,4)
236
237
 
237
238
  # Venezuela (Bolivarian Republic of)
@@ -362,12 +363,29 @@ Phony.define do
362
363
  trunk('', :normalize => false) |
363
364
  fixed(2) >> split(2,2,2,2)
364
365
 
365
- country '226', none >> split(4,4) # Burkina Faso http://www.wtng.info/wtng-226-bf.html
366
+ # Burkina Faso
367
+ # http://www.wtng.info/wtng-226-bf.html
368
+ # https://en.wikipedia.org/wiki/Telephone_numbers_in_Burkina_Faso
369
+ #
370
+ # There is no trunk code for this country and several of the mobile prefixes start with 0
371
+ country '226',
372
+ trunk('', normalize: false) |
373
+ none >> split(2,2,2,2)
374
+
366
375
  country '227', none >> split(4,4) # Niger http://www.wtng.info/wtng-227-ne.html
367
376
  country '228', none >> split(4,4) # Togolese Republic http://www.wtng.info/wtng-228-tg.html
368
377
  country '229', none >> split(4,4) # Benin http://www.itu.int/oth/T0202000017/en
369
378
 
370
- country '230', none >> split(4,4) # Mauritius http://www.wtng.info/wtng-230-mu.html
379
+ # Mauritius
380
+ # http://www.wtng.info/wtng-230-mu.html
381
+ # https://en.wikipedia.org/wiki/Telephone_numbers_in_Mauritius
382
+ #
383
+ # There is no trunk code for this country.
384
+ country '230',
385
+ none >> matched_split(
386
+ /^5\d{7}$/ => [1,3,4], # Mobile
387
+ /^[246]\d{6}$/ => [3,4], # Landline
388
+ )
371
389
 
372
390
  # Liberia
373
391
  # https://www.numberingplans.com/?page=plans&sub=phonenr&alpha_2_input=LR
@@ -476,7 +494,7 @@ Phony.define do
476
494
  one_of('802') >> split(3,3) | # national rate
477
495
  one_of(%w(251 252 271 272 281 282 293)) >> split(3,2) |
478
496
  one_of(%w(21 23 24 26)) >> split(3,3) |
479
- one_of(%w(82 84 86)) >> split(4,3) | # mobile
497
+ one_of(%w(82 83 84 85 86 87)) >> split(4,3) | # mobile
480
498
  one_of('89') >> split(4,3) | # satellite GMPCS
481
499
  one_of('7') >> split(4,4) | # universal access
482
500
  one_of('9') >> split(4,4) | # premium rate
@@ -488,28 +506,22 @@ Phony.define do
488
506
  # http://www.wtng.info/wtng-260-zm.html
489
507
  # https://github.com/googlei18n/libphonenumber/
490
508
  # https://en.wikipedia.org/wiki/Telephone_numbers_in_Zambia
509
+
491
510
  country '260',
492
511
  trunk('0') |
493
- match(/^(76|77|95|96|97)/) >> split(3, 4) | # Mobile
512
+ match(/^(75|76|77|94|95|96|97)/) >> split(3, 4) | # Mobile
494
513
  match(/^(800)/) >> split(3,3) | # Toll free
495
514
  match(/^(21[1-8])/) >> split(6) # Fixed
496
515
 
497
- # Madagascar
516
+ # Madagascar
498
517
  # https://en.wikipedia.org/wiki/Telephone_numbers_in_Madagascar
499
518
  # http://www.itu.int/oth/T020200007F/en
500
519
  country '261',
501
- # none >> matched_split(
502
- # /\A20\d+\z/ => [2,2,3,2], # Telecom Malagasy (Telma)
503
- # /\A32\d+\z/ => [2,2,3,2], # mobile Orange Madagascar
504
- # /\A33\d+\z/ => [2,2,3,2], # mobile Airtel Madagascar
505
- # /\A34\d+\z/ => [2,2,3,2], # mobile Telecom Malagasy (Telma)
506
- # /\A38\d+\z/ => [2,2,3,2], # mobile Telecom Malagasy (Telma)
507
- # /\A39\d+\z => [2,2,3,2] # mobile Blueline
508
- # ),
509
520
  match(/\A(20)\d+\z/) >> split(2,3,2) | # fix Telecom Malagasy (Telma)
510
521
  match(/\A(32)\d+\z/) >> split(2,3,2) | # mobile Orange Madagascar
511
522
  match(/\A(33)\d+\z/) >> split(2,3,2) | # mobile Airtel Madagascar
512
523
  match(/\A(34)\d+\z/) >> split(2,3,2) | # mobile Telecom Malagasy (Telma)
524
+ match(/\A(37)\d+\z/) >> split(2,3,2) | # mobile Orange Madagascar
513
525
  match(/\A(38)\d+\z/) >> split(2,3,2) | # mobile Telecom Malagasy (Telma)
514
526
  match(/\A(39)\d+\z/) >> split(2,3,2) # mobile Blueline Madagascar
515
527
 
@@ -635,12 +647,12 @@ Phony.define do
635
647
  match(/^(2[467]\d{2})\d{4}$/) >> split(2,2) | # 4-digit NDC
636
648
  match(/^(6\d[18])\d+$/) >> split(3,3) | # mobile
637
649
  match(/^(60\d{2})\d{8}$/) >> split(2,2,2,2) | # mobile machine to machine
638
- match(/^((2[^467]|[3-9]\d))\d{4}$/) >> split(2,2) | # 2-digit NDC Regular 6 digits number
639
- match(/^((2[^467]|[3-9]\d))\d{4}$/) >> split(2,2) | # 2-digit NDC Regular 6 digits number
640
- match(/^((2[^467]|[3-9]\d))\d{5}$/) >> split(2,2,1) | # 2-digit NDC Regular 6 digits number w/ 1 digit extension
641
- match(/^((2[^467]|[3-9]\d))\d{6}$/) >> split(2,2,2) | # 2-digit NDC Regular 8 digits number or 6 digits with 2 digits extension
642
- match(/^((2[^467]|[3-9]\d))\d{7}$/) >> split(2,2,3) | # 2-digit NDC Regular 6 digits with 4 digits extension
643
- match(/^((2[^467]|[3-9]\d))\d{8}$/) >> split(2,2,4) | # 2-digit NDC Regular 6 digits number with 4 digits extension
650
+ match(/^((2[^467]|[2-9]\d))\d{4}$/) >> split(2,2) | # 2-digit NDC Regular 6 digits number
651
+ match(/^((2[^467]|[2-9]\d))\d{4}$/) >> split(2,2) | # 2-digit NDC Regular 6 digits number
652
+ match(/^((2[^467]|[2-9]\d))\d{5}$/) >> split(2,2,1) | # 2-digit NDC Regular 6 digits number w/ 1 digit extension
653
+ match(/^((2[^467]|[2-9]\d))\d{6}$/) >> split(2,2,2) | # 2-digit NDC Regular 8 digits number or 6 digits with 2 digits extension
654
+ match(/^((2[^467]|[2-9]\d))\d{7}$/) >> split(2,2,3) | # 2-digit NDC Regular 6 digits with 4 digits extension
655
+ match(/^((2[^467]|[2-9]\d))\d{8}$/) >> split(2,2,4) | # 2-digit NDC Regular 6 digits number with 4 digits extension
644
656
  match(/^(\d{2})\d{3}$/) >> split(2,2,1) # fallback for 5 digit number
645
657
 
646
658
  # country '353' # Republic of Ireland, see special file.
@@ -910,7 +922,14 @@ Phony.define do
910
922
  )
911
923
 
912
924
  country '671', todo # Spare code
913
- country '672', todo # Australian External Territories
925
+
926
+ # Australian External Territories https://en.wikipedia.org/wiki/Telephone_numbers_in_Norfolk_Island
927
+ # Norfolk Island
928
+ country '672',
929
+ fixed(1) >> split(2,3) |
930
+ match(/^(2\d+)$/) >> split(3) | # Fixed
931
+ match(/^(5\d+)$/) >> split(3) # Mobile
932
+
914
933
  country '673', fixed(1) >> split(3, 3) # Brunei Darussalam http://www.wtng.info/wtng-673-bn.html
915
934
  country '674', none >> split(3, 4) # Nauru (Republic of) http://www.wtng.info/wtng-674-nr.html
916
935
 
@@ -982,7 +1001,7 @@ Phony.define do
982
1001
  /\A\d+\z/ => [2,3] # geographic
983
1002
  )
984
1003
 
985
- country '686', none >> split(2,3) # Kiribati (Republic of) http://www.wtng.info/wtng-686-ki.html
1004
+ country '686', none >> split(8) # Kiribati (Republic of) https://www.numberingplans.com/?page=plans&sub=phonenr&alpha_2_input=KI
986
1005
  country '687', none >> split(3,3) # New Caledonia (Territoire français d'outre-mer) http://www.wtng.info/wtng-687-nc.html
987
1006
  country '688', none >> split(5) # Tuvalu http://www.wtng.info/wtng-688-tv.html
988
1007
  country '689', none >> split(2,2,2,2) # French Polynesia (Territoire français d'outre-mer) http://www.wtng.info/wtng-689-pf.html
@@ -1053,6 +1072,7 @@ Phony.define do
1053
1072
 
1054
1073
  # Lao People's Democratic Republic http://www.wtng.info/wtng-856-la.html, https://www.numberingplans.com
1055
1074
  country '856',
1075
+ trunk('0') |
1056
1076
  one_of('30') >> split(3,4) | # geographic
1057
1077
  one_of('20') >> split(4,4) | # mobile
1058
1078
  fixed(2) >> split(3,3) # geographic
@@ -100,6 +100,17 @@ module Phony
100
100
  return false unless (4..16) === normalized.size # unless hints[:check_length] == false
101
101
 
102
102
  country, cc, rest = partial_split normalized
103
+
104
+ # Was a country calling code given?
105
+ #
106
+ if ccc = hints[:ccc]
107
+ cc, ndc, *local = split ccc
108
+
109
+ raise ArgumentError.new("The provided ccc option is too long and includes more than a cc ('#{cc}') and ndc ('#{ndc}'). It also includes '#{local.join}'.") unless local.size == 1 && local[0].empty?
110
+
111
+ hints[:cc] = cc
112
+ hints[:ndc] = ndc
113
+ end
103
114
 
104
115
  # Country code plausible?
105
116
  #
@@ -109,6 +120,8 @@ module Phony
109
120
  # Country specific tests.
110
121
  #
111
122
  country.plausible? rest, hints
123
+ rescue ArgumentError
124
+ raise
112
125
  rescue StandardError
113
126
  return false
114
127
  end
@@ -18,27 +18,27 @@ describe 'Phony::Config' do
18
18
  it 'does not fail when loading all' do
19
19
  Phony::Config.load
20
20
 
21
- Phony.split('15551115511').should == ['1', '555', '111', '5511']
21
+ expect(Phony.split('15551115511')).to eq ['1', '555', '111', '5511']
22
22
  end
23
23
  it 'raises when a CC is used that has not been loaded.' do
24
24
  Phony::Config.load('41')
25
25
 
26
- expect { Phony.split('15551115511') }.to raise_error
26
+ expect { Phony.split('15551115511') }.to raise_error(Phony::SplittingError)
27
27
  end
28
28
  it 'raises when a CC is used that has not been loaded.' do
29
29
  Phony::Config.load(only: ['41'])
30
30
 
31
- expect { Phony.split('15551115511') }.to raise_error
31
+ expect { Phony.split('15551115511') }.to raise_error(Phony::SplittingError)
32
32
  end
33
33
  it 'raises when a CC is used that has not been loaded.' do
34
34
  Phony::Config.load(except: ['1'])
35
35
 
36
- expect { Phony.split('15551115511') }.to raise_error
36
+ expect { Phony.split('15551115511') }.to raise_error(Phony::SplittingError)
37
37
  end
38
38
  it 'does not raise when a CC is used that has been loaded.' do
39
39
  Phony::Config.load(except: ['41'])
40
40
 
41
- Phony.split('15551115511').should == ['1', '555', '111', '5511']
41
+ expect(Phony.split('15551115511')).to eq ['1', '555', '111', '5511']
42
42
  end
43
43
  end
44
44
  end
@@ -25,11 +25,11 @@ describe 'plausibility' do
25
25
  incorrect = [shortest.sub(/\d\s*\z/, '')] # , longest + '0']
26
26
 
27
27
  correct.each do |value|
28
- Phony.plausible?(value).should be_truthy,
28
+ expect(Phony.plausible?(value)).to be_truthy,
29
29
  "It should validate #{value}, but does not."
30
30
  end
31
31
  incorrect.each do |value|
32
- Phony.plausible?(value).should be_falsey,
32
+ expect(Phony.plausible?(value)).to be_falsey,
33
33
  "It should not validate #{value}, but does."
34
34
  end
35
35
  end
@@ -38,7 +38,7 @@ describe 'plausibility' do
38
38
  invalid = [*sample]
39
39
 
40
40
  invalid.each do |value|
41
- Phony.plausible?(value).should be_falsey,
41
+ expect(Phony.plausible?(value)).to be_falsey,
42
42
  "It should not validate #{value}, but does."
43
43
  end
44
44
  end
@@ -51,6 +51,14 @@ describe 'plausibility' do
51
51
  it_is_correct_for 'Bosnia and Herzegovina', :samples => ['+387 66 666 666',
52
52
  '+387 37 123 456',
53
53
  '+387 33 222 111']
54
+ it 'is correct for Brasil' do
55
+ Phony.plausible?('+55 67 998280912').should be_truthy
56
+ Phony.plausible?('+55 67 98280912').should be_falsey
57
+ Phony.plausible?('+55 11 12345678').should be_falsey
58
+ Phony.plausible?('+55 11 123456789').should be_falsey
59
+ Phony.plausible?('+55 11 023456789').should be_falsey
60
+ Phony.plausible?('+55 11 22345678').should be_truthy
61
+ end
54
62
  it 'is correct for Bulgaria' do
55
63
  Phony.plausible?('+359 2 1234567').should be_truthy
56
64
  Phony.plausible?('+359 30 12345').should be_truthy
@@ -179,6 +187,14 @@ describe 'plausibility' do
179
187
  Phony.plausible?('+359 998 123456').should be_truthy
180
188
  Phony.plausible?('+359 999 123456').should be_truthy
181
189
  end
190
+ it_is_correct_for 'Colombia', :samples => ['+57 601 411 1899',
191
+ '+57 602 111 2222',
192
+ '+57 603 111 2222',
193
+ '+57 604 111 2222',
194
+ '+57 605 111 2222',
195
+ '+57 606 111 2222',
196
+ '+57 607 111 2222',
197
+ '+57 608 111 2222']
182
198
  it_is_correct_for 'Congo', :samples => '+242 1234 56789'
183
199
  it_is_correct_for 'Cook Islands', :samples => '+682 71928'
184
200
  it_is_correct_for 'Costa Rica', :samples => '+506 2 234 5678'
@@ -280,13 +296,12 @@ describe 'plausibility' do
280
296
  it_is_correct_for 'Guinea-Bissau', :samples => '+245 44 728 6998'
281
297
  it_is_correct_for 'Guyana', :samples => '+592 263 1234'
282
298
  it_is_correct_for 'Honduras (Republic of)', :samples => '+504 12 961 637'
283
- it_is_correct_for 'Italy', :samples => ['+39 0574 1234']
284
299
  it_is_correct_for 'Iraq', :samples => ['+964 1 123 4567',
285
300
  '+964 21 113 456',
286
301
  '+964 71 1234 5678']
287
302
 
288
303
 
289
- it_is_correct_for 'Kiribati (Republic of)', :samples => '+686 31993'
304
+ it_is_correct_for 'Kiribati (Republic of)', :samples => '+686 34814527'
290
305
  it_is_correct_for "Democratic People's Republic of Korea", :samples => ['+850 2 123 45',
291
306
  '+850 2 123 456 789',
292
307
  '+850 2 381 2356',
@@ -329,6 +344,7 @@ describe 'plausibility' do
329
344
  '+261 32 34 546 78',
330
345
  '+261 33 34 546 78',
331
346
  '+261 34 34 546 78',
347
+ '+261 37 34 546 78',
332
348
  '+261 38 34 546 78']
333
349
  it 'is incorrect for Madagascar' do
334
350
  Phony.plausible?('+261 20 012 345 678').should be_falsey
@@ -348,7 +364,8 @@ describe 'plausibility' do
348
364
  it_is_correct_for 'Marshall Islands (Republic of the)', :samples => '+692 372 7183'
349
365
  it_is_correct_for 'Martinique (French Department of)', :samples => '+596 596 123 456'
350
366
  it_is_correct_for 'Mauritania', :samples => '+222 1234 5678'
351
- it_is_correct_for 'Mauritius', :samples => '+230 5695 2277'
367
+ it_is_correct_for 'Mauritius', :samples => ['+230 5 695 2277',
368
+ '+230 260 0070']
352
369
  it_is_correct_for 'Micronesia (Federated States of)', :samples => '+691 766 7914'
353
370
  it_is_correct_for 'Moldova', :samples => ['+373 800 123 45',
354
371
  '+373 22 123 345',
@@ -574,7 +591,9 @@ describe 'plausibility' do
574
591
  '+598 805 123 45']
575
592
  it_is_correct_for 'Vietnam', :samples => ['+84 24 41234567',
576
593
  '+84 28 41234567',
577
- '+84 23 61234567']
594
+ '+84 23 61234567',
595
+ '+84 1900 1212',
596
+ '+84 1900 541234']
578
597
  it_is_correct_for 'Yemen', :samples => [['+967 1 234 567', '+967 1 234 5678'],
579
598
  '+967 7 234 567',
580
599
  '+967 77 123 4567',
@@ -602,6 +621,29 @@ describe 'plausibility' do
602
621
  Phony.plausible?('+62 22 000 000 000').should be_truthy
603
622
  end
604
623
 
624
+ it 'is correct for Italy' do
625
+ Phony.plausible?('+39 0574 123').should be_falsy
626
+ Phony.plausible?('+39 0574 1234').should be_truthy
627
+ Phony.plausible?('+39 0574 12345').should be_falsy
628
+
629
+ Phony.plausible?('+39 085 541').should be_falsy
630
+ Phony.plausible?('+39 085 5410').should be_truthy
631
+ Phony.plausible?('+39 085 54105').should be_truthy
632
+
633
+ Phony.plausible?('+39 06 4991').should be_falsy
634
+ Phony.plausible?('+39 06 49911').should be_truthy
635
+ Phony.plausible?('+39 06 499112').should be_truthy
636
+
637
+ Phony.plausible?('+39 800 081631').should be_truthy
638
+ Phony.plausible?('+39 800 0816311').should be_falsy
639
+
640
+ Phony.plausible?('+39 803 08163').should be_falsy
641
+ Phony.plausible?('+39 803 081').should be_truthy
642
+
643
+ Phony.plausible?('+39 06 8323074181').should be_falsy
644
+ Phony.plausible?('+39 06 832307418').should be_truthy
645
+ end
646
+
605
647
  it 'is correct for Russia' do
606
648
  Phony.plausible?('+7 3522 000 000').should be_truthy
607
649
  end
@@ -5,7 +5,7 @@ require 'spec_helper'
5
5
  describe 'country descriptions' do
6
6
 
7
7
  def self.it_splits number, expected
8
- it { Phony.split(number).should == expected }
8
+ it { expect(Phony.split(number)).to eq expected }
9
9
  end
10
10
 
11
11
  describe 'regression' do
@@ -147,9 +147,8 @@ describe 'country descriptions' do
147
147
  end
148
148
 
149
149
  describe 'Brazil' do
150
- it_splits '551112341234', ['55', '11', '1234', '1234']
150
+ it_splits '551122341234', ['55', '11', '2234', '1234']
151
151
  it_splits '5511981231234', ['55', '11', '98123', '1234'] # São Paulo's 9 digits mobile
152
- it_splits '552181231234', ['55', '21', '8123', '1234']
153
152
  it_splits '5521981231234', ['55', '21', '98123', '1234'] # Rio de Janeiro's 9 digits mobile
154
153
  it_splits '551931311234', ['55', '19', '3131', '1234']
155
154
  it_splits '5531991311234', ['55', '31', '99131', '1234'] # Belo Horizonte's 9th digit
@@ -157,6 +156,7 @@ describe 'country descriptions' do
157
156
  it_splits '5579991311234', ['55', '79', '99131', '1234'] # Sergipe's 9th digit
158
157
  it_splits '5547991311234', ['55', '47', '99131', '1234'] # Santa Catarina's 9th digit
159
158
  it_splits '5541991311234', ['55', '41', '99131', '1234'] # Parana's 9th digit
159
+ it_splits '556734212121', ['55', '67', '3421', '2121']
160
160
 
161
161
  context 'mobile numbers' do
162
162
  %w{
@@ -240,7 +240,7 @@ describe 'country descriptions' do
240
240
  end
241
241
  end
242
242
  describe 'Colombia' do
243
- it_splits '5711234567', ['57', '1', '123', '4567']
243
+ it_splits '5711234567', ['57', '1', '123', '4567'] # Outdated.
244
244
  it_splits '573101234567', ['57', '310', '123', '4567'] # mobile
245
245
  end
246
246
  describe 'Croatia' do
@@ -460,8 +460,9 @@ describe 'country descriptions' do
460
460
  it_splits '3934869528123',['39', '348', '695', '2812', '3'] # Mobile (8-digit subscriber no - new)
461
461
  it_splits '393357210488', ['39', '335', '721', '0488'] # Mobile
462
462
  it_splits '393248644272', ['39', '324', '864', '4272'] # Mobile
463
- it_splits '3906123412', ['39', '06', '1234', '12'] # Roma 6 digit
464
- it_splits '39061234123', ['39', '06', '1234', '123'] # Roma 7 digit
463
+ it_splits '390612341', ['39', '06', '12341'] # Roma 5 digit
464
+ it_splits '3906123412', ['39', '06', '1234', '12'] # Roma 6 digit
465
+ it_splits '39061234123', ['39', '06', '1234', '123'] # Roma 7 digit
465
466
  it_splits '390612341234', ['39', '06', '1234', '1234'] # Roma 8 digit
466
467
  it_splits '3902888388', ['39', '02', '8883', '88'] # Milano 6 digit
467
468
  it_splits '39028883888', ['39', '02', '8883', '888'] # Milano 7 digit
@@ -527,6 +528,8 @@ describe 'country descriptions' do
527
528
  it_splits '352545258', ['352', '54', '52', '58']
528
529
  it_splits '352818181', ['352', '81', '81', '81']
529
530
  it_splits '3523572141', ['352', '35', '72', '14', '1']
531
+ it_splits '3522634731', ['352', '26', '34', '73', '1']
532
+ it_splits '352264412701', ['352', '26', '44', '12', '701']
530
533
  end
531
534
  describe 'Macedonia' do
532
535
  it_splits '38921234567', ['389', '2', '123', '4567'] # Skopje
@@ -592,6 +595,10 @@ describe 'country descriptions' do
592
595
  it_splits '31222123456', ['31', '222', '123', '456']
593
596
  it_splits '3197012345678', ['31', '970', '1234', '5678'] # machine-to-machine
594
597
  end
598
+ describe 'Norfolk Island' do
599
+ it_splits '672321234', ['672', '3', '21', '234'] # fixed
600
+ it_splits '672351234', ['672', '3', '51', '234'] # mobile
601
+ end
595
602
  describe 'Norway' do
596
603
  it_splits '4721234567', ['47',false,'21','23','45','67']
597
604
  it_splits '4731234567', ['47',false,'31','23','45','67']
@@ -850,6 +857,8 @@ describe 'country descriptions' do
850
857
  it_splits '842841234567', ['84', '28', '4123', '4567'] # Ho Chi Minh City
851
858
  it_splits '84341234567', ['84', '34', '1234567'] # Viettel
852
859
  it_splits '84841234567', ['84', '84', '1234567'] # Vinaphone
860
+ it_splits '8419001212', ['84', '1900', '1212'] # Vinaphone
861
+ it_splits '841900541234', ['84', '1900', '541234'] # Vinaphone
853
862
  end
854
863
  describe 'Zambia' do
855
864
  it_splits '260211123456', ['260', '211', '123456'] # Fixed
@@ -870,7 +879,8 @@ describe 'country descriptions' do
870
879
  it_splits '6737932744', %w(673 7 932 744)
871
880
  end
872
881
  describe 'Burkina Faso' do
873
- it_splits '22667839323', ['226', false, '6783', '9323']
882
+ it_splits '22667839323', ['226', false, '67', '83', '93', '23']
883
+ it_splits '22601234567', ['226', false, '01', '23', '45', '67'] # 0 not removed.
874
884
  end
875
885
  describe 'Burundi' do
876
886
  it_splits '25712345678', ['257', false, '1234', '5678']
@@ -1011,7 +1021,7 @@ describe 'country descriptions' do
1011
1021
  it_splits '96287901456', %w(962 8790 1456)
1012
1022
  end
1013
1023
  describe 'Kiribati (Republic of)' do
1014
- it_splits '68634814', ['686', false, '34', '814']
1024
+ it_splits '68634814527', ['686', false, '34814527']
1015
1025
  end
1016
1026
  describe "Democratic People's Republic of Korea" do
1017
1027
  it_splits '850212345', %w(850 2 123 45)
@@ -1084,7 +1094,8 @@ describe 'country descriptions' do
1084
1094
  it_splits '22212345678', ['222', false, '1234', '5678']
1085
1095
  end
1086
1096
  describe 'Mauritius' do
1087
- it_splits '23059518919', ['230', false, '5951', '8919']
1097
+ it_splits '23059518919', ['230', false, '5', '951', '8919']
1098
+ it_splits '2302600070', ['230', false, '260', '0070']
1088
1099
  end
1089
1100
  describe 'Micronesia (Federated States of)' do
1090
1101
  it_splits '6911991754', ['691', false, '199', '1754']