phony 2.16.4 → 2.20.8
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.
- 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
|
|