Version History
---------------
 - 0.23.0 - released *2014-11-5*
  - Fix a bug where message body length was being assigned to the content header prior to converting the unicode string to bytes (#49)
  - Add a new rabbitpy.utils.maybe_utf8_encode method for handling strings that may or may not contain unicode (#49)
  - Fix the automatic coercion of header types to UTF-8 encoded bytes (#49)
  - Fix an integration test that was not cleaning up its queue after itself
  - Raise TypeError if a timestamp property can not be converted properly
 - 0.22.0 - released *2014-11-4*
  - Address an issue when RabbitMQ is configured with a max-frame-size of 0 (#48)
  - Do not lose the traceback when exiting a context manager due to a an exception (#46)
  - Adds server capability checking in rabbitpy.Channel methods that require RabbitMQ enhancements to the AMQP protocol (Publisher confirms, consumer priorities, & Baisc.Nack). If unsupported functionality is used, a rabbitpy.exceptions.NotSupportedError exception will be raised.
  - Pin pamqp version range to >= 1.4, < 2.0
  - Fix wheel distribution
 - 0.21.1 - released *2014-10-23*
  - Clean up KQueue issues found when troubleshooting #44, checking for socket EOF in flags to detect connection reset
  - Remove sockets from KQueue when in error state
  - Change behavior when there is a poll exception list
  - Handle socket connect errors more cleanly (#44)
  - Handle bug for how we pull the error string from an exception in IO.on_error (#44)
  - Re-raise exceptions causing the exit of Connection or Channel so they can be cleanly caught (#44)
 - 0.21.0 - released *2014-10-21*
  - Address a possible edge case where message frames can be interspersed when publishing in a multi-threaded environment
  - Add exception handling around select.error (#43)
  - Check all frames for Channel.CloseOk when consuming
  - Add a new ``opinionated`` flag in rabbitpy.Message construction that deprecates the ``auto_id`` flag
  - Add wheel distribution
 - 0.20.0 - released *2014-10-01*
  - Added support for KQueue and Poll in IOLoop for performance improvements
  - Fixed issues with publishing large messages and socket resource availability errors (#37)
  - Add exchange property to rabbitpy.Message (#40)
  - Fix exception when timestamp is None in received Message (#41)
  - Fix rabbitpy.Message.json() in Python 3.4 (#42)
  - Add out-of-band consumer cancellation with Queue.stop_consuming() (#38, #39)
  - Add new simple method rabbitpy.create_headers_exchange()
  - Significantly increase test coverage
 - 0.19.0 - released *2014-06-30*
  - Fix the socket read/write buffer size (#35)
  - Add new flag in channels to use blocking queue.get operations increasing throughput and lowering overhead.
 - 0.18.1 - released *2014-05-15*
  - Fix unicode message body encoding in Python 2
 - 0.18.0 - released *2014-05-15*
  - Make IO thread daemonic
  - block on RPC reads for 1 second instead of 100ms
  - add the Message.redelivered property
 - 0.17.0 - released *2014-04-16*
  - Refactor cross-thread communication for RabbitMQ invoked RPC methods
  - fix unclean shutdown conditions and cross-thread exceptions
 - 0.16.0 - released *2014-04-10*
  - Fix an issue with no_ack=True consumer cancellation
  - Fix exchange and queue unbinding
  - Add wait on the SOCKET_OPENED event when connecting
  - Deal with str message body values in Python 3 by casting to bytes and encoding as UTF-8.
 - 0.15.1 - released *2014-01-27*
  - Fix an issue with Python 3 IO write trigger
 - 0.15.0 - released *2014-01-27*
  - Change default durability for Exchange and Queue to False
  - Fix a SSL connection issue
 - 0.14.2 - released *2014-01-23*
  - Fix an issue when IPv6 is the default protocol for the box rabbitpy is being used on
 - 0.14.1 - released *2014-01-23*
  - Assign queue name for RabbitMQ named queues in rabbitpy.Queue.declare
 - 0.14.0 - released *2014-01-22*
  - Add support for authentication_failure_close
  - Add consumer priorities
  - Exception cleanup
  - Queue consuming via Queue.__iter__
  - Queue & Exchange attributes are no longer private
  - Tx objects can be used as a context manager
  - Experimental support for Windows.
 - 0.13.0 - released *2014-01-17*
  - Validate heartbeat is always an integer
  - add arguments to Queue for expires, message-ttl, max-length, & dead-lettering
 - 0.12.3 - released *2013-12-23*
  - Minor Message.pprint() reformatting
 - 0.12.2 - released *2013-12-23*
  - Add Exchange and Routing Key to Message.pprint, check for empty method frames in Channel._create_message
 - 0.12.1 - released *2013-12-19*
  - Fix exception with pika.exceptions.AMQP
 - 0.12.0 - released *2013-12-19*
  - Updated simple consumer to potential one-liner
  - Added rabbitpy.Message.pprint()
 - 0.11.0 - released *2013-12-19*
  - Major bugfix focused on receiving multiple AMQP frames at the same time.
  - Add auto-coercion of property data-types.
 - 0.10.0 - released *2013-12-11*
  - Rewrite of IO layer yielding improved performance and reduction of CPU usage, bugfixes
 - 0.9.0 - released *2013-10-02*
  - Major performance improvements, CPU usage reduction, minor bug-fixes
 - 0.8.0 - released *2013-10-01*
  - Major bugfixes
  - IPv6 support
 - 0.7.0 - released *2013-10-01*
  - Bugfixes and code cleanup.
  - Most notable fix around Basic.Return and recursion in Channel._wait_on_frame.
 - 0.6.0 - released *2013-09-30*
  - Bugfix with Queue.get()
  - Bugfix with RPC requests expecting multiple responses
  - Add Queue.consume_messages() method.
 - 0.5.1 - released *2013-09-24*
  - Installer/setup fix
 - 0.5.0 - released *2013-09-23*
  - Bugfix release including low level socket sending fix and connection timeouts.
 - < 0.5.0
  - Previously called rmqid
