0.2.0 rc 1
------------------
* backwards incompatible changes
* gutted `image_wrapper.py`:
* multiple classes in `image_wrapper` now inherit from BasicImage, which wraps teh file
* `WrappedImage` now contains a `basicImage` and `pilObject`.
* multiple functions in `WrappedImage` removed.  functions previously hitting `WrappedImage` should call the attributes of `WrappedImage.basicImage`
* `BasicImage` can "optimize" an image. this is accomplished by piping the data into gifsicle, pngcrush, jpegtran.  This can be run on original and resize
* resizerConfig , resize and register_image_file now require information on optimizing the original & resize.  NOTE - large images can take some time!
* NOTE - the optimization will not work on windows. this is because it uses NamedTemporaryFile to create files.
* now requires `envoy`, which makes using the subprocess module a bit better.


0.1.0 rc 10
------------------
* better checking of supported types
* allowing a prefeerence for file-like objects to be configured

0.1.0 rc 9
------------------
* added `utils.PIL_type_to_extension`
* added `image_wrapper.ResizedImage.file_extension`; proxies call to `utils.PIL_type_to_extension`
* added `image_wrapper.FakedOriginal.file_extension`; proxies call to `utils.PIL_type_to_extension`


0.1.0 rc 8
------------------
* docs change to illustrate allowing factory managers to upload archive or resizes only


0.1.0 rc 7
------------------
* updated demo.py to reflect current narrative docs
* added `imagehelper.image_wrapper.ResizedImage().file_b64`
* added `imagehelper.image_wrapper.ImageWrapper().file_b64`
* added `imagehelper.utils.file_b64`
* added `imagehelper.utils.b64_decode_to_file`
* updated `imagehelper.resizer.ResizerFactory().resizer()` now accepts `file_b64` data
* updated `imagehelper.resizer.Resizer().register_image_file()` now accepts `file_b64` data


0.1.0 rc 6
------------------
* refactored `imagehelper.s3.S3Uploader`
** new base class `_S3CoreManager` for `_S3Manager` and new class `S3SimpleAccess`
** base class houses `s3_connection` , `s3_buckets` , `s3_delete`
* new class `imagehelper.s3.S3SimpleAccess`
** `imagehelper.s3.S3SimpleAccess().s3_file_upload()` upload a single file/bucket
** `imagehelper.s3.S3SimpleAccess().simple_uploads_mapping()` generates a `s3_uploads` compatible dict for deletion

0.1.0 rc 5
------------------
* updated docs for deleting
* renamed `imagehelper.resize.Resizer().fake_resultset()` to `imagehelper.resize.Resizer().fake_resize()`
* removed `imagehelper.resize.Resizer().reset()`. this should never be done.
* added `imagehelper.resize.Resizer().get_original()`. proxies to the internal image object
* renamed `imagehelper.resize.Resizer().image` to `imagehelper.resize.Resizer()._image`
* renamed `imagehelper.resize.Resizer().resizerConfig` to `imagehelper.resize.Resizer()._resizerConfig`



0.1.0 rc 4
------------------
* renamed `imagehelper.s3.S3Uploader()` to `imagehelper.s3.S3Manager()`
* added `imagehelper.s3.S3ManagerFactory()` class to generate `S3Manager` instances via `s3_manager()` method.


0.1.0 rc 3
------------------
* added `imagehelper.resizer.ResizerFactory.resizer(imagefile=None)` to return a new resizer object.  this is useful for validating a file.
* fixed location of error codes; were moved to `utils` from (deprecated) `constants`
* removed `imagehelper.image_wrapper.ImageObject().imageObject_mode`
* renamed `imagehelper.resizer.Resizer().imageWrapper` to  `imagehelper.image_wrapper.`imagehelper.resizer.Resizer().image`
* added proxied properties to `imagehelper.image_wrapper.ImageObject`
** name = self.imageObject_name
** mode = self.imageObject.mode
** size = self.imageObject.size
** format = self.imageObject.format
** format_standardized = utils.PIL_type_to_standardized( self.imageObject.format )
* renamed `imagehelper.resize.ResizedImage().filesize` to `file_size`
* added `imagehelper.utils.file_md5`
* added `imagehelper.resize.ResizedImage().file_md5`
* added `imagehelper.utils._standardized_to_PIL_type`
* added `imagehelper.utils.standardized_to_PIL_type()`
* added `imagehelper.image_wrapper.FakedOriginal()`
* added `imagehelper.resize.Resizer().fake_resultset()` to generate a resultset compatible with s3 operations ( specifically delete )
* renamed `imagehelper.s3.S3Logger().log_upload` is now passed `file_size` instead of `filesize`
* addded `imagehelper.s3.S3Logger().log_upload` is now passed `file_md5`
* removed `imagehelper.resize.ResizeFactory().resize()` ; the factory should only return configured `imagehelper.resize.Resize()` objects, not proxy actions to them



0.1.0 rc 2
------------------
* standardized kwargs and attributes of config objects to be camelCase for instances
* renamed `image_resizes` to `resizesSchema`
* renamed `image_resizes_selected` to `selected_resizes`
* added tests for image resizing

0.1.0 rc 1
------------------
* THIS TOTALLY AND ENTIRELY BREAKS PRIOR INTEGRATIONS
* simplifying interface
* splitting code into multiple files with better organization
* supporting Pillow , as PIL isn't really used by many people
* cleaning up S3 interface
* this entirely breaks older versions
* the older schema definitions ( dicts ) remain unchanged. the python
  integration has completely changed
* started adding tests

notable changes :

* classes have been logically separated into different namespaces
* resizing does not automatically upload to s3 anymore. you must chain this
  in your own code
* s3logger objects
** kwarg `bucket` is now `bucket_name`
** kwarg `filesize` is now sent on upload



0.0.4 (2012-06-07)
------------------
- fixed setup script


0.0.3 (2012-03-25)
------------------
- not backwards compatible. sorry.

# Tracking the "archive" image was changed.

1. photo_sizes now reserve an initial @ character for internal usage
2. archived fullsize images are now tracked as:

	dict[bucket_name]['@archive'][filename]

before there was a dual-use dict, that was just hard to manage

	dict[public_bucket_name][size][filename]
	dict[archive_bucket_name][filename]

this created issues where you couldn't save the archived image to the same s3 bucket.  now you can.

# added s3_generate_filenames

this call just generates the filenames that would be saved to s3.
this is necessary for deletion or external auditing of your uploads

# added s3_delete

you can now delete s3 files

# this still doesn't have proper tests

check the demo.py


0.0.2 (2012-03-23)
------------------
- corrected error in handling of failed items.  created a check for DictType and StringTypes.

0.0.1 (2012-03-14)
------------------
- initial release
