diff --git a/python/phonenumbers/__init__.py b/python/phonenumbers/__init__.py index 6fe916b9..dddc1189 100644 --- a/python/phonenumbers/__init__.py +++ b/python/phonenumbers/__init__.py @@ -146,7 +146,7 @@ # Version number is taken from the upstream libphonenumber version # together with an indication of the version of the Python-specific code. -__version__ = "9.0.27" +__version__ = "9.0.28" __all__ = ['PhoneNumber', 'CountryCodeSource', 'FrozenPhoneNumber', 'REGION_CODE_FOR_NON_GEO_ENTITY', 'NumberFormat', 'PhoneNumberDesc', 'PhoneMetadata', diff --git a/python/phonenumbers/carrierdata/data0.py b/python/phonenumbers/carrierdata/data0.py index 0f8a8f01..195d9ac7 100644 --- a/python/phonenumbers/carrierdata/data0.py +++ b/python/phonenumbers/carrierdata/data0.py @@ -1580,6 +1580,8 @@ '267778':{'en': 'Mascom'}, '267779':{'en': 'Orange'}, '26778':{'en': 'Orange'}, + '267790':{'en': 'Orange'}, + '267793':{'en': 'Orange'}, '26875':{'en': 'Eswatini Mobile'}, '26876':{'en': 'Swazi MTN'}, '26877':{'en': 'SPTC'}, @@ -2439,9 +2441,10 @@ '346112':{'en': 'Yoigo'}, '346113':{'en': 'Yoigo'}, '34612':{'en': 'Syma'}, - '346122':{'en': 'Lycamobile'}, - '346124':{'en': 'Lycamobile'}, - '346125':{'en': 'Lycamobile'}, + '346122':{'en': 'Yoigo'}, + '346124':{'en': 'Yoigo'}, + '346125':{'en': 'Yoigo'}, + '346126':{'en': 'Sarenet'}, '34613':{'en': 'Yoigo'}, '34614':{'en': 'DigiMobil'}, '34615':{'en': 'Orange'}, @@ -2891,15 +2894,15 @@ '35850':{'en': 'Elisa'}, '35987':{'en': 'Vivacom'}, '35988':{'en': 'A1'}, - '35989':{'en': 'Telenor'}, + '35989':{'en': 'Yettel'}, '359988':{'en': 'Bob'}, '359989':{'en': 'A1'}, '3599960':{'en': 'A1'}, '3599961':{'en': 'A1'}, '3599962':{'en': 'A1'}, - '3599964':{'en': 'Telenor'}, - '3599965':{'en': 'Telenor'}, - '3599966':{'en': 'Telenor'}, + '3599964':{'en': 'Yettel'}, + '3599965':{'en': 'Yettel'}, + '3599966':{'en': 'Yettel'}, '3599967':{'en': 'Vivacom'}, '3599968':{'en': 'Vivacom'}, '3599969':{'en': 'Vivacom'}, @@ -2907,8 +2910,8 @@ '3599991':{'en': 'A1'}, '3599992':{'en': 'A1'}, '3599993':{'en': 'A1'}, - '3599994':{'en': 'Telenor'}, - '3599995':{'en': 'Telenor'}, + '3599994':{'en': 'Yettel'}, + '3599995':{'en': 'Yettel'}, '3599996':{'en': 'Vivacom'}, '3599997':{'en': 'Vivacom'}, '3599998':{'en': 'Vivacom'}, @@ -10016,7 +10019,4 @@ '553199745':{'en': 'Telemig Celular'}, '553199746':{'en': 'Telemig Celular'}, '553199747':{'en': 'Telemig Celular'}, - '553199748':{'en': 'Telemig Celular'}, - '553199749':{'en': 'Telemig Celular'}, - '553199751':{'en': 'Telemig Celular'}, } diff --git a/python/phonenumbers/carrierdata/data1.py b/python/phonenumbers/carrierdata/data1.py index 34861564..60b5d4c1 100644 --- a/python/phonenumbers/carrierdata/data1.py +++ b/python/phonenumbers/carrierdata/data1.py @@ -19,6 +19,9 @@ # limitations under the License. data = { + '553199748':{'en': 'Telemig Celular'}, + '553199749':{'en': 'Telemig Celular'}, + '553199751':{'en': 'Telemig Celular'}, '553199752':{'en': 'Telemig Celular'}, '553199753':{'en': 'Telemig Celular'}, '553199755':{'en': 'Telemig Celular'}, @@ -10016,7 +10019,4 @@ '57305266':{'en': 'Tigo'}, '573052670':{'en': 'Tigo'}, '573052671':{'en': 'Tigo'}, - '5730527':{'en': 'Tigo'}, - '5730528':{'en': 'Tigo'}, - '5730529':{'en': 'Tigo'}, } diff --git a/python/phonenumbers/carrierdata/data2.py b/python/phonenumbers/carrierdata/data2.py index 6f47e301..d98ee683 100644 --- a/python/phonenumbers/carrierdata/data2.py +++ b/python/phonenumbers/carrierdata/data2.py @@ -19,6 +19,9 @@ # limitations under the License. data = { + '5730527':{'en': 'Tigo'}, + '5730528':{'en': 'Tigo'}, + '5730529':{'en': 'Tigo'}, '573053':{'en': 'Tigo'}, '5730540':{'en': 'Movil Exito'}, '5730541':{'en': 'Movil Exito'}, @@ -8422,7 +8425,10 @@ '9725531':{'en': '019mobile'}, '9725532':{'en': 'Free Telecom'}, '9725533':{'en': 'Free Telecom'}, - '9725540':{'en': 'Rami Levy'}, + '97255400':{'en': 'Rami Levy'}, + '97255401':{'en': 'Rami Levy'}, + '97255402':{'en': 'Rami Levy'}, + '97255403':{'en': 'Yossi'}, '9725541':{'en': 'Merkaziya'}, '9725543':{'en': 'Maskyoo'}, '9725544':{'en': 'Cellran Cellular Communications'}, @@ -8519,7 +8525,16 @@ '976507':{'en': 'Mobicom'}, '976508':{'en': 'Mobicom'}, '976509':{'en': 'Mobicom'}, - '97655':{'en': 'Unitel'}, + '976550':{'en': 'Unitel'}, + '976551':{'en': 'Unitel'}, + '976552':{'en': 'Unitel'}, + '976553':{'en': 'Unitel'}, + '976554':{'en': 'Unitel'}, + '976555':{'en': 'Mobicom'}, + '976556':{'en': 'Mobicom'}, + '976557':{'en': 'Mobicom'}, + '976558':{'en': 'Mobicom'}, + '976559':{'en': 'Mobicom'}, '97660':{'en': 'ONDO'}, '97666':{'en': 'ONDO'}, '97669':{'en': 'Skytel'}, @@ -8530,6 +8545,7 @@ '97683':{'en': 'G-Mobile'}, '97685':{'en': 'Mobicom'}, '97686':{'en': 'Unitel'}, + '97687':{'en': 'G-Mobile'}, '97688':{'en': 'Unitel'}, '97689':{'en': 'Unitel'}, '97690':{'en': 'Skytel'}, diff --git a/python/phonenumbers/data/region_BW.py b/python/phonenumbers/data/region_BW.py index 811a5de1..1be4957e 100644 --- a/python/phonenumbers/data/region_BW.py +++ b/python/phonenumbers/data/region_BW.py @@ -4,7 +4,7 @@ PHONE_METADATA_BW = PhoneMetadata(id='BW', country_code=267, international_prefix='00', general_desc=PhoneNumberDesc(national_number_pattern='(?:0800|(?:[37]|800)\\d)\\d{6}|(?:[2-6]\\d|90)\\d{5}', possible_length=(7, 8, 10)), fixed_line=PhoneNumberDesc(national_number_pattern='(?:2(?:4[0-48]|6[0-24]|9[0578])|3(?:1[0-35-9]|55|[69]\\d|7[013]|81)|4(?:6[03]|7[1267]|9[0-5])|5(?:3[03489]|4[0489]|7[1-47]|88|9[0-49])|6(?:2[1-35]|5[149]|8[013467]))\\d{4}', example_number='2401234', possible_length=(7,)), - mobile=PhoneNumberDesc(national_number_pattern='(?:321|7[1-8]\\d)\\d{5}', example_number='71123456', possible_length=(8,)), + mobile=PhoneNumberDesc(national_number_pattern='(?:321|7(?:[1-8]\\d|9[03]))\\d{5}', example_number='71123456', possible_length=(8,)), toll_free=PhoneNumberDesc(national_number_pattern='(?:0800|800\\d)\\d{6}', example_number='0800012345', possible_length=(10,)), premium_rate=PhoneNumberDesc(national_number_pattern='90\\d{5}', example_number='9012345', possible_length=(7,)), voip=PhoneNumberDesc(national_number_pattern='79(?:1(?:[0-2]\\d|3[0-8])|2[0-7]\\d)\\d{3}', example_number='79101234', possible_length=(8,)), diff --git a/python/phonenumbers/data/region_IL.py b/python/phonenumbers/data/region_IL.py index fe4ca47c..15917d59 100644 --- a/python/phonenumbers/data/region_IL.py +++ b/python/phonenumbers/data/region_IL.py @@ -4,9 +4,9 @@ PHONE_METADATA_IL = PhoneMetadata(id='IL', country_code=972, international_prefix='0(?:0|1[2-9])', general_desc=PhoneNumberDesc(national_number_pattern='1\\d{6}(?:\\d{3,5})?|[57]\\d{8}|[1-489]\\d{7}', possible_length=(7, 8, 9, 10, 11, 12)), fixed_line=PhoneNumberDesc(national_number_pattern='153\\d{8,9}|29[1-9]\\d{5}|(?:2[0-8]|[3489]\\d)\\d{6}', example_number='21234567', possible_length=(8, 11, 12), possible_length_local_only=(7,)), - mobile=PhoneNumberDesc(national_number_pattern='55(?:4(?:0[0-2]|[16]0)|57[0-289])\\d{4}|5(?:(?:[0-2][02-9]|[36]\\d|[49][2-9]|8[3-7])\\d|5(?:01|2\\d|3[0-3]|4[3-5]|5[0-25689]|6[6-8]|7[0-267]|8[7-9]|9[1-9]))\\d{5}', example_number='502345678', possible_length=(9,)), + mobile=PhoneNumberDesc(national_number_pattern='55(?:4(?:0[0-3]|[16]0)|57[0-289])\\d{4}|5(?:(?:[0-2][02-9]|[36]\\d|[49][2-9]|8[3-7])\\d|5(?:01|2\\d|3[0-3]|4[3-5]|5[0-25689]|6[6-8]|7[0-267]|8[7-9]|9[1-9]))\\d{5}', example_number='502345678', possible_length=(9,)), toll_free=PhoneNumberDesc(national_number_pattern='1(?:255|80[019]\\d{3})\\d{3}', example_number='1800123456', possible_length=(7, 10)), - premium_rate=PhoneNumberDesc(national_number_pattern='1212\\d{4}|1(?:200|9(?:0[0-2]|19))\\d{6}', example_number='1919123456', possible_length=(8, 10)), + premium_rate=PhoneNumberDesc(national_number_pattern='1212\\d{4}|1(?:200|9(?:0[0-2]|19|9\\d))\\d{6}', example_number='1919123456', possible_length=(8, 10)), shared_cost=PhoneNumberDesc(national_number_pattern='1700\\d{6}', example_number='1700123456', possible_length=(10,)), voip=PhoneNumberDesc(national_number_pattern='7(?:38(?:[05]\\d|8[0138])|8(?:33|55|77|81)\\d)\\d{4}|7(?:18|2[23]|3[237]|47|6[258]|7\\d|82|9[2-9])\\d{6}', example_number='771234567', possible_length=(9,)), uan=PhoneNumberDesc(national_number_pattern='1599\\d{6}', example_number='1599123456', possible_length=(10,)), diff --git a/python/phonenumbers/data/region_MN.py b/python/phonenumbers/data/region_MN.py index fa7cdc95..55fd6184 100644 --- a/python/phonenumbers/data/region_MN.py +++ b/python/phonenumbers/data/region_MN.py @@ -3,12 +3,12 @@ PHONE_METADATA_MN = PhoneMetadata(id='MN', country_code=976, international_prefix='001', general_desc=PhoneNumberDesc(national_number_pattern='[12]\\d{7,9}|[5-9]\\d{7}', possible_length=(8, 9, 10), possible_length_local_only=(4, 5, 6)), - fixed_line=PhoneNumberDesc(national_number_pattern='[12]2[1-3]\\d{5,6}|(?:(?:[12](?:1|27)|5[368])\\d\\d|7(?:0(?:[0-5]\\d|7[078]|80)|128))\\d{4}|[12](?:3[2-8]|4[2-68]|5[1-4689])\\d{6,7}', example_number='53123456', possible_length=(8, 9, 10), possible_length_local_only=(4, 5, 6)), - mobile=PhoneNumberDesc(national_number_pattern='92[0139]\\d{5}|(?:5[05]|6[069]|7[28]|8[0135689]|9[013-9])\\d{6}', example_number='88123456', possible_length=(8,)), + fixed_line=PhoneNumberDesc(national_number_pattern='[12](?:2[1-3]|(?:3[2-8]|4[2-68]|5[1-4689])\\d)\\d{5,6}|7(?:0(?:[0-5]\\d|7[078]|80)|128)\\d{4}|[12]27\\d{6}|(?:11|2[16]|5[368])\\d{6}', example_number='53123456', possible_length=(8, 9, 10), possible_length_local_only=(4, 5, 6)), + mobile=PhoneNumberDesc(national_number_pattern='(?:87[01]|92[0139])\\d{5}|(?:5[05]|6[069]|7[28]|8[0135689]|9[013-9])\\d{6}', example_number='88123456', possible_length=(8,)), voip=PhoneNumberDesc(national_number_pattern='712[0-79]\\d{4}|7(?:1[013-9]|[5-79]\\d)\\d{5}', example_number='75123456', possible_length=(8,)), national_prefix='0', national_prefix_for_parsing='0', - number_format=[NumberFormat(pattern='(\\d{2})(\\d{2})(\\d{4})', format='\\1 \\2 \\3', leading_digits_pattern=['[12]1'], national_prefix_formatting_rule='0\\1'), + number_format=[NumberFormat(pattern='(\\d{2})(\\d{2})(\\d{4})', format='\\1 \\2 \\3', leading_digits_pattern=['11|2[16]'], national_prefix_formatting_rule='0\\1'), NumberFormat(pattern='(\\d{4})(\\d{4})', format='\\1 \\2', leading_digits_pattern=['[5-9]']), NumberFormat(pattern='(\\d{3})(\\d{5,6})', format='\\1 \\2', leading_digits_pattern=['[12]2[1-3]'], national_prefix_formatting_rule='0\\1'), NumberFormat(pattern='(\\d{4})(\\d{5,6})', format='\\1 \\2', leading_digits_pattern=['[12](?:27|3[2-8]|4[2-68]|5[1-4689])', '[12](?:27|3[2-8]|4[2-68]|5[1-4689])[0-3]'], national_prefix_formatting_rule='0\\1'), diff --git a/python/phonenumbers/data/region_RE.py b/python/phonenumbers/data/region_RE.py index 03c2a976..d3722088 100644 --- a/python/phonenumbers/data/region_RE.py +++ b/python/phonenumbers/data/region_RE.py @@ -3,7 +3,7 @@ PHONE_METADATA_RE = PhoneMetadata(id='RE', country_code=262, international_prefix='00', general_desc=PhoneNumberDesc(national_number_pattern='709\\d{6}|(?:26|[689]\\d)\\d{7}', possible_length=(9,)), - fixed_line=PhoneNumberDesc(national_number_pattern='26(?:2\\d\\d|3(?:0\\d|1[0-6]))\\d{4}', example_number='262161234', possible_length=(9,)), + fixed_line=PhoneNumberDesc(national_number_pattern='2631[0-6]\\d{4}|26(?:2\\d|30|88)\\d{5}', example_number='262161234', possible_length=(9,)), mobile=PhoneNumberDesc(national_number_pattern='(?:69(?:2\\d\\d|3(?:[06][0-6]|1[0-3]|2[0-2]|3[0-39]|4\\d|5[0-5]|7[0-37]|8[0-8]|9[0-479]))|7092[0-3])\\d{4}', example_number='692123456', possible_length=(9,)), toll_free=PhoneNumberDesc(national_number_pattern='80\\d{7}', example_number='801234567', possible_length=(9,)), premium_rate=PhoneNumberDesc(national_number_pattern='89[1-37-9]\\d{6}', example_number='891123456', possible_length=(9,)), diff --git a/python/phonenumbers/data/region_SR.py b/python/phonenumbers/data/region_SR.py index adf838d9..15a5512d 100644 --- a/python/phonenumbers/data/region_SR.py +++ b/python/phonenumbers/data/region_SR.py @@ -2,12 +2,12 @@ from ..phonemetadata import NumberFormat, PhoneNumberDesc, PhoneMetadata PHONE_METADATA_SR = PhoneMetadata(id='SR', country_code=597, international_prefix='00', - general_desc=PhoneNumberDesc(national_number_pattern='(?:[2-5]|[6-8]\\d|90)\\d{5}', possible_length=(6, 7)), - fixed_line=PhoneNumberDesc(national_number_pattern='(?:2[1-3]|3[0-7]|4\\d|5[2-58])\\d{4}', example_number='211234', possible_length=(6,)), + general_desc=PhoneNumberDesc(national_number_pattern='(?:[2-5]|[6-9]\\d)\\d{5}', possible_length=(6, 7)), + fixed_line=PhoneNumberDesc(national_number_pattern='(?:2[1-3]|3[0-7]|4\\d|5[2-578])\\d{4}', example_number='211234', possible_length=(6,)), mobile=PhoneNumberDesc(national_number_pattern='(?:6[08]|7[124-7]|8[1-9])\\d{5}', example_number='7412345', possible_length=(7,)), toll_free=PhoneNumberDesc(national_number_pattern='80\\d{5}', example_number='8012345', possible_length=(7,)), premium_rate=PhoneNumberDesc(national_number_pattern='90\\d{5}', example_number='9012345', possible_length=(7,)), - voip=PhoneNumberDesc(national_number_pattern='56\\d{4}', example_number='561234', possible_length=(6,)), + voip=PhoneNumberDesc(national_number_pattern='(?:56|91\\d)\\d{4}', example_number='561234', possible_length=(6, 7)), number_format=[NumberFormat(pattern='(\\d{2})(\\d{2})(\\d{2})', format='\\1-\\2-\\3', leading_digits_pattern=['56']), NumberFormat(pattern='(\\d{3})(\\d{3})', format='\\1-\\2', leading_digits_pattern=['[2-5]']), NumberFormat(pattern='(\\d{3})(\\d{4})', format='\\1-\\2', leading_digits_pattern=['[6-9]'])]) diff --git a/python/phonenumbers/data/region_YT.py b/python/phonenumbers/data/region_YT.py index 40d7ab01..c674e90d 100644 --- a/python/phonenumbers/data/region_YT.py +++ b/python/phonenumbers/data/region_YT.py @@ -2,8 +2,8 @@ from ..phonemetadata import NumberFormat, PhoneNumberDesc, PhoneMetadata PHONE_METADATA_YT = PhoneMetadata(id='YT', country_code=262, international_prefix='00', - general_desc=PhoneNumberDesc(national_number_pattern='7093\\d{5}|(?:80|9\\d)\\d{7}|(?:26|63)9\\d{6}', possible_length=(9,)), - fixed_line=PhoneNumberDesc(national_number_pattern='269(?:0[0-467]|15|5[0-4]|6\\d|[78]0)\\d{4}', example_number='269601234', possible_length=(9,)), + general_desc=PhoneNumberDesc(national_number_pattern='(?:639\\d|7093)\\d{5}|(?:26|80|9\\d)\\d{7}', possible_length=(9,)), + fixed_line=PhoneNumberDesc(national_number_pattern='26(?:89\\d|9(?:0[0-467]|15|5[0-4]|6\\d|[78]0))\\d{4}', example_number='269601234', possible_length=(9,)), mobile=PhoneNumberDesc(national_number_pattern='(?:639(?:0[0-79]|1[019]|[267]\\d|3[09]|40|5[05-9]|9[04-79])|7093[5-7])\\d{4}', example_number='639012345', possible_length=(9,)), toll_free=PhoneNumberDesc(national_number_pattern='80\\d{7}', example_number='801234567', possible_length=(9,)), voip=PhoneNumberDesc(national_number_pattern='9(?:(?:39|47)8[01]|769\\d)\\d{4}', example_number='939801234', possible_length=(9,)), diff --git a/python/phonenumbers/phonenumberutil.py b/python/phonenumbers/phonenumberutil.py index ff9a17a4..e95b3685 100644 --- a/python/phonenumbers/phonenumberutil.py +++ b/python/phonenumbers/phonenumberutil.py @@ -1485,14 +1485,15 @@ def format_in_original_format(numobj, region_calling_from): Returns the formatted phone number in its original number format. """ - if (numobj.raw_input is not None and not _has_formatting_pattern_for_number(numobj)): + format_rule = _choose_formatting_pattern_for_numobj(numobj) + if (numobj.raw_input is not None and format_rule is None): # We check if we have the formatting pattern because without that, we # might format the number as a group without national prefix. return numobj.raw_input if numobj.country_code_source is CountryCodeSource.UNSPECIFIED: return format_number(numobj, PhoneNumberFormat.NATIONAL) - formatted_number = _format_original_allow_mods(numobj, region_calling_from) + formatted_number = _format_original_allow_mods(numobj, region_calling_from, format_rule) num_raw_input = numobj.raw_input # If no digit is inserted/removed/modified as a result of our formatting, # we return the formatted phone number; otherwise we return the raw input @@ -1505,7 +1506,7 @@ def format_in_original_format(numobj, region_calling_from): return formatted_number -def _format_original_allow_mods(numobj, region_calling_from): +def _format_original_allow_mods(numobj, region_calling_from, format_rule): if (numobj.country_code_source == CountryCodeSource.FROM_NUMBER_WITH_PLUS_SIGN): return format_number(numobj, PhoneNumberFormat.INTERNATIONAL) elif numobj.country_code_source == CountryCodeSource.FROM_NUMBER_WITH_IDD: @@ -1527,12 +1528,6 @@ def _format_original_allow_mods(numobj, region_calling_from): if (_raw_input_contains_national_prefix(numobj.raw_input, national_prefix, region_code)): # If so, we can safely return the national format. return national_format - # Metadata cannot be None here because ndd_prefix_for_region() (above) returns None if - # there is no metadata for the region. - metadata = PhoneMetadata.metadata_for_region(region_code) - assert metadata is not None - national_number = national_significant_number(numobj) - format_rule = _choose_formatting_pattern_for_number(metadata.number_format, national_number) # The format rule could still be null here if the national number was # 0 and there was no raw input (this should not be possible for # numbers generated by the phonenumber library as they would also not @@ -1578,15 +1573,28 @@ def _raw_input_contains_national_prefix(raw_input, national_prefix, region_code) return False -def _has_formatting_pattern_for_number(numobj): +def _choose_formatting_pattern_for_numobj(numobj): country_code = numobj.country_code phone_number_region = region_code_for_country_code(country_code) metadata = PhoneMetadata.metadata_for_region_or_calling_code(country_code, phone_number_region) if metadata is None: - return False + return None national_number = national_significant_number(numobj) - format_rule = _choose_formatting_pattern_for_number(metadata.number_format, national_number) - return format_rule is not None + return _choose_formatting_pattern_for_number(metadata.number_format, national_number) + + +def _choose_formatting_pattern_for_number(available_formats, national_number): + for num_format in available_formats: + size = len(num_format.leading_digits_pattern) + # We always use the last leading_digits_pattern, as it is the most detailed. + if size > 0: + ld_pattern = re.compile(num_format.leading_digits_pattern[-1]) + ld_match = ld_pattern.match(national_number) + if size == 0 or ld_match: + format_pattern = re.compile(num_format.pattern) + if fullmatch(format_pattern, national_number): + return num_format + return None def format_out_of_country_keeping_alpha_chars(numobj, region_calling_from): @@ -1769,20 +1777,6 @@ def _format_nsn(number, metadata, num_format, carrier_code=None): return _format_nsn_using_pattern(number, formatting_pattern, num_format, carrier_code) -def _choose_formatting_pattern_for_number(available_formats, national_number): - for num_format in available_formats: - size = len(num_format.leading_digits_pattern) - # We always use the last leading_digits_pattern, as it is the most detailed. - if size > 0: - ld_pattern = re.compile(num_format.leading_digits_pattern[-1]) - ld_match = ld_pattern.match(national_number) - if size == 0 or ld_match: - format_pattern = re.compile(num_format.pattern) - if fullmatch(format_pattern, national_number): - return num_format - return None - - def _format_nsn_using_pattern(national_number, formatting_pattern, number_format, carrier_code=None): # Note that carrier_code is optional - if None or an empty string, no diff --git a/python/phonenumbers/phonenumberutil.pyi b/python/phonenumbers/phonenumberutil.pyi index e3fb34cb..48f63801 100644 --- a/python/phonenumbers/phonenumberutil.pyi +++ b/python/phonenumbers/phonenumberutil.pyi @@ -152,14 +152,14 @@ def format_national_number_with_preferred_carrier_code(numobj: PhoneNumber, fall def format_number_for_mobile_dialing(numobj: PhoneNumber, region_calling_from: str, with_formatting: bool) -> str: ... def format_out_of_country_calling_number(numobj: PhoneNumber, region_calling_from: str) -> str: ... def format_in_original_format(numobj: PhoneNumber, region_calling_from: str) -> str: ... -def _format_original_allow_mods(numobj: PhoneNumber, region_calling_from: str) -> str: ... +def _format_original_allow_mods(numobj: PhoneNumber, region_calling_from: str, format_rule: NumberFormat) -> str: ... def _raw_input_contains_national_prefix(raw_input: str, national_prefix: str, region_code: str) -> bool: ... -def _has_formatting_pattern_for_number(numobj: PhoneNumber) -> bool: ... +def _choose_formatting_pattern_for_numobj(numobj: PhoneNumber) -> NumberFormat: ... +def _choose_formatting_pattern_for_number(available_formats: list[NumberFormat], national_number: str) -> NumberFormat | None: ... def format_out_of_country_keeping_alpha_chars(numobj: PhoneNumber, region_calling_from: str) -> str: ... def national_significant_number(numobj: PhoneNumber) -> str: ... def _prefix_number_with_country_calling_code(country_code: int, num_format: int, formatted_number: str) -> str: ... def _format_nsn(number: str, metadata: PhoneMetadata, num_format: int, carrier_code: str | None = ...) -> str: ... -def _choose_formatting_pattern_for_number(available_formats: list[NumberFormat], national_number: str) -> NumberFormat | None: ... def _format_nsn_using_pattern(national_number: str, formatting_pattern: NumberFormat, number_format: int, carrier_code: str | None = ...) -> str: ... def example_number(region_code: str) -> PhoneNumber | None: ... def invalid_example_number(region_code: str) -> PhoneNumber | None: ... diff --git a/python/phonenumbers/tzdata/data0.py b/python/phonenumbers/tzdata/data0.py index 68f815aa..fc54d21b 100644 --- a/python/phonenumbers/tzdata/data0.py +++ b/python/phonenumbers/tzdata/data0.py @@ -2123,6 +2123,8 @@ '262':('Indian/Mayotte', 'Indian/Reunion'), '262262':('Indian/Reunion',), '262263':('Indian/Reunion',), + '2622688':('Indian/Reunion',), + '2622689':('Indian/Mayotte',), '262269':('Indian/Mayotte',), '26263':('Indian/Mayotte',), '26269':('Indian/Reunion',), @@ -3297,6 +3299,7 @@ '97624':('Asia/Hovd',), '97625':('Asia/Ulaanbaatar',), '976258':('Asia/Choibalsan',), + '97626':('Asia/Ulaanbaatar',), '9765':('Asia/Ulaanbaatar',), '9766':('Asia/Ulaanbaatar',), '9767':('Asia/Ulaanbaatar',), diff --git a/resources/PhoneNumberMetadata.xml b/resources/PhoneNumberMetadata.xml index 5c9fbf8e..5ada1a1d 100644 --- a/resources/PhoneNumberMetadata.xml +++ b/resources/PhoneNumberMetadata.xml @@ -5088,7 +5088,10 @@ (?: 321| - 7[1-8]\d + 7(?: + [1-8]\d| + 9[03] + ) )\d{5} @@ -14352,7 +14355,7 @@ - + @@ -14440,7 +14443,7 @@ 55(?: 4(?: - 0[0-2]| + 0[0-3]| [16]0 )| 57[0-289] @@ -14490,7 +14493,8 @@ 200| 9(?: 0[0-2]| - 19 + 19| + 9\d ) )\d{6} @@ -21307,7 +21311,10 @@ area code until now. Grouping access code and area code, this is why first two digits are grouped. --> - [12]1 + + 11| + 2[16] + $1 $2 $3