phony 2.15.0 → 2.20.1

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 (67) hide show
  1. checksums.yaml +5 -5
  2. data/README.textile +35 -7
  3. data/lib/phony/config.rb +91 -0
  4. data/lib/phony/countries/argentina.rb +355 -0
  5. data/lib/phony/countries/austria.rb +34 -24
  6. data/lib/phony/countries/bangladesh.rb +2 -0
  7. data/lib/phony/countries/belarus.rb +2 -0
  8. data/lib/phony/countries/brazil.rb +6 -4
  9. data/lib/phony/countries/cambodia.rb +6 -4
  10. data/lib/phony/countries/china.rb +7 -2
  11. data/lib/phony/countries/croatia.rb +13 -16
  12. data/lib/phony/countries/georgia.rb +6 -4
  13. data/lib/phony/countries/germany.rb +5 -2
  14. data/lib/phony/countries/guinea.rb +8 -5
  15. data/lib/phony/countries/india.rb +2 -0
  16. data/lib/phony/countries/indonesia.rb +8 -3
  17. data/lib/phony/countries/ireland.rb +27 -23
  18. data/lib/phony/countries/italy.rb +30 -17
  19. data/lib/phony/countries/japan.rb +61 -8
  20. data/lib/phony/countries/kyrgyzstan.rb +2 -0
  21. data/lib/phony/countries/latvia.rb +2 -0
  22. data/lib/phony/countries/libya.rb +3 -1
  23. data/lib/phony/countries/malaysia.rb +22 -2
  24. data/lib/phony/countries/moldova.rb +2 -0
  25. data/lib/phony/countries/montenegro.rb +2 -0
  26. data/lib/phony/countries/myanmar.rb +2 -0
  27. data/lib/phony/countries/namibia.rb +2 -0
  28. data/lib/phony/countries/nepal.rb +2 -0
  29. data/lib/phony/countries/netherlands.rb +5 -1
  30. data/lib/phony/countries/pakistan.rb +2 -0
  31. data/lib/phony/countries/paraguay.rb +2 -0
  32. data/lib/phony/countries/russia_kazakhstan_abkhasia_south_ossetia.rb +24 -14
  33. data/lib/phony/countries/saudi_arabia.rb +40 -0
  34. data/lib/phony/countries/serbia.rb +10 -4
  35. data/lib/phony/countries/somalia.rb +5 -1
  36. data/lib/phony/countries/south_korea.rb +16 -9
  37. data/lib/phony/countries/sweden.rb +53 -38
  38. data/lib/phony/countries/taiwan.rb +22 -46
  39. data/lib/phony/countries/tajikistan.rb +2 -0
  40. data/lib/phony/countries/turkmenistan.rb +2 -0
  41. data/lib/phony/countries/ukraine.rb +5 -2
  42. data/lib/phony/countries/united_kingdom.rb +5 -2
  43. data/lib/phony/countries/uruguay.rb +2 -0
  44. data/lib/phony/countries/vietnam.rb +94 -92
  45. data/lib/phony/countries/zimbabwe.rb +2 -0
  46. data/lib/phony/countries.rb +210 -98
  47. data/lib/phony/country.rb +15 -3
  48. data/lib/phony/country_codes.rb +17 -4
  49. data/lib/phony/dsl.rb +5 -3
  50. data/lib/phony/local_splitters/fixed.rb +2 -0
  51. data/lib/phony/national_code.rb +1 -1
  52. data/lib/phony/national_splitters/none.rb +1 -3
  53. data/lib/phony/trunk_code.rb +5 -4
  54. data/lib/phony/vanity.rb +1 -1
  55. data/lib/phony.rb +94 -59
  56. data/spec/functional/config_spec.rb +44 -0
  57. data/spec/functional/plausibility_spec.rb +373 -35
  58. data/spec/lib/phony/countries_spec.rb +295 -63
  59. data/spec/lib/phony/country_codes_spec.rb +106 -33
  60. data/spec/lib/phony/country_spec.rb +54 -15
  61. data/spec/lib/phony/dsl_spec.rb +2 -2
  62. data/spec/lib/phony/local_splitters/regex_spec.rb +12 -5
  63. data/spec/lib/phony/national_splitters/default_spec.rb +1 -1
  64. data/spec/lib/phony/trunk_code_spec.rb +85 -0
  65. data/spec/lib/phony/vanity_spec.rb +30 -0
  66. data/spec/lib/phony_spec.rb +70 -0
  67. metadata +27 -17
@@ -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 3 mobile operators
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,13 +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(/^(70|800|90\d)\d+$/) >> split(3,3) | # Service
100
- match(/^(468)\d{6}$/) >> split(2,2,2) | # Mobile (Telenet)
101
- match(/^(4[789]\d)\d{6}$/) >> split(2,2,2) | # Mobile
102
- one_of('2','3','4','9') >> split(3,2,2) | # Short NDCs
103
- fixed(2) >> split(2,2,2) # 2-digit NDCs
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
104
109
 
105
110
  # France.
106
111
  #
@@ -121,11 +126,19 @@ Phony.define do
121
126
 
122
127
  # Hungary.
123
128
  #
129
+ # http://webpub-ext.nmhh.hu/aga/foldr/DoIndexAction.do
130
+ #
124
131
  country '36',
125
132
  trunk('06', normalize: false) |
126
- one_of('104','105','107','112') >> split(3,3) | # Service
127
- one_of('1') >> split(3,4) | # Budapest
128
- fixed(2) >> split(3,4) # 2-digit NDCs
133
+ one_of('104', '105', '107', '112') >> split(3,3) | # Service
134
+ one_of('1') >> split(3,4) | # Budapest
135
+ one_of('20', '30', '31', '50', '70') >> split(3,4) | # Mobile
136
+ one_of('21') >> split(3,4) | # VOIP
137
+ one_of('40', '80', '90', '91') >> split(3,3) | # Special charged numbers
138
+ one_of('51') >> split(3,3) | # Corporate network, M2M
139
+ one_of('38') >> split(3,4) | # Corporate network, M2M
140
+ one_of('71') >> split(5,5) | # M2M Numbers
141
+ fixed(2) >> split(3,3) # Geographic numbers
129
142
 
130
143
  # country '39' # Italy, see special file.
131
144
 
@@ -136,13 +149,15 @@ Phony.define do
136
149
  match(/^(112|800|90[036])\d+$/) >> split(3,3) | # Service
137
150
  match(/^(7[1-9])\d+$/) >> split(3,4) | # Mobile
138
151
  one_of('21', '31') >> split(3,4) | # Bucureşti
139
- fixed(3) >> split(3,4) # 3-digit NDCs
152
+ fixed(3) >> split(3,3) # 3-digit NDCs
140
153
 
141
154
  # Switzerland.
142
155
  #
143
156
  country '41',
144
157
  trunk('0', normalize: true) |
145
- match(/^(8(00|4[0248]))\d+$/) >> split(3,3)|
158
+ match(/^(860)\d+$/) >> split(2, 3, 2, 2) | # Voice Mail access
159
+ match(/^(8(?:00|4[0248]))\d+$/) >> split(3,3) | # Freecall/Shared Cost
160
+ match(/^(90[016])\d+$/) >> split(3,3) | # Business
146
161
  fixed(2) >> split(3,2,2)
147
162
 
148
163
  # country '43' # Austria, see special file.
@@ -167,17 +182,19 @@ Phony.define do
167
182
  # Note: http://wapedia.mobi/en/Telephone_numbers_in_Poland, mobile not yet correct
168
183
  #
169
184
  country '48',
170
- match(/^(5[013]\d|6[069]\d|7[02389]\d|80[01]|88\d)/) >> split(3,3) |
185
+ match(/^(45\d|5[0137]\d|6[069]\d|7[02389]\d|80[01]|88\d)/) >> split(3,3) |
171
186
  fixed(2) >> split(3,2,2)
172
187
 
173
188
  # country '49' # Germany, see special file.
174
189
 
175
190
  # Peru.
176
- #
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
177
193
  country '51',
178
194
  one_of('103', '105') >> split(3,3) | # Service.
179
- one_of('1', '9') >> split(4,4) | # Lima and mobile.
180
- fixed(2) >> split(4,4) # 2-digit NDCs.
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.
181
198
 
182
199
  # Mexico.
183
200
  #
@@ -198,14 +215,7 @@ Phony.define do
198
215
  fixed(3) >> split(7) # 3-digit NDCs
199
216
 
200
217
  # Argentine Republic.
201
- #
202
- country '54',
203
- one_of('11', '911') >> split(4,4) | # Fixed & Mobile
204
- match(/^(22[0137]|237|26[14]|29[179]|34[1235]|35[138]|38[1578])/) >> split(3,4) | # Fixed
205
- match(/^(922[0137]|9237|926[14]|929[179]|934[1235]|935[138]|938[1578])/) >> split(3,4) | # Mobile
206
- match(/^(9\d{4})/) >> split(2,4) | # Mobile
207
- match(/^([68]\d{2})/) >> split(3,4) | # Service
208
- fixed(4) >> split(2,4) # Fixed
218
+ # country '54' # argentina, see special file.
209
219
 
210
220
  # Brazil (Federative Republic of).
211
221
  # http://en.wikipedia.org/wiki/Telephone_numbers_in_Brazil
@@ -222,6 +232,7 @@ Phony.define do
222
232
  # http://www.itu.int/oth/T020200002C/en
223
233
  country '57',
224
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) |
225
236
  fixed(1) >> split(3,4)
226
237
 
227
238
  # Venezuela (Bolivarian Republic of)
@@ -234,8 +245,11 @@ Phony.define do
234
245
  # Australia.
235
246
  #
236
247
  country '61',
237
- trunk('0') |
248
+ trunk('0', format: false) |
238
249
  match(/^(4\d\d)\d+$/) >> split(3,3) | # Mobile
250
+ match(/^(1800)\d+$/) >> split(3,3) | # 1800 free call
251
+ match(/^(1300)\d+$/) >> split(3,3) | # 1300 local rate
252
+ match(/^(13)\d+$/) >> split(2,2) | # 13 local rate
239
253
  fixed(1) >> split(4,4) # Rest
240
254
 
241
255
  # country '62' # Indonesia (Republic of), see special file
@@ -246,9 +260,10 @@ Phony.define do
246
260
  trunk('0') |
247
261
  # 7/10 digits for area code '2'.
248
262
  match(/\A(2)\d{10}\z/) >> split(10) |
263
+ match(/\A(2)\d{8}\z/) >> split(8) |
249
264
  one_of('2') >> split(7) |
250
265
  # mobile
251
- match(/\A(9\d\d)\d{7}\z/) >> split(7) |
266
+ match(/\A([89]\d\d)\d{7}\z/) >> split(7) |
252
267
  match(/\A(9\d\d)\d+\z/) >> split(6) |
253
268
  #
254
269
  fixed(2) >> split(7)
@@ -260,18 +275,23 @@ Phony.define do
260
275
  match(/^(2\d)\d{7}$/) >> split(3,4) | # Mobile
261
276
  match(/^(2\d)\d{6}$/) >> split(3,3) |
262
277
  match(/^(2\d)\d{8}$/) >> split(2,3,3) |
278
+ match(/^(800)\d{6}$/) >> split(3,3) | # International 800 service where agreed
279
+ match(/^(800)\d{7}$/) >> split(3,4) | # International 800 service where agreed
263
280
  fixed(1) >> split(3,4) # Rest
264
281
 
265
282
  # Singapore (Republic of).
266
283
  #
267
284
  country '65',
268
- none >> split(4,4) # TODO Short Codes.
285
+ none >> matched_split(
286
+ /^(800)\d{7}$/ => [3,3,4], # International Toll Free Service (ITFS) and Home Country Direct Service (HCDS) Numbers
287
+ /^\d{8}$/ => [4,4] # TODO Short Codes
288
+ )
269
289
 
270
290
  # Thailand.
271
291
  #
272
292
  country '66',
273
293
  trunk('0') |
274
- match(/\A([89]\d\d)\d+\z/) >> split(3,3) | # mobile
294
+ match(/\A([689]\d\d)\d+\z/) >> split(3,3) | # mobile
275
295
  one_of('2') >> split(3,4) | # Bangkok
276
296
  fixed(2) >> split(3,3) # Rest
277
297
 
@@ -335,20 +355,20 @@ Phony.define do
335
355
 
336
356
  # Côte d'Ivoire
337
357
  # http://www.wtng.info/wtng-225-ci.html
338
- # http://www.itu.int/dms_pub/itu-t/oth/02/02/T02020000310001PDFE.pdf
358
+ # https://www.itu.int/dms_pub/itu-t/oth/02/02/T02020000310006PDFE.pdf
339
359
  # http://en.wikipedia.org/wiki/Telephone_numbers_in_Ivory_Coast
340
360
  #
341
361
  # There is no trunk code for this country and several of the mobile prefixes start with 0
342
362
  country '225',
343
363
  trunk('', :normalize => false) |
344
- fixed(2) >> split(2,2,2)
364
+ fixed(2) >> split(2,2,2,2)
345
365
 
346
366
  country '226', none >> split(4,4) # Burkina Faso http://www.wtng.info/wtng-226-bf.html
347
367
  country '227', none >> split(4,4) # Niger http://www.wtng.info/wtng-227-ne.html
348
368
  country '228', none >> split(4,4) # Togolese Republic http://www.wtng.info/wtng-228-tg.html
349
369
  country '229', none >> split(4,4) # Benin http://www.itu.int/oth/T0202000017/en
350
370
 
351
- country '230', none >> split(3,4) # Mauritius http://www.wtng.info/wtng-230-mu.html
371
+ country '230', none >> split(4,4) # Mauritius http://www.wtng.info/wtng-230-mu.html
352
372
 
353
373
  # Liberia
354
374
  # https://www.numberingplans.com/?page=plans&sub=phonenr&alpha_2_input=LR
@@ -366,32 +386,43 @@ Phony.define do
366
386
  # Ghana
367
387
  #
368
388
  # From http://www.itu.int/oth/T0202000052/en
389
+ # https://en.wikipedia.org/wiki/Telephone_numbers_in_Ghana
369
390
  #
370
- country '233', fixed(2) >> split(3,4)
391
+ country '233', trunk('0') | fixed(2) >> split(3,4)
371
392
 
372
393
  # Nigeria
373
- # Wikipedia says 3 4 split, many local number with no splitting
394
+ # 3 4 split for mobile and 1 digit NDC, 3 2 or 3 3 otherwise
395
+ # Many local numbers with no splitting
374
396
  #
375
- # mobile telephony number allocation taken from: http://www.ncc.gov.ng/index.php?option=com_content&view=article&id=113&Itemid=102
397
+ # mobile telephony number allocation taken from:
398
+ # https://www.ncc.gov.ng/technical-regulation/standards/numbering and
399
+ # https://www.itu.int/oth/T020200009C/en
376
400
  country '234',
377
- match(/^([7-9]0\d)\d+$/) >> split(3,4) | # Mobile
378
- match(/^(81\d)\d+$/) >> split(3,4) | # Mobile
379
- one_of('1', '2', '9') >> split(3,4) | # Lagos, Ibadan and Abuja
380
- fixed(2) >> split(3,4) # 2-digit NDC
401
+ match(/^([7-9]0\d)\d+$/) >> split(3,4) | # Mobile
402
+ match(/^(81\d)\d+$/) >> split(3,4) | # Mobile
403
+ match(/^(91\d)\d+$/) >> split(3,4) | # Mobile
404
+ one_of('1', '2') >> split(3,3..4) | # Lagos, Ibadan
405
+ one_of('9') >> split(3,4) | # Abuja
406
+ one_of((30..79).map(&:to_s)) >> split(3,2..3) | # 2-digit NDC
407
+ one_of(%w(82 83 84 85 86 87 88 89)) >> split(3,3) # 2-digit NDC
381
408
 
382
409
  country '235', none >> split(4,4) # Chad http://www.wtng.info/wtng-235-td.html
383
410
  country '236', none >> split(4,4) # Central African Republic http://www.wtng.info/wtng-236-cf.html
384
- country '237', none >> split(4,4) # Cameroon http://www.wtng.info/wtng-237-cm.html
411
+ country '237', none >> split(3,2,2,2) # Cameroon http://www.wtng.info/wtng-237-cm.html
385
412
  country '238', none >> split(3,4) # Cape Verde http://www.wtng.info/wtng-238-cv.html
386
413
  country '239', fixed(1) >> split(3,3) # Sao Tome and Principe, http://www.wtng.info/wtng-239-st.html
387
414
 
388
415
  country '240', none >> split(3,3,3) # Equatorial Guinea
389
- country '241', fixed(1) >> split(3,3) # Gabonese Republic http://www.wtng.info/wtng-241-ga.html
390
- country '242', none >> split(4,5) # Congo http://www.wtng.info/wtng-242-cg.html
391
- country '243', fixed(1) >> split(3,4) # Democratic Republic of the Congo http://www.wtng.info/wtng-243-cd.html
416
+ country '241',
417
+ match(/^(\d)\d{6}$/) >> split(3,3) | # Gabonese Republic http://www.wtng.info/wtng-241-ga.html
418
+ match(/^(\d\d)\d{6}$/) >> split(2,2,2) # 2019 update https://en.wikipedia.org/wiki/Telephone_numbers_in_Gabon
419
+ country '242', # Congo http://www.wtng.info/wtng-242-cg.html
420
+ trunk('', :normalize => false) |
421
+ none >> split(4,5)
422
+ country '243', fixed(2) >> split(3,4) # Democratic Republic of the Congo http://www.wtng.info/wtng-243-cd.html
392
423
  country '244', one_of('321', '348', '358', '363', '364', '485', '526', '535', '546', '612', '643', '652', '655', '722', '726', '728', '729', '777') >> split(3,3) | # Angola
393
424
  fixed(2) >> split(3,4)
394
- country '245', none >> split(3,4) # Guinea-Bissau http://www.wtng.info/wtng-245-gw.html
425
+ country '245', none >> split(2,3,4) # Guinea-Bissau http://www.wtng.info/wtng-245-gw.html
395
426
  country '246', none >> split(3,4) # Diego Garcia http://www.wtng.info/wtng-246-io.html
396
427
  country '247', none >> split(4) # Ascension
397
428
 
@@ -404,9 +435,9 @@ Phony.define do
404
435
  # http://en.wikipedia.org/wiki/Telephone_numbers_in_Rwanda
405
436
  country '250',
406
437
  trunk('0') |
407
- one_of('25') >> split(7) | # Geographic, fixed
408
- match(/^(7[238])/) >> split(7) | # Non-geographic, mobile
409
- one_of('06') >> split(6) # Satellite
438
+ one_of('25') >> split(7) | # Geographic, fixed
439
+ match(/^(7[2389])/) >> split(7) | # Non-geographic, mobile
440
+ one_of('06') >> split(6) # Satellite
410
441
 
411
442
  country '251', fixed(2) >> split(3, 4) # Ethiopia http://www.wtng.info/wtng-251-et.html
412
443
 
@@ -456,25 +487,33 @@ Phony.define do
456
487
 
457
488
  # Zambia
458
489
  # http://www.wtng.info/wtng-260-zm.html
490
+ # https://github.com/googlei18n/libphonenumber/
491
+ # https://en.wikipedia.org/wiki/Telephone_numbers_in_Zambia
492
+
459
493
  country '260',
460
- match(/^(9(55|66|7[7-9]))/) >> split(6) | # mobile
461
- match(/^(21[1-8])/) >> split(6) # fixed
494
+ trunk('0') |
495
+ match(/^(75|76|77|94|95|96|97)/) >> split(3, 4) | # Mobile
496
+ match(/^(800)/) >> split(3,3) | # Toll free
497
+ match(/^(21[1-8])/) >> split(6) # Fixed
462
498
 
463
- # Madagascar http://www.wtng.info/wtng-261-mg.html
499
+ # Madagascar
500
+ # https://en.wikipedia.org/wiki/Telephone_numbers_in_Madagascar
464
501
  # http://www.itu.int/oth/T020200007F/en
465
502
  country '261',
466
- none >> matched_split(
467
- /\A200\d+\z/ => [2,3,3,3], # Telecom Malagasy (Telma)
468
- /\A20\d+\z/ => [2,3,4], # Telecom Malagasy (Telma)
469
- /\A23\d+\z/ => [2,3,4], # Digitel
470
- /\A30\d+\z/ => [2,3,4], # mobile Madamobil (CDMA2000)
471
- /\A31\d+\z/ => [2,3,4], # mobile Sacel
472
- /\A32\d+\z/ => [2,3,4], # mobile Orange Madagascar
473
- /\A34\d+\z/ => [2,3,4], # mobile Telecom Malagasy (Telma)
474
- /\A5\d+\z/ => [3,3,3], # pager
475
- /\A22\d+\z/ => [3,3,3], # satellite GULFSAT Téléphonie
476
- /\A6\d+\z/ => [3,3,3] # satellite
477
- )
503
+ # none >> matched_split(
504
+ # /\A20\d+\z/ => [2,2,3,2], # Telecom Malagasy (Telma)
505
+ # /\A32\d+\z/ => [2,2,3,2], # mobile Orange Madagascar
506
+ # /\A33\d+\z/ => [2,2,3,2], # mobile Airtel Madagascar
507
+ # /\A34\d+\z/ => [2,2,3,2], # mobile Telecom Malagasy (Telma)
508
+ # /\A38\d+\z/ => [2,2,3,2], # mobile Telecom Malagasy (Telma)
509
+ # /\A39\d+\z => [2,2,3,2] # mobile Blueline
510
+ # ),
511
+ match(/\A(20)\d+\z/) >> split(2,3,2) | # fix Telecom Malagasy (Telma)
512
+ match(/\A(32)\d+\z/) >> split(2,3,2) | # mobile Orange Madagascar
513
+ match(/\A(33)\d+\z/) >> split(2,3,2) | # mobile Airtel Madagascar
514
+ match(/\A(34)\d+\z/) >> split(2,3,2) | # mobile Telecom Malagasy (Telma)
515
+ match(/\A(38)\d+\z/) >> split(2,3,2) | # mobile Telecom Malagasy (Telma)
516
+ match(/\A(39)\d+\z/) >> split(2,3,2) # mobile Blueline Madagascar
478
517
 
479
518
  country '262', # Reunion / Mayotte (new) http://www.wtng.info/wtng-262-fr.html
480
519
  trunk('0') |
@@ -595,17 +634,26 @@ Phony.define do
595
634
  # Luxembourg
596
635
  #
597
636
  country '352',
598
- one_of('4') >> split(2,2,2) | # Luxembourg City
599
- match(/^(2[467]\d{2})$/) >> split(2,2,2) | # 4-digit NDC
600
- match(/^(6\d[18])\d+$/) >> split(3,3) | # mobile
601
- match(/^(60\d{2})\d{8}$/) >> split(2,2,2,2) | # mobile machine to machine
602
- match(/^([2-9]\d)/) >> split(2,2,2) # 2-digit NDC
637
+ match(/^(2[467]\d{2})\d{4}$/) >> split(2,2) | # 4-digit NDC
638
+ match(/^(6\d[18])\d+$/) >> split(3,3) | # mobile
639
+ match(/^(60\d{2})\d{8}$/) >> split(2,2,2,2) | # mobile machine to machine
640
+ match(/^((2[^467]|[3-9]\d))\d{4}$/) >> split(2,2) | # 2-digit NDC Regular 6 digits number
641
+ match(/^((2[^467]|[3-9]\d))\d{4}$/) >> split(2,2) | # 2-digit NDC Regular 6 digits number
642
+ match(/^((2[^467]|[3-9]\d))\d{5}$/) >> split(2,2,1) | # 2-digit NDC Regular 6 digits number w/ 1 digit extension
643
+ match(/^((2[^467]|[3-9]\d))\d{6}$/) >> split(2,2,2) | # 2-digit NDC Regular 8 digits number or 6 digits with 2 digits extension
644
+ match(/^((2[^467]|[3-9]\d))\d{7}$/) >> split(2,2,3) | # 2-digit NDC Regular 6 digits with 4 digits extension
645
+ match(/^((2[^467]|[3-9]\d))\d{8}$/) >> split(2,2,4) | # 2-digit NDC Regular 6 digits number with 4 digits extension
646
+ match(/^(\d{2})\d{3}$/) >> split(2,2,1) # fallback for 5 digit number
603
647
 
604
648
  # country '353' # Republic of Ireland, see special file.
605
649
 
606
650
  country '354', none >> split(3,4) # Iceland
651
+
652
+ # Albania
653
+ # https://en.wikipedia.org/wiki/Telephone_numbers_in_Albania
607
654
  country '355', trunk('0') |
608
- one_of('4') >> split(4,3) | # Albania
655
+ one_of('4') >> split(3,4) | # Tirana
656
+ match(/\A(6[6-9])\d*\z/) >> split(3,4) | # mobile
609
657
  match(/\A(2[24]|3[2-5]|47|5[2-5]|6[6-9]|8[2-5])\d*\z/) >> split(3,3) |
610
658
  fixed(3) >> split(3,2)
611
659
 
@@ -626,17 +674,48 @@ Phony.define do
626
674
  #
627
675
  country '358',
628
676
  trunk('0') |
629
- match(/^([1-3]0)\d+$/) >> split(3,3,0..6) | # Service/subscriber
630
- match(/^([6-8]00)\d+$/) >> split(3,3) | # Service
631
- match(/^(4\d|50)\d+$/) >> split(3,2,0..2) | # Mobile
632
- one_of('2','3','5','6','8','9') >> split(3,2..4) | # Short NDCs
633
- fixed(2) >> split(3,3) # 2-digit NDCs
677
+ match(/^(600[3-5]\d|601\d\d|700[3457]\d|7500[12]|7532[12]|7575[12]|7598[12])\d{3,4}$/) >> split(3..4) | # national service numbers, 5-digit NDC
678
+ match(/^(753[02][3-9]|7575[3-9]|7598[3-9])\d{3,5}$/) >> split(3..5) | # national subscriber numbers, 5-digit NDC
679
+ match(/^(73[0-4]\d\d)\d{5}$/) >> split(5) | # national subscriber numbers, 5-digit NDC (starting with 073)
680
+ match(/^(202[023]|209[8-9]|600[0126-9]|700[0126]|7099|800\d)\d{4,5}$/) >> split(2, 2..3) | # national service numbers, 4-digit NDCs
681
+ match(/^(606\d|70[78]\d)\d{6}$/) >> split(3, 3) | # national service numbers, 4-digit NDCs (starting with 0606/0707/0708)
682
+ match(/^(202[14-9]|209[0-7])\d{4,6}$/) >> split(3, 1..3) | # national subscriber numbers, 4-digit NDCs
683
+ match(/^(45[45789]\d)\d{2,6}$/) >> split(2, 0..4) | # mobile numbers, 4-digit NDCs
684
+ match(/^([123]00|602)\d{5,6}$/) >> split(3, 2..3) | # national service numbers, 3-digit NDCs
685
+ match(/^(10[1-9]|20[13-8]|30[1-9]|73[5-9])\d{5,7}$/) >> split(3, 2..4) | # national subscriber numbers, 3-digit NDCs
686
+ match(/^(71\d)\d{6}$/) >> split(3, 3) | # national subscriber numbers, 3-digit NDCs (starting with 071)
687
+ match(/^(73[5-9])\d{7}$/) >> split(3, 4) | # national subscriber numbers, 3-digit NDCs (starting with 073)
688
+ match(/^(43\d|45[0-36])\d{5,7}$/) >> split(3, 2..4) | # mobile numbers, 3-digit NDCs
689
+ match(/^(49\d)\d{8}$/) >> split(3, 3, 2) | # mobile numbers, 3-digit NDCs (starting with 049)
690
+ match(/^([235]9)\d{6,8}$/) >> split(3, 3, 0..2) | # national subscriber numbers, 2-digit NDCs
691
+ match(/^(4[0124678]|50)\d{4,8}$/) >> split(3, 1..5) | # mobile numbers, 2-digit NDCs
692
+ one_of('2','3','5','6','8','9') >> split(3,1..5) | # Short NDCs
693
+ fixed(2) >> split(3, 0..4) # 2-digit NDCs
634
694
 
635
695
  # Bulgaria
636
696
  #
697
+ # Note: https://www.numberingplans.com/?page=plans&sub=phonenr&alpha_2_input=BG
698
+ # Note: https://en.wikipedia.org/wiki/Telephone_numbers_in_Bulgaria
637
699
  country '359',
638
700
  trunk('0') |
639
- fixed(2) >> split(3,2,2) # Bulgaria
701
+ match(/^(2)\d{6}$/) >> split(3,3) | # Landline Sofia (optional last digit)
702
+ match(/^(2)\d{7}$/) >> split(3,4) | # Landline Sofia (optional last digit)
703
+ match(/^(30|31|33|36|37|39|41|43\d|45|47|51|53|55|57|59)\d{5}$/) >> split(5) |
704
+ 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) |
705
+
706
+ match(/^(60|61|63|65|66|69)\d{5}$/) >> split(5) |
707
+ match(/^(60|61|62|63|64|65|66|68|69)\d{6}$/) >> split(6) |
708
+
709
+ match(/^(700|701|703|704|705|706|707|708|709)\d{5}$/) >> split(5) |
710
+ match(/^(701|702|703|704|705|706|707|708|709)\d{4}$/) >> split(4) |
711
+
712
+ match(/^(71|72|74|75|77)\d{5}$/) >> split(5) |
713
+ match(/^(71|72|73|74|75|76|77|78|79)\d{6}$/) >> split(6) |
714
+
715
+ match(/^(80\d|81|91|93|95|97)\d{5}$/) >> split(5) |
716
+ match(/^(81|82|84|86)\d{6}$/) >> split(6) |
717
+ match(/^(87|88|89)\d{7}$/) >> split(4,3) |
718
+ match(/^(90|91|92|93|94|95|96|97|98\d|99\d)\d{6}$/) >> split(6)
640
719
 
641
720
  # Lithuania
642
721
  #
@@ -670,11 +749,12 @@ Phony.define do
670
749
  # Monaco
671
750
  #
672
751
  country '377',
673
- one_of('6') >> split(2,2,2,2) | # mobile
752
+ one_of('6') >> split(2,2,2,2) | # mobile
674
753
  fixed(2) >> split(2,2,2)
675
754
 
676
755
  # San Marino
677
756
  country '378',
757
+ trunk('', :normalize => false) |
678
758
  none >> matched_split(
679
759
  /\A\d{6}\z/ => [3,3],
680
760
  /\A\d+\z/ => [3,3,4]
@@ -688,7 +768,13 @@ Phony.define do
688
768
 
689
769
  # country '382' # Montenegro, see special file
690
770
 
691
- country '383', todo # -
771
+ # Kosovo
772
+ #
773
+ # Note: https://en.wikipedia.org/wiki/Telephone_numbers_in_Kosovo
774
+ country '383',
775
+ trunk('0') |
776
+ fixed(2) >> split(3,3)
777
+
692
778
  country '384', todo # -
693
779
 
694
780
  # country '385' # Croatia, see special file.
@@ -702,17 +788,23 @@ Phony.define do
702
788
  one_of('1','2','3','4','5','7') >> split(3,4) | # Ljubljana, Maribor, Celje, Kranj, Nova Gorica, Novo mesto
703
789
  fixed(3) >> split(2,3) # catchall
704
790
 
705
- country '387', trunk('0') | fixed(2) >> split(3,2,2) # Bosnia and Herzegovina
791
+ country '387', trunk('0') | fixed(2) >> split(3,3) # Bosnia and Herzegovina
706
792
  country '388', trunk('0') | fixed(2) >> split(3,2,2) # Group of countries, shared code
707
- country '389', trunk('0') | fixed(2) >> split(3,2,2) # The Former Yugoslav Republic of Macedonia
793
+
794
+ # The Former Yugoslav Republic of Macedonia
795
+ country '389',
796
+ trunk('0') |
797
+ one_of('2','3','4','5','6','7','8') >> split(3,4)
708
798
 
709
799
  country '420', fixed(3) >> split(3,3) # Czech Republic
710
800
 
711
801
  # Slovak Republic.
712
802
  #
713
- country '421', match(/^(9\d\d).+$/) >> split(6) | # Mobile
714
- one_of('2') >> split(8) | # Bratislava
715
- fixed(2) >> split(7) # 2-digit NDCs
803
+ country '421', match(/^(9\d\d).+$/) >> split(6) | # Mobile
804
+ match(/\A(2)1\d{2,4}\z/) >> split(3..5) | # Bratislava Short
805
+ match(/\A(\d{2})1\d{2,4}\z/) >> split(3..5) | # 2-digit NDCs Short
806
+ one_of('2') >> split(8) | # Bratislava
807
+ fixed(2) >> split(7) # 2-digit NDCs
716
808
 
717
809
  country '422', todo # Spare code
718
810
  country '423', none >> split(3,2,2) # Liechtenstein (Principality of)
@@ -784,7 +876,14 @@ Phony.define do
784
876
  one_of(%w(11 16 17 18 19)) >> split(3) | # audiotext
785
877
  fixed(3) >> split(4) # geographic, audiotext
786
878
 
787
- country '593', fixed(2) >> split(3, 4) # Ecuador http://www.wtng.info/wtng-593-ec.html
879
+ # Ecuador http://www.wtng.info/wtng-593-ec.html
880
+ # https://www.numberingplans.com/?page=plans&sub=phonenr&alpha_2_input=EC&current_page=1
881
+ # https://en.wikipedia.org/wiki/Telephone_numbers_in_Ecuador
882
+ country '593',
883
+ one_of('9') >> split(4,4) |
884
+ match(/\A([\d]{2})\d{7}\z/) >> split(3,4) |
885
+ fixed(1) >> split(3,4)
886
+
788
887
  country '594', fixed(3) >> split(3, 3) # French Guiana (French Department of) http://www.wtng.info/wtng-594-fr.html
789
888
 
790
889
  # country '595' # Paraguay (Republic of), see special file
@@ -830,7 +929,14 @@ Phony.define do
830
929
  one_of('115') >> split(4,4) | # voicemail (mobile)
831
930
  one_of(%w(28 29)) >> split(3,2) | # pager
832
931
  one_of(%w(16 18)) >> split(3,2) | # ISP
833
- one_of(%w(71 72 73 76)) >> split(3,3) | # mobile
932
+ one_of(%w(70 71 72 74 75 76 78 79)) >> split(3,3) | # mobile
933
+ one_of(%w(731 732 733 734 735 736 738 739)) >> split(2,3) | # mobile
934
+ one_of(%w(770)) >> split(2,3) | # wireless geographic; Port Moresby, National Capital District
935
+ one_of(%w(771)) >> split(2,3) | # wireless geographic; Momase region
936
+ one_of(%w(772)) >> split(2,3) | # wireless geographic; Highlands region
937
+ one_of(%w(7730)) >> split(1,3) | # wireless geographic; Southern region
938
+ one_of(%w(774)) >> split(2,3) | # wireless geographic; Islands region
939
+ one_of(%w(775)) >> split(2,3) | # mobile
834
940
  one_of(%w(80 81 82 83)) >> split(3,3) | # freephone
835
941
  one_of(%w(90 91 92 93)) >> split(3,3) | # geographic, ISDN
836
942
  one_of(%w(3 4 5 6 7 8 9)) >> split(3,3) # geographic
@@ -873,7 +979,7 @@ Phony.define do
873
979
  /\A800\d+\z/ => [3,3], # freephone
874
980
  /\A830\d+\z/ => [3,3], # shared cost
875
981
  /\A60\d+\z/ => [3,3], # wireless geographic
876
- /\A(72|75|76|77)\d+\z/ => [3,4], # mobile
982
+ /\A(71|72|75|76|77)\d+\z/ => [3,4], # mobile
877
983
  /\A84\d+\z/ => [3,4], # wireless geographic
878
984
  /\A\d+\z/ => [2,3] # geographic
879
985
  )
@@ -894,7 +1000,10 @@ Phony.define do
894
1000
  country '698', todo # -
895
1001
  country '699', todo # -
896
1002
 
897
- country '800', todo # International Freephone Service
1003
+ # International Freephone Service
1004
+ # https://www.itu.int/en/ITU-T/inr/unum/Pages/uifn.aspx
1005
+ country '800', none >> split(8)
1006
+
898
1007
  country '801', todo # -
899
1008
  country '802', todo # -
900
1009
  country '803', todo # -
@@ -902,7 +1011,7 @@ Phony.define do
902
1011
  country '805', todo # -
903
1012
  country '806', todo # -
904
1013
  country '807', todo # -
905
- country '808', todo # International Shared Cost Service (ISCS)
1014
+ country '808', none >> split(12) # International Shared Cost Service (ISCS)
906
1015
  country '809', todo # -
907
1016
 
908
1017
  country '830', todo # -
@@ -933,9 +1042,15 @@ Phony.define do
933
1042
  # Hong Kong, China
934
1043
 
935
1044
  country '852',
1045
+ match(/^(800)\d+$/) >> split(2, 4) |
936
1046
  none >> split(4,4)
937
1047
 
938
- country '853', todo # Macao, China
1048
+ # Macao, China
1049
+ country '853', # Macao, China
1050
+ match(/^(28)\d+$/) >> split(2,4) | # Landline.
1051
+ match(/^(8)\d+$/) >> split(3,4) | # Landline.
1052
+ match(/^(6)\d+$/) >> split(3,4) # Mobile.
1053
+
939
1054
  country '854', todo # Spare code
940
1055
 
941
1056
  # Lao People's Democratic Republic http://www.wtng.info/wtng-856-la.html, https://www.numberingplans.com
@@ -962,7 +1077,10 @@ Phony.define do
962
1077
  # Bangladesh (People's Republic of)
963
1078
  # country '880' # see special file
964
1079
 
965
- country '881', todo # International Mobile, shared code
1080
+ # Global Mobile Satellite System (i.e. Iridium, Globalstar, etc)
1081
+ # https://www.numberingplans.com/?page=plans&sub=phonenr&alpha_2_input=QM
1082
+ country '881', fixed(1) >> split(3,5)
1083
+
966
1084
  country '882', todo # International Networks, shared code
967
1085
  country '883', todo # -
968
1086
  country '884', todo # -
@@ -1041,14 +1159,7 @@ Phony.define do
1041
1159
  /\A8\d+\z/ => [3,3], # geographic
1042
1160
  )
1043
1161
 
1044
- # Saudi Arabia (Kingdom of)
1045
- # http://www.wtng.info/wtng-966-sa.html
1046
- # http://www.citc.gov.sa/English/MediaCenter/awarenesscampaigns/Pages/PR_AWR_004.aspx
1047
- # http://en.wikipedia.org/wiki/Telephone_numbers_in_Saudi_Arabia
1048
- # https://answers.yahoo.com/question/index?qid=20090303142622AAQBoZ0
1049
- country '966',
1050
- match(/\A(5[0-9])\d+\z/) >> split(3,4) | # mobile numbers
1051
- fixed(3) >> split(3,4)
1162
+ # country '966' # Saudi Arabia (Kingdom of), see special file.
1052
1163
 
1053
1164
  # Yemen (Republic of)
1054
1165
  # https://www.numberingplans.com/?page=dialling&sub=areacodes
@@ -1080,17 +1191,18 @@ Phony.define do
1080
1191
  one_of(%w(500 700 900)) >> split(3,3) | # premium rate
1081
1192
  one_of('800') >> matched_split(
1082
1193
  /\A\d{2}\z/ => [2],
1194
+ /\A\d{7}\z/ => [2,3,2],
1083
1195
  /\A\d+\z/ => [2,3,4]) | # freephone
1084
- one_of(%w(50 52 55 56)) >> split(3,4) | # mobile
1196
+ one_of(%w(50 52 54 55 56 58)) >> split(3,4) | # mobile
1085
1197
  one_of(%w(2 3 4 6 7 9)) >> split(3,4) |
1086
1198
  fixed(1) >> split(3,4)
1087
1199
 
1088
1200
  # Israel (State of) (also works for numbers in Palestinian territories)
1089
1201
  country '972',
1090
1202
  trunk('0') |
1091
- one_of('1') >> split(3,3,3) | # special numbers
1092
- one_of('2', '3', '4', '8', '9') >> split(3,4) | # 1 digit ndc
1093
- match(/^(5[023456789]|7[23467])\d+$/) >> split(3,4) # 2 digit ndc
1203
+ one_of('1') >> split(3,3,3) | # special numbers
1204
+ one_of('2', '3', '4', '8', '9') >> split(3,4) | # 1 digit ndc
1205
+ match(/^(5[012345689]|7[234679])\d+$/) >> split(3,4) # 2 digit ndc
1094
1206
 
1095
1207
  country '973', none >> split(4,4..4) # Bahrain (Kingdom of) http://www.itu.int/oth/T0202000011/en
1096
1208
 
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
- def normalize national_number
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
  #