Change History
==============
Version 0.4 -
-------------
- Added compute() method to Table to support global update of all 
  objects in the table, to add or modify a given attribute on each
  object.  compute() takes a function that computes the new or
  modified attribute value, taking the entire object as its single
  input argument.  Can override DataObject's write-only functionality
  (for example, when converting attributes entered as a string to
  an int or float).  Also accepts a default value to use, in case
  the computing function raises an exception.  Useful when creating
  a new attribute that would be computed based on other values in
  the object.
  
- Added transforms argument to csv_import, to simplify the conversion
  of string data values to int, float, or other non-string type.
  The transforms argument is a dict mapping attribute names to 
  conversion functions, each function taking the as-imported string
  value and return a new transformed value.
  

Version 0.3 -
(renamed project from dulce to littletable)
-------------
- Improved exception message when duplicate or None value is given 
  for a unique index attribute.
  
- Support for namedtuples and __slots__-defining objects supplied
  by Colin McPhail, thanks!

- Added Table.pivot() method, to return a pivot table on one or
  more attributes.  New PivotTable class includes methods for
  extracting data in both Table and tabular formats.

- Added more details to the docstring for Table.join, to more
  completely describe the sequence of steps to join 2 or more
  Tables, using join(), or join_to and '+'. Also, removed table_name
  argument in Table.join, to simplify this call (the resulting table
  can be easily renamed using Table call form).

- Python 3 compatibility changes, importing simplejson or json,
  as appropriate - thanks again to Colin for the Python
  compatibility testing.

- Renamed _TableJoin to JoinTerm, and added documentation on
  how it is used to build up table joins using '+' addition 
  notation.


Version 0.2 -
-------------
- Fixed typo in module docstring, "wishlists" should be "wishitems" 
  (as shown correctly in dulce_demo.py). Also fixed typo in docs for 
  Table.create_index, caused by my lack of epydoc-fu.  Plus some 
  general cleanup of the docstrings.  Thanks, Colin McPhail for 
  reporting these!

- Changed _orderby and _orderbydesc flags to just _orderby, taking
  a single string containing a comma-separated list of attribute
  names (this is necessary since **kwargs does not preserve arguments 
  order).
  
- Changed Table attribute "name" to "table_name", so as not to 
  collide with a user-defined index on an attribute named "name".

- Added support for unique indexes to allow or disallow null key
  values.  If null keys are allowed, then all records with a null key 
  are stored in an internal list.

- Added some join performance pickup, using the table with the
  smaller number of keys as the outer loop in finding matching
  records.
  
- Added query performance pickup, when using multiple indexed 
  attributes in query.


Version 0.1 - 16 October 2010
-----------------------------
Initial prototype release