diff options
author | David Drysdale <dmd@lurklurk.org> | 2013-07-18 12:47:08 +0100 |
---|---|---|
committer | David Drysdale <dmd@lurklurk.org> | 2013-07-18 12:47:08 +0100 |
commit | fd241f716059aca4f37e8f73b3ddb81f73c5c77a (patch) | |
tree | 1add33c7c03700a7b76b3d4a2e3b8aa194577744 | |
parent | 4c61c334c81565e5aeab8a1584302060ba2bbfdf (diff) |
Merge upstream short number code changes from r594
-rw-r--r-- | python/phonenumbers/shortnumberutil.py | 51 | ||||
-rw-r--r-- | python/tests/examplenumberstest.py | 5 | ||||
-rw-r--r-- | python/tests/shortnumberutiltest.py | 19 |
3 files changed, 74 insertions, 1 deletions
diff --git a/python/phonenumbers/shortnumberutil.py b/python/phonenumbers/shortnumberutil.py index bec8774e..bc440aa7 100644 --- a/python/phonenumbers/shortnumberutil.py +++ b/python/phonenumbers/shortnumberutil.py @@ -25,6 +25,57 @@ from .phonenumberutil import _extract_possible_number, _PLUS_CHARS_PATTERN from .phonenumberutil import normalize_digits_only +class ShortNumberCost(object): + """Cost categories of short numbers.""" + TOLL_FREE = 0 + STANDARD_RATE = 1 + PREMIUM_RATE = 2 + UNKNOWN_COST = 3 + + +def _example_short_number(region_code): + metadata = PhoneMetadata.short_metadata_for_region(region_code) + if metadata is None: + return u"" + desc = metadata.short_code + if desc.example_number is not None: + return desc.example_number + return u"" + + +def _example_short_number_for_cost(region_code, cost): + """Gets a valid short number for the specified cost category. + + Arguments: + region_code -- the region for which an example short number is needed. + cost -- the cost category of number that is needed. + + Returns a valid short number for the specified region and cost + category. Returns an empty string when the metadata does not contain such + information, or the cost is UNKNOWN_COST. + """ + metadata = PhoneMetadata.short_metadata_for_region(region_code) + if metadata is None: + return u"" + desc = _short_number_desc_by_cost(metadata, cost) + if desc is not None and desc.example_number is not None: + return desc.example_number + return u"" + + +def _short_number_desc_by_cost(metadata, cost): + if cost == ShortNumberCost.TOLL_FREE: + return metadata.toll_free + elif cost == ShortNumberCost.STANDARD_RATE: + return metadata.standard_rate + elif cost == ShortNumberCost.PREMIUM_RATE: + return metadata.premium_rate + else: + # ShortNumberCost.UNKNOWN_COST numbers are computed by the process of + # elimination from the other cost categoried. + return None + + def connects_to_emergency_number(number, region_code): """Returns whether the number might be used to connect to an emergency service in the given region. diff --git a/python/tests/examplenumberstest.py b/python/tests/examplenumberstest.py index 23ac581e..a0e7f5ce 100644 --- a/python/tests/examplenumberstest.py +++ b/python/tests/examplenumberstest.py @@ -23,6 +23,7 @@ import unittest from phonenumbers import PhoneNumberType, PhoneMetadata, NumberParseException from phonenumbers import phonenumberutil, PhoneNumber, is_emergency_number +from phonenumbers import shortnumberutil from phonenumbers.re_util import fullmatch @@ -165,6 +166,10 @@ class ExampleNumbersTest(unittest.TestCase): exampleNumber = phonenumberutil.example_number(regionCode) self.assertTrue(exampleNumber is not None, msg="None found for region %s" % regionCode) + for regionCode in phonenumberutil.SUPPORTED_SHORT_REGIONS: + exampleShortNumber = shortnumberutil._example_short_number(regionCode) + self.assertNotEqual(exampleShortNumber, "", + msg="No example short number found for region %s" % regionCode) # Extra tests that need access to the real metadata def testBlankMetadata(self): diff --git a/python/tests/shortnumberutiltest.py b/python/tests/shortnumberutiltest.py index 3740ce8d..99c6b8f2 100644 --- a/python/tests/shortnumberutiltest.py +++ b/python/tests/shortnumberutiltest.py @@ -17,13 +17,30 @@ # See the License for the specific language governing permissions and # limitations under the License. -from phonenumbers import connects_to_emergency_number, is_emergency_number +from phonenumbers import connects_to_emergency_number, is_emergency_number, ShortNumberCost +from phonenumbers import shortnumberutil, ShortNumberCost from .testmetadatatest import TestMetadataTestCase class ShortNumberUtilTest(TestMetadataTestCase): """Unit tests for shortnumberutil.py""" + def testGetExampleShortNumber(self): + self.assertEqual("8711", shortnumberutil._example_short_number("AM")) + self.assertEqual("1010", shortnumberutil._example_short_number("FR")) + self.assertEqual("", shortnumberutil._example_short_number("001")) + self.assertEqual("", shortnumberutil._example_short_number(None)) + + def testGetExampleShortNumberForCost(self): + self.assertEqual("3010", + shortnumberutil._example_short_number_for_cost("FR", ShortNumberCost.TOLL_FREE)) + self.assertEqual("118777", + shortnumberutil._example_short_number_for_cost("FR", ShortNumberCost.STANDARD_RATE)) + self.assertEqual("3200", + shortnumberutil._example_short_number_for_cost("FR", ShortNumberCost.PREMIUM_RATE)) + self.assertEqual("", + shortnumberutil._example_short_number_for_cost("FR", ShortNumberCost.UNKNOWN_COST)) + def testConnectsToEmergencyNumber_US(self): self.assertTrue(connects_to_emergency_number("911", "US")) self.assertTrue(connects_to_emergency_number("119", "US")) |