phony 2.18.3 → 3.0.3

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.
Files changed (79) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +117 -0
  3. data/lib/phony/config.rb +25 -26
  4. data/lib/phony/countries/argentina.rb +352 -0
  5. data/lib/phony/countries/austria.rb +73 -74
  6. data/lib/phony/countries/bangladesh.rb +27 -28
  7. data/lib/phony/countries/belarus.rb +110 -111
  8. data/lib/phony/countries/brazil.rb +93 -93
  9. data/lib/phony/countries/cambodia.rb +10 -14
  10. data/lib/phony/countries/china.rb +22 -18
  11. data/lib/phony/countries/croatia.rb +6 -5
  12. data/lib/phony/countries/georgia.rb +84 -84
  13. data/lib/phony/countries/germany.rb +4067 -4068
  14. data/lib/phony/countries/guinea.rb +8 -8
  15. data/lib/phony/countries/india.rb +31 -34
  16. data/lib/phony/countries/indonesia.rb +57 -46
  17. data/lib/phony/countries/ireland.rb +10 -9
  18. data/lib/phony/countries/italy.rb +79 -60
  19. data/lib/phony/countries/japan.rb +456 -406
  20. data/lib/phony/countries/kyrgyzstan.rb +109 -109
  21. data/lib/phony/countries/latvia.rb +34 -34
  22. data/lib/phony/countries/libya.rb +109 -107
  23. data/lib/phony/countries/malaysia.rb +12 -12
  24. data/lib/phony/countries/moldova.rb +42 -42
  25. data/lib/phony/countries/montenegro.rb +24 -20
  26. data/lib/phony/countries/myanmar.rb +39 -39
  27. data/lib/phony/countries/namibia.rb +35 -29
  28. data/lib/phony/countries/nepal.rb +60 -62
  29. data/lib/phony/countries/netherlands.rb +13 -13
  30. data/lib/phony/countries/pakistan.rb +135 -111
  31. data/lib/phony/countries/paraguay.rb +135 -135
  32. data/lib/phony/countries/russia_kazakhstan_abkhasia_south_ossetia.rb +125 -128
  33. data/lib/phony/countries/saudi_arabia.rb +5 -5
  34. data/lib/phony/countries/serbia.rb +48 -36
  35. data/lib/phony/countries/somalia.rb +18 -18
  36. data/lib/phony/countries/south_korea.rb +16 -13
  37. data/lib/phony/countries/sweden.rb +356 -48
  38. data/lib/phony/countries/taiwan.rb +20 -18
  39. data/lib/phony/countries/tajikistan.rb +70 -70
  40. data/lib/phony/countries/turkmenistan.rb +65 -65
  41. data/lib/phony/countries/ukraine.rb +607 -607
  42. data/lib/phony/countries/united_kingdom.rb +66 -66
  43. data/lib/phony/countries/uruguay.rb +40 -41
  44. data/lib/phony/countries/vietnam.rb +20 -14
  45. data/lib/phony/countries/zimbabwe.rb +31 -31
  46. data/lib/phony/countries.rb +509 -453
  47. data/lib/phony/country.rb +50 -44
  48. data/lib/phony/country_codes.rb +77 -57
  49. data/lib/phony/dsl.rb +25 -28
  50. data/lib/phony/local_splitters/fixed.rb +24 -29
  51. data/lib/phony/local_splitters/regex.rb +30 -31
  52. data/lib/phony/national_code.rb +7 -10
  53. data/lib/phony/national_splitters/default.rb +9 -11
  54. data/lib/phony/national_splitters/dsl.rb +8 -18
  55. data/lib/phony/national_splitters/fixed.rb +12 -15
  56. data/lib/phony/national_splitters/none.rb +8 -14
  57. data/lib/phony/national_splitters/regex.rb +13 -17
  58. data/lib/phony/national_splitters/variable.rb +37 -38
  59. data/lib/phony/trunk_code.rb +23 -23
  60. data/lib/phony/vanity.rb +12 -13
  61. data/lib/phony.rb +84 -83
  62. metadata +14 -45
  63. data/README.textile +0 -112
  64. data/spec/functional/config_spec.rb +0 -44
  65. data/spec/functional/plausibility_spec.rb +0 -608
  66. data/spec/lib/phony/countries_spec.rb +0 -1391
  67. data/spec/lib/phony/country_codes_spec.rb +0 -203
  68. data/spec/lib/phony/country_spec.rb +0 -84
  69. data/spec/lib/phony/dsl_spec.rb +0 -24
  70. data/spec/lib/phony/local_splitters/fixed_spec.rb +0 -56
  71. data/spec/lib/phony/local_splitters/regex_spec.rb +0 -97
  72. data/spec/lib/phony/national_code_spec.rb +0 -91
  73. data/spec/lib/phony/national_splitters/default_spec.rb +0 -34
  74. data/spec/lib/phony/national_splitters/fixed_spec.rb +0 -49
  75. data/spec/lib/phony/national_splitters/none_spec.rb +0 -28
  76. data/spec/lib/phony/national_splitters/regex_spec.rb +0 -23
  77. data/spec/lib/phony/national_splitters/variable_spec.rb +0 -39
  78. data/spec/lib/phony/vanity_spec.rb +0 -30
  79. data/spec/lib/phony_spec.rb +0 -70
@@ -6,7 +6,7 @@
6
6
  land_ndcs_with_4_digits = [
7
7
  '3031', # Boké
8
8
  '3046', # Boussoura
9
- *['3041', '3043', '3045', '3047'], # Conakry
9
+ '3041', '3043', '3045', '3047', # Conakry
10
10
  '3069', # Delaba
11
11
  '3081', # Faranah
12
12
  '3024', # Fria
@@ -27,20 +27,20 @@ land_ndcs_with_5_digits = [
27
27
  '30613' # Télimélé
28
28
  ]
29
29
 
30
- # NOTE We're not using *('660'..'669') since it does not freeze easily.
30
+ # NOTE: We're not using *('660'..'669') since it does not freeze easily.
31
31
  mobile_ndcs_with_3_digits = [
32
32
  '600', '601', '602', '603', '604', '605', '606', '607', '608', '609', # Sotelgui
33
33
  '620', '621', '622', '623', '624', '625', '626', '627', '628', '629', # Orange
34
34
  '650', '651', '652', '653', '654', '655', '656', '657', '658', '659', # Cellcom
35
35
  '630', '631', '632', '633', '634', '635', '636', '637', '638', '639', # Intercel
36
- '660', '661', '662', '663', '664', '665', '666', '667', '668', '669', # Areeba
36
+ '660', '661', '662', '663', '664', '665', '666', '667', '668', '669' # Areeba
37
37
  ]
38
38
 
39
39
  Phony.define do
40
40
  country '224',
41
- one_of(land_ndcs_with_5_digits) >> split(2, 2) | # 2-2-2-2
42
- one_of(land_ndcs_with_4_digits) >> split(2, 2) | # 2-2-2-2
43
- one_of(mobile_ndcs_with_3_digits) >> split(2, 2, 2) | # 3-2-2-2
44
- match(/^(7\d{2})\d{6}/) >> split(2, 2, 2) | # voip numbers
45
- fixed(3) >> split(2, 2, 2)
41
+ one_of(land_ndcs_with_5_digits) >> split(2, 2) | # 2-2-2-2
42
+ one_of(land_ndcs_with_4_digits) >> split(2, 2) | # 2-2-2-2
43
+ one_of(mobile_ndcs_with_3_digits) >> split(2, 2, 2) | # 3-2-2-2
44
+ match(/^(7\d{2})\d{6}/) >> split(2, 2, 2) | # voip numbers
45
+ fixed(3) >> split(2, 2, 2)
46
46
  end
@@ -11,40 +11,37 @@
11
11
  #
12
12
  #
13
13
 
14
-
15
- sdca_with_2_digits = %w{ 11 20 22 33 39 40 44 50 60 70 79 80 }
16
-
17
- sdca_with_3_digits = %w{
18
- 120 121 122 124 129 130 131 132 135 141 144 145 151 154 160 161 164 171 172 175 177 180 181 183 184 186 191 194
19
- 210 212 217 230 231 233 239 240 241 249 250 251 254 257 260 261 265 268 270 272 278 281 285 286 288 291 294
20
- 326 341 342 343 353 354 360 361 364 369 370 373 374 376 381 385 389
21
- 413 416 421 423 424 427 431 435 451 452 461 462 469 470 471 474 475 476 477 478 479 480 481 483 484 485 487 490 491 494 495 496 497
22
- 512 515 532 535 542 548 551 562 565 572 581 595
23
- 612 621 631 641 651 657 661 663 671 674 680
24
- 712 721 724 731 733 734 744 751 755 761 747 788
25
- 816 820 821 824 831 832 836 861 863 866 870 877 878 883 884 891
26
- 140
27
- 240 249 254 260 270 272
28
- 300 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 318 320 327 328 329 340 344 349 350 357 388
29
- 412 419 430 438 439 450 453 458 459 460 464 466 467 468
30
- 510 513 520 523 529 530 537 538 539 540 543 547 550 553 557 558 559 560 563 570 575 576 577 578 579 580 589 590 593 597 598 599
31
- 610 614 616 617 619 620 623 626 628 629 630 635 636 637 638 639 640 644 648 649 650 660 669 670 677 687 688 689
32
- 730 735 738 740 750 787 789
33
- 812 814 829 843 860 879 880 887 889 890 895 897 898 899
34
- }
35
-
36
-
37
-
38
- mobile = %w{ 91 92 93 94 97 98 99 }
39
-
40
- pagers = %w{ 96 }
14
+ sdca_with_2_digits = %w[11 20 22 33 39 40 44 50 60 70 79 80]
15
+
16
+ sdca_with_3_digits = %w[
17
+ 120 121 122 124 129 130 131 132 135 141 144 145 151 154 160 161 164 171 172 175 177 180 181 183 184 186 191 194
18
+ 210 212 217 230 231 233 239 240 241 249 250 251 254 257 260 261 265 268 270 272 278 281 285 286 288 291 294
19
+ 326 341 342 343 353 354 360 361 364 369 370 373 374 376 381 385 389
20
+ 413 416 421 423 424 427 431 435 451 452 461 462 469 470 471 474 475 476 477 478 479 480 481 483 484 485 487 490 491 494 495 496 497
21
+ 512 515 532 535 542 548 551 562 565 572 581 595
22
+ 612 621 631 641 651 657 661 663 671 674 680
23
+ 712 721 724 731 733 734 744 751 755 761 747 788
24
+ 816 820 821 824 831 832 836 861 863 866 870 877 878 883 884 891
25
+ 140
26
+ 240 249 254 260 270 272
27
+ 300 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 318 320 327 328 329 340 344 349 350 357 388
28
+ 412 419 430 438 439 450 453 458 459 460 464 466 467 468
29
+ 510 513 520 523 529 530 537 538 539 540 543 547 550 553 557 558 559 560 563 570 575 576 577 578 579 580 589 590 593 597 598 599
30
+ 610 614 616 617 619 620 623 626 628 629 630 635 636 637 638 639 640 644 648 649 650 660 669 670 677 687 688 689
31
+ 730 735 738 740 750 787 789
32
+ 812 814 829 843 860 879 880 887 889 890 895 897 898 899
33
+ ]
34
+
35
+ mobile = %w[91 92 93 94 97 98 99]
36
+
37
+ pagers = %w[96]
41
38
 
42
39
  Phony.define do
43
40
  country '91',
44
- trunk('0') |
45
- one_of(sdca_with_3_digits) >> split(3, 2, 2) |
46
- one_of(sdca_with_2_digits) >> split(3, 2, 3) |
47
- one_of(mobile) >> split(3, 2, 3) |
48
- one_of(pagers) >> split(2, 3, 3) |
49
- fixed(4) >> split(3, 3) # fallback (4 digit sdca)
50
- end
41
+ trunk('0') |
42
+ one_of(sdca_with_3_digits) >> split(3, 2, 2) |
43
+ one_of(sdca_with_2_digits) >> split(3, 2, 3) |
44
+ one_of(mobile) >> split(3, 2, 3) |
45
+ one_of(pagers) >> split(2, 3, 3) |
46
+ fixed(4) >> split(3, 3) # fallback (4 digit sdca)
47
+ end
@@ -6,50 +6,61 @@
6
6
 
7
7
  Phony.define do
8
8
  country '62',
9
- trunk('0') |
10
- one_of('21') >> matched_split(
11
- /\A\d{5}\z/ => [3,2],
12
- /\A\d{7}\z/ => [3,4],
13
- /\A\d+\z/ => [4,4]) |
14
- one_of(%w(22 23 24 25 26 27 28 29 31 32 33 34 35 36 37 38 39 72)) >> matched_split(
15
- /\A\d{5}\z/ => [3,2],
16
- /\A\d{7}\z/ => [3,4],
17
- /\A\d{8}\z/ => [4,4],
18
- /\A\d{9}\z/ => [3,3,3]) |
19
- one_of('70') >> split(3,3) |
20
- one_of(%w(71 73 74 75 76 77)) >> matched_split(
21
- /\A\d{6}\z/ => [3,3],
22
- /\A\d+\z/ => [3,4]) |
23
- one_of('13') >> matched_split( # pager
24
- /\A\d{3}\z/ => [3],
25
- /\A\d+\z/ => [3,3]) |
26
- one_of(%w(174 175)) >> matched_split( # satellite
27
- /\A\d{2}\z/ => [2],
28
- /\A\d+\z/ => [2,3]) |
29
- one_of('177') >> matched_split( # satellite
30
- /\A\d{2}\z/ => [2],
31
- /\A\d+\z/ => [4,4]) |
32
- one_of('178') >> matched_split( # satellite
33
- /\A\d{3}\z/ => [3],
34
- /\A\d+\z/ => [3,2]) |
35
- one_of(%w(870)) >> split(3,2) | # satellite
36
- match(/\A(81\d|82\d|83\d|84\d|85\d|86\d|87\d|88\d|89\d)\d+\z/) >> matched_split( # mobile
37
- /\A\d{6}\z/ => [3,3],
38
- /\A\d{7}\z/ => [3,4],
39
- /\A\d{8}\z/ => [4,4],
40
- /\A\d+\z/ => [4,5]) |
41
- one_of(%w(9)) >> matched_split( # geographic
42
- /\A\d{7}\z/ => [4,3],
43
- /\A\d+\z/ => [3,3,3]) |
44
- one_of(%w(4 5)) >> matched_split(
45
- /\A\d{6}\z/ => [3,3],
46
- /\A\d+\z/ => [4,4]) |
47
- one_of('6') >> matched_split(
48
- /\A\d{7}\z/ => [3,4],
49
- /\A\d+\z/ => [4,4]) |
50
- one_of('9') >> matched_split(
51
- /\A\d{7}\z/ => [3,4],
52
- /\A\d+\z/ => [4,5]) |
53
- fixed(2) >> split(4,4)
9
+ trunk('0') |
10
+ one_of('21') >> matched_split(
11
+ /\A\d{5}\z/ => [3, 2],
12
+ /\A\d{7}\z/ => [3, 4],
13
+ /\A\d+\z/ => [4, 4]
14
+ ) |
15
+ one_of(%w[22 23 24 25 26 27 28 29 31 32 33 34 35 36 37 38 39 72]) >> matched_split(
16
+ /\A\d{5}\z/ => [3, 2],
17
+ /\A\d{7}\z/ => [3, 4],
18
+ /\A\d{8}\z/ => [4, 4],
19
+ /\A\d{9}\z/ => [3, 3, 3]
20
+ ) |
21
+ one_of('70') >> split(3, 3) |
22
+ one_of(%w[71 73 74 75 76 77]) >> matched_split(
23
+ /\A\d{6}\z/ => [3, 3],
24
+ /\A\d+\z/ => [3, 4]
25
+ ) |
26
+ one_of('13') >> matched_split( # pager
27
+ /\A\d{3}\z/ => [3],
28
+ /\A\d+\z/ => [3, 3]
29
+ ) |
30
+ one_of(%w[174 175]) >> matched_split( # satellite
31
+ /\A\d{2}\z/ => [2],
32
+ /\A\d+\z/ => [2, 3]
33
+ ) |
34
+ one_of('177') >> matched_split( # satellite
35
+ /\A\d{2}\z/ => [2],
36
+ /\A\d+\z/ => [4, 4]
37
+ ) |
38
+ one_of('178') >> matched_split( # satellite
39
+ /\A\d{3}\z/ => [3],
40
+ /\A\d+\z/ => [3, 2]
41
+ ) |
42
+ one_of(%w[870]) >> split(3, 2) | # satellite
43
+ match(/\A(81\d|82\d|83\d|84\d|85\d|86\d|87\d|88\d|89\d)\d+\z/) >> matched_split( # mobile
44
+ /\A\d{6}\z/ => [3, 3],
45
+ /\A\d{7}\z/ => [3, 4],
46
+ /\A\d{8}\z/ => [4, 4],
47
+ /\A\d+\z/ => [4, 5]
48
+ ) |
49
+ one_of(%w[9]) >> matched_split( # geographic
50
+ /\A\d{7}\z/ => [4, 3],
51
+ /\A\d+\z/ => [3, 3, 3]
52
+ ) |
53
+ one_of(%w[4 5]) >> matched_split(
54
+ /\A\d{6}\z/ => [3, 3],
55
+ /\A\d+\z/ => [4, 4]
56
+ ) |
57
+ one_of('6') >> matched_split(
58
+ /\A\d{7}\z/ => [3, 4],
59
+ /\A\d+\z/ => [4, 4]
60
+ ) |
61
+ one_of('9') >> matched_split(
62
+ /\A\d{7}\z/ => [3, 4],
63
+ /\A\d+\z/ => [4, 5]
64
+ ) |
65
+ fixed(2) >> split(4, 4)
54
66
  end
55
-
@@ -9,14 +9,14 @@
9
9
  #
10
10
  # References:
11
11
  # http://www.comreg.ie/_fileupload/publications/ComReg03147.pdf (2003)
12
+ # https://www.comreg.ie/media/dlm_uploads/2015/12/ComReg0804.pdf (2008)
12
13
  # http://www.comreg.ie/licensing_and_services/area_code_maps.552.1040.html
13
14
  # http://en.wikipedia.org/wiki/Telephone_numbers_in_the_Republic_of_Ireland
14
15
  #
15
16
  ndcs_with_5_subscriber_digits = [
16
- '22', '23', '24', '25', '26', '27', '28', '29', # Mallow, Bandon, Youghal, Fermoy, Macroom, Bantry, Skibbereen, Kanturk
17
+ '22', '24', '25', '26', '27', '28', '29', # Mallow, Youghal, Fermoy, Macroom, Bantry, Skibbereen, Kanturk
17
18
  '402', # Arklow
18
19
  '404', # Wicklow
19
- '43', # Longford, Granard
20
20
  '47', # Monaghan, Clones
21
21
  '48', # Northern Ireland
22
22
  '502', # Portlaoise, Abbeyleix
@@ -24,12 +24,10 @@ ndcs_with_5_subscriber_digits = [
24
24
  '505', # Roscrea
25
25
  '506', # Tullamore
26
26
  '509', # Bin-
27
- '52', # Killenaule
28
27
  '54', # Legacy Ferns, Enniscorthy
29
28
  '55', # Legacy Gorey
30
29
  '62', # Tipperary, Cashel
31
30
  '63', # Charleville
32
- '64', # Killarney, Rathmore
33
31
  '67', # Nenagh
34
32
  '68', # Listowel
35
33
  '69', # Newcastle West
@@ -41,21 +39,25 @@ ndcs_with_6_subscriber_digits = [
41
39
  '45', # Naas, Kildare, Curragh
42
40
  '51', # Waterford, Carrick-on-Suir, New Ross, Kilmacthomas
43
41
  '61', # Limerick, Scariff
44
- '91', # Galway, GOrt, Loughrea
42
+ '91' # Galway, GOrt, Loughrea
45
43
  ]
46
44
 
47
45
  ndcs_with_7_subscriber_digits = [
48
46
  '1', # Dublin
49
47
  '21', # Cork, Coachford, Kinsale
48
+ '23', # Bandon
50
49
  '41', # Ardee
51
50
  '42', # Dundalk, Carrickmacross, Castleblaney
51
+ '43', # Longford, Granard
52
52
  '44', # Mullingar, Castlepollard, Tyrellspass
53
53
  '46', # Navan, Kells, Trim, Enfield, Edenderry
54
54
  '49', # Cavan, Cootehill, Oldcastle, Belturbet
55
+ '52', # Killenaule
55
56
  '53', # Wexford, Enniscorthy, Ferns, Gorey, Craanford
56
57
  '56', # Kilkenny, Castlecomer
57
58
  '58', # Dungarvan
58
59
  '59', # Carlow, Muine Bheag, Athy, Baltinglass
60
+ '64', # Killarney, Rathmore
59
61
  '65', # Ennistymon, Kilrush
60
62
  '66', # Tralee, Dingle, Killorglin, Cahirciveen
61
63
  '71', # Sligo, Manorhamilton, Carrick-on-Shannon
@@ -71,11 +73,10 @@ freefone = [
71
73
 
72
74
  Phony.define do
73
75
  country '353', trunk('0') |
74
- one_of(ndcs_with_7_subscriber_digits) >> split(3,4) |
76
+ one_of(ndcs_with_7_subscriber_digits) >> split(3, 4) |
75
77
  one_of(ndcs_with_5_subscriber_digits) >> split(5) |
76
78
  one_of(ndcs_with_6_subscriber_digits) >> split(6) |
77
79
  one_of(freefone) >> split(6) |
78
- match(/^(8\d).+$/) >> split(3,4) | # mobile
79
- fixed(3) >> split(6) # Fallback
80
-
80
+ match(/^(8\d).+$/) >> split(3, 4) | # mobile
81
+ fixed(3) >> split(6) # Fallback
81
82
  end
@@ -3,46 +3,46 @@
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
- '06', # Rome (including State of Vatican City) and Aprilia
10
+ '06' # Rome (including State of Vatican City) and Aprilia
11
11
  ]
12
12
 
13
- ndcs_3digit = [
14
- '010', # Genoa
15
- '011', # Turin
16
- '015', # Biella
17
- '019', # Savona
18
- '030', # Brescia
19
- '031', # Como
20
- '035', # Bergamo
21
- '039', # Monza
22
- '040', # Trieste
23
- '041', # Venice
24
- '045', # Verona
25
- '049', # Padua
26
- '050', # Pisa
27
- '051', # Bologna
28
- '055', # Florence
29
- '059', # Modena
30
- '070', # Cagliari
31
- '071', # Ancona
32
- '075', # Perugia
33
- '079', # Sassari
34
- '080', # Bari
35
- '081', # Naples
36
- '085', # Pescara
37
- '089', # Salerno
38
- '090', # Messina
39
- '091', # Palermo
40
- '092', # Agrigento
41
- '095', # Catania
42
- '099', # Taranto
13
+ ndcs_2digit = [
14
+ '010', # Genoa
15
+ '011', # Turin
16
+ '015', # Biella
17
+ '019', # Savona
18
+ '030', # Brescia
19
+ '031', # Como
20
+ '035', # Bergamo
21
+ '039', # Monza
22
+ '040', # Trieste
23
+ '041', # Venice
24
+ '045', # Verona
25
+ '049', # Padua
26
+ '050', # Pisa
27
+ '051', # Bologna
28
+ '055', # Florence
29
+ '059', # Modena
30
+ '070', # Cagliari
31
+ '071', # Ancona
32
+ '075', # Perugia
33
+ '079', # Sassari
34
+ '080', # Bari
35
+ '081', # Naples
36
+ '085', # Pescara
37
+ '089', # Salerno
38
+ '090', # Messina
39
+ '091', # Palermo
40
+ '092', # Agrigento
41
+ '095', # Catania
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
@@ -246,7 +246,7 @@ ndcs_4digit = [
246
246
  '0982', # Paola
247
247
  '0983', # Rossano
248
248
  '0984', # Cosenza
249
- '0985', # Scalea
249
+ '0985' # Scalea
250
250
  ]
251
251
 
252
252
  # All 3-- numbers are reserved for mobile phones according to
@@ -254,35 +254,54 @@ ndcs_4digit = [
254
254
  # NOTE was:
255
255
  # mobile = ('300'..'399').to_a
256
256
  # but this was not frozen so easily.
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)
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
258
+ 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
259
 
259
- service = [ # Not exhaustive.
260
- '112',
261
- '113',
262
- '115',
263
- '116',
264
- '117',
265
- '118',
266
- '1515',
267
- '1518',
268
- '1530'
260
+ # Not exhaustive.
261
+ service = %w[
262
+ 112
263
+ 113
264
+ 115
265
+ 116
266
+ 117
267
+ 118
268
+ 1515
269
+ 1518
270
+ 1530
271
+ ]
272
+
273
+ # Not exhaustive. Unused below - just for info purposes.
274
+ free_of_charge_services = %w[
275
+ 800
276
+ 803
269
277
  ]
270
278
 
271
279
  Phony.define do
272
- country '39', trunk('', :normalize => false) |
273
- one_of(*service) >> split(3,3) |
274
- 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]
280
+ # NOTE: The 0 does not count towards NDC number length.
281
+ country '39', trunk('', normalize: false) |
282
+ one_of(*service) >> split(3, 3) |
283
+ one_of(*mobile) >> split(3, 4, -1..1) |
284
+ match(/^(800)\d{6}$/) >> split(6) | # 3-6, Special handling for 800 numbers.
285
+ match(/^(803)\d{3}$/) >> split(3) | # 3-3, Special handling for 803 numbers.
286
+ one_of(*ndcs_1digit) >> matched_split(
287
+ /\A\d{5}\z/ => [5],
288
+ /\A\d{6}\z/ => [4, 2],
289
+ /\A\d{7}\z/ => [4, 3],
290
+ /\A\d{8}\z/ => [4, 4],
291
+ /\A\d{9}\z/ => [4, 5]
281
292
  ) |
282
- one_of(*ndcs_4digit) >> matched_split(
283
- /^1\d{5}$/ => [6],
284
- /^1\d{6}$/ => [7],
285
- /^[^1]\d{4}$/ => [5],
286
- /^[^1]\d{5}$/ => [3,3]
293
+ one_of(*ndcs_2digit) >> matched_split(
294
+ /\A\d{4}\z/ => [4],
295
+ /\A\d{5}\z/ => [5],
296
+ /\A\d{6}\z/ => [6],
297
+ /\A\d{7}\z/ => [7],
298
+ /\A\d{8}\z/ => [8]
299
+ ) |
300
+ one_of(*ndcs_3digit) >> matched_split(
301
+ /\A\d{4}\z/ => [4],
302
+ /\A1\d{5}\z/ => [6],
303
+ /\A1\d{6}\z/ => [7],
304
+ /\A[^1]\d{4}\z/ => [5],
305
+ /\A[^1]\d{5}\z/ => [3, 3]
287
306
  )
288
307
  end