Most Important API Changes
--------------------------

Those are mentioned here as are not backward compatible.
I want the API to be stable and consistent in the next release and later,
so I do all the big changes now (I would have to do them at some time anyway).

2010-04-03

	M2Crypto dependency dropped in favor of the 'ssl' module from the
        standard Python library. TLS API has been changed a bit: certificate
	verification callback now should expect one argument only (a dictionary
	with certificate information)

	Python 2.6 is now _required!

2006-08-31

	Interface API for better externalisation of various components. First
	introduced to the Client classes -- one may create different classes
	to handle different stanza types and namespaces, annotate them with
	interfaces implemented (IFeaturesProvider, IPresenceHandlersProvider,
	IMessageHandlersProvider or IIqHandlersProvider) and list their
	instances in a Client object's interface_providers attribute.

	See the echocomponent.py example to see how to use that.

2006-08-26
	
	Exception handling improvements, part one.

	All PyXMPP-specific exceptions moved to pyxmpp.exceptions module. Some exceptions
	have been removed (those which were used where some standard exception, like ValueError,
	would be a better choice), the most important omission is StanzaError exception.

	ProtocolError exception with some derivatives added -- these are raised when 
	an error is detected in a stanza (received) processed. These exceptions
	will be handled internally by PyXMPP some day (automatically
	<bad-request/> or similar XMPP error will be raised).

2006-08-26

	CachedPropertyObject class removed and its usage in pyxmpp.jabber.disco
	Now all the DiscoItem/DiscoInfo/DiscoItems attributes are regular properties
	calling set_*, get_* funtions on every access. 
	The old cached properties were giving no speed gain and only complicated things.

2005-10-14

	Usage of non-unicode strings in PyXMPP API is deprecated. No
	no implicit conversion is made where utf-8 string would previously be
	accepted (e.g. JID constructor). Sometimes deprecation warning will be
	raised when string is used instead of unicode.


2005-03-20

	"common_doc", "common_root", and "common_ns" can no longer be imported
	from the "stanza" module. They were moved to the "xmlextra" module.

2005-01-20

	Minor change: now "disco_info" and "disco_items" attributes
	of pyxmpp.jabber.client and pyxmpp.jabberd.component are initialized
	in the constructors of those classes. Those __init__() methods now
	accept "disco_name", "disco_category" and "disco_type" arguments
	to set up the entity identity. Also register_feature() and
	unregister_feature() methods were added for managing the feature
	list in .disco_info.

2005-01-09

	Continuation of the big API unification.

	All attribute and parameter names "node", relating to XML node have
	been renamed to "xmlnode". The most important change is `Stanza.node` renamed
	to `Stanza.xmlnode`.

	Roster.items(), Roster.groups(), Roster.items_by_name(), Roster.items_by_group(),
	Roser.items_by_jid() renamed to: Roster.get_items(), Roster.get_groups(),
	Roster.get_items_by_name(), Roster.get_items_by_group(), Roster.get_item_by_jid()

	Keys of Roster.items_dict are now JIDs, not unicode.

	More .as_xml() methods unified. To reuse most of the code needed two
	new virtual classes were added: pyxmpp.objects.StanzaPayloadObject
	and pyxmpp.objects.StanzaPayloadWrapperObject. Objects providing .as_xml()
	methods may be used directly as argument to Stanza.set_content() and
	Stanza.add_content() methods.

2005-01-06

	Big API unification started.
	
	jabber.vcard.VCard and jabber.delay.Delay
	classes' method as_xml accepts now "parent" and "doc" arguments in
	that order. Argument interpretation is also unified. All other similar
	objects will have the add_xml() with the same signature soon.

	Classes in jabber.disco module were modified heavily, so  all the 
	getter are named get_*, all the setters set_* and all the interesting
	properties may be accessed as attributes which also adds some caching.
	Other classes, if they don't use that get_*/set_* naming, will be
	modified in similar way soon.

2004-12-31

	There was a design flaw in PyXMPP from the very beginning, which caused
	that many unnecessary modules from PyXMPP package (and subpackages,
	when they were used) were imported even when only one simple module was
	used. That was because pyxmpp imported all the useful names from
	submodules. That was a problem (unnecessarily long startup time
	sometimes), but it was also quite convenient.

	To resolve the problem those imports were removed from __init__
	modules, so importing a package doesn't cause any other imports now.
	To improve backward compatibility and keep the convenience of the old
	behavior "all" modules were added to "pyxmpp", "pyxmpp.jabber" and
	"pyxmpp.jabber" packages. 

	If your application was broken by that change just import "pyxmpp.all"
	(and/or "pyxmpp.jabber.all", "pyxmpp.jabberd.all" if you use them)
	there -- you need to do it once per application (no need to change
	every module). After that everything should work as before.

	If you use only small part of the API and don't want to import unused
	modules import names like "JID" or "Stanza" directly from modules that
	define them (e.g.: 'import JID from pyxmpp.jid').

2004-12-18

	dnspython (http://www.dnspython.org) is now used for resolving DNS
	names. Please note, that because of a conflict between dnspython and
	old PyXMPP DNS implementation you must clean up after old PyXMPP
	installation and do 'make clean' before building PyXMPP.

2004-09-16
	
	Stanza, Message, Iq and Presence constructors arguments have been
	changed again. "typ" and "sid" were really stupid and ugly.
	Now Stanza (derived classes) constructor keyword parameters are:
	from_jid, to_jid, stanza_type, stanza_id
	
	I hope this will never change again, at least not after the next
	official release. You may update your application code using
	"migrate-0_5-0_6.py" script.

2004-09-13
	
	Stanza, Message, Iq and Presence constructors arguments have been
	changed so build-ins "type" and "id" are not redefined. So the "type"
	argument has been changed to "typ" and the "id" argument to "sid"
	(stanza id).

2004-09-03

	Stream.data_in and Stream.data_out callbacks removed. Data sent and
	received is now logged via 'logging' module to 'pyxmpp.Stream.out' and
	'pyxmpp.Stream.in' loggers.  The raw data is available for logging
	handlers as the first element of 'args' attribute of the log record
	(record.args[0]).

2004-08-29

	All debug messages are passed to the standard python 'logging' module.
	There is no debug() methods in PyXMPP classes any more.

2005-06-02

	Python 2.2 support is gone. Compliant XMPP implementation
	requires stringprep and IDN support. Python 2.3 provides both,
	Python 2.2 none. Maintaining separete stringprep and IDN
	implementations for use with Python 2.2 is IMHO not worth the effort
	needed.

2005-05-28

	Roster and RosterItems classes rewritten. Now they are not wrapper
	around roster XML node any more. Old code was complicated, slow,
	and not standard compliant (ingored stringprep profiles).

	Most important changes:
	
	- no `node` attribute in Roster and RosterItem
	- RosterItem constructor doesn't take `roster` argument any more
	- `jid`, `ask`, `subscription`, `name` and `groups` are now attributes,
	  not methods, of `RosterItem`
	- `add_group`, `rm_group`, etc. methods of `RosterItem` are gone. Use
	  list operations on `groups` attribute now.
	- inline documentation included

 vi: spell spelllang=en
