<commit_before>#summary notes from releases

= Release Notes =

Here are the visible changes for each release.

== 1.1.1 ==

This release contains a single important bugfix.  All users of 1.1.0 should upgrade.

  * r77 A logical error caused ordering operators to behave incorrectly.

== 1.1.0 ==

`ipaddr.py` is now part of the standard library in Python 2.7 and 3.1!  This release is compatible with the `ipaddr` from future versions of Python.

Special thanks to <NAME> for making most of the improvements to this release, and to <NAME> for shepherding this into the Python standard library.

  * r59 Method names are now PEP-8 compliant, instead of Google-style camel case.  The old method names remain, but are deprecated; you should use the lowercase names to be compatible with Python 2.7/3.1. (pmoody)
  * r63 .prefixlen is now a property. (pmoody)
  * r64 Stronger validation. (<NAME>)
  * r65 1.2.3.4 is not a valid v6 address, so we can simplify the constructor. (<NAME>meister)
  * r66 Expand rich comparison operations and their tests, with a goal of supporting 2to3.  Add a new method .networks_key().  Add a new script to run through 2to3 and make sure tests pass under Python 3 with the converted version. (<NAME>)
  * r68 New method .packed(). (Philipp Hagemeister)
  * r69 Add `is_multicast`, `is_unspecified`, `is_loopback`, `is_link_local`, `is_site_local`, and `is_private` for IPv6. Make more methods into properties. Improved documentation and tests for `is_*` properties for IPv4 and IPv6. Rename `networks_key()` to `_get_networks_key()`.
  * r71 Fix off-by-one bug (issue 15). (gpsmith)

== 1.0.2 ==<commit_msg>Edited wiki page through web user interface.<commit_after>#summary notes from releases

= Release Notes =

Here are the visible changes for each release.

== 2.0.0 ==

ipaddr-2.0 release notes.

First and foremost, this is a backwards incompatible change.  Code written for ipaddr-1.x will likely not work stock with ipaddr-2.0. For users of the 1.x branch, I'll continue to provide support, but new-feature development has ceased. But it's not so bad, take a look.All in all, I think this new version of ipaddr is much more intuitive and easy to use. 

The best way to get a feel for this code is to download it and try and out, but I've tried to list some of the more important changes below to help you out.

The major changes.

  # IPvXAddress and IPvXNetwork classes.

  * Individual addresses are now (IPv4|IPv6)Address objects. Network attributes that are actually addresses (eg, broadcast, network, hostmask) are now (IPv4|IPv6)Address objects. That means no more IPv4/IPv6 classes handling only networks.
{{{
In [3]: ipaddr.IPv4Network("1.1.1.0/24")
Out[3]: IPv4Network('1.1.1.0/24')

In [4]: ipaddr.IPv4Network("1.1.1.0/24").network
Out[4]: IPv4Address('1.1.1.0')

In [5]: ipaddr.IPv4Network("1.1.1.0/24").broadcast
Out[5]: IPv4Address('172.16.17.32')
}}}

  * no more ext methods. To reference the stringified version of any attribute, you call str() on (similar for the numeric value with int()).
{{{
In [6]: str(ipaddr.IPv4Network("1.1.1.0/24").broadcast)
Out[6]: '172.16.17.32'

In [7]: int(ipaddr.IPv4Network("1.1.1.0/24").broadcast)
Out[7]: 16843263

In [8]: int(ipaddr.IPv4Network("1.1.1.0/24").network)
Out[8]: 16843008

In [9]: str(ipaddr.IPv4Network("1.1.1.0/24").network)
Out[9]: '1.1.1.0'
}}}

  * IP() everything-constructor has been replaced by IPAddress() and IPNetwork() constructors.  It seems reasonable to assume that an application programmer will know when they are dealing strictly with ip addresses vs. networks and making this separation de-clutters the code.  IPNetwork still assumes a default prefixlength of 32 for IPv4 and 128 for IPv6 if none is supplied (just like IP() used to), so when in doubt, you can always use IPNetwork.
{{{
In [16]: ipaddr.IPNetwork('1.1.1.1')
Out[16]: IPv4Network('1.1.1.1/32')

In [17]: ipaddr.IPNetwork('1.1.1.1/12')
Out[17]: IPv4Network('1.1.1.1/12')

In [18]: ipaddr.IPNetwork('::1')
Out[18]: IPv6Network('::1/128')

In [19]: ipaddr.IPNetwork('::1/64')
Out[19]: IPv6Network('::1/64')
}}}

  # Some other (but no less important) bug fixes/improvements:

  * __ contains __ accepts strings/ints as well as (IPv4|IPv6)Address objects.
{{{
In [9]: ipaddr.IPAddress('1.1.1.1') in ipaddr.IPNetwork('1.1.1.0/24')
Out[9]: True

In [10]: '1.1.1.1' in  ipaddr.IPv4Network("1.1.1.0/24")         
Out[10]: True

In [11]: '1' in ipaddr.IPv4Network("0.0.0.0/0")
Out[11]: True

In [12]: 1 in ipaddr.IPv4Network("0.0.0.0/0")
Out[12]: True
}}}
  * summarize_address_range. You can now get a list of all of the networks between two distinct (IPv4|IPv6)Address'es (results in potentially huge speed boosts for address collapsing)
{{{
In [14]: ipaddr.summarize_address_range(ipaddr.IPAddress('1.1.0.0'), ipaddr.IPAddress('192.168.127.12'))
Out[14]: [IPv4Network('1.1.0.0/16')]

In [15]: ipaddr.summarize_address_range(ipaddr.IPAddress('1.1.0.0'), ipaddr.IPAddress('172.16.31.10'))
Out[15]: 
[IPv4Network('1.1.0.0/17'),
 IPv4Network('192.168.3.11/18'),
 IPv4Network('192.168.3.11/19'),
 IPv4Network('192.168.127.12/20'),
 IPv4Network('172.16.58.3/21'),
 IPv4Network('172.16.58.3/22'),
 IPv4Network('192.168.127.12/23'),
 IPv4Network('192.168.127.12/24'),
 IPv4Network('172.16.17.32/25'),
 IPv4Network('192.168.127.12/26'),
 IPv4Network('172.16.58.3/27'),
 IPv4Network('192.168.127.12/28'),
 IPv4Network('192.168.3.11/29'),
 IPv4Network('172.16.58.3/30'),
 IPv4Network('172.16.31.10/31'),
 IPv4Network('172.16.31.10/32')]
}}}

  * network iterators. the (IPv4|IPv6)Network classes now implement iterators to help quickly access each member of a network in sequence:
{{{

In [24]: for addr in iter(ipaddr.IPNetwork('1.1.1.1/28')): addr
   ....: 
Out[24]: IPv4Address('1.1.1.0')
Out[24]: IPv4Address('1.1.1.1')
Out[24]: IPv4Address('1.1.1.2')
Out[24]: IPv4Address('1.1.1.3')
Out[24]: IPv4Address('1.1.1.4')
Out[24]: IPv4Address('1.1.1.5')
Out[24]: IPv4Address('1.1.1.6')
Out[24]: IPv4Address('1.1.1.7')
Out[24]: IPv4Address('1.1.1.8')
Out[24]: IPv4Address('1.1.1.9')
Out[24]: IPv4Address('1.1.1.10')
Out[24]: IPv4Address('1.1.1.11')
Out[24]: IPv4Address('1.1.1.12')
Out[24]: IPv4Address('1.1.1.13')
Out[24]: IPv4Address('1.1.1.14')
Out[24]: IPv4Address('1.1.1.15')
}}}

  * additionally, an iterhosts() method has been added to allow for iterating over all of the usable addresses on a network (everything except the network and broadcast addresses)
{{{
In [26]: for addr in ipaddr.IPNetwork('1.1.1.1/28').iterhosts(): addr
   ....: 
Out[26]: IPv4Address('1.1.1.1')
Out[26]: IPv4Address('1.1.1.2')
Out[26]: IPv4Address('1.1.1.3')
Out[26]: IPv4Address('1.1.1.4')
Out[26]: IPv4Address('1.1.1.5')
Out[26]: IPv4Address('1.1.1.6')
Out[26]: IPv4Address('1.1.1.7')
Out[26]: IPv4Address('1.1.1.8')
Out[26]: IPv4Address('1.1.1.9')
Out[26]: IPv4Address('1.1.1.10')
Out[26]: IPv4Address('1.1.1.11')
Out[26]: IPv4Address('1.1.1.12')
Out[26]: IPv4Address('1.1.1.13')
Out[26]: IPv4Address('1.1.1.14')
}}}

Thanks to the python community and everyone who's made feature suggestions or submitted patches. Please continue to send bugs/enhancements/patches to the mailing list.

== 1.1.1 ==

This release contains a single important bugfix.  All users of 1.1.0 should upgrade.

  * r77 A logical error caused ordering operators to behave incorrectly.

== 1.1.0 ==

`ipaddr.py` is now part of the standard library in Python 2.7 and 3.1!  This release is compatible with the `ipaddr` from future versions of Python.

Special thanks to <NAME> for making most of the improvements to this release, and to <NAME> for shepherding this into the Python standard library.

  * r59 Method names are now PEP-8 compliant, instead of Google-style camel case.  The old method names remain, but are deprecated; you should use the lowercase names to be compatible with Python 2.7/3.1. (pmoody)
  * r63 .prefixlen is now a property. (pmoody)
  * r64 Stronger validation. (<NAME>meister)
  * r65 1.2.3.4 is not a valid v6 address, so we can simplify the constructor. (Philipp Hagemeister)
  * r66 Expand rich comparison operations and their tests, with a goal of supporting 2to3.  Add a new method .networks_key().  Add a new script to run through 2to3 and make sure tests pass under Python 3 with the converted version. (<NAME>)
  * r68 New method .packed(). (<NAME>agemeister)
  * r69 Add `is_multicast`, `is_unspecified`, `is_loopback`, `is_link_local`, `is_site_local`, and `is_private` for IPv6. Make more methods into properties. Improved documentation and tests for `is_*` properties for IPv4 and IPv6. Rename `networks_key()` to `_get_networks_key()`.
  * r71 Fix off-by-one bug (issue 15). (gpsmith)

== 1.0.2 ==
{'fraction_non_alphanumeric': 0.1496480904580593, 'fraction_numerical': 0.09518864659051575, 'mean_word_length': 4.30802204531537, 'pattern_counts': {'":': 0, '<': 13, '<?xml version=': 0, '>': 13, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 77, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 1, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '5770095', 'n_tokens_mistral': 3473, 'n_tokens_neox': 3086, 'n_words': 992}