<commit_before>#summary notes from releases

= Release Notes =

Here are the visible changes for each release.

== 2.1.3 ==

(2010-06-12)

ipaddr-2.1.3 release notes.

  * fix for issue61, incorrect network containment (thanks bw.default)
  
== 2.1.2 ==

(2010-05-31)

ipaddr-2.1.2 release notes.

  * Happy Memorial day.
  * arithmetic for v4 and v6 address objects and ints (issue 57).
  * fix address_exclude issue where excluding an address from itself puked.
  * make sure addresses and networks don't compare.
  * doc-string fixes (issue60)
  * and masked() method to _BaseNet to return a network object with the host bits masked out (issue58)
  * fix v6 subnet representation (email to ipaddr-py-dev)
    

== 2.1.1 ==

(3/2/2010)

ipaddr-2.1.1 release notes.

 * bug with list comprehension in {{{ IPv4Network._is_valid_netmask() }}}
 * kill the last remaining instances of the old exceptions in the docstrings(thanks <NAME>)

== 2.1.0 ==

(2010-02-13)

ipaddr-2.1.0 release notes.

Easier change this time :)

  * networks and addresses are unsortable by default (see https://groups.google.com/group/ipaddr-py-dev/browse_thread/thread/8fbc5166be71adbc for discussion).
  * exception text cleanup.
  * fixing inconsistent behavior of v4/v6 address/network comparisons.
  * add IPv4Network().is_unspecified (thanks rep.dot.net)
  * fix for decoding mapped addresses (thanks rlaager)
  * docstring updates (thanks <NAME>)
  * fix errant ref to non-existent variable(s) (thanks <NAME>)
  * fix exceptions  (most exceptions are subclassed from ValueError now, so this can easily be caught)
  * iterator for looping through subnets (thanks <NAME>)

That's mostly it. there were quite a few other minor changes, but this should cover the major bits. Usage.wiki will be updated in the coming days.

== 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('192.168.127.12')
}}}

  * 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)<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.1.3 ==

(2010-06-12)

  * fix for issue61, incorrect network containment (thanks bw.default)
  
== 2.1.2 ==

(2010-05-31)

  * Happy Memorial day.
  * arithmetic for v4 and v6 address objects and ints (issue 57).
  * fix address_exclude issue where excluding an address from itself puked.
  * make sure addresses and networks don't compare.
  * doc-string fixes (issue60)
  * and masked() method to _BaseNet to return a network object with the host bits masked out (issue58)
  * fix v6 subnet representation (email to ipaddr-py-dev)
    

== 2.1.1 ==

(3/2/2010)

ipaddr-2.1.1 release notes.

 * bug with list comprehension in {{{ IPv4Network._is_valid_netmask() }}}
 * kill the last remaining instances of the old exceptions in the docstrings(thanks <NAME>)

== 2.1.0 ==

(2010-02-13)

Easier change this time :)

  * networks and addresses are unsortable by default (see https://groups.google.com/group/ipaddr-py-dev/browse_thread/thread/8fbc5166be71adbc for discussion).
  * exception text cleanup.
  * fixing inconsistent behavior of v4/v6 address/network comparisons.
  * add IPv4Network().is_unspecified (thanks rep.dot.net)
  * fix for decoding mapped addresses (thanks rlaager)
  * docstring updates (thanks <NAME>)
  * fix errant ref to non-existent variable(s) (thanks <NAME>)
  * fix exceptions  (most exceptions are subclassed from ValueError now, so this can easily be caught)
  * iterator for looping through subnets (thanks <NAME>)

That's mostly it. there were quite a few other minor changes, but this should cover the major bits. Usage.wiki will be updated in the coming days.

== 2.0.0 ==

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('192.168.127.12')
}}}

  * 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)
{'fraction_non_alphanumeric': 0.10241451952681899, 'fraction_numerical': 0.046831955922865015, 'mean_word_length': 3.9415532425940754, 'pattern_counts': {'":': 0, '<': 11, '<?xml version=': 0, '>': 11, 'https://': 2, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 14, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 2, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '5864295', 'n_tokens_mistral': 2107, 'n_tokens_neox': 1914, 'n_words': 775}