From e5019d5183041f4f75cf4a30b2dc84eed347425e Mon Sep 17 00:00:00 2001 From: Peter Moody Date: Thu, 24 Oct 2013 09:47:10 -0700 Subject: #17400: correct handling of 100.64.0.0/10, fixing the docs and updating NEWS --- Doc/library/ipaddress.rst | 6 ++++++ Lib/ipaddress.py | 27 +++++++++++++++------------ Lib/test/test_ipaddress.py | 4 +++- Misc/NEWS | 3 +++ 4 files changed, 27 insertions(+), 13 deletions(-) diff --git a/Doc/library/ipaddress.rst b/Doc/library/ipaddress.rst index af1b3b8..826e4aa 100644 --- a/Doc/library/ipaddress.rst +++ b/Doc/library/ipaddress.rst @@ -158,6 +158,12 @@ write code that handles both IP versions correctly. ``True`` if the address is reserved for multicast use. See :RFC:`3171` (for IPv4) or :RFC:`2373` (for IPv6). + .. attribute:: is_private + + ``True`` if the address is allocated for private networks. See + iana-ipv4-special-registry (for IPv4) or iana-ipv6-special-registry + (for IPv6). + .. attribute:: is_global ``True`` if the address is allocated for public networks. See diff --git a/Lib/ipaddress.py b/Lib/ipaddress.py index 7936192..97ff13d 100644 --- a/Lib/ipaddress.py +++ b/Lib/ipaddress.py @@ -1244,7 +1244,6 @@ class IPv4Address(_BaseV4, _BaseAddress): """ return (self in IPv4Network('0.0.0.0/8') or self in IPv4Network('10.0.0.0/8') or - self in IPv4Network('100.64.0.0/10') or self in IPv4Network('127.0.0.0/8') or self in IPv4Network('169.254.0.0/16') or self in IPv4Network('172.16.0.0/12') or @@ -1258,17 +1257,6 @@ class IPv4Address(_BaseV4, _BaseAddress): self in IPv4Network('240.0.0.0/4') or self in IPv4Network('255.255.255.255/32')) - @property - def is_global(self): - """Test if this address is allocated for public networks. - - Returns: - A boolean, True if the address is not reserved per - iana-ipv4-special-registry. - - """ - return self in IPv4Network('100.64.0.0/10') or not self.is_private - @property def is_multicast(self): @@ -1501,6 +1489,21 @@ class IPv4Network(_BaseV4, _BaseNetwork): if self._prefixlen == (self._max_prefixlen - 1): self.hosts = self.__iter__ + @property + @functools.lru_cache() + def is_global(self): + """Test if this address is allocated for public networks. + + Returns: + A boolean, True if the address is not reserved per + iana-ipv4-special-registry. + + """ + return (not (self.network_address in IPv4Network('100.64.0.0/10') and + self.broadcast_address in IPv4Network('100.64.0.0/10')) and + not self.is_private) + + class _BaseV6: diff --git a/Lib/test/test_ipaddress.py b/Lib/test/test_ipaddress.py index 25f190c..f3b1565 100644 --- a/Lib/test/test_ipaddress.py +++ b/Lib/test/test_ipaddress.py @@ -1319,8 +1319,10 @@ class IpaddrUnitTest(unittest.TestCase): self.assertEqual(True, ipaddress.ip_network( '127.42.0.0/16').is_loopback) self.assertEqual(False, ipaddress.ip_network('128.0.0.0').is_loopback) - self.assertEqual(True, ipaddress.ip_network('100.64.0.0/10').is_private) + self.assertEqual(False, + ipaddress.ip_network('100.64.0.0/10').is_private) self.assertEqual(False, ipaddress.ip_network('100.64.0.0/10').is_global) + self.assertEqual(True, ipaddress.ip_network('192.0.2.128/25').is_private) self.assertEqual(True, diff --git a/Misc/NEWS b/Misc/NEWS index 2c0430c..9a3e08a 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -19,6 +19,9 @@ Core and Builtins Library ------- +- Issue #17400: New 'is_global' attribute for ipaddress to tell if an address + is allocated by IANA for global or private networks. + - Issue #19350: Increasing the test coverage of macurl2path. Patch by Colin Williams. -- cgit v0.12