]> granicus.if.org Git - python/commitdiff
Improve an internal ipaddress test, add a comment explaining why treating networks...
authorNick Coghlan <ncoghlan@gmail.com>
Sun, 17 Jun 2012 06:33:00 +0000 (16:33 +1000)
committerNick Coghlan <ncoghlan@gmail.com>
Sun, 17 Jun 2012 06:33:00 +0000 (16:33 +1000)
Lib/ipaddress.py
Lib/test/test_ipaddress.py

index abbdcf88ae8670f8ba8f853c3152ca3f1a6a18ad..05ea4533ffdfe0ca890f59aa700972c755ae4fad 100644 (file)
@@ -416,6 +416,11 @@ class _IPAddressBase:
         """Return the shorthand version of the IP address as a string."""
         return str(self)
 
+    @property
+    def version(self):
+        msg = '%200s has no version specified' % (type(self),)
+        raise NotImplementedError(msg)
+
     def _ip_int_from_prefix(self, prefixlen=None):
         """Turn the prefix length netmask into a int for comparison.
 
@@ -555,10 +560,6 @@ class _BaseAddress(_IPAddressBase):
     def _get_address_key(self):
         return (self._version, self)
 
-    @property
-    def version(self):
-        raise NotImplementedError('BaseIP has no version')
-
 
 class _BaseNetwork(_IPAddressBase):
 
@@ -726,13 +727,13 @@ class _BaseNetwork(_IPAddressBase):
         """Number of hosts in the current subnet."""
         return int(self.broadcast_address) - int(self.network_address) + 1
 
-    @property
-    def version(self):
-        raise NotImplementedError('BaseNet has no version')
-
     @property
     def _address_class(self):
-        raise NotImplementedError('BaseNet has no associated address class')
+        # Returning bare address objects (rather than interfaces) allows for
+        # more consistent behaviour across the network address, broadcast
+        # address and individual host addresses.
+        msg = '%200s has no associated address class' % (type(self),)
+        raise NotImplementedError(msg)
 
     @property
     def prefixlen(self):
@@ -1333,7 +1334,6 @@ class IPv4Network(_BaseV4, _BaseNetwork):
 
     """
     # Class to use when creating address objects
-    # TODO (ncoghlan): Investigate using IPv4Interface instead
     _address_class = IPv4Address
 
     def __init__(self, address, strict=True):
@@ -1945,7 +1945,6 @@ class IPv6Network(_BaseV6, _BaseNetwork):
     """
 
     # Class to use when creating address objects
-    # TODO (ncoghlan): Investigate using IPv6Interface instead
     _address_class = IPv6Address
 
     def __init__(self, address, strict=True):
index cbd656ca568ed42cd066d5e831879fe76c765cba..22caa6dad20b38b52ea955ea8ac0fb0c647a929c 100644 (file)
@@ -150,16 +150,31 @@ class IpaddrUnitTest(unittest.TestCase):
         self.assertEqual(first, last)
         self.assertEqual(0, ipaddress._get_prefix_length(2**32, 0, 32))
         self.assertEqual(128, ipaddress._count_righthand_zero_bits(0, 128))
-        base_ip = ipaddress._BaseAddress('127.0.0.1')
-        try:
-            base_ip.version
-            self.fail('_BaseAddress.version didn\'t raise NotImplementedError')
-        except NotImplementedError:
-            pass
         self.assertEqual("IPv4Network('1.2.3.0/24')", repr(self.ipv4_network))
         self.assertEqual('0x1020318', hex(self.ipv4_network))
         self.assertRaises(TypeError, self.ipv4_network.__eq__, object())
 
+    def testMissingAddressVersion(self):
+        class Broken(ipaddress._BaseAddress):
+            pass
+        broken = Broken('127.0.0.1')
+        with self.assertRaisesRegex(NotImplementedError, "Broken.*version"):
+            broken.version
+
+    def testMissingNetworkVersion(self):
+        class Broken(ipaddress._BaseNetwork):
+            pass
+        broken = Broken('127.0.0.1')
+        with self.assertRaisesRegex(NotImplementedError, "Broken.*version"):
+            broken.version
+
+    def testMissingAddressClass(self):
+        class Broken(ipaddress._BaseNetwork):
+            pass
+        broken = Broken('127.0.0.1')
+        with self.assertRaisesRegex(NotImplementedError, "Broken.*address"):
+            broken._address_class
+
     def testGetNetwork(self):
         self.assertEqual(int(self.ipv4_network.network_address), 16909056)
         self.assertEqual(str(self.ipv4_network.network_address), '1.2.3.0')