summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--CHANGES.md614
-rw-r--r--CHANGES.rst659
-rw-r--r--CONTRIBUTING.md166
-rw-r--r--CONTRIBUTING.rst81
-rw-r--r--README.md28
-rw-r--r--README.rst39
-rw-r--r--kazoo/version.py2
-rw-r--r--setup.py4
8 files changed, 811 insertions, 782 deletions
diff --git a/CHANGES.md b/CHANGES.md
new file mode 100644
index 0000000..52f9975
--- /dev/null
+++ b/CHANGES.md
@@ -0,0 +1,614 @@
+Changelog
+=========
+
+2.3.0 (2017-05-31)
+------------------
+
+Please note, there have been a few dozen merges that failed to update the
+changelog here. As such, the log here should not be considered conclusive as
+to the changes that are arriving in 2.3.0.
+
+Changes being made now to ensure more accuracy in the changelog will appear
+in all future versions going forward. Read the commit history for a better
+understanding of changes merged between 2.2.1 and 2.3.0.
+
+All future commits must abide by the new CONTRIBUTING.md document describing
+how to label commits so they can be automatically used to automatically
+generate an accurate changelog.
+
+*WARNING:* THIS IS THE LAST KAZOO RELEASE THAT SUPPORTS PYTHON 2.6. ALL FUTURE
+VERSIONS WILL REQUIRE PYTHON 2.7 AND ABOVE.
+
+### Features
+
+- allow having observers and different sized clusters
+
+### Bug Handling
+
+- \#372: fully resolve multiple records for hosts in the zookeeper
+ connection string
+
+### Documentation
+
+- Fix the recipe examples, so they actually work by connecting to
+ ZooKeeper. Without start() they just hang and can't be killed.
+
+2.2.1 (2015-06-17)
+------------------
+
+### Bug Handling
+
+- handle NameError with basestring on py3k.
+
+### Documentation
+
+2.2 (2015-06-15)
+----------------
+
+### Documentation
+
+### Features
+
+- Issue \#234: Add support for reconfig cluster membership operation
+
+### Bug Handling
+
+- \#315: multiple acquires of a kazoo lock using the lock recipe would
+ block when using acquire even when non-blocking is specified (only
+ when the lock was/has been already acquired).
+- \#318: At exit register takes `*args` and `**kwargs` not args and
+ kargs
+
+### Documentation
+
+2.1 (2015-05-11)
+----------------
+
+### Features
+
+- Start running tests against Zookeeper 3.5.0 alpha and explicitly
+ configure the admin.serverPort in tests to avoid port conflicts. The
+ Zookeeper alpha version is not yet officially supported.
+- Integrate eventlet *handler* support into kazoo so that along with
+ [gevent, threading] handlers there can now be a dedicated eventlet
+ handler for projects that need to (or want to) use eventlet (such as
+ those working in the openstack community). The
+ `requirements_eventlet.txt` file lists the optional eventlet
+ requirement(s) that needs to be satisfied when this new handler is
+ used.
+- Use `six` to nicely handle the cross compatibility of kazoo with
+ python 2.x and 3.x (reducing/removing the need to have custom
+ compatibility code that replicates what six already provides).
+- Add `state_change_event` to
+ `kazoo.recipe.partitioner.SetPartitioner` which is set on every
+ state change.
+- Add a NonBlockingLease recipe. The recipe allows e.g. cron jobs
+ scheduled on multiple machines to ensure that at most N instances
+ will run a particular job, with lease timeout for graceful handover
+ in case of node failures.
+
+### Bug Handling
+
+- \#291: Kazoo lock recipe was only partially re-entrant in that
+ multiple calls to acquire would obtain the the lock but the first
+ call to release would remove the underlying lock. This would leave
+ the X - 1 other acquire statements unprotected (and no longer
+ holding there expected lock). To fix this the comment about that
+ lock recipe being re-entrant has been removed and multiple acquires
+ will now block when attempted.
+- \#78: Kazoo now uses socketpairs instead of pipes making it
+ compatible with Windows.
+- \#144, \#221: Let client.command work with IPv6 addresses.
+- \#216: Fixed timeout for ConnectionHandler.\_invoke.
+- \#261: Creating a sequential znode under / doesn't work.
+- \#274: Add server\_version() retries (by default 4 attempts will be
+ made) to better handle flakey responses.
+- \#271: Fixed handling of KazooState.SUSPENDED in SetPartitioner.
+- \#283: Fixed a race condition in SetPartitioner when party changes
+ during handling of lock acquisition.
+- \#303: don't crash on random input as the hosts string.
+
+### Documentation
+
+- \#222: Document that committed on the transaction is used to ensure
+ only one commit and is not an indicator of whether operations in the
+ transaction returned desired results.
+
+2.0 (2014-06-19)
+----------------
+
+### Documentation
+
+- Extend support to Python 3.4, deprecating Python 3.2.
+- Issue \#198: Mention Zake as a sophisticated kazoo mock testing
+ library.
+- Issue \#181: Add documentation on basic logging setup.
+
+2.0b1 (2014-04-24)
+------------------
+
+### API Changes
+
+- Null or None data is no longer treated as "". Pull req \#165, patch
+ by Raul Gutierrez S. This will affect how you should treat null data
+ in a znode vs. an empty string.
+- Passing acl=[] to create() now works properly instead of an
+ InvalidACLError as it returned before. Patch by Raul Gutierrez S in
+ PR \#164.
+- Removed the dependency on zope.interface. The classes in the
+ interfaces module are left for documentation purposes only (issue
+ \#131).
+
+### Features
+
+- Logging levels have been reduced.
+ - Logging previously at the `logging.DEBUG` level is now logged at
+ the `kazoo.loggingsupport.BLATHER` level (5).
+ - Some low-level logging previously at the `logging.INFO` level is
+ now logged at the `logging.DEBUG` level.
+- Issue \#133: Introduce a new environment variable
+ ZOOKEEPER\_PORT\_OFFSET for the testing support, to run the testing
+ cluster on a different range.
+
+### Bug Handling
+
+- When authenticating via add\_auth() the auth data will be saved to
+ ensure that the authentication happens on reconnect (as is the case
+ when feeding auth data via KazooClient's constructor). PR \#172,
+ patch by Raul Gutierrez S.
+- Change gevent import to remove deprecation warning when newer gevent
+ is used. PR \#191, patch by Hiroaki Kawai.
+- Lock recipe was failing to use the client's sleep\_func causing
+ issues with gevent. Issue \#150.
+- Calling a DataWatch or ChildrenWatch instance twice (decorator) now
+ throws an exception as only a single function can be associated with
+ a single watcher. Issue \#154.
+- Another fix for atexit handling so that when disposing of
+ connections the atexit handler is removed. PR \#190, patch by Devaev
+ Maxim.
+- Fix atexit handling for kazoo threading handler, PR \#183. Patch by
+ Brian Wickman.
+- Partitioner should handle a suspended connection properly and
+ restore an allocated state if it was allocated previously. Patch by
+ Manish Tomar.
+- Issue \#167: Closing a client that was never started throws a type
+ error. Patch by Joshua Harlow.
+- Passing dictionaries to KazooClient.\_\_init\_\_() wasn't actually
+ working properly. Patch by Ryan Uber.
+- Issue \#119: Handler timeout takes the max of the random interval or
+ the read timeout to ensure a negative number isn't used for the read
+ timeout.
+- Fix ordering of exception catches in lock.acquire as it was
+ capturing a parent exception before the child. Patch by ReneSac.
+- Fix issue with client.stop() not always setting the client state to
+ KeeperState.CLOSED. Patch by Jyrki Pulliainen in PR \#174.
+- Issue \#169: Fixed pipes leaking into child processes.
+
+### Documentation
+
+- Add section on contributing recipes, add maintainer/status
+ information for existing recipes.
+- Add note about alternate use of DataWatch.
+
+1.3.1 (2013-09-25)
+------------------
+
+### Bug Handling
+
+- \#118, \#125, \#128: Fix unknown variable in KazooClient
+ command\_retry argument handling.
+- \#126: Fix KazooRetry.copy to correctly copy sleep function.
+- \#118: Correct session/socket timeout conversion (int vs. float).
+
+### Documentation
+
+- \#121: Add a note about kazoo.recipe.queue.LockingQueue requiring a
+ Zookeeper 3.4+ server.
+
+1.3 (2013-09-05)
+----------------
+
+### Features
+
+- \#115: Limit the backends we use for SLF4J during tests.
+- \#112: Add IPv6 support. Patch by Dan Kruchinin.
+
+1.2.1 (2013-08-01)
+------------------
+
+### Bug Handling
+
+- Issue \#108: Circular import fail when importing
+ kazoo.recipe.watchers directly has now been resolved. Watchers and
+ partitioner properly import the KazooState from
+ kazoo.protocol.states rather than kazoo.client.
+- Issue \#109: Partials not usable properly as a datawatch call can
+ now be used. All funcs will be called with 3 args and fall back to 2
+ args if there's an argument error.
+- Issue \#106, \#107: client.create\_async didn't strip change root
+ from the returned path.
+
+1.2 (2013-07-24)
+----------------
+
+### Features
+
+- KazooClient can now be stopped more reliably even if its in the
+ middle of a long retry sleep. This utilizes the new interrupt
+ feature of KazooRetry which lets the sleep be broken down into
+ chunks and an interrupt function called to determine if the retry
+ should fail early.
+- Issue \#62, \#92, \#89, \#101, \#102: Allow KazooRetry to have a max
+ deadline, transition properly when connection fails to LOST, and
+ setup separate connection retry behavior from client command retry
+ behavior. Patches by Mike Lundy.
+- Issue \#100: Make it easier to see exception context in threading
+ and connection modules.
+- Issue \#85: Increase information density of logs and don't prevent
+ dynamic reconfiguration of log levels at runtime.
+- Data-watchers for the same node are no longer 'stacked'. That is, if
+ a get and an exists call occur for the same node with the same watch
+ function, then it will be registered only once. This change results
+ in Kazoo behaving per Zookeeper client spec regarding repeat watch
+ use.
+
+### Bug Handling
+
+- Issue \#53: Throw a warning upon starting if the chroot path doesn't
+ exist so that it's more obvious when the chroot should be created
+ before performing more operations.
+- Kazoo previously would let the same function be registered as a
+ data-watch or child-watch multiple times, and then call it multiple
+ times upon being triggered. This was non-compliant Zookeeper client
+ behavior, the same watch can now only be registered once for the
+ same znode path per Zookeeper client documentation.
+- Issue \#105: Avoid rare import lock problems by moving module
+ imports in client.py to the module scope.
+- Issue \#103: Allow prefix-less sequential znodes.
+- Issue \#98: Extend testing ZK harness to work with different file
+ locations on some versions of Debian/Ubuntu.
+- Issue \#97: Update some docstrings to reflect current state of
+ handlers.
+- Issue \#62, \#92, \#89, \#101, \#102: Allow KazooRetry to have a max
+ deadline, transition properly when connection fails to LOST, and
+ setup separate connection retry behavior from client command retry
+ behavior. Patches by Mike Lundy.
+
+### API Changes
+
+- The kazoo.testing.harness.KazooTestHarness class directly inherits
+ from unittest.TestCase and you need to ensure to call its
+ \_\_init\_\_ method.
+- DataWatch no longer takes any parameters besides for the optional
+ function during instantiation. The additional options are now
+ implicitly True, with the user being left to ignore events as they
+ choose. See the DataWatch API docs for more information.
+- Issue \#99: Better exception raised when the writer fails to close.
+ A WriterNotClosedException that inherits from KazooException is now
+ raised when the writer fails to close in time.
+
+1.1 (2013-06-08)
+----------------
+
+### Features
+
+- Issue \#93: Add timeout option to lock/semaphore acquire methods.
+- Issue \#79 / \#90: Add ability to pass the WatchedEvent to DataWatch
+ and ChildWatch functions.
+- Respect large client timeout values when closing the connection.
+- Add a max\_leases consistency check to the semaphore recipe.
+- Issue \#76: Extend testing helpers to allow customization of the
+ Java classpath by specifying the new ZOOKEEPER\_CLASSPATH
+ environment variable.
+- Issue \#65: Allow non-blocking semaphore acquisition.
+
+### Bug Handling
+
+- Issue \#96: Provide Windows compatibility in testing harness.
+- Issue \#95: Handle errors deserializing connection response.
+- Issue \#94: Clean up stray bytes in connection pipe.
+- Issue \#87 / \#88: Allow re-acquiring lock after cancel.
+- Issue \#77: Use timeout in initial socket connection.
+- Issue \#69: Only ensure path once in lock and semaphore recipes.
+- Issue \#68: Closing the connection causes exceptions to be raised by
+ watchers which assume the connection won't be closed when running
+ commands.
+- Issue \#66: Require ping reply before sending another ping,
+ otherwise the connection will be considered dead and a
+ ConnectionDropped will be raised to trigger a reconnect.
+- Issue \#63: Watchers weren't reset on lost connection.
+- Issue \#58: DataWatcher failed to re-register for changes after
+ non-existent node was created then deleted.
+
+### API Changes
+
+- KazooClient.create\_async now supports the makepath argument.
+- KazooClient.ensure\_path now has an async version,
+ ensure\_path\_async.
+
+1.0 (2013-03-26)
+----------------
+
+### Features
+
+- Added a LockingQueue recipe. The queue first locks an item and
+ removes it from the queue only after the consume() method is called.
+ This enables other nodes to retake the item if an error occurs on
+ the first node.
+
+### Bug Handling
+
+- Issue \#50: Avoid problems with sleep function in mixed
+ gevent/threading setup.
+- Issue \#56: Avoid issues with watch callbacks evaluating to false.
+
+1.0b1 (2013-02-24)
+------------------
+
+### Features
+
+- Refactored the internal connection handler to use a single thread.
+ It now uses a deque and pipe to signal the ZK thread that there's a
+ new command to send, so that the ZK thread can send it, or retrieve
+ a response. Processing ZK requests and responses serially in a
+ single thread eliminates the need for a bunch of the locking, the
+ peekable queue and two threads working on the same underlying
+ socket.
+- Issue \#48: Added documentation for the retry helper module.
+- Issue \#55: Fix os.pipe file descriptor leak and introduce a
+ KazooClient.close method. The method is particular useful in tests,
+ where multiple KazooClients are created and closed in the same
+ process.
+
+### Bug Handling
+
+- Issue \#46: Avoid TypeError in GeneratorContextManager on process
+ shutdown.
+- Issue \#43: Let DataWatch return node data if allow\_missing\_node
+ is used.
+
+0.9 (2013-01-07)
+----------------
+
+### API Changes
+
+- When a retry operation ultimately fails, it now raises a
+ kazoo.retry.RetryFailedError exception, instead of a general
+ Exception instance. RetryFailedError also inherits from the base
+ KazooException.
+
+### Features
+
+- Improvements to Debian packaging rules.
+
+### Bug Handling
+
+- Issue \#39 / \#41: Handle connection dropped errors during session
+ writes. Ensure client connection is re-established to a new ZK node
+ if available.
+- Issue \#38: Set CLOEXEC flag on all sockets when available.
+- Issue \#37 / \#40: Handle timeout errors during select calls on
+ sockets.
+- Issue \#36: Correctly set ConnectionHandler.writer\_stopped even if
+ an exception is raised inside the writer, like a retry operation
+ failing.
+
+0.8 (2012-10-26)
+----------------
+
+### API Changes
+
+- The KazooClient.\_\_init\_\_ took as watcher argument as its second
+ keyword argument. The argument had no effect anymore since version
+ 0.5 and was removed.
+
+### Bug Handling
+
+- Issue \#35: KazooClient.\_\_init\_\_ didn't pass on
+ retry\_max\_delay to the retry helper.
+- Issue \#34: Be more careful while handling socket connection errors.
+
+0.7 (2012-10-15)
+----------------
+
+### Features
+
+- DataWatch now has a allow\_missing\_node setting that allows a watch
+ to be set on a node that doesn't exist when the DataWatch is
+ created.
+- Add new Queue recipe, with optional priority support.
+- Add new Counter recipe.
+- Added debian packaging rules.
+
+### Bug Handling
+
+- Issue \#31 fixed: Only catch KazooExceptions in catch-all calls.
+- Issue \#15 fixed again: Force sleep delay to be a float to appease
+ gevent.
+- Issue \#29 fixed: DataWatch and ChildrenWatch properly re-register
+ their watches on server disconnect.
+
+0.6 (2012-09-27)
+----------------
+
+### API Changes
+
+- Node paths are assumed to be Unicode objects. Under Python 2
+ pure-ascii strings will also be accepted. Node values are considered
+ bytes. The byte type is an alias for str under Python 2.
+- New KeeperState.CONNECTED\_RO state for Zookeeper servers connected
+ in read-only mode.
+- New NotReadOnlyCallError exception when issuing a write change
+ against a server thats currently read-only.
+
+### Features
+
+- Add support for Python 3.2, 3.3 and PyPy (only for the threading
+ handler).
+- Handles connecting to Zookeeper 3.4+ read-only servers.
+- Automatic background scanning for a Read/Write server when connected
+ to a server in read-only mode.
+- Add new Semaphore recipe.
+- Add a new retry\_max\_delay argument to the client and by default
+ limit the retry delay to at most an hour regardless of exponential
+ backoff settings.
+- Add new randomize\_hosts argument to KazooClient, allowing one to
+ disable host randomization.
+
+### Bug Handling
+
+- Fix bug with locks not handling intermediary lock contenders
+ disappearing.
+- Fix bug with set\_data type check failing to catch unicode values.
+- Fix bug with gevent 0.13.x backport of peekable queue.
+- Fix PatientChildrenWatch to use handler specific sleep function.
+
+0.5 (2012-09-06)
+----------------
+
+Skipping a version to reflect the magnitude of the change. Kazoo is now
+a pure Python client with no C bindings. This release should run without
+a problem on alternate Python implementations such as PyPy and Jython.
+Porting to Python 3 in the future should also be much easier.
+
+### Documentation
+
+- Docs have been restructured to handle the new classes and locations
+ of the methods from the pure Python refactor.
+
+### Bug Handling
+
+This change may introduce new bugs, however there is no longer the
+possibility of a complete Python segfault due to errors in the C library
+and/or the C binding.
+
+- Possible segfaults from the C lib are gone.
+- Password mangling due to the C lib is gone.
+- The party recipes didn't set their participating flag to False after
+ leaving.
+
+### Features
+
+- New client.command and client.server\_version API, exposing
+ Zookeeper's four letter commands and giving access to structured
+ version information.
+- Added 'include\_data' option for get\_children to include the node's
+ Stat object.
+- Substantial increase in logging data with debug mode. All
+ correspondence with the Zookeeper server can now be seen to help in
+ debugging.
+
+### API Changes
+
+- The testing helpers have been moved from testing.\_\_init\_\_ into a
+ testing.harness module. The official API's of KazooTestCase and
+ KazooTestHarness can still be directly imported from testing.
+- The kazoo.handlers.util module was removed.
+- Backwards compatible exception class aliases are provided for now in
+ kazoo exceptions for the prior C exception names.
+- Unicode strings now work fine for node names and are properly
+ converted to and from unicode objects.
+- The data value argument for the create and create\_async methods of
+ the client was made optional and defaults to an empty byte string.
+ The data value must be a byte string. Unicode values are no longer
+ allowed and will raise a TypeError.
+
+0.3 (2012-08-23)
+----------------
+
+### API Changes
+
+- Handler interface now has an rlock\_object for use by recipes.
+
+### Bug Handling
+
+- Fixed password bug with updated zc-zookeeper-static release, which
+ retains null bytes in the password properly.
+- Fixed reconnect hammering, so that the reconnection follows retry
+ jitter and retry backoff's.
+- Fixed possible bug with using a threading.Condition in the set
+ partitioner. Set partitioner uses new rlock\_object handler API to
+ get an appropriate RLock for gevent.
+- Issue \#17 fixed: Wrap timeout exceptions with staticmethod so they
+ can be used directly as intended. Patch by Bob Van Zant.
+- Fixed bug with client reconnection looping indefinitely using an
+ expired session id.
+
+0.2 (2012-08-12)
+----------------
+
+### Documentation
+
+- Fixed doc references to start\_async using an AsyncResult object, it
+ uses an Event object.
+
+### Bug Handling
+
+- Issue \#16 fixed: gevent zookeeper logging failed to handle a monkey
+ patched logging setup. Logging is now setup such that a greenlet is
+ used for logging messages under gevent, and the thread one is used
+ otherwise.
+- Fixed bug similar to \#14 for ChildrenWatch on the session listener.
+- Issue \#14 fixed: DataWatch had inconsistent handling of the node it
+ was watching not existing. DataWatch also properly spawns its
+ \_get\_data function to avoid blocking session events.
+- Issue \#15 fixed: sleep\_func for SequentialGeventHandler was not
+ set on the class appropriately leading to additional arguments being
+ passed to gevent.sleep.
+- Issue \#9 fixed: Threads/greenlets didn't gracefully shut down.
+ Handler now has a start/stop that is used by the client when calling
+ start and stop that shuts down the handler workers. This addresses
+ errors and warnings that could be emitted upon process shutdown
+ regarding a clean exit of the workers.
+- Issue \#12 fixed: gevent 0.13 doesn't use the same
+ start\_new\_thread as gevent 1.0 which resulted in a fully
+ monkey-patched environment halting due to the wrong thread. Updated
+ to use the older kazoo method of getting the real thread module
+ object.
+
+### API Changes
+
+- The KazooClient handler is now officially exposed as
+ KazooClient.handler so that the appropriate sync objects can be used
+ by end-users.
+- Refactored ChildrenWatcher used by SetPartitioner into a publicly
+ exposed PatientChildrenWatch under recipe.watchers.
+
+### Deprecations
+
+- connect/connect\_async has been renamed to start/start\_async to
+ better match the stop to indicate connection handling. The prior
+ names are aliased for the time being.
+
+### Recipes
+
+- Added Barrier and DoubleBarrier implementation.
+
+0.2b1 (2012-07-27)
+------------------
+
+### Bug Handling
+
+- ZOOKEEPER-1318: SystemError is caught and rethrown as the proper
+ invalid state exception in older zookeeper python bindings where
+ this issue is still valid.
+- ZOOKEEPER-1431: Install the latest zc-zookeeper-static library or
+ use the packaged ubuntu one for ubuntu 12.04 or later.
+- ZOOKEEPER-553: State handling isn't checked via this method, we
+ track it in a simpler manner with the watcher to ensure we know the
+ right state.
+
+### Features
+
+- Exponential backoff with jitter for retrying commands.
+- Gevent 0.13 and 1.0b support.
+- Lock, Party, SetPartitioner, and Election recipe implementations.
+- Data and Children watching API's.
+- State transition handling with listener registering to handle
+ session state changes (choose to fatal the app on session
+ expiration, etc.)
+- Zookeeper logging stream redirected into Python logging channel
+ under the name 'Zookeeper'.
+- Base client library with handler support for threading and gevent
+ async environments.
+
diff --git a/CHANGES.rst b/CHANGES.rst
deleted file mode 100644
index 4cb8dca..0000000
--- a/CHANGES.rst
+++ /dev/null
@@ -1,659 +0,0 @@
-Changelog
-=========
-
-2.X.Y (TBD)
------------
-
-Features
-********
-
-Bug Handling
-************
-- #372: fully resolve multiple records for hosts in the zookeeper connection string
-
-Documentation
-*************
-
-2.2.1 (2015-06-17)
-------------------
-
-Features
-********
-- allow having observers and different sized clusters
-
-Bug Handling
-************
-- handle NameError with basestring on py3k.
-
-Documentation
-*************
-
-2.2 (2015-06-15)
-----------------
-
-Documentation
-*************
-
-Features
-********
-
-- Issue #234: Add support for reconfig cluster membership operation
-
-Bug Handling
-************
-
-- #315: multiple acquires of a kazoo lock using the lock recipe would
- block when using `acquire` even when non-blocking is specified (only
- when the lock was/has been already acquired).
-- #318: At exit register takes ``*args`` and ``**kwargs`` not args and kargs
-
-Documentation
-*************
-
-2.1 (2015-05-11)
-----------------
-
-Features
-********
-
-- Start running tests against Zookeeper 3.5.0 alpha and explicitly configure
- the `admin.serverPort` in tests to avoid port conflicts. The Zookeeper
- alpha version is not yet officially supported.
-- Integrate eventlet *handler* support into kazoo so that along with [gevent,
- threading] handlers there can now be a dedicated eventlet handler for
- projects that need to (or want to) use eventlet (such as those working
- in the openstack community). The ``requirements_eventlet.txt`` file lists
- the optional eventlet requirement(s) that needs to be satisfied when this
- new handler is used.
-- Use ``six`` to nicely handle the cross compatibility of kazoo with
- python 2.x and 3.x (reducing/removing the need to have custom compatibility
- code that replicates what six already provides).
-- Add ``state_change_event`` to ``kazoo.recipe.partitioner.SetPartitioner``
- which is set on every state change.
-- Add a NonBlockingLease recipe. The recipe allows e.g. cron jobs scheduled
- on multiple machines to ensure that at most N instances will run a particular
- job, with lease timeout for graceful handover in case of node failures.
-
-
-Bug Handling
-************
-
-- #291: Kazoo lock recipe was only partially re-entrant in that multiple
- calls to `acquire` would obtain the the lock but the first call to `release`
- would remove the underlying lock. This would leave the X - 1 other `acquire`
- statements unprotected (and no longer holding there expected lock). To fix
- this the comment about that lock recipe being re-entrant has been removed
- and multiple acquires will now block when attempted.
-
-- #78: Kazoo now uses socketpairs instead of pipes making it compatible with
- Windows.
-
-- #144, #221: Let `client.command` work with IPv6 addresses.
-
-- #216: Fixed timeout for ConnectionHandler._invoke.
-
-- #261: Creating a sequential znode under / doesn't work.
-
-- #274: Add server_version() retries (by default 4 attempts will be made) to
- better handle flakey responses.
-
-- #271: Fixed handling of KazooState.SUSPENDED in SetPartitioner.
-
-- #283: Fixed a race condition in SetPartitioner when party changes during
- handling of lock acquisition.
-
-- #303: don't crash on random input as the hosts string.
-
-Documentation
-*************
-
-- #222: Document that committed on the transaction is used to ensure only one
- commit and is not an indicator of whether operations in the transaction
- returned desired results.
-
-2.0 (2014-06-19)
-----------------
-
-Documentation
-*************
-
-- Extend support to Python 3.4, deprecating Python 3.2.
-- Issue #198: Mention Zake as a sophisticated kazoo mock testing library.
-- Issue #181: Add documentation on basic logging setup.
-
-
-2.0b1 (2014-04-24)
-------------------
-
-API Changes
-***********
-
-- Null or None data is no longer treated as "". Pull req #165, patch by
- Raul Gutierrez S. This will affect how you should treat null data in a
- znode vs. an empty string.
-- Passing acl=[] to create() now works properly instead of an InvalidACLError
- as it returned before. Patch by Raul Gutierrez S in PR #164.
-- Removed the dependency on zope.interface. The classes in the interfaces
- module are left for documentation purposes only (issue #131).
-
-Features
-********
-
-- Logging levels have been reduced.
-
- - Logging previously at the ``logging.DEBUG`` level is now logged at
- the ``kazoo.loggingsupport.BLATHER`` level (5).
-
- - Some low-level logging previously at the ``logging.INFO`` level is
- now logged at the ``logging.DEBUG`` level.
-
-- Issue #133: Introduce a new environment variable `ZOOKEEPER_PORT_OFFSET`
- for the testing support, to run the testing cluster on a different range.
-
-Bug Handling
-************
-
-- When authenticating via add_auth() the auth data will be saved to ensure that
- the authentication happens on reconnect (as is the case when feeding auth
- data via KazooClient's constructor). PR #172, patch by Raul Gutierrez S.
-- Change gevent import to remove deprecation warning when newer gevent is
- used. PR #191, patch by Hiroaki Kawai.
-- Lock recipe was failing to use the client's sleep_func causing issues with
- gevent. Issue #150.
-- Calling a DataWatch or ChildrenWatch instance twice (decorator) now throws
- an exception as only a single function can be associated with a single
- watcher. Issue #154.
-- Another fix for atexit handling so that when disposing of connections the
- atexit handler is removed. PR #190, patch by Devaev Maxim.
-- Fix atexit handling for kazoo threading handler, PR #183. Patch by
- Brian Wickman.
-- Partitioner should handle a suspended connection properly and restore
- an allocated state if it was allocated previously. Patch by Manish Tomar.
-- Issue #167: Closing a client that was never started throws a type error.
- Patch by Joshua Harlow.
-- Passing dictionaries to KazooClient.__init__() wasn't actually working
- properly. Patch by Ryan Uber.
-- Issue #119: Handler timeout takes the max of the random interval or
- the read timeout to ensure a negative number isn't used for the read
- timeout.
-- Fix ordering of exception catches in lock.acquire as it was capturing a
- parent exception before the child. Patch by ReneSac.
-- Fix issue with client.stop() not always setting the client state to
- KeeperState.CLOSED. Patch by Jyrki Pulliainen in PR #174.
-- Issue #169: Fixed pipes leaking into child processes.
-
-Documentation
-*************
-
-- Add section on contributing recipes, add maintainer/status information for
- existing recipes.
-- Add note about alternate use of DataWatch.
-
-1.3.1 (2013-09-25)
-------------------
-
-Bug Handling
-************
-
-- #118, #125, #128: Fix unknown variable in KazooClient `command_retry`
- argument handling.
-
-- #126: Fix `KazooRetry.copy` to correctly copy sleep function.
-
-- #118: Correct session/socket timeout conversion (int vs. float).
-
-Documentation
-*************
-
-- #121: Add a note about `kazoo.recipe.queue.LockingQueue` requiring a
- Zookeeper 3.4+ server.
-
-
-1.3 (2013-09-05)
-----------------
-
-Features
-********
-
-- #115: Limit the backends we use for SLF4J during tests.
-
-- #112: Add IPv6 support. Patch by Dan Kruchinin.
-
-1.2.1 (2013-08-01)
-------------------
-
-Bug Handling
-************
-
-- Issue #108: Circular import fail when importing kazoo.recipe.watchers
- directly has now been resolved. Watchers and partitioner properly import
- the KazooState from kazoo.protocol.states rather than kazoo.client.
-- Issue #109: Partials not usable properly as a datawatch call can now be
- used. All funcs will be called with 3 args and fall back to 2 args if
- there's an argument error.
-- Issue #106, #107: `client.create_async` didn't strip change root from the
- returned path.
-
-1.2 (2013-07-24)
-----------------
-
-Features
-********
-
-- KazooClient can now be stopped more reliably even if its in the middle
- of a long retry sleep. This utilizes the new interrupt feature of
- KazooRetry which lets the sleep be broken down into chunks and an
- interrupt function called to determine if the retry should fail early.
-
-- Issue #62, #92, #89, #101, #102: Allow KazooRetry to have a
- max deadline, transition properly when connection fails to LOST, and
- setup separate connection retry behavior from client command retry
- behavior. Patches by Mike Lundy.
-
-- Issue #100: Make it easier to see exception context in threading and
- connection modules.
-
-- Issue #85: Increase information density of logs and don't prevent
- dynamic reconfiguration of log levels at runtime.
-
-- Data-watchers for the same node are no longer 'stacked'. That is, if
- a get and an exists call occur for the same node with the same watch
- function, then it will be registered only once. This change results in
- Kazoo behaving per Zookeeper client spec regarding repeat watch use.
-
-Bug Handling
-************
-
-- Issue #53: Throw a warning upon starting if the chroot path doesn't exist
- so that it's more obvious when the chroot should be created before
- performing more operations.
-
-- Kazoo previously would let the same function be registered as a data-watch
- or child-watch multiple times, and then call it multiple times upon being
- triggered. This was non-compliant Zookeeper client behavior, the same
- watch can now only be registered once for the same znode path per Zookeeper
- client documentation.
-
-- Issue #105: Avoid rare import lock problems by moving module imports in
- client.py to the module scope.
-
-- Issue #103: Allow prefix-less sequential znodes.
-
-- Issue #98: Extend testing ZK harness to work with different file locations
- on some versions of Debian/Ubuntu.
-
-- Issue #97: Update some docstrings to reflect current state of handlers.
-
-- Issue #62, #92, #89, #101, #102: Allow KazooRetry to have a
- max deadline, transition properly when connection fails to LOST, and
- setup separate connection retry behavior from client command retry
- behavior. Patches by Mike Lundy.
-
-API Changes
-***********
-
-- The `kazoo.testing.harness.KazooTestHarness` class directly inherits from
- `unittest.TestCase` and you need to ensure to call its `__init__` method.
-
-- DataWatch no longer takes any parameters besides for the optional function
- during instantiation. The additional options are now implicitly True, with
- the user being left to ignore events as they choose. See the DataWatch
- API docs for more information.
-
-- Issue #99: Better exception raised when the writer fails to close. A
- WriterNotClosedException that inherits from KazooException is now raised
- when the writer fails to close in time.
-
-1.1 (2013-06-08)
-----------------
-
-Features
-********
-
-- Issue #93: Add timeout option to lock/semaphore acquire methods.
-
-- Issue #79 / #90: Add ability to pass the WatchedEvent to DataWatch and
- ChildWatch functions.
-
-- Respect large client timeout values when closing the connection.
-
-- Add a `max_leases` consistency check to the semaphore recipe.
-
-- Issue #76: Extend testing helpers to allow customization of the Java
- classpath by specifying the new `ZOOKEEPER_CLASSPATH` environment variable.
-
-- Issue #65: Allow non-blocking semaphore acquisition.
-
-Bug Handling
-************
-
-- Issue #96: Provide Windows compatibility in testing harness.
-
-- Issue #95: Handle errors deserializing connection response.
-
-- Issue #94: Clean up stray bytes in connection pipe.
-
-- Issue #87 / #88: Allow re-acquiring lock after cancel.
-
-- Issue #77: Use timeout in initial socket connection.
-
-- Issue #69: Only ensure path once in lock and semaphore recipes.
-
-- Issue #68: Closing the connection causes exceptions to be raised by watchers
- which assume the connection won't be closed when running commands.
-
-- Issue #66: Require ping reply before sending another ping, otherwise the
- connection will be considered dead and a ConnectionDropped will be raised
- to trigger a reconnect.
-
-- Issue #63: Watchers weren't reset on lost connection.
-
-- Issue #58: DataWatcher failed to re-register for changes after non-existent
- node was created then deleted.
-
-API Changes
-***********
-
-- KazooClient.create_async now supports the makepath argument.
-
-- KazooClient.ensure_path now has an async version, ensure_path_async.
-
-1.0 (2013-03-26)
-----------------
-
-Features
-********
-
-- Added a LockingQueue recipe. The queue first locks an item and removes it
- from the queue only after the consume() method is called. This enables other
- nodes to retake the item if an error occurs on the first node.
-
-Bug Handling
-************
-
-- Issue #50: Avoid problems with sleep function in mixed gevent/threading
- setup.
-
-- Issue #56: Avoid issues with watch callbacks evaluating to false.
-
-1.0b1 (2013-02-24)
-------------------
-
-Features
-********
-
-- Refactored the internal connection handler to use a single thread. It now
- uses a deque and pipe to signal the ZK thread that there's a new command to
- send, so that the ZK thread can send it, or retrieve a response.
- Processing ZK requests and responses serially in a single thread eliminates
- the need for a bunch of the locking, the peekable queue and two threads
- working on the same underlying socket.
-
-- Issue #48: Added documentation for the `retry` helper module.
-
-- Issue #55: Fix `os.pipe` file descriptor leak and introduce a
- `KazooClient.close` method. The method is particular useful in tests, where
- multiple KazooClients are created and closed in the same process.
-
-Bug Handling
-************
-
-- Issue #46: Avoid TypeError in GeneratorContextManager on process shutdown.
-
-- Issue #43: Let DataWatch return node data if allow_missing_node is used.
-
-0.9 (2013-01-07)
-----------------
-
-API Changes
-***********
-
-- When a retry operation ultimately fails, it now raises a
- `kazoo.retry.RetryFailedError` exception, instead of a general `Exception`
- instance. `RetryFailedError` also inherits from the base `KazooException`.
-
-Features
-********
-
-- Improvements to Debian packaging rules.
-
-Bug Handling
-************
-
-- Issue #39 / #41: Handle connection dropped errors during session writes.
- Ensure client connection is re-established to a new ZK node if available.
-
-- Issue #38: Set `CLOEXEC` flag on all sockets when available.
-
-- Issue #37 / #40: Handle timeout errors during `select` calls on sockets.
-
-- Issue #36: Correctly set `ConnectionHandler.writer_stopped` even if an
- exception is raised inside the writer, like a retry operation failing.
-
-0.8 (2012-10-26)
-----------------
-
-API Changes
-***********
-
-- The `KazooClient.__init__` took as `watcher` argument as its second keyword
- argument. The argument had no effect anymore since version 0.5 and was
- removed.
-
-Bug Handling
-************
-
-- Issue #35: `KazooClient.__init__` didn't pass on `retry_max_delay` to the
- retry helper.
-
-- Issue #34: Be more careful while handling socket connection errors.
-
-0.7 (2012-10-15)
-----------------
-
-Features
-********
-
-- DataWatch now has a `allow_missing_node` setting that allows a watch to be
- set on a node that doesn't exist when the DataWatch is created.
-- Add new Queue recipe, with optional priority support.
-- Add new Counter recipe.
-- Added debian packaging rules.
-
-Bug Handling
-************
-
-- Issue #31 fixed: Only catch KazooExceptions in catch-all calls.
-- Issue #15 fixed again: Force sleep delay to be a float to appease gevent.
-- Issue #29 fixed: DataWatch and ChildrenWatch properly re-register their
- watches on server disconnect.
-
-0.6 (2012-09-27)
-----------------
-
-API Changes
-***********
-
-- Node paths are assumed to be Unicode objects. Under Python 2 pure-ascii
- strings will also be accepted. Node values are considered bytes. The byte
- type is an alias for `str` under Python 2.
-- New KeeperState.CONNECTED_RO state for Zookeeper servers connected in
- read-only mode.
-- New NotReadOnlyCallError exception when issuing a write change against a
- server thats currently read-only.
-
-Features
-********
-
-- Add support for Python 3.2, 3.3 and PyPy (only for the threading handler).
-- Handles connecting to Zookeeper 3.4+ read-only servers.
-- Automatic background scanning for a Read/Write server when connected to a
- server in read-only mode.
-- Add new Semaphore recipe.
-- Add a new `retry_max_delay` argument to the client and by default limit the
- retry delay to at most an hour regardless of exponential backoff settings.
-- Add new `randomize_hosts` argument to `KazooClient`, allowing one to disable
- host randomization.
-
-Bug Handling
-************
-
-- Fix bug with locks not handling intermediary lock contenders disappearing.
-- Fix bug with set_data type check failing to catch unicode values.
-- Fix bug with gevent 0.13.x backport of peekable queue.
-- Fix PatientChildrenWatch to use handler specific sleep function.
-
-0.5 (2012-09-06)
-----------------
-
-Skipping a version to reflect the magnitude of the change. Kazoo is now a pure
-Python client with no C bindings. This release should run without a problem
-on alternate Python implementations such as PyPy and Jython. Porting to Python
-3 in the future should also be much easier.
-
-Documentation
-*************
-
-- Docs have been restructured to handle the new classes and locations of the
- methods from the pure Python refactor.
-
-Bug Handling
-************
-
-This change may introduce new bugs, however there is no longer the possibility
-of a complete Python segfault due to errors in the C library and/or the C
-binding.
-
-- Possible segfaults from the C lib are gone.
-- Password mangling due to the C lib is gone.
-- The party recipes didn't set their participating flag to False after
- leaving.
-
-Features
-********
-
-- New `client.command` and `client.server_version` API, exposing Zookeeper's
- four letter commands and giving access to structured version information.
-- Added 'include_data' option for get_children to include the node's Stat
- object.
-- Substantial increase in logging data with debug mode. All correspondence with
- the Zookeeper server can now be seen to help in debugging.
-
-API Changes
-***********
-
-- The testing helpers have been moved from `testing.__init__` into a
- `testing.harness` module. The official API's of `KazooTestCase` and
- `KazooTestHarness` can still be directly imported from `testing`.
-- The kazoo.handlers.util module was removed.
-- Backwards compatible exception class aliases are provided for now in kazoo
- exceptions for the prior C exception names.
-- Unicode strings now work fine for node names and are properly converted to
- and from unicode objects.
-- The data value argument for the create and create_async methods of the
- client was made optional and defaults to an empty byte string. The data
- value must be a byte string. Unicode values are no longer allowed and
- will raise a TypeError.
-
-
-0.3 (2012-08-23)
-----------------
-
-API Changes
-***********
-
-- Handler interface now has an rlock_object for use by recipes.
-
-Bug Handling
-************
-
-- Fixed password bug with updated zc-zookeeper-static release, which retains
- null bytes in the password properly.
-- Fixed reconnect hammering, so that the reconnection follows retry jitter and
- retry backoff's.
-- Fixed possible bug with using a threading.Condition in the set partitioner.
- Set partitioner uses new rlock_object handler API to get an appropriate RLock
- for gevent.
-- Issue #17 fixed: Wrap timeout exceptions with staticmethod so they can be
- used directly as intended. Patch by Bob Van Zant.
-- Fixed bug with client reconnection looping indefinitely using an expired
- session id.
-
-0.2 (2012-08-12)
-----------------
-
-Documentation
-*************
-
-- Fixed doc references to start_async using an AsyncResult object, it uses
- an Event object.
-
-Bug Handling
-************
-
-- Issue #16 fixed: gevent zookeeper logging failed to handle a monkey patched
- logging setup. Logging is now setup such that a greenlet is used for logging
- messages under gevent, and the thread one is used otherwise.
-- Fixed bug similar to #14 for ChildrenWatch on the session listener.
-- Issue #14 fixed: DataWatch had inconsistent handling of the node it was
- watching not existing. DataWatch also properly spawns its _get_data function
- to avoid blocking session events.
-- Issue #15 fixed: sleep_func for SequentialGeventHandler was not set on the
- class appropriately leading to additional arguments being passed to
- gevent.sleep.
-- Issue #9 fixed: Threads/greenlets didn't gracefully shut down. Handler now
- has a start/stop that is used by the client when calling start and stop that
- shuts down the handler workers. This addresses errors and warnings that could
- be emitted upon process shutdown regarding a clean exit of the workers.
-- Issue #12 fixed: gevent 0.13 doesn't use the same start_new_thread as gevent
- 1.0 which resulted in a fully monkey-patched environment halting due to the
- wrong thread. Updated to use the older kazoo method of getting the real thread
- module object.
-
-API Changes
-***********
-
-- The KazooClient handler is now officially exposed as KazooClient.handler
- so that the appropriate sync objects can be used by end-users.
-- Refactored ChildrenWatcher used by SetPartitioner into a publicly exposed
- PatientChildrenWatch under recipe.watchers.
-
-Deprecations
-************
-
-- connect/connect_async has been renamed to start/start_async to better match
- the stop to indicate connection handling. The prior names are aliased for
- the time being.
-
-Recipes
-*******
-
-- Added Barrier and DoubleBarrier implementation.
-
-0.2b1 (2012-07-27)
-------------------
-
-Bug Handling
-************
-
-- ZOOKEEPER-1318: SystemError is caught and rethrown as the proper invalid
- state exception in older zookeeper python bindings where this issue is still
- valid.
-- ZOOKEEPER-1431: Install the latest zc-zookeeper-static library or use the
- packaged ubuntu one for ubuntu 12.04 or later.
-- ZOOKEEPER-553: State handling isn't checked via this method, we track it in
- a simpler manner with the watcher to ensure we know the right state.
-
-Features
-********
-
-- Exponential backoff with jitter for retrying commands.
-- Gevent 0.13 and 1.0b support.
-- Lock, Party, SetPartitioner, and Election recipe implementations.
-- Data and Children watching API's.
-- State transition handling with listener registering to handle session state
- changes (choose to fatal the app on session expiration, etc.)
-- Zookeeper logging stream redirected into Python logging channel under the
- name 'Zookeeper'.
-- Base client library with handler support for threading and gevent async
- environments.
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
new file mode 100644
index 0000000..133e03a
--- /dev/null
+++ b/CONTRIBUTING.md
@@ -0,0 +1,166 @@
+# Contribution Guidelines
+
+We gladly accept outside contributions. We use our
+[Github issue tracker](https://github.com/python-zk/kazoo/issues)
+for both discussions and talking about new features or bugs. You can
+also fork the project and sent us a pull request. If you have a more
+general topic to discuss, the
+[user@zookeeper.apache.org](https://zookeeper.apache.org/lists.html)
+mailing list is a good place to do so. You can sometimes find us on
+IRC in the
+[#zookeeper channel on freenode](https://zookeeper.apache.org/irc.html).
+
+[See the README](/README.rst) for contact information.
+
+## Development
+
+If you want to work on the code and sent us a
+[pull request](https://help.github.com/articles/using-pull-requests),
+first fork the repository on github to your own account. Then clone
+your new repository and run the build scripts:
+
+```
+ git clone git@github.com:<username>/kazoo.git
+ cd kazoo
+ make
+```
+
+You need to have some supported version of Python installed and have
+it available as `python` in your shell. To run Zookeeper you also
+need a Java runtime (JRE or JDK) version 6 or 7. To run tests, you
+need to have the tox, Python testing tool, to be installed in your shell.
+
+You can run all the tests by calling:
+
+```
+ make test
+```
+
+Or to run individual tests:
+
+```
+ export ZOOKEEPER_PATH=/<path to current folder>/bin/zookeeper/
+ bin/nosetests -s -d kazoo.tests.test_client:TestClient.test_create
+```
+
+The nose test runner allows you to filter by test module, class or
+individual test method.
+
+If you made changes to the documentation, you can build it locally:
+
+```
+ make html
+```
+
+And then open `./docs/_build/html/index.html` in a web browser to
+verify the correct rendering.
+
+
+## Bug Reports
+
+You can file issues here on GitHub. Please try to include as much information as
+you can and under what conditions you saw the issue.
+
+## Adding Recipes
+
+New recipes are welcome, however they should include the status/maintainer
+RST information so its clear who is maintaining the recipe. This does mean
+that if you submit a recipe for inclusion with Kazoo, you should be ready
+to support/maintain it, and address bugs that may be found.
+
+Ideally a recipe should have at least two maintainers.
+
+## Sending Pull Requests
+
+Patches should be submitted as pull requests (PR).
+
+Before submitting a PR:
+- Your code must run and pass all the automated tests before you submit your PR
+ for review. "Work in progress" pull requests are allowed to be submitted, but
+ should be clearly labeled as such and should not be merged until all tests
+ pass and the code has been reviewed.
+- Your patch should include new tests that cover your changes. It is your and
+ your reviewer's responsibility to ensure your patch includes adequate tests.
+
+When submitting a PR:
+- You agree to license your code under the project's open source license
+ ([APL 2.0](/LICENSE)).
+- Base your branch off the current `master`.
+- Add both your code and new tests if relevant.
+- Sign your git commit.
+- Run the test suite to make sure your code passes linting and tests.
+- Ensure your changes do not reduce code coverage of the test suite.
+- Please do not include merge commits in pull requests; include only commits
+ with the new relevant code.
+
+
+## Code Review
+
+This project is production Mozilla code and subject to our [engineering practices and quality standards](https://developer.mozilla.org/en-US/docs/Mozilla/Developer_guide/Committing_Rules_and_Responsibilities). Every patch must be peer reviewed.
+
+## Git Commit Guidelines
+
+We loosely follow the [Angular commit guidelines](https://github.com/angular/angular.js/blob/master/CONTRIBUTING.md#type)
+of `<type>(scope): <subject>` where `type` must be one of:
+
+* **feat**: A new feature
+* **fix**: A bug fix
+* **docs**: Documentation only changes
+* **style**: Changes that do not affect the meaning of the code (white-space, formatting, missing
+ semi-colons, etc)
+* **refactor**: A code change that neither fixes a bug or adds a feature
+* **perf**: A code change that improves performance
+* **test**: Adding missing tests
+* **chore**: Changes to the build process or auxiliary tools and libraries such as documentation
+ generation
+
+Scope may be left off if none of these components are applicable:
+
+* **core**: Core client/connection handling
+* **recipe**: Changes/Fixes/Additions to recipes
+
+### Subject
+
+The subject contains succinct description of the change:
+
+* use the imperative, present tense: "change" not "changed" nor "changes"
+* don't capitalize first letter
+* no dot (.) at the end
+
+### Body
+
+In order to maintain a reference to the context of the commit, add
+`closes #<issue_number>` if it closes a related issue or `issue #<issue_number>`
+if it's a partial fix.
+
+You can also write a detailed description of the commit: Just as in the
+**subject**, use the imperative, present tense: "change" not "changed" nor
+"changes" It should include the motivation for the change and contrast this with
+previous behavior.
+
+### Footer
+
+The footer should contain any information about **Breaking Changes** and is also
+the place to reference GitHub issues that this commit **Closes**.
+
+### Example
+
+A properly formatted commit message should look like:
+
+```
+feat(core): add tasty cookies to the client handler
+
+Properly formatted commit messages provide understandable history and
+documentation. This patch will provide a delicious cookie when all tests have
+passed and the commit message is properly formatted.
+
+BREAKING CHANGE: This patch requires developer to lower expectations about
+ what "delicious" and "cookie" may mean. Some sadness may result.
+
+Closes #3.14, #9.75
+```
+
+# Legal
+
+Currently we don't have any legal contributor agreement, so code
+ownership stays with the original authors.
diff --git a/CONTRIBUTING.rst b/CONTRIBUTING.rst
deleted file mode 100644
index bb7cf38..0000000
--- a/CONTRIBUTING.rst
+++ /dev/null
@@ -1,81 +0,0 @@
-=================
-How to contribute
-=================
-
-We gladly accept outside contributions. We use our
-`Github issue tracker <https://github.com/python-zk/kazoo/issues>`_
-for both discussions and talking about new features or bugs. You can
-also fork the project and sent us a pull request. If you have a more
-general topic to discuss, the
-`user@zookeeper.apache.org <https://zookeeper.apache.org/lists.html>`_
-mailing list is a good place to do so. You can sometimes find us on
-IRC in the
-`#zookeeper channel on freenode <https://zookeeper.apache.org/irc.html>`_.
-
-
-Development
-===========
-
-If you want to work on the code and sent us a
-`pull request <https://help.github.com/articles/using-pull-requests>`_,
-first fork the repository on github to your own account. Then clone
-your new repository and run the build scripts::
-
- git clone git@github.com:<username>/kazoo.git
- cd kazoo
- make
-
-You need to have some supported version of Python installed and have
-it available as ``python`` in your shell. To run Zookeeper you also
-need a Java runtime (JRE or JDK) version 6 or 7. To run tests, you
-need to have the tox, Python testing tool, to be installed in your shell.
-
-You can run all the tests by calling::
-
- make test
-
-Or to run individual tests::
-
- export ZOOKEEPER_PATH=/<path to current folder>/bin/zookeeper/
- bin/nosetests -s -d kazoo.tests.test_client:TestClient.test_create
-
-The nose test runner allows you to filter by test module, class or
-individual test method.
-
-If you made changes to the documentation, you can build it locally::
-
- make html
-
-And then open ``./docs/_build/html/index.html`` in a web browser to
-verify the correct rendering.
-
-
-Submitting changes
-==================
-
-We appreciate getting changes sent as pull requests via github. We have
-travis-ci set up, which will run all tests on all supported version
-combinations for submitted pull requests, which makes it easy to see
-if new code breaks tests on some weird version combination.
-
-If you introduce new functionality, please also add documentation and
-a short entry in the top-level ``CHANGES.rst`` file.
-
-
-Adding Recipes
-==============
-
-New recipes are welcome, however they should include the status/maintainer
-RST information so its clear who is maintaining the recipe. This does mean
-that if you submit a recipe for inclusion with Kazoo, you should be ready
-to support/maintain it, and address bugs that may be found.
-
-Ideally a recipe should have at least two maintainers.
-
-Legal
-=====
-
-Currently we don't have any legal contributor agreement, so code
-ownership stays with the original authors. The project is licensed
-under the
-`Apache License Version 2 <https://github.com/python-zk/kazoo/blob/master/LICENSE>`_.
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..b6dd29f
--- /dev/null
+++ b/README.md
@@ -0,0 +1,28 @@
+Kazoo
+=====
+
+![Travis Build](https://travis-ci.org/python-zk/kazoo.svg?branch=master)
+
+![Latest Version](https://img.shields.io/pypi/v/kazoo.svg)
+
+![Downloads](https://img.shields.io/pypi/dm/kazoo.svg)
+
+`kazoo` implements a higher level API to [Apache
+Zookeeper](http://zookeeper.apache.org/) for Python clients.
+
+See [the full docs](http://kazoo.rtfd.org/) for more information.
+
+License
+-------
+
+`kazoo` is offered under the Apache License 2.0.
+
+Authors
+-------
+
+`kazoo` started under the [Nimbus
+Project](http://www.nimbusproject.org/) and through collaboration with
+the open-source community has been merged with code from
+[Mozilla](http://www.mozilla.org/) and the [Zope
+Corporation](http://zope.com/). It has since gathered an active
+community of over fifty contributors.
diff --git a/README.rst b/README.rst
deleted file mode 100644
index dc90961..0000000
--- a/README.rst
+++ /dev/null
@@ -1,39 +0,0 @@
-=====
-Kazoo
-=====
-
-.. image:: https://travis-ci.org/python-zk/kazoo.svg?branch=master
- :target: https://travis-ci.org/python-zk/kazoo
- :alt: Travis Build
-
-.. image:: https://img.shields.io/pypi/v/kazoo.svg
- :target: https://pypi.python.org/pypi/kazoo/
- :alt: Latest Version
-
-.. image:: https://img.shields.io/pypi/dm/kazoo.svg
- :target: https://pypi.python.org/pypi/kazoo/
- :alt: Downloads
-
-``kazoo`` implements a higher level API to `Apache Zookeeper`_ for Python
-clients.
-
-See `the full docs`_ for more information.
-
-License
-=======
-
-``kazoo`` is offered under the Apache License 2.0.
-
-Authors
-=======
-
-``kazoo`` started under the `Nimbus Project`_ and through collaboration with
-the open-source community has been merged with code from `Mozilla`_ and the
-`Zope Corporation`_. It has since gathered an active community of over fifty
-contributors.
-
-.. _Apache Zookeeper: http://zookeeper.apache.org/
-.. _the full docs: http://kazoo.rtfd.org/
-.. _Nimbus Project: http://www.nimbusproject.org/
-.. _Zope Corporation: http://zope.com/
-.. _Mozilla: http://www.mozilla.org/
diff --git a/kazoo/version.py b/kazoo/version.py
index 36a511e..8219039 100644
--- a/kazoo/version.py
+++ b/kazoo/version.py
@@ -1 +1 @@
-__version__ = '2.2.1'
+__version__ = '2.3.0'
diff --git a/setup.py b/setup.py
index 109c43a..1af6113 100644
--- a/setup.py
+++ b/setup.py
@@ -6,9 +6,9 @@ import re
from setuptools import setup, find_packages
here = os.path.abspath(os.path.dirname(__file__))
-with open(os.path.join(here, 'README.rst')) as f:
+with open(os.path.join(here, 'README.md')) as f:
README = f.read()
-with open(os.path.join(here, 'CHANGES.rst')) as f:
+with open(os.path.join(here, 'CHANGES.md')) as f:
CHANGES = f.read()
version = ''
with open(os.path.join(here, 'kazoo', 'version.py')) as f: