phony 2.16.4 → 2.20.8
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/README.textile +34 -6
- data/lib/phony/config.rb +91 -0
- data/lib/phony/countries/argentina.rb +355 -0
- data/lib/phony/countries/austria.rb +4 -2
- data/lib/phony/countries/bangladesh.rb +2 -0
- data/lib/phony/countries/belarus.rb +2 -0
- data/lib/phony/countries/brazil.rb +4 -2
- data/lib/phony/countries/cambodia.rb +3 -5
- data/lib/phony/countries/china.rb +7 -2
- data/lib/phony/countries/croatia.rb +2 -0
- data/lib/phony/countries/georgia.rb +2 -0
- data/lib/phony/countries/germany.rb +5 -2
- data/lib/phony/countries/guinea.rb +8 -5
- data/lib/phony/countries/india.rb +2 -0
- data/lib/phony/countries/indonesia.rb +2 -0
- data/lib/phony/countries/ireland.rb +27 -23
- data/lib/phony/countries/italy.rb +40 -18
- data/lib/phony/countries/japan.rb +61 -8
- data/lib/phony/countries/kyrgyzstan.rb +2 -0
- data/lib/phony/countries/latvia.rb +2 -0
- data/lib/phony/countries/libya.rb +3 -1
- data/lib/phony/countries/malaysia.rb +22 -2
- data/lib/phony/countries/moldova.rb +2 -0
- data/lib/phony/countries/montenegro.rb +2 -0
- data/lib/phony/countries/myanmar.rb +2 -0
- data/lib/phony/countries/namibia.rb +2 -0
- data/lib/phony/countries/nepal.rb +2 -0
- data/lib/phony/countries/netherlands.rb +2 -0
- data/lib/phony/countries/pakistan.rb +2 -0
- data/lib/phony/countries/paraguay.rb +2 -0
- data/lib/phony/countries/russia_kazakhstan_abkhasia_south_ossetia.rb +22 -13
- data/lib/phony/countries/saudi_arabia.rb +2 -0
- data/lib/phony/countries/serbia.rb +7 -1
- data/lib/phony/countries/somalia.rb +2 -0
- data/lib/phony/countries/south_korea.rb +7 -2
- data/lib/phony/countries/sweden.rb +2 -0
- data/lib/phony/countries/taiwan.rb +3 -0
- data/lib/phony/countries/tajikistan.rb +2 -0
- data/lib/phony/countries/turkmenistan.rb +2 -0
- data/lib/phony/countries/ukraine.rb +3 -0
- data/lib/phony/countries/united_kingdom.rb +5 -2
- data/lib/phony/countries/uruguay.rb +2 -0
- data/lib/phony/countries/vietnam.rb +93 -93
- data/lib/phony/countries/zimbabwe.rb +2 -0
- data/lib/phony/countries.rb +142 -64
- data/lib/phony/country.rb +15 -3
- data/lib/phony/country_codes.rb +16 -3
- data/lib/phony/dsl.rb +5 -3
- data/lib/phony/local_splitters/fixed.rb +2 -0
- data/lib/phony/national_code.rb +1 -1
- data/lib/phony/national_splitters/none.rb +1 -3
- data/lib/phony/trunk_code.rb +5 -5
- data/lib/phony.rb +62 -57
- data/spec/functional/config_spec.rb +44 -0
- data/spec/functional/plausibility_spec.rb +285 -18
- data/spec/lib/phony/countries_spec.rb +140 -39
- data/spec/lib/phony/country_codes_spec.rb +82 -58
- data/spec/lib/phony/country_spec.rb +29 -9
- data/spec/lib/phony/dsl_spec.rb +7 -3
- data/spec/lib/phony/local_splitters/regex_spec.rb +19 -15
- data/spec/lib/phony/national_code_spec.rb +15 -45
- data/spec/lib/phony/national_splitters/fixed_spec.rb +12 -16
- data/spec/lib/phony/national_splitters/none_spec.rb +3 -3
- data/spec/lib/phony/national_splitters/variable_spec.rb +9 -13
- data/spec/lib/phony/trunk_code_spec.rb +85 -0
- data/spec/lib/phony/vanity_spec.rb +4 -4
- data/spec/lib/phony_spec.rb +63 -67
- metadata +13 -8
data/lib/phony/countries.rb
CHANGED
@@ -1,4 +1,6 @@
|
|
1
1
|
# -*- coding: utf-8 -*-
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
2
4
|
# All countries, ordered by country code.
|
3
5
|
#
|
4
6
|
# Definitions are in the format:
|
@@ -67,7 +69,7 @@ Phony.define do
|
|
67
69
|
country '20', one_of('800') >> split(7..7) | # Egypt toll free
|
68
70
|
one_of('3') >> split(7..7) | # Alexandria
|
69
71
|
one_of('2') >> split(8..8) | # Cairo/Giza
|
70
|
-
one_of('10', '11', '12') >> split(8..8) | # the
|
72
|
+
one_of('10', '11', '12', '15') >> split(8..8) | # the 4 mobile operators
|
71
73
|
fixed(2) >> split(7..7) # all the other 24 provinces
|
72
74
|
|
73
75
|
# South Africa.
|
@@ -94,15 +96,16 @@ Phony.define do
|
|
94
96
|
# Belgium.
|
95
97
|
#
|
96
98
|
# http://en.wikipedia.org/wiki/Telephone_numbers_in_Belgium
|
99
|
+
# https://www.bipt.be/operators/publication/national-numbering-plan
|
97
100
|
#
|
98
101
|
country '32', trunk('0') |
|
99
|
-
match(/^(7[08])\d+$/)
|
100
|
-
match(/^(800|90\d)\d+$/)
|
101
|
-
match(/^(46[
|
102
|
-
match(/^(4[789]\d)\d{6}$/)
|
103
|
-
match(/^(
|
104
|
-
one_of('2','3','4','9')
|
105
|
-
fixed(2)
|
102
|
+
match(/^(7[08])\d+$/) >> split(3,3) | # Premium and national rate Services
|
103
|
+
match(/^(800|90\d)\d+$/) >> split(2,3) | # Toll free service and premium numbers
|
104
|
+
match(/^(46[056789])\d{6}$/) >> split(2,2,2) | # Mobile (Lycamobile, Telenet, Join Experience, Proximus 0460)
|
105
|
+
match(/^(4[789]\d)\d{6}$/) >> split(2,2,2) | # Mobile
|
106
|
+
match(/^(45[56])\d{6}$/) >> split(2,2,2) | # Mobile Vikings and Voo
|
107
|
+
one_of('2','3','4','9') >> split(3,2,2) | # Short NDCs
|
108
|
+
fixed(2) >> split(2,2,2) # 2-digit NDCs
|
106
109
|
|
107
110
|
# France.
|
108
111
|
#
|
@@ -152,6 +155,7 @@ Phony.define do
|
|
152
155
|
#
|
153
156
|
country '41',
|
154
157
|
trunk('0', normalize: true) |
|
158
|
+
match(/^(860)\d+$/) >> split(2, 3, 2, 2) | # Voice Mail access
|
155
159
|
match(/^(8(?:00|4[0248]))\d+$/) >> split(3,3) | # Freecall/Shared Cost
|
156
160
|
match(/^(90[016])\d+$/) >> split(3,3) | # Business
|
157
161
|
fixed(2) >> split(3,2,2)
|
@@ -184,11 +188,13 @@ Phony.define do
|
|
184
188
|
# country '49' # Germany, see special file.
|
185
189
|
|
186
190
|
# Peru.
|
187
|
-
#
|
191
|
+
# Note: https://en.wikipedia.org/wiki/Telephone_numbers_in_Peru
|
192
|
+
# Note: https://www.numberingplans.com/?page=plans&sub=phonenr&alpha_2_input=PE
|
188
193
|
country '51',
|
189
194
|
one_of('103', '105') >> split(3,3) | # Service.
|
190
|
-
one_of('
|
191
|
-
|
195
|
+
one_of('9') >> split(4,4) | # Mobile.
|
196
|
+
one_of('1') >> split(3,4) | # Lima.
|
197
|
+
fixed(2) >> split(3,3) # 2-digit NDCs.
|
192
198
|
|
193
199
|
# Mexico.
|
194
200
|
#
|
@@ -209,14 +215,7 @@ Phony.define do
|
|
209
215
|
fixed(3) >> split(7) # 3-digit NDCs
|
210
216
|
|
211
217
|
# Argentine Republic.
|
212
|
-
#
|
213
|
-
country '54',
|
214
|
-
one_of('11', '911') >> split(4,4) | # Fixed & Mobile
|
215
|
-
match(/^(22[0137]|237|26[14]|29[179]|34[1235]|35[138]|38[1578])/) >> split(3,4) | # Fixed
|
216
|
-
match(/^(922[0137]|9237|926[14]|929[179]|934[1235]|935[138]|938[1578])/) >> split(3,4) | # Mobile
|
217
|
-
match(/^(9\d{4})/) >> split(2,4) | # Mobile
|
218
|
-
match(/^([68]\d{2})/) >> split(3,4) | # Service
|
219
|
-
fixed(4) >> split(2,4) # Fixed
|
218
|
+
# country '54' # argentina, see special file.
|
220
219
|
|
221
220
|
# Brazil (Federative Republic of).
|
222
221
|
# http://en.wikipedia.org/wiki/Telephone_numbers_in_Brazil
|
@@ -233,6 +232,7 @@ Phony.define do
|
|
233
232
|
# http://www.itu.int/oth/T020200002C/en
|
234
233
|
country '57',
|
235
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) |
|
236
236
|
fixed(1) >> split(3,4)
|
237
237
|
|
238
238
|
# Venezuela (Bolivarian Republic of)
|
@@ -260,9 +260,10 @@ Phony.define do
|
|
260
260
|
trunk('0') |
|
261
261
|
# 7/10 digits for area code '2'.
|
262
262
|
match(/\A(2)\d{10}\z/) >> split(10) |
|
263
|
+
match(/\A(2)\d{8}\z/) >> split(8) |
|
263
264
|
one_of('2') >> split(7) |
|
264
265
|
# mobile
|
265
|
-
match(/\A(
|
266
|
+
match(/\A([89]\d\d)\d{7}\z/) >> split(7) |
|
266
267
|
match(/\A(9\d\d)\d+\z/) >> split(6) |
|
267
268
|
#
|
268
269
|
fixed(2) >> split(7)
|
@@ -354,20 +355,37 @@ Phony.define do
|
|
354
355
|
|
355
356
|
# Côte d'Ivoire
|
356
357
|
# http://www.wtng.info/wtng-225-ci.html
|
357
|
-
#
|
358
|
+
# https://www.itu.int/dms_pub/itu-t/oth/02/02/T02020000310006PDFE.pdf
|
358
359
|
# http://en.wikipedia.org/wiki/Telephone_numbers_in_Ivory_Coast
|
359
360
|
#
|
360
361
|
# There is no trunk code for this country and several of the mobile prefixes start with 0
|
361
362
|
country '225',
|
362
363
|
trunk('', :normalize => false) |
|
363
|
-
fixed(2) >> split(2,2,2)
|
364
|
+
fixed(2) >> split(2,2,2,2)
|
365
|
+
|
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)
|
364
374
|
|
365
|
-
country '226', none >> split(4,4) # Burkina Faso http://www.wtng.info/wtng-226-bf.html
|
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
|
-
|
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
|
@@ -385,18 +403,25 @@ Phony.define do
|
|
385
403
|
# Ghana
|
386
404
|
#
|
387
405
|
# From http://www.itu.int/oth/T0202000052/en
|
406
|
+
# https://en.wikipedia.org/wiki/Telephone_numbers_in_Ghana
|
388
407
|
#
|
389
|
-
country '233', fixed(2) >> split(3,4)
|
408
|
+
country '233', trunk('0') | fixed(2) >> split(3,4)
|
390
409
|
|
391
410
|
# Nigeria
|
392
|
-
#
|
411
|
+
# 3 4 split for mobile and 1 digit NDC, 3 2 or 3 3 otherwise
|
412
|
+
# Many local numbers with no splitting
|
393
413
|
#
|
394
|
-
# mobile telephony number allocation taken from:
|
414
|
+
# mobile telephony number allocation taken from:
|
415
|
+
# https://www.ncc.gov.ng/technical-regulation/standards/numbering and
|
416
|
+
# https://www.itu.int/oth/T020200009C/en
|
395
417
|
country '234',
|
396
|
-
match(/^([7-9]0\d)\d+$/)
|
397
|
-
match(/^(81\d)\d+$/)
|
398
|
-
|
399
|
-
|
418
|
+
match(/^([7-9]0\d)\d+$/) >> split(3,4) | # Mobile
|
419
|
+
match(/^(81\d)\d+$/) >> split(3,4) | # Mobile
|
420
|
+
match(/^(91\d)\d+$/) >> split(3,4) | # Mobile
|
421
|
+
one_of('1', '2') >> split(3,3..4) | # Lagos, Ibadan
|
422
|
+
one_of('9') >> split(3,4) | # Abuja
|
423
|
+
one_of((30..79).map(&:to_s)) >> split(3,2..3) | # 2-digit NDC
|
424
|
+
one_of(%w(82 83 84 85 86 87 88 89)) >> split(3,3) # 2-digit NDC
|
400
425
|
|
401
426
|
country '235', none >> split(4,4) # Chad http://www.wtng.info/wtng-235-td.html
|
402
427
|
country '236', none >> split(4,4) # Central African Republic http://www.wtng.info/wtng-236-cf.html
|
@@ -405,7 +430,9 @@ Phony.define do
|
|
405
430
|
country '239', fixed(1) >> split(3,3) # Sao Tome and Principe, http://www.wtng.info/wtng-239-st.html
|
406
431
|
|
407
432
|
country '240', none >> split(3,3,3) # Equatorial Guinea
|
408
|
-
country '241',
|
433
|
+
country '241',
|
434
|
+
match(/^(\d)\d{6}$/) >> split(3,3) | # Gabonese Republic http://www.wtng.info/wtng-241-ga.html
|
435
|
+
match(/^(\d\d)\d{6}$/) >> split(2,2,2) # 2019 update https://en.wikipedia.org/wiki/Telephone_numbers_in_Gabon
|
409
436
|
country '242', # Congo http://www.wtng.info/wtng-242-cg.html
|
410
437
|
trunk('', :normalize => false) |
|
411
438
|
none >> split(4,5)
|
@@ -425,9 +452,9 @@ Phony.define do
|
|
425
452
|
# http://en.wikipedia.org/wiki/Telephone_numbers_in_Rwanda
|
426
453
|
country '250',
|
427
454
|
trunk('0') |
|
428
|
-
one_of('25')
|
429
|
-
match(/^(7[
|
430
|
-
one_of('06')
|
455
|
+
one_of('25') >> split(7) | # Geographic, fixed
|
456
|
+
match(/^(7[2389])/) >> split(7) | # Non-geographic, mobile
|
457
|
+
one_of('06') >> split(6) # Satellite
|
431
458
|
|
432
459
|
country '251', fixed(2) >> split(3, 4) # Ethiopia http://www.wtng.info/wtng-251-et.html
|
433
460
|
|
@@ -478,27 +505,32 @@ Phony.define do
|
|
478
505
|
# Zambia
|
479
506
|
# http://www.wtng.info/wtng-260-zm.html
|
480
507
|
# https://github.com/googlei18n/libphonenumber/
|
508
|
+
# https://en.wikipedia.org/wiki/Telephone_numbers_in_Zambia
|
509
|
+
|
481
510
|
country '260',
|
482
|
-
|
483
|
-
match(/^(
|
484
|
-
match(/^(
|
511
|
+
trunk('0') |
|
512
|
+
match(/^(75|76|77|94|95|96|97)/) >> split(3, 4) | # Mobile
|
513
|
+
match(/^(800)/) >> split(3,3) | # Toll free
|
514
|
+
match(/^(21[1-8])/) >> split(6) # Fixed
|
485
515
|
|
486
|
-
# Madagascar
|
516
|
+
# Madagascar
|
517
|
+
# https://en.wikipedia.org/wiki/Telephone_numbers_in_Madagascar
|
487
518
|
# http://www.itu.int/oth/T020200007F/en
|
488
519
|
country '261',
|
489
|
-
none >> matched_split(
|
490
|
-
|
491
|
-
|
492
|
-
|
493
|
-
|
494
|
-
|
495
|
-
|
496
|
-
|
497
|
-
|
498
|
-
|
499
|
-
|
500
|
-
|
501
|
-
)
|
520
|
+
# none >> matched_split(
|
521
|
+
# /\A20\d+\z/ => [2,2,3,2], # Telecom Malagasy (Telma)
|
522
|
+
# /\A32\d+\z/ => [2,2,3,2], # mobile Orange Madagascar
|
523
|
+
# /\A33\d+\z/ => [2,2,3,2], # mobile Airtel Madagascar
|
524
|
+
# /\A34\d+\z/ => [2,2,3,2], # mobile Telecom Malagasy (Telma)
|
525
|
+
# /\A38\d+\z/ => [2,2,3,2], # mobile Telecom Malagasy (Telma)
|
526
|
+
# /\A39\d+\z => [2,2,3,2] # mobile Blueline
|
527
|
+
# ),
|
528
|
+
match(/\A(20)\d+\z/) >> split(2,3,2) | # fix Telecom Malagasy (Telma)
|
529
|
+
match(/\A(32)\d+\z/) >> split(2,3,2) | # mobile Orange Madagascar
|
530
|
+
match(/\A(33)\d+\z/) >> split(2,3,2) | # mobile Airtel Madagascar
|
531
|
+
match(/\A(34)\d+\z/) >> split(2,3,2) | # mobile Telecom Malagasy (Telma)
|
532
|
+
match(/\A(38)\d+\z/) >> split(2,3,2) | # mobile Telecom Malagasy (Telma)
|
533
|
+
match(/\A(39)\d+\z/) >> split(2,3,2) # mobile Blueline Madagascar
|
502
534
|
|
503
535
|
country '262', # Reunion / Mayotte (new) http://www.wtng.info/wtng-262-fr.html
|
504
536
|
trunk('0') |
|
@@ -679,9 +711,28 @@ Phony.define do
|
|
679
711
|
|
680
712
|
# Bulgaria
|
681
713
|
#
|
714
|
+
# Note: https://www.numberingplans.com/?page=plans&sub=phonenr&alpha_2_input=BG
|
715
|
+
# Note: https://en.wikipedia.org/wiki/Telephone_numbers_in_Bulgaria
|
682
716
|
country '359',
|
683
717
|
trunk('0') |
|
684
|
-
|
718
|
+
match(/^(2)\d{6}$/) >> split(3,3) | # Landline Sofia (optional last digit)
|
719
|
+
match(/^(2)\d{7}$/) >> split(3,4) | # Landline Sofia (optional last digit)
|
720
|
+
match(/^(30|31|33|36|37|39|41|43\d|45|47|51|53|55|57|59)\d{5}$/) >> split(5) |
|
721
|
+
match(/^(30|31|32|33|34|35|36|37|38|39|41|42|44|45|46|47|51|52|53|54|55|56|57|58|59)\d{6}$/) >> split(2,4) |
|
722
|
+
|
723
|
+
match(/^(60|61|63|65|66|69)\d{5}$/) >> split(5) |
|
724
|
+
match(/^(60|61|62|63|64|65|66|68|69)\d{6}$/) >> split(6) |
|
725
|
+
|
726
|
+
match(/^(700|701|703|704|705|706|707|708|709)\d{5}$/) >> split(5) |
|
727
|
+
match(/^(701|702|703|704|705|706|707|708|709)\d{4}$/) >> split(4) |
|
728
|
+
|
729
|
+
match(/^(71|72|74|75|77)\d{5}$/) >> split(5) |
|
730
|
+
match(/^(71|72|73|74|75|76|77|78|79)\d{6}$/) >> split(6) |
|
731
|
+
|
732
|
+
match(/^(80\d|81|91|93|95|97)\d{5}$/) >> split(5) |
|
733
|
+
match(/^(81|82|84|86)\d{6}$/) >> split(6) |
|
734
|
+
match(/^(87|88|89)\d{7}$/) >> split(4,3) |
|
735
|
+
match(/^(90|91|92|93|94|95|96|97|98\d|99\d)\d{6}$/) >> split(6)
|
685
736
|
|
686
737
|
# Lithuania
|
687
738
|
#
|
@@ -715,11 +766,12 @@ Phony.define do
|
|
715
766
|
# Monaco
|
716
767
|
#
|
717
768
|
country '377',
|
718
|
-
one_of('6')
|
769
|
+
one_of('6') >> split(2,2,2,2) | # mobile
|
719
770
|
fixed(2) >> split(2,2,2)
|
720
771
|
|
721
772
|
# San Marino
|
722
773
|
country '378',
|
774
|
+
trunk('', :normalize => false) |
|
723
775
|
none >> matched_split(
|
724
776
|
/\A\d{6}\z/ => [3,3],
|
725
777
|
/\A\d+\z/ => [3,3,4]
|
@@ -733,7 +785,13 @@ Phony.define do
|
|
733
785
|
|
734
786
|
# country '382' # Montenegro, see special file
|
735
787
|
|
736
|
-
|
788
|
+
# Kosovo
|
789
|
+
#
|
790
|
+
# Note: https://en.wikipedia.org/wiki/Telephone_numbers_in_Kosovo
|
791
|
+
country '383',
|
792
|
+
trunk('0') |
|
793
|
+
fixed(2) >> split(3,3)
|
794
|
+
|
737
795
|
country '384', todo # -
|
738
796
|
|
739
797
|
# country '385' # Croatia, see special file.
|
@@ -871,7 +929,14 @@ Phony.define do
|
|
871
929
|
)
|
872
930
|
|
873
931
|
country '671', todo # Spare code
|
874
|
-
|
932
|
+
|
933
|
+
# Australian External Territories https://en.wikipedia.org/wiki/Telephone_numbers_in_Norfolk_Island
|
934
|
+
# Norfolk Island
|
935
|
+
country '672',
|
936
|
+
fixed(1) >> split(2,3) |
|
937
|
+
match(/^(2\d+)$/) >> split(3) | # Fixed
|
938
|
+
match(/^(5\d+)$/) >> split(3) # Mobile
|
939
|
+
|
875
940
|
country '673', fixed(1) >> split(3, 3) # Brunei Darussalam http://www.wtng.info/wtng-673-bn.html
|
876
941
|
country '674', none >> split(3, 4) # Nauru (Republic of) http://www.wtng.info/wtng-674-nr.html
|
877
942
|
|
@@ -888,7 +953,14 @@ Phony.define do
|
|
888
953
|
one_of('115') >> split(4,4) | # voicemail (mobile)
|
889
954
|
one_of(%w(28 29)) >> split(3,2) | # pager
|
890
955
|
one_of(%w(16 18)) >> split(3,2) | # ISP
|
891
|
-
one_of(%w(71 72
|
956
|
+
one_of(%w(70 71 72 74 75 76 78 79)) >> split(3,3) | # mobile
|
957
|
+
one_of(%w(731 732 733 734 735 736 738 739)) >> split(2,3) | # mobile
|
958
|
+
one_of(%w(770)) >> split(2,3) | # wireless geographic; Port Moresby, National Capital District
|
959
|
+
one_of(%w(771)) >> split(2,3) | # wireless geographic; Momase region
|
960
|
+
one_of(%w(772)) >> split(2,3) | # wireless geographic; Highlands region
|
961
|
+
one_of(%w(7730)) >> split(1,3) | # wireless geographic; Southern region
|
962
|
+
one_of(%w(774)) >> split(2,3) | # wireless geographic; Islands region
|
963
|
+
one_of(%w(775)) >> split(2,3) | # mobile
|
892
964
|
one_of(%w(80 81 82 83)) >> split(3,3) | # freephone
|
893
965
|
one_of(%w(90 91 92 93)) >> split(3,3) | # geographic, ISDN
|
894
966
|
one_of(%w(3 4 5 6 7 8 9)) >> split(3,3) # geographic
|
@@ -931,12 +1003,12 @@ Phony.define do
|
|
931
1003
|
/\A800\d+\z/ => [3,3], # freephone
|
932
1004
|
/\A830\d+\z/ => [3,3], # shared cost
|
933
1005
|
/\A60\d+\z/ => [3,3], # wireless geographic
|
934
|
-
/\A(72|75|76|77)\d+\z/ => [3,4], # mobile
|
1006
|
+
/\A(71|72|75|76|77)\d+\z/ => [3,4], # mobile
|
935
1007
|
/\A84\d+\z/ => [3,4], # wireless geographic
|
936
1008
|
/\A\d+\z/ => [2,3] # geographic
|
937
1009
|
)
|
938
1010
|
|
939
|
-
country '686', none >> split(
|
1011
|
+
country '686', none >> split(8) # Kiribati (Republic of) https://www.numberingplans.com/?page=plans&sub=phonenr&alpha_2_input=KI
|
940
1012
|
country '687', none >> split(3,3) # New Caledonia (Territoire français d'outre-mer) http://www.wtng.info/wtng-687-nc.html
|
941
1013
|
country '688', none >> split(5) # Tuvalu http://www.wtng.info/wtng-688-tv.html
|
942
1014
|
country '689', none >> split(2,2,2,2) # French Polynesia (Territoire français d'outre-mer) http://www.wtng.info/wtng-689-pf.html
|
@@ -952,7 +1024,10 @@ Phony.define do
|
|
952
1024
|
country '698', todo # -
|
953
1025
|
country '699', todo # -
|
954
1026
|
|
955
|
-
|
1027
|
+
# International Freephone Service
|
1028
|
+
# https://www.itu.int/en/ITU-T/inr/unum/Pages/uifn.aspx
|
1029
|
+
country '800', none >> split(8)
|
1030
|
+
|
956
1031
|
country '801', todo # -
|
957
1032
|
country '802', todo # -
|
958
1033
|
country '803', todo # -
|
@@ -960,7 +1035,7 @@ Phony.define do
|
|
960
1035
|
country '805', todo # -
|
961
1036
|
country '806', todo # -
|
962
1037
|
country '807', todo # -
|
963
|
-
country '808',
|
1038
|
+
country '808', none >> split(12) # International Shared Cost Service (ISCS)
|
964
1039
|
country '809', todo # -
|
965
1040
|
|
966
1041
|
country '830', todo # -
|
@@ -991,6 +1066,7 @@ Phony.define do
|
|
991
1066
|
# Hong Kong, China
|
992
1067
|
|
993
1068
|
country '852',
|
1069
|
+
match(/^(800)\d+$/) >> split(2, 4) |
|
994
1070
|
none >> split(4,4)
|
995
1071
|
|
996
1072
|
# Macao, China
|
@@ -1003,6 +1079,7 @@ Phony.define do
|
|
1003
1079
|
|
1004
1080
|
# Lao People's Democratic Republic http://www.wtng.info/wtng-856-la.html, https://www.numberingplans.com
|
1005
1081
|
country '856',
|
1082
|
+
trunk('0') |
|
1006
1083
|
one_of('30') >> split(3,4) | # geographic
|
1007
1084
|
one_of('20') >> split(4,4) | # mobile
|
1008
1085
|
fixed(2) >> split(3,3) # geographic
|
@@ -1139,6 +1216,7 @@ Phony.define do
|
|
1139
1216
|
one_of(%w(500 700 900)) >> split(3,3) | # premium rate
|
1140
1217
|
one_of('800') >> matched_split(
|
1141
1218
|
/\A\d{2}\z/ => [2],
|
1219
|
+
/\A\d{7}\z/ => [2,3,2],
|
1142
1220
|
/\A\d+\z/ => [2,3,4]) | # freephone
|
1143
1221
|
one_of(%w(50 52 54 55 56 58)) >> split(3,4) | # mobile
|
1144
1222
|
one_of(%w(2 3 4 6 7 9)) >> split(3,4) |
|
@@ -1147,9 +1225,9 @@ Phony.define do
|
|
1147
1225
|
# Israel (State of) (also works for numbers in Palestinian territories)
|
1148
1226
|
country '972',
|
1149
1227
|
trunk('0') |
|
1150
|
-
one_of('1')
|
1151
|
-
one_of('2', '3', '4', '8', '9')
|
1152
|
-
match(/^(5[
|
1228
|
+
one_of('1') >> split(3,3,3) | # special numbers
|
1229
|
+
one_of('2', '3', '4', '8', '9') >> split(3,4) | # 1 digit ndc
|
1230
|
+
match(/^(5[012345689]|7[234679])\d+$/) >> split(3,4) # 2 digit ndc
|
1153
1231
|
|
1154
1232
|
country '973', none >> split(4,4..4) # Bahrain (Kingdom of) http://www.itu.int/oth/T0202000011/en
|
1155
1233
|
|
data/lib/phony/country.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Phony
|
2
4
|
|
3
5
|
#
|
@@ -95,6 +97,9 @@ module Phony
|
|
95
97
|
end
|
96
98
|
end
|
97
99
|
def format_cc_ndc trunk, ndc, local, type, space, parentheses, use_trunk
|
100
|
+
# Note: We mark NDCs that are of type "none" with false (nil trips plausible?). This would result in false being printed.
|
101
|
+
# Therefore we set NDC to nil when formatting.
|
102
|
+
ndc = nil if ndc == false
|
98
103
|
case type
|
99
104
|
when String
|
100
105
|
trunk &&= trunk.format(space, use_trunk)
|
@@ -123,6 +128,7 @@ module Phony
|
|
123
128
|
end
|
124
129
|
end
|
125
130
|
def format_ndc ndc, parentheses
|
131
|
+
ndc = nil if ndc == false # TODO
|
126
132
|
parentheses ? "(#{ndc})" : ndc
|
127
133
|
end
|
128
134
|
def format_with_ndc format, cc, ndc, local, space
|
@@ -154,10 +160,12 @@ module Phony
|
|
154
160
|
#
|
155
161
|
# In some cases it doesn't, like Italy.
|
156
162
|
#
|
157
|
-
|
163
|
+
# Note: Options such as CC
|
164
|
+
#
|
165
|
+
def normalize national_number, options = {}
|
158
166
|
clean! national_number
|
159
167
|
normalized = @codes.reduce national_number do |number, code|
|
160
|
-
result = code.normalize number
|
168
|
+
result = code.normalize number, options
|
161
169
|
break result if result
|
162
170
|
number
|
163
171
|
end
|
@@ -168,7 +176,7 @@ module Phony
|
|
168
176
|
#
|
169
177
|
def plausible? rest, hints = {}
|
170
178
|
local, _, ndc, *rest = internal_split rest
|
171
|
-
|
179
|
+
|
172
180
|
# Element based checking.
|
173
181
|
#
|
174
182
|
# Note: ndc == false means the country has none.
|
@@ -185,6 +193,10 @@ module Phony
|
|
185
193
|
#
|
186
194
|
ndc_needed = hints[:ndc]
|
187
195
|
return false if ndc_needed && !(ndc_needed === ndc)
|
196
|
+
|
197
|
+
# If there is no local part, we can assume it's not a plausible number.
|
198
|
+
# (Or, not defined correctly in Phony yet)
|
199
|
+
return false unless local
|
188
200
|
|
189
201
|
# Local code specific checks.
|
190
202
|
#
|
data/lib/phony/country_codes.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
module Phony
|
2
2
|
|
3
|
-
EMPTY_STRING = ''
|
3
|
+
EMPTY_STRING = '' unless defined?(EMPTY_STRING)
|
4
4
|
|
5
5
|
# Handles determining the correct national code handler.
|
6
6
|
#
|
@@ -66,7 +66,7 @@ module Phony
|
|
66
66
|
country, cc, number = partial_split number
|
67
67
|
country
|
68
68
|
end
|
69
|
-
number = country.normalize number
|
69
|
+
number = country.normalize number, cc: cc
|
70
70
|
countrify! number, cc
|
71
71
|
end
|
72
72
|
|
@@ -97,9 +97,20 @@ module Phony
|
|
97
97
|
|
98
98
|
# False if it fails the basic check.
|
99
99
|
#
|
100
|
-
return false unless (4..
|
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
|
data/lib/phony/dsl.rb
CHANGED
@@ -12,9 +12,9 @@ module Phony
|
|
12
12
|
#
|
13
13
|
# Phony.define.country ...
|
14
14
|
#
|
15
|
-
def self.define
|
15
|
+
def self.define(&block)
|
16
16
|
dsl = DSL.new
|
17
|
-
dsl.instance_eval(&
|
17
|
+
dsl.instance_eval(&block) if block_given?
|
18
18
|
dsl
|
19
19
|
end
|
20
20
|
|
@@ -41,6 +41,8 @@ module Phony
|
|
41
41
|
# country '27', # CC, followed by rules, for example fixed(2) >> ...
|
42
42
|
#
|
43
43
|
def country country_code, definition, options = {}
|
44
|
+
return unless Phony.config.load?(country_code)
|
45
|
+
|
44
46
|
definition.with country_code, options
|
45
47
|
Phony::CountryCodes.instance.add country_code, definition
|
46
48
|
end
|
@@ -139,7 +141,7 @@ module Phony
|
|
139
141
|
#
|
140
142
|
ndcs = ndcs.first if Array === ndcs.first
|
141
143
|
|
142
|
-
NationalSplitters::Variable.new options[:max_length], ndcs
|
144
|
+
NationalSplitters::Variable.new options[:max_length], ndcs.map(&:freeze)
|
143
145
|
end
|
144
146
|
|
145
147
|
# If you have a number of (possibly) variable length NDCs
|
data/lib/phony/national_code.rb
CHANGED
@@ -31,9 +31,7 @@ module Phony
|
|
31
31
|
# since using nil is dangerous and breaks
|
32
32
|
# abstraction)
|
33
33
|
#
|
34
|
-
# Note:
|
35
|
-
#
|
36
|
-
# TODO Flip nil/false?
|
34
|
+
# Note: Decided it stays in. When formatting, it's turned into nil.
|
37
35
|
#
|
38
36
|
def split national_number
|
39
37
|
[nil, false, national_number]
|
data/lib/phony/trunk_code.rb
CHANGED
@@ -6,9 +6,9 @@ module Phony
|
|
6
6
|
# * code: The trunk code, e.g. 0.
|
7
7
|
#
|
8
8
|
# Options:
|
9
|
-
# * normalize: Remove the trunk code when normalizing (only use if number scheme is defined unambiguously).
|
10
|
-
# * split: Remove the trunk code when splitting (only use if number scheme is defined unambiguously).
|
11
|
-
# * format: Add the trunk code when formatting (passing `false` will not add it).
|
9
|
+
# * normalize: [true (default), false] Remove the trunk code when normalizing (only use if number scheme is defined unambiguously).
|
10
|
+
# * split: [true, false (default)] Remove the trunk code when splitting (only use if number scheme is defined unambiguously).
|
11
|
+
# * format: [true (default), false] Add the trunk code when formatting (passing `false` will not add it).
|
12
12
|
#
|
13
13
|
def initialize code, options = {}
|
14
14
|
@code = code
|
@@ -35,8 +35,8 @@ module Phony
|
|
35
35
|
|
36
36
|
# Normalize normalizes the given national number.
|
37
37
|
#
|
38
|
-
def normalize national_number
|
39
|
-
national_number.gsub! @trunk_code_replacement, EMPTY_STRING if @normalize
|
38
|
+
def normalize national_number, options = {}
|
39
|
+
national_number.gsub! @trunk_code_replacement, EMPTY_STRING if @normalize && options[:cc]
|
40
40
|
return national_number
|
41
41
|
end
|
42
42
|
|