PyAMF Changelog
===============

This file contains information about the changes between the different
versions of PyAMF.

.. contents::

0.5 (unreleased)
----------------
 - Support for Django i18n ugettext_lazy (Ticket:496)
 - Added support for microseconds for datetime objects. Thanks to Derek Payton
   for the patch. (Ticket:490)
 - Added support for property types on SQLAlchemy mapped classes. (Ticket:491)
 - Added support for property types for Google AppEngine db.Model and
   db.Expando. (Ticket:487)

0.4.1 (2009-02-23)
------------------
 - amf0.Encoder.use_amf3 has been extended to cover all object types
   (Ticket:453,467)
 - Property types on Django models will now encode as expected. (Ticket:480)
 - Django models.ForeignKey properties will be followed only if previously
   accessed outside of PyAMF. `_[attr]_cache` is no longer encoded.
   (Ticket:456)
 - Encoding {0:0, '0':1} will now raise an AttributeError. (Ticket:458)
 - Google AppEngine adapter improvements - see ticket for details (Ticket:479)
 - amf0.Encoder will encode all elements as AMF3 if use_amf3 option is set to
   True (Ticket:453)
 - Unicode handling in __repr__ functions has been improved (Ticket:455)
 - object attributes and dict keys are now utf8 encoded bytestrings. Python
   \**kwargs doesn't accept unicode key objects. (Ticket:463)
 - Django models.TimeField, models.DateField will now be converted to the
   correct type (datetime.time and datetime.date respectively).
   fields.NOT_PROVIDED is also checked for by converting to pyamf.Undefined
   and back again. (Ticket:457)

0.4 (2009-01-18)
----------------
 - cpyamf now deals with exceptional floats the same way as pure python -
   especially on windows (Ticket:448)
 - Support for SQLAlchemy 0.5.1 (Ticket:449)
 - amf0.Encoder now has a use_amf3 flag which determines which XML type to
   return to the client (Ticket:435)
 - BufferedByteString.truncate(length) now actually does something useful
   (Ticket:444)
 - setup.py now gets the version number from pyamf/__init__.py source
   (Ticket:429)

0.4rc3 (2009-01-14)
-------------------
 - Support for SQLAlchemy 0.5.0 (Ticket:436)
 - pyamf.util.DataTypeMixIn/cpyamf.util.BufferedByteStream can now
   encode/decode 24bit un/signed integers. (Ticket:422)
 - pyamf.util.StringIOProxy/cpyamf.util.BufferedByteStream both have new
   consume methods that will chop of the tail of the stream (already read
   stream). (Ticket:423)
 - Now checking for all types of supported xml lib types for encoding, but
   will only use the first implementation for decoding (Ticket:426)
 - fpconst dependancy is now only required if the platform requires it
   (Ticket:356)
 - Decoding negative timestamps on certain platforms (namely Windows) are now
   supported (Ticket:390)

0.4rc2 (2009-01-05)
-------------------
 - Support for SQLAlchemy 0.4.0 (Ticket:410)

0.4rc1 (2008-12-31)
-------------------
 - Support for encoding/decoding SQLAlchemy ORM objects with a new adapter.
   Lots of people involved in this one, but special thanks to Dave Thompson
   and Michael Van Tellingen for making this happen. (Ticket:277)
 - All gateways now log exceptions when exceptions are raised during
   en/decoding. (Ticket:394)
 - Flex messaging now uses correct static attributes for encoding. Determining
   static/dynamic attributes on objects is now easier (Ticket:357)
 - Added use_proxy option to amf3 which will automagically convert ObjectProxy
   to dict and ArrayCollection to list on decoding, and vice versa on encode.
   Thanks to dthompso for the excellent patch (Ticket:355)
 - flex.ArrayCollection now subclasses list instead of dict as non-int keys
   are not allowed. IList interface has been implemented. (Ticket:349)
 - Encoding registered subclass of list that define the 'externalised'
   metadata will be encoded as an object.
 - Encoders how have a 'strict' mode. Not generally useful for the time being
   but will help with developments in the future. Type mapped functions now
   require a second 'encoder' attribute. (Ticket:378)
 - Added adapter to handle the decimal module and, if strict is set to False,
   silently converts a Decimal instance to a float (Ticket:376)
 - ClassAlias can now be subclassed and three new methods have been added:
   applyAttributes, createInstance, getAttributes all which help to provide
   fine control for object/instance manipulation (Ticket:348)
 - Added support for __slots__ (Ticket:347)
 - Fixed problem when decoding objects that map to GAE db.Model objects with
   required properties (Ticket:342)
 - ByteArray now does not throw an error when used in the Remoting framework
   (Ticket:379)
 - A new adapter that converts sets.ImmutableSet and sets.Set to tuples before
   encoding. (Ticket:280)
 - A revamped google app engine adapter that checks for the _key attribute in
   an aliased class and first loads the object from the datastore and then
   applies that properties in the object stream. (Ticket:307)
 - New helper function to make it easier to manually add adapters (Ticket:350)
 - Ability to disable the c extension with passing --disable-ext to setup.py
   (Ticket:381, 391)
 - Python C-extension for the pyamf.util.BufferedByteStream class. Originally
   contributed by Gerard Escalante (Ticket:225, 405)
 - New API to add headers such as cookies in pyamf.remoting.client
   (Ticket:337)
 - Now clearing the context between remoting requests (Ticket:309)
 - Fixed issue with AMF3 class definition references (Ticket:341)
 - More helpful description for register_class args check (Ticket:334)
 - pyamf.register_class now checks to ensure that __init__ args do not have
   any arguments (Ticket:322)
 - Added RemoteObject support for AsyncMessage (Ticket:292)
 - pyamf.remoting.ErrorFault.__repr__ now displays the traceback info (if it
   exists). (Ticket:331)
 - Both Encoders will now raise pyamf.EncodeError if a function is encoded
   (Ticket:311)
 - Twisted Gateway would fall over when returning tuples (Ticket:313)
 - The remoting gateways now send a customizable Server header (Ticket:317)
 - The remoting client now sends a customizable User-Agent header (Ticket:306)
 - Added ability to set the HTTP referer in remoting client (Ticket:316)
 - Fixed issue where the AMF3 encoder assumed objects with a 'tag' attribute
   needed XML encoding. Reported by cy-man (Ticket:303)
 - Solved issue with repr for AbstractMessage. Reported by datafunk
   (Ticket:283)
 - Content-type was missing in POST requests from the AMF client. Reported by
   magog (Ticket:304)
 - Added the disconnect Command operation (Ticket:325)
 - Fixed issue with the unit tests for Django (Ticket:281)
 - Removed the NetworkIOMixIn class (Ticket:232)

0.3.1 (2008-05-04)
------------------
 - Importing module now has tests (Ticket:266)
 - Django model adapter now imported only when django.db.models is imported
   (Ticket:261)
 - Google Model/Expando encoding now works out of the box
 - Fixed issue with Remote Object destination (Ticket:270)
 - Added a new gateway for the Google App Engine - see
   pyamf.remoting.gateway.google.WebAppGateway (Ticket:253)
 - amf0 Encoder now takes amf3 contexts into account (Ticket:268)
 - amf*.encode helpers can now accept multiple arguments (Ticket:267)
 - Removed the dependancy of fpconst for Python 2.5 or newer (Ticket:243)
 - Solved issue with AMFPHP exceptions in AMF client (Ticket:258)
 - Fixed issue with url parsing in AMF client (Ticket:256)
 - Client no longer raises httplib.ResponseNotReady when making multiple
   requests using the same RemotingService (Ticket:254)

0.3 (2008-04-14)
----------------
 - Added compatibility module for Google App Engine (Ticket:247)
 - Fixed the signed interpretation of compressed integers in AMF3 (Ticket:241)
 - Classic class decoding would throw an AttributeError (Ticket:248)
 - Reloading adapter modules caused errors in Django, Pylons and Google App
   Engine. Resolved by removing dependancy on Importing module and
   incorporating into pyamf.util (Ticket:250)
 - Adapter framework can now be fired when only loading submodules
   (Ticket:246)
 - Made util.BufferedByteStream endian aware (Ticket:231)
 - Fixed issue with Twisted threads (Ticket:233)

0.2 (2008-03-12)
----------------
 - Removed amfinfo console_script (Ticket:226)
 - Encoders/Decoders now check for __getstate__/__setstate__ respectively
   (Ticket:209)
 - Gateway import hack has now been removed - permanently (Ticket:224)
 - Encoding/decoding performance has been increased 2x for AMF0 and up-to
   10x(!) for AMF3 (Ticket:198)
 - Logging is now possible in all the supported gateways (Ticket:173)
 - A new preprocessor function that runs after authentication, but before
   invoking the service method (Ticket:196)
 - authenticator can now be decorated with expose_request (Ticket:195)
 - Python 2.3 support (Ticket:33)
 - Python 2.6 support (Ticket:222)
 - Made PyAMF distributable as zip-based Python Egg (Ticket:193)

0.1.1 (2008-02-18)
------------------
 - AMF3 encoder reported incorrect byte length header for non-ASCII string
   data. Patch supplied by akaihola. (Ticket:194)
 - Decoder context not cleared between reading the remoting header and body.
   Reported by gerard (Ticket:192)

0.1 (2008-02-11)
----------------
 - New error handling api useful for registering custom exception classes
   (Ticket:185)
 - When a client receives a remoting error, an exception is generated
   (Ticket:167)
 - expose_request per service control vastly improved (Ticket:169)
 - Authentication per service control vastly improved (Ticket:166)
 - uuid is no longer installed when using Python 2.5 or newer (Ticket:182)
 - The inheritance tree was not consulted when encoding attributes (Ticket:172)
 - TypedObjects didn't work with old style classes (Ticket:171)
 - ErrorFault now prints details (Ticket:168)
 - Added expose_request to TwistedGateway (Ticket:165)
 - TwistedGateway now expects deferred from service functions (Ticket:164)

0.1b (2008-01-13)
-----------------
 - IExternalizable now takes its methods from the class and fine grain control
   over attr encoding (Ticket:110)
 - Added an adapter framework that gets imported when the related module is
   imported. See http://pyamf.org/wiki/AdapterFramework for more info
 - Added 'expose_environ' argument to WSGIGateway to expose the WSGI environ
   as the first arg in the called services.
 - Implemented Local Shared Object (LSO) support (Ticket:11)
 - ByteArray now implements IDataInput and IDataOutput instead of
   StringIOProxy (Ticket:151)
 - dicts are now used as the default for anonymous objects (Ticket:131)
 - remoting.client mostly fully supports the predefined headers (defined at
   http://osflash.org/documentation/amf/envelopes/remoting/headers). The only
   one missing is amf_server_debug (Ticket:39)
 - LazyImporter objects now set the __file__ attribute to None, so that
   querying sys.modules don't accidentally import the underlying module.
   (Ticket:147)
 - Fixed argument positioning for RemoteObject processing. Thanks akaihola!
   (Ticket:145)
 - ElementTree requirement is now ignored when using Python >= 2.5
   (Ticket:144)
 - Added tests for TwistedGateway (Ticket:132)
 - Workaround for Python 2.4 float shortcomings (Ticket:78)
 - Service Browser ('DescribeService' header) requests supported. (Ticket:138)
 - Remoting client now supports authentication. (Ticket:137)
 - Proper encoding for aliased subclassed builtin types, specifically
   flex.ArrayCollection.
 - Added support for easy encoding of Django object queries
   (Foo.objects.all())
 - Added 'add_type' allowing finer grain control of how a class is encoded in
   an AMF stream. (Ticket:130)
 - 'authenticator' keyword added to all gateways (moved from ServiceRequest)
   (Ticket:129)
 - Added 'expose_request' argument to DjangoGateway to expose the underlying
   HTTP Request object as the first arg in the called services. (Ticket:103)

0.1.0a (2007-12-12)
-------------------
 - AMF0 and AMF3 encoders/decoders
 - Additional support for IExternalizable, ArrayCollection, ObjectProxy,
   ByteArray, RecordSet and RemoteObject
 - Remoting gateways for Twisted, WSGI, and Django
 - Authentication/setCredentials support
 - zlib compression support for ByteArray
 - Remoting client with httplib

0.0.1 (2007-10-19)
------------------
 - Started project based on previous work done in the RTMPy (http://rtmpy.org)
   project.
