summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Drysdale <dmd@lurklurk.org>2013-07-18 12:47:08 +0100
committerDavid Drysdale <dmd@lurklurk.org>2013-07-18 12:47:08 +0100
commitfd241f716059aca4f37e8f73b3ddb81f73c5c77a (patch)
tree1add33c7c03700a7b76b3d4a2e3b8aa194577744
parent4c61c334c81565e5aeab8a1584302060ba2bbfdf (diff)
Merge upstream short number code changes from r594
-rw-r--r--python/phonenumbers/shortnumberutil.py51
-rw-r--r--python/tests/examplenumberstest.py5
-rw-r--r--python/tests/shortnumberutiltest.py19
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"))