phony 1.9.0 → 2.19.14

Sign up to get free protection for your applications and to get access to all the features.
Files changed (82) hide show
  1. checksums.yaml +7 -0
  2. data/README.textile +64 -112
  3. data/lib/phony/config.rb +91 -0
  4. data/lib/phony/countries/argentina.rb +355 -0
  5. data/lib/phony/countries/austria.rb +56 -22
  6. data/lib/phony/countries/bangladesh.rb +57 -0
  7. data/lib/phony/countries/belarus.rb +133 -0
  8. data/lib/phony/countries/brazil.rb +101 -95
  9. data/lib/phony/countries/cambodia.rb +131 -0
  10. data/lib/phony/countries/china.rb +13 -6
  11. data/lib/phony/countries/croatia.rb +23 -0
  12. data/lib/phony/countries/georgia.rb +94 -0
  13. data/lib/phony/countries/germany.rb +66 -42
  14. data/lib/phony/countries/guinea.rb +46 -0
  15. data/lib/phony/countries/india.rb +50 -0
  16. data/lib/phony/countries/indonesia.rb +55 -0
  17. data/lib/phony/countries/ireland.rb +35 -28
  18. data/lib/phony/countries/italy.rb +272 -166
  19. data/lib/phony/countries/japan.rb +468 -0
  20. data/lib/phony/countries/kyrgyzstan.rb +120 -0
  21. data/lib/phony/countries/latvia.rb +43 -0
  22. data/lib/phony/countries/libya.rb +116 -0
  23. data/lib/phony/countries/malaysia.rb +31 -7
  24. data/lib/phony/countries/moldova.rb +53 -0
  25. data/lib/phony/countries/montenegro.rb +30 -0
  26. data/lib/phony/countries/myanmar.rb +55 -0
  27. data/lib/phony/countries/namibia.rb +37 -0
  28. data/lib/phony/countries/nepal.rb +73 -0
  29. data/lib/phony/countries/netherlands.rb +17 -5
  30. data/lib/phony/countries/pakistan.rb +121 -0
  31. data/lib/phony/countries/paraguay.rb +147 -0
  32. data/lib/phony/countries/{russia_kazakhstan_abhasia_south_osetia.rb → russia_kazakhstan_abkhasia_south_ossetia.rb} +35 -24
  33. data/lib/phony/countries/saudi_arabia.rb +40 -0
  34. data/lib/phony/countries/serbia.rb +47 -0
  35. data/lib/phony/countries/somalia.rb +26 -0
  36. data/lib/phony/countries/south_korea.rb +19 -10
  37. data/lib/phony/countries/sweden.rb +58 -38
  38. data/lib/phony/countries/taiwan.rb +28 -0
  39. data/lib/phony/countries/tajikistan.rb +79 -0
  40. data/lib/phony/countries/turkmenistan.rb +76 -0
  41. data/lib/phony/countries/ukraine.rb +630 -0
  42. data/lib/phony/countries/united_kingdom.rb +639 -44
  43. data/lib/phony/countries/uruguay.rb +53 -0
  44. data/lib/phony/countries/vietnam.rb +133 -0
  45. data/lib/phony/countries/zimbabwe.rb +39 -0
  46. data/lib/phony/countries.rb +901 -301
  47. data/lib/phony/country.rb +177 -20
  48. data/lib/phony/country_codes.rb +119 -101
  49. data/lib/phony/dsl.rb +113 -68
  50. data/lib/phony/local_splitters/fixed.rb +25 -1
  51. data/lib/phony/local_splitters/regex.rb +16 -2
  52. data/lib/phony/national_code.rb +7 -7
  53. data/lib/phony/national_splitters/default.rb +35 -3
  54. data/lib/phony/national_splitters/dsl.rb +12 -7
  55. data/lib/phony/national_splitters/fixed.rb +7 -1
  56. data/lib/phony/national_splitters/none.rb +7 -3
  57. data/lib/phony/national_splitters/regex.rb +6 -0
  58. data/lib/phony/national_splitters/variable.rb +13 -9
  59. data/lib/phony/trunk_code.rb +57 -0
  60. data/lib/phony/vanity.rb +3 -3
  61. data/lib/phony.rb +239 -55
  62. data/spec/functional/config_spec.rb +44 -0
  63. data/spec/functional/plausibility_spec.rb +656 -0
  64. data/spec/lib/phony/countries_spec.rb +1207 -119
  65. data/spec/lib/phony/country_codes_spec.rb +99 -81
  66. data/spec/lib/phony/country_spec.rb +54 -14
  67. data/spec/lib/phony/dsl_spec.rb +2 -2
  68. data/spec/lib/phony/local_splitters/fixed_spec.rb +4 -4
  69. data/spec/lib/phony/local_splitters/regex_spec.rb +50 -2
  70. data/spec/lib/phony/national_code_spec.rb +34 -34
  71. data/spec/lib/phony/national_splitters/default_spec.rb +34 -0
  72. data/spec/lib/phony/national_splitters/fixed_spec.rb +12 -6
  73. data/spec/lib/phony/national_splitters/none_spec.rb +13 -3
  74. data/spec/lib/phony/national_splitters/regex_spec.rb +1 -1
  75. data/spec/lib/phony/national_splitters/variable_spec.rb +11 -5
  76. data/spec/lib/phony/trunk_code_spec.rb +85 -0
  77. data/spec/lib/phony/vanity_spec.rb +15 -19
  78. data/spec/lib/phony_spec.rb +59 -277
  79. metadata +67 -34
  80. data/lib/phony/validator.rb +0 -26
  81. data/lib/phony/validators.rb +0 -88
  82. data/spec/lib/phony/validations_spec.rb +0 -109
@@ -1,22 +1,46 @@
1
+ # frozen_string_literal: true
2
+
1
3
  # Malaysian phone numbers.
2
4
  #
3
5
  # http://en.wikipedia.org/wiki/Telephone_numbers_in_Malaysia
4
6
  #
5
7
  ndcs = [
6
8
  '2', # Singapore
7
- '3', # Selangor & Federal Territories of Kuala Lumpur & Putrajaya & also Genting Highlands, Pahang
8
9
  '4', # Kedah, Penang & Perlis
9
10
  '5', # Perak & Cameron Highlands (Pahang)
10
11
  '6', # Melaka, Negeri Sembilan & Muar (Johor)
11
12
  '7', # Johor (except Muar)
12
13
  '9', # Kelantan, Pahang (except Cameron Highlands & Genting Highlands) & Terengganu
13
14
  ]
15
+
16
+ ndcs_two_digits = [
17
+ '80', # Domestic access code from East Malaysia to Brunei
18
+ '81', # Reserved number for future use
19
+ '82', # Sarawak – Kuching, Samarahan and Serian
20
+ '83', # Sarawak – Sri Aman and Betong
21
+ '84', # Sarawak – Sibu, Sarikei, Mukah and Kapit
22
+ '85', # Sarawak – Miri, Limbang and Lawas
23
+ '86', # Sarawak – Bintulu and Belaga
24
+ '87', # Labuan Interior Division, Sabah
25
+ '88', # Sabah – Kota Kinabalu and Kudat
26
+ '89', # Sabah – Lahad Datu, Sandakan and Tawau
27
+ ]
28
+
14
29
  mobile = %w{ 10 11 12 13 14 153 154 156 158 16 17 18 19 }
15
- service = %w{ 100 101 102 103 104 108 112 991 994 995 999 }
30
+ # service = %w{ 100 101 102 103 104 108 991 994 995 999 } # Emergeny and Service numbers, only 3 digits long
31
+ freephone = %w{ 300 700 800 }
32
+ ndcs_eight = [
33
+ '3' # Selangor & Federal Territories of Kuala Lumpur & Putrajaya & also Genting Highlands, Pahang
34
+ ]
16
35
 
17
36
  Phony.define do
18
- country '60', one_of(service) >> split(3,3) | # Service
19
- one_of(mobile) >> split(8) | # Mobile
20
- one_of(ndcs) >> split(8) | # 1-digit NDCs
21
- fixed(2) >> split(8) # 2-digit NDCs (Also, fallback)
22
- end
37
+ country '60',
38
+ trunk('0') |
39
+ one_of(freephone) >> split(2,4) | # Freephone, Tollfree, Forwarding
40
+ # one_of(service) >> none | # Service
41
+ one_of(mobile) >> split(3,4..5) | # Mobile
42
+ one_of(ndcs_two_digits) >> split(6) | # 2-digit NDCs
43
+ one_of(ndcs) >> split(7) | # 1-digit NDCs
44
+ one_of(ndcs_eight) >> split(8) | # 1-digit NDCs
45
+ fixed(2) >> split(8) # 2-digit NDCs (Also, fallback)
46
+ end
@@ -0,0 +1,53 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Moldova
4
+ # https://www.numberingplans.com/?page=dialling&sub=areacodes
5
+ # https://www.numberingplans.com/?page=plans&sub=phonenr&alpha_2_input=MD
6
+
7
+ ndcs_with_6_subscriber_numbers = %w(22)
8
+ ndcs_with_5_subscriber_numbers = %w(
9
+ 230
10
+ 231
11
+ 235
12
+ 236
13
+ 237
14
+ 241
15
+ 242
16
+ 243
17
+ 244
18
+ 246
19
+ 247
20
+ 248
21
+ 249
22
+ 250
23
+ 251
24
+ 252
25
+ 254
26
+ 256
27
+ 258
28
+ 259
29
+ 262
30
+ 263
31
+ 264
32
+ 265
33
+ 268
34
+ 269
35
+ 271
36
+ 272
37
+ 273
38
+ 277
39
+ 291
40
+ 293
41
+ 294
42
+ 297
43
+ 298
44
+ 299
45
+ )
46
+
47
+ Phony.define do
48
+ country '373',
49
+ trunk('0') |
50
+ one_of(ndcs_with_5_subscriber_numbers) >> split(3,2) |
51
+ one_of(ndcs_with_6_subscriber_numbers) >> split(3,3) |
52
+ fixed(3) >> split(3,2)
53
+ end
@@ -0,0 +1,30 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Montenegro
4
+ # https://www.numberingplans.com/?page=dialling&sub=areacodes
5
+ # https://www.numberingplans.com/?page=plans&sub=phonenr&alpha_2_input=ME
6
+
7
+ Phony.define do
8
+ country '382',
9
+ trunk('0') |
10
+ one_of(%w(80)) >> split(3,3) | # freephone
11
+ one_of(%w(20 30 31 40 52)) >> matched_split(
12
+ /\A\d{5}\z/ => [3,2],
13
+ /\A\d+\z/ => [3,3]) |
14
+ one_of(%w(32 33 50 51)) >> split(3,3) |
15
+ one_of(%w(77)) >> split(3,3) | # national geographic
16
+ one_of(%w(78)) >> split(3,3) | # VoIP telephony
17
+ one_of(%w(88)) >> split(3,3) | # shared cost
18
+ one_of(%w(94 95)) >> split(3,3) | # premium rate
19
+ one_of(%w(63 67 69 70)) >> matched_split(
20
+ /\A\d{3}\z/ => [3],
21
+ /\A\d{6}\z/ => [3,3],
22
+ /\A\d+\z/ => [3,3,4]) | # mobile, voicemail (mobile
23
+ one_of(%w(68)) >> matched_split(
24
+ /\A\d{2}\z/ => [2],
25
+ /\A\d{6}\z/ => [3,3],
26
+ /\A\d+\z/ => [2,4,4]) | # voicemail (mobile)
27
+ fixed(2) >> matched_split(
28
+ /\A\d{5}\z/ => [3,2],
29
+ /\A\d+\z/ => [3,3])
30
+ end
@@ -0,0 +1,55 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Myanmar: http://www.itu.int/dms_pub/itu-t/oth/02/02/T02020000920003PDFE.pdf
4
+ #
5
+ # formatting according to Google's libphonenumber library. (r680 7/30/2014)
6
+ # except for ANEE SAKHAN area, Yangon ZTE GSM, MEC Tel CDMA 800 Mhz which are
7
+ # not correctly handled by the google library
8
+
9
+ area_codes = [
10
+ '1',
11
+ '2',
12
+ '42',
13
+ '43',
14
+ '44',
15
+ '45',
16
+ '46',
17
+ '52',
18
+ '53',
19
+ '54',
20
+ '57',
21
+ '58',
22
+ '59',
23
+ '61',
24
+ '62',
25
+ '64',
26
+ '65',
27
+ '66',
28
+ '67',
29
+ '69',
30
+ '70',
31
+ '71',
32
+ '72',
33
+ '73',
34
+ '75',
35
+ '81',
36
+ '82',
37
+ '83',
38
+ '84',
39
+ '85',
40
+ '86'
41
+ ]
42
+
43
+ Phony.define do
44
+ country '95',
45
+ one_of(area_codes) >> matched_split(
46
+ /\A\d{5}\z/ => [2,3],
47
+ /\A\d{6}\z/ => [3,3],
48
+ /\A\d{7}\z/ => [3,4]
49
+ ) |
50
+ one_of('9') >> matched_split( # mobile operators
51
+ /\A\d{7}\z/ => [3,4],
52
+ /\A\d{8}\z/ => [4,4],
53
+ /\A\d{9}\z/ => [3,3,3]
54
+ )
55
+ end
@@ -0,0 +1,37 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Namibia
4
+ # https://www.numberingplans.com/?page=dialling&sub=areacodes
5
+ # https://www.numberingplans.com/?page=plans&sub=phonenr&alpha_2_input=NA
6
+
7
+ Phony.define do
8
+ country '264',
9
+ one_of(%w(632532)) >> split(4) |
10
+ one_of(%w(6342)) >> matched_split(
11
+ /\A\d{3}\z/ => [3],
12
+ /\A\d+\z/ => [3,3]) |
13
+ one_of(%w(6362 6638)) >> split(4) |
14
+ one_of(%w(6642)) >> matched_split(
15
+ /\A\d{4}\z/ => [4],
16
+ /\A\d+\z/ => [3,3]) |
17
+ one_of(%w(6751)) >> split(3,2) |
18
+ one_of(%w(628)) >> split(4) |
19
+ one_of(%w(658)) >> split(5) |
20
+ one_of(%w(668)) >> matched_split(
21
+ /\A\d{4}\z/ => [4],
22
+ /\A\d{5}\z/ => [3,2],
23
+ /\A\d+\z/ => [3,3]) |
24
+ one_of(%w(61 63 64 65 67)) >> matched_split(
25
+ /\A\d{6}\z/ => [3,3],
26
+ /\A\d+\z/ => [3,3,3]) |
27
+ one_of(%w(66)) >> matched_split(
28
+ /\A\d{4}\z/ => [4],
29
+ /\A\d+\z/ => [3,3]) |
30
+ one_of(%w(62)) >> split(3,3) |
31
+ one_of(%w(67)) >> matched_split(
32
+ /\A\d{6}\z/ => [3,3],
33
+ /\A\d{7}\z/ => [4,3],
34
+ /\A\d+\z/ => [3,3,3]) |
35
+ one_of(%w(60 81 82 83 85)) >> split(4,3) |
36
+ fixed(2) >> split(3,3)
37
+ end
@@ -0,0 +1,73 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Nepal
4
+ # https://www.numberingplans.com/?page=dialling&sub=areacodes
5
+ # https://www.numberingplans.com/?page=plans&sub=phonenr&alpha_2_input=NP
6
+
7
+ ndcs_with_7_subscriber_digits = %w(1)
8
+
9
+ ndcs_with_6_subscriber_digits = %w(
10
+ 10
11
+ 11
12
+ 21
13
+ 23
14
+ 24
15
+ 25
16
+ 26
17
+ 27
18
+ 29
19
+ 31
20
+ 33
21
+ 35
22
+ 36
23
+ 37
24
+ 38
25
+ 41
26
+ 44
27
+ 46
28
+ 47
29
+ 49
30
+ 51
31
+ 53
32
+ 55
33
+ 56
34
+ 57
35
+ 61
36
+ 63
37
+ 64
38
+ 66
39
+ 67
40
+ 68
41
+ 69
42
+ 71
43
+ 75
44
+ 76
45
+ 77
46
+ 78
47
+ 79
48
+ 81
49
+ 82
50
+ 83
51
+ 84
52
+ 86
53
+ 87
54
+ 89
55
+ 91
56
+ 92
57
+ 93
58
+ 94
59
+ 95
60
+ 96
61
+ 97
62
+ 99
63
+ )
64
+
65
+ Phony.define do
66
+ country '977',
67
+ one_of(ndcs_with_6_subscriber_digits) >> split(3,3) |
68
+ one_of(%w(98)) >> split(4,4) | # mobile
69
+ one_of(ndcs_with_7_subscriber_digits) >> split(3,4) |
70
+ fixed(2) >> split(3,3)
71
+ end
72
+
73
+
@@ -1,4 +1,7 @@
1
- # The Netherlands use a variable-length ndc code, thus we use a separate file to not let all_other.rb explode.
1
+ # frozen_string_literal: true
2
+
3
+ # The Netherlands use a variable-length ndc code, thus we use a separate file to not let all_other.rb explode. The
4
+ # latest version of the numbering plan is available at http://wetten.overheid.nl/BWBR0010198/
2
5
  #
3
6
  # Note: The netherlands use a variable ndc format from length 2 to 3.
4
7
  # To save space, we only use ndcs of length 2 (and use the fallback of 3 to handle the rest).
@@ -43,6 +46,9 @@ service = [
43
46
  '87', # Both of the above.
44
47
  '88', # Bedrijfsnummers
45
48
  '91', # Plaatsonafhankelijk netnummer
49
+ ]
50
+
51
+ service3 = [
46
52
  '676', # Inbelnummers van Internetproviders
47
53
  '800', # Gratis informatienummers
48
54
  '900', # Betaalde informatienummers
@@ -51,7 +57,13 @@ service = [
51
57
  ]
52
58
 
53
59
  Phony.define do
54
- country '31', one_of(service) >> split(3,3) |
55
- one_of(['6'] + ndcs) >> split(8) | # mobile + landline
56
- fixed(3) >> split(8) # 8 is for mobile numbers, other numbers will work as well (they use 7).
57
- end
60
+ country '31',
61
+ trunk('0', :normalize => true) |
62
+ match(/\A(97[0,9])\d{8}\z/) >> split(4,4) | # machine-to-machine
63
+ one_of(service) >> split(4,3) |
64
+ match(/\A(800|900)\d{4}\z/) >> split(4) |
65
+ one_of(service3) >> split(4,3) |
66
+ one_of('6') >> split(2,2,2,2) | # mobile
67
+ one_of(ndcs) >> split(3,4) | # landline (geographic region)
68
+ fixed(3) >> split(3,3) # 3 digit ndc
69
+ end
@@ -0,0 +1,121 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Pakistan (Islamic Republic of)
4
+ # https://www.numberingplans.com/?page=plans&sub=phonenr&alpha_2_input=PK
5
+
6
+ ndcs_with_8_subscriber_numbers = %w(21 42 58)
7
+
8
+ ndcs_with_7_subscriber_numbers = %w(
9
+ 22
10
+ 25
11
+ 40
12
+ 41
13
+ 44
14
+ 46
15
+ 47
16
+ 48
17
+ 49
18
+ 51
19
+ 52
20
+ 53
21
+ 55
22
+ 56
23
+ 57
24
+ 61
25
+ 62
26
+ 63
27
+ 64
28
+ 65
29
+ 66
30
+ 67
31
+ 68
32
+ 71
33
+ 74
34
+ 81
35
+ 86
36
+ 91
37
+ )
38
+
39
+ ndcs_with_6_subscriber_numbers = %w(
40
+ 232
41
+ 233
42
+ 235
43
+ 238
44
+ 242
45
+ 243
46
+ 244
47
+ 297
48
+ 298
49
+ 453
50
+ 454
51
+ 457
52
+ 459
53
+ 542
54
+ 543
55
+ 544
56
+ 546
57
+ 547
58
+ 604
59
+ 606
60
+ 608
61
+ 722
62
+ 723
63
+ 726
64
+ 822
65
+ 823
66
+ 824
67
+ 825
68
+ 826
69
+ 828
70
+ 829
71
+ 832
72
+ 833
73
+ 835
74
+ 837
75
+ 838
76
+ 843
77
+ 844
78
+ 847
79
+ 848
80
+ 852
81
+ 853
82
+ 855
83
+ 856
84
+ 922
85
+ 923
86
+ 924
87
+ 925
88
+ 926
89
+ 927
90
+ 928
91
+ 932
92
+ 937
93
+ 938
94
+ 939
95
+ 942
96
+ 943
97
+ 944
98
+ 945
99
+ 946
100
+ 963
101
+ 965
102
+ 966
103
+ 969
104
+ 992
105
+ 995
106
+ 996
107
+ 997
108
+ 998
109
+ )
110
+
111
+ Phony.define do
112
+
113
+ country '92',
114
+ one_of(ndcs_with_6_subscriber_numbers) >> split(3,3) |
115
+ one_of('122') >> split(3,3) | # universal access
116
+ one_of(ndcs_with_7_subscriber_numbers) >> split(4,3) |
117
+ one_of(ndcs_with_8_subscriber_numbers) >> split(4,4) |
118
+ one_of(%w(30 31 32 33 34 35 36)) >> split(4,4) | # mobile
119
+ fixed(2) >> split(4,4)
120
+
121
+ end
@@ -0,0 +1,147 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Paraguay (Republic of)
4
+ # https://www.numberingplans.com/?page=dialling&sub=areacodes
5
+ # https://www.numberingplans.com/?page=plans&sub=phonenr&alpha_2_input=PY
6
+
7
+ ndcs_with_6_7_subscriber_numbers = %w(
8
+ 21
9
+ 24
10
+ 25
11
+ 26
12
+ 28
13
+ 31
14
+ 32
15
+ 33
16
+ 36
17
+ 37
18
+ 38
19
+ 39
20
+ 41
21
+ 42
22
+ 43
23
+ 44
24
+ 46
25
+ 47
26
+ 48
27
+ 61
28
+ 71
29
+ 72
30
+ 73
31
+ 75
32
+ 81
33
+ 82
34
+ 83
35
+ 86
36
+ 91
37
+ 92
38
+ 93
39
+ 94
40
+ )
41
+
42
+ ndcs_with_6_subscriber_numbers = %w(
43
+ 271
44
+ 275
45
+ 291
46
+ 292
47
+ 293
48
+ 294
49
+ 295
50
+ 345
51
+ 351
52
+ 418
53
+ 451
54
+ 453
55
+ 464
56
+ 511
57
+ 512
58
+ 513
59
+ 514
60
+ 515
61
+ 516
62
+ 517
63
+ 518
64
+ 519
65
+ 520
66
+ 521
67
+ 522
68
+ 523
69
+ 524
70
+ 527
71
+ 528
72
+ 529
73
+ 531
74
+ 532
75
+ 533
76
+ 534
77
+ 535
78
+ 536
79
+ 537
80
+ 538
81
+ 539
82
+ 541
83
+ 542
84
+ 544
85
+ 545
86
+ 546
87
+ 547
88
+ 548
89
+ 549
90
+ 550
91
+ 552
92
+ 553
93
+ 554
94
+ 631
95
+ 632
96
+ 633
97
+ 644
98
+ 671
99
+ 672
100
+ 673
101
+ 674
102
+ 675
103
+ 676
104
+ 677
105
+ 678
106
+ 717
107
+ 718
108
+ 740
109
+ 741
110
+ 742
111
+ 743
112
+ 761
113
+ 762
114
+ 763
115
+ 764
116
+ 767
117
+ 768
118
+ 780
119
+ 781
120
+ 782
121
+ 783
122
+ 784
123
+ 785
124
+ 787
125
+ 858
126
+ 871
127
+ 873
128
+ 918
129
+ 951
130
+ 952
131
+ )
132
+
133
+ Phony.define do
134
+
135
+ country '595',
136
+ one_of(ndcs_with_6_subscriber_numbers) >> split(3,3) | # geographic
137
+ one_of(ndcs_with_6_7_subscriber_numbers) >>
138
+ matched_split(
139
+ /\A\d{6}\z/ => [3,3],
140
+ /\A\d+\z/ => [3,4]) | # geographic
141
+ one_of(%w(96 97 98 99)) >> split(3,4) | # mobile
142
+ fixed(2) >>
143
+ matched_split(
144
+ /\A\d{6}\z/ => [3,3],
145
+ /\A\d+\z/ => [3,4])
146
+
147
+ end