phony 1.9.0 → 2.19.14
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/README.textile +64 -112
- data/lib/phony/config.rb +91 -0
- data/lib/phony/countries/argentina.rb +355 -0
- data/lib/phony/countries/austria.rb +56 -22
- data/lib/phony/countries/bangladesh.rb +57 -0
- data/lib/phony/countries/belarus.rb +133 -0
- data/lib/phony/countries/brazil.rb +101 -95
- data/lib/phony/countries/cambodia.rb +131 -0
- data/lib/phony/countries/china.rb +13 -6
- data/lib/phony/countries/croatia.rb +23 -0
- data/lib/phony/countries/georgia.rb +94 -0
- data/lib/phony/countries/germany.rb +66 -42
- data/lib/phony/countries/guinea.rb +46 -0
- data/lib/phony/countries/india.rb +50 -0
- data/lib/phony/countries/indonesia.rb +55 -0
- data/lib/phony/countries/ireland.rb +35 -28
- data/lib/phony/countries/italy.rb +272 -166
- data/lib/phony/countries/japan.rb +468 -0
- data/lib/phony/countries/kyrgyzstan.rb +120 -0
- data/lib/phony/countries/latvia.rb +43 -0
- data/lib/phony/countries/libya.rb +116 -0
- data/lib/phony/countries/malaysia.rb +31 -7
- data/lib/phony/countries/moldova.rb +53 -0
- data/lib/phony/countries/montenegro.rb +30 -0
- data/lib/phony/countries/myanmar.rb +55 -0
- data/lib/phony/countries/namibia.rb +37 -0
- data/lib/phony/countries/nepal.rb +73 -0
- data/lib/phony/countries/netherlands.rb +17 -5
- data/lib/phony/countries/pakistan.rb +121 -0
- data/lib/phony/countries/paraguay.rb +147 -0
- data/lib/phony/countries/{russia_kazakhstan_abhasia_south_osetia.rb → russia_kazakhstan_abkhasia_south_ossetia.rb} +35 -24
- data/lib/phony/countries/saudi_arabia.rb +40 -0
- data/lib/phony/countries/serbia.rb +47 -0
- data/lib/phony/countries/somalia.rb +26 -0
- data/lib/phony/countries/south_korea.rb +19 -10
- data/lib/phony/countries/sweden.rb +58 -38
- data/lib/phony/countries/taiwan.rb +28 -0
- data/lib/phony/countries/tajikistan.rb +79 -0
- data/lib/phony/countries/turkmenistan.rb +76 -0
- data/lib/phony/countries/ukraine.rb +630 -0
- data/lib/phony/countries/united_kingdom.rb +639 -44
- data/lib/phony/countries/uruguay.rb +53 -0
- data/lib/phony/countries/vietnam.rb +133 -0
- data/lib/phony/countries/zimbabwe.rb +39 -0
- data/lib/phony/countries.rb +901 -301
- data/lib/phony/country.rb +177 -20
- data/lib/phony/country_codes.rb +119 -101
- data/lib/phony/dsl.rb +113 -68
- data/lib/phony/local_splitters/fixed.rb +25 -1
- data/lib/phony/local_splitters/regex.rb +16 -2
- data/lib/phony/national_code.rb +7 -7
- data/lib/phony/national_splitters/default.rb +35 -3
- data/lib/phony/national_splitters/dsl.rb +12 -7
- data/lib/phony/national_splitters/fixed.rb +7 -1
- data/lib/phony/national_splitters/none.rb +7 -3
- data/lib/phony/national_splitters/regex.rb +6 -0
- data/lib/phony/national_splitters/variable.rb +13 -9
- data/lib/phony/trunk_code.rb +57 -0
- data/lib/phony/vanity.rb +3 -3
- data/lib/phony.rb +239 -55
- data/spec/functional/config_spec.rb +44 -0
- data/spec/functional/plausibility_spec.rb +656 -0
- data/spec/lib/phony/countries_spec.rb +1207 -119
- data/spec/lib/phony/country_codes_spec.rb +99 -81
- data/spec/lib/phony/country_spec.rb +54 -14
- data/spec/lib/phony/dsl_spec.rb +2 -2
- data/spec/lib/phony/local_splitters/fixed_spec.rb +4 -4
- data/spec/lib/phony/local_splitters/regex_spec.rb +50 -2
- data/spec/lib/phony/national_code_spec.rb +34 -34
- data/spec/lib/phony/national_splitters/default_spec.rb +34 -0
- data/spec/lib/phony/national_splitters/fixed_spec.rb +12 -6
- data/spec/lib/phony/national_splitters/none_spec.rb +13 -3
- data/spec/lib/phony/national_splitters/regex_spec.rb +1 -1
- data/spec/lib/phony/national_splitters/variable_spec.rb +11 -5
- data/spec/lib/phony/trunk_code_spec.rb +85 -0
- data/spec/lib/phony/vanity_spec.rb +15 -19
- data/spec/lib/phony_spec.rb +59 -277
- metadata +67 -34
- data/lib/phony/validator.rb +0 -26
- data/lib/phony/validators.rb +0 -88
- 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
|
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',
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
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
|
-
#
|
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',
|
55
|
-
|
56
|
-
|
57
|
-
|
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
|