)]}'
{".gitignore":[{"author":{"_account_id":9107,"name":"Victor Stinner","email":"vstinner@redhat.com","username":"haypo"},"change_message_id":"0e444af86d0daa2d46c4941e2ec8a5ef08935a3e","unresolved":false,"context_lines":[{"line_number":15,"context_line":"*.egg"},{"line_number":16,"context_line":"tooz/versioninfo"},{"line_number":17,"context_line":"doc/source/api/tooz.*.rst"},{"line_number":18,"context_line":"doc/source/api/tests.*.rst"},{"line_number":19,"context_line":"doc/source/api/autoindex.rst"},{"line_number":20,"context_line":"doc/source/sourcecode"},{"line_number":21,"context_line":"*.mo"}],"source_content_type":"application/octet-stream","patch_set":1,"id":"AAAATn%2F9vos%3D","line":18,"updated":"2013-12-06 13:44:55.000000000","message":"why do you ignore these files? how are they generated?","commit_id":"62e0248f00d4b07314d824a9711d8e045ea22e98"},{"author":{"_account_id":9107,"name":"Victor Stinner","email":"vstinner@redhat.com","username":"haypo"},"change_message_id":"0e444af86d0daa2d46c4941e2ec8a5ef08935a3e","unresolved":false,"context_lines":[{"line_number":18,"context_line":"doc/source/api/tests.*.rst"},{"line_number":19,"context_line":"doc/source/api/autoindex.rst"},{"line_number":20,"context_line":"doc/source/sourcecode"},{"line_number":21,"context_line":"*.mo"},{"line_number":22,"context_line":".project"},{"line_number":23,"context_line":".pydevproject"},{"line_number":24,"context_line":".settings"}],"source_content_type":"application/octet-stream","patch_set":1,"id":"AAAATn%2F9voo%3D","line":21,"updated":"2013-12-06 13:44:55.000000000","message":"tooz uses gettext?","commit_id":"62e0248f00d4b07314d824a9711d8e045ea22e98"},{"author":{"_account_id":1669,"name":"Julien Danjou","display_name":"jd","email":"julien@danjou.info","username":"jdanjou"},"change_message_id":"b3d1449d0b4dca3bea6f1e118e191b6032349150","unresolved":false,"context_lines":[{"line_number":20,"context_line":"doc/source/sourcecode"},{"line_number":21,"context_line":"*.mo"},{"line_number":22,"context_line":".project"},{"line_number":23,"context_line":".pydevproject"},{"line_number":24,"context_line":".settings"},{"line_number":25,"context_line":""}],"source_content_type":"application/octet-stream","patch_set":1,"id":"AAAATn%2F9v1I%3D","line":23,"updated":"2013-12-06 13:09:43.000000000","message":"I tend to be happier if you only includes files that are generated by the build process of the project, not the tools used by various developers.","commit_id":"62e0248f00d4b07314d824a9711d8e045ea22e98"},{"author":{"_account_id":7450,"name":"Yassine Lamgarchal","email":"yassine.lamgarchal@redhat.com","username":"yassine.lamgarchal"},"change_message_id":"066018af36bb96cc1a407411186e80a3f9c5dc3e","unresolved":false,"context_lines":[{"line_number":20,"context_line":"doc/source/sourcecode"},{"line_number":21,"context_line":"*.mo"},{"line_number":22,"context_line":".project"},{"line_number":23,"context_line":".pydevproject"},{"line_number":24,"context_line":".settings"},{"line_number":25,"context_line":""}],"source_content_type":"application/octet-stream","patch_set":1,"id":"AAAATn%2F9vpc%3D","line":23,"in_reply_to":"AAAATn%2F9v1I%3D","updated":"2013-12-09 11:19:06.000000000","message":"Done","commit_id":"62e0248f00d4b07314d824a9711d8e045ea22e98"},{"author":{"_account_id":8122,"name":"Cyril Roelandt","email":"cyril@redhat.com","username":"cyril.roelandt.enovance"},"change_message_id":"ae093f98d11ad807cd24593ad7382b8fc35f41ce","unresolved":false,"context_lines":[{"line_number":17,"context_line":"doc/source/api/tooz.*.rst"},{"line_number":18,"context_line":"doc/source/api/tests.*.rst"},{"line_number":19,"context_line":"doc/source/api/autoindex.rst"},{"line_number":20,"context_line":"doc/source/sourcecode"},{"line_number":21,"context_line":"*.mo"}],"source_content_type":"application/octet-stream","patch_set":2,"id":"AAAATn%2F9pEg%3D","line":20,"updated":"2013-12-09 12:17:37.000000000","message":"There is no doc/ repository. Why would you ignore it ? The same thing is probably true for other files.","commit_id":"db1708709fc5c9685eb443cd70f0ec798f0f487b"},{"author":{"_account_id":7450,"name":"Yassine Lamgarchal","email":"yassine.lamgarchal@redhat.com","username":"yassine.lamgarchal"},"change_message_id":"25c1314310e6eeae3ae955a2ca30a3854931e209","unresolved":false,"context_lines":[{"line_number":17,"context_line":"doc/source/api/tooz.*.rst"},{"line_number":18,"context_line":"doc/source/api/tests.*.rst"},{"line_number":19,"context_line":"doc/source/api/autoindex.rst"},{"line_number":20,"context_line":"doc/source/sourcecode"},{"line_number":21,"context_line":"*.mo"}],"source_content_type":"application/octet-stream","patch_set":2,"id":"AAAATn%2F9o3A%3D","line":20,"in_reply_to":"AAAATn%2F9pEg%3D","updated":"2013-12-09 14:12:50.000000000","message":"Done","commit_id":"db1708709fc5c9685eb443cd70f0ec798f0f487b"},{"author":{"_account_id":1669,"name":"Julien Danjou","display_name":"jd","email":"julien@danjou.info","username":"jdanjou"},"change_message_id":"0686413496bc9e89a27dcdb3bad8325b9ebbeec1","unresolved":false,"context_lines":[{"line_number":2,"context_line":"*.egg-info"},{"line_number":3,"context_line":"build"},{"line_number":4,"context_line":".egg"},{"line_number":5,"context_line":""}],"source_content_type":"application/octet-stream","patch_set":3,"id":"AAAATn%2F9oKs%3D","line":5,"updated":"2013-12-09 15:04:30.000000000","message":"Empty line.","commit_id":"73ef89698c4c771e7e628090a98424562440058e"}],"/COMMIT_MSG":[{"author":{"_account_id":688,"name":"Sandy Walsh","email":"sandy.walsh@rackspace.com","username":"sandy-walsh"},"change_message_id":"53c29b3c2650fe21039d3786ce75ef011de780db","unresolved":false,"context_lines":[{"line_number":9,"context_line":"For now the project is composed of a simple API and"},{"line_number":10,"context_line":"use ZooKeeper as the first backend."},{"line_number":11,"context_line":""},{"line_number":12,"context_line":"Created files:"},{"line_number":13,"context_line":"    - tooz/api.py: the python public API and the abstract class"},{"line_number":14,"context_line":"to implement for backends."},{"line_number":15,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"AAAATn%2F9t4g%3D","line":12,"updated":"2013-12-06 19:51:26.000000000","message":"Perhaps this should go in the Readme?","commit_id":"62e0248f00d4b07314d824a9711d8e045ea22e98"},{"author":{"_account_id":8122,"name":"Cyril Roelandt","email":"cyril@redhat.com","username":"cyril.roelandt.enovance"},"change_message_id":"ae093f98d11ad807cd24593ad7382b8fc35f41ce","unresolved":false,"context_lines":[{"line_number":21,"context_line":"    - tooz/models.py: read only classes, for now the Member class."},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"    - tooz/tests/test_api.py: Tooz will provide a unique unit-tests suite"},{"line_number":24,"context_line":"which will be run against all backends (thanks to testscenarios)."},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"Change-Id: I4e4cefb52cf6c39a3f6ba35ab1d4ef34a77b5811"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"AAAATn%2F9pEw%3D","line":24,"updated":"2013-12-09 12:17:37.000000000","message":"I don\u0027t think this listing should be in the commit log. An English message describing what has been done would be better.","commit_id":"db1708709fc5c9685eb443cd70f0ec798f0f487b"},{"author":{"_account_id":7450,"name":"Yassine Lamgarchal","email":"yassine.lamgarchal@redhat.com","username":"yassine.lamgarchal"},"change_message_id":"25c1314310e6eeae3ae955a2ca30a3854931e209","unresolved":false,"context_lines":[{"line_number":21,"context_line":"    - tooz/models.py: read only classes, for now the Member class."},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"    - tooz/tests/test_api.py: Tooz will provide a unique unit-tests suite"},{"line_number":24,"context_line":"which will be run against all backends (thanks to testscenarios)."},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"Change-Id: I4e4cefb52cf6c39a3f6ba35ab1d4ef34a77b5811"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"AAAATn%2F9ogM%3D","line":24,"in_reply_to":"AAAATn%2F9pEw%3D","updated":"2013-12-09 14:12:50.000000000","message":"Done","commit_id":"db1708709fc5c9685eb443cd70f0ec798f0f487b"}],"README.rst":[{"author":{"_account_id":8122,"name":"Cyril Roelandt","email":"cyril@redhat.com","username":"cyril.roelandt.enovance"},"change_message_id":"014b39545df38d5d29b8662c47cffbd24951713a","unresolved":false,"context_lines":[{"line_number":1,"context_line":"tooz"},{"line_number":2,"context_line":"\u003d\u003d\u003d\u003d"},{"line_number":3,"context_line":""},{"line_number":4,"context_line":"The Tooz project aims to provided a coordination API which help developpers to"},{"line_number":5,"context_line":"build distributed applications."},{"line_number":6,"context_line":""}],"source_content_type":"text/x-rst","patch_set":1,"id":"AAAATn%2F9pWs%3D","line":4,"updated":"2013-12-09 10:51:42.000000000","message":"developer, with a single \u0027p\u0027.","commit_id":"62e0248f00d4b07314d824a9711d8e045ea22e98"},{"author":{"_account_id":1669,"name":"Julien Danjou","display_name":"jd","email":"julien@danjou.info","username":"jdanjou"},"change_message_id":"b3d1449d0b4dca3bea6f1e118e191b6032349150","unresolved":false,"context_lines":[{"line_number":1,"context_line":"tooz"},{"line_number":2,"context_line":"\u003d\u003d\u003d\u003d"},{"line_number":3,"context_line":""},{"line_number":4,"context_line":"The Tooz project aims to provided a coordination API which help developpers to"},{"line_number":5,"context_line":"build distributed applications."},{"line_number":6,"context_line":""}],"source_content_type":"text/x-rst","patch_set":1,"id":"AAAATn%2F9v04%3D","line":4,"updated":"2013-12-06 13:09:43.000000000","message":"to provide\n\nwhich help -\u003e helping\n\ndevelopers","commit_id":"62e0248f00d4b07314d824a9711d8e045ea22e98"},{"author":{"_account_id":7450,"name":"Yassine Lamgarchal","email":"yassine.lamgarchal@redhat.com","username":"yassine.lamgarchal"},"change_message_id":"066018af36bb96cc1a407411186e80a3f9c5dc3e","unresolved":false,"context_lines":[{"line_number":1,"context_line":"tooz"},{"line_number":2,"context_line":"\u003d\u003d\u003d\u003d"},{"line_number":3,"context_line":""},{"line_number":4,"context_line":"The Tooz project aims to provided a coordination API which help developpers to"},{"line_number":5,"context_line":"build distributed applications."},{"line_number":6,"context_line":""}],"source_content_type":"text/x-rst","patch_set":1,"id":"AAAATn%2F9vfw%3D","line":4,"in_reply_to":"AAAATn%2F9v04%3D","updated":"2013-12-09 11:19:06.000000000","message":"Done","commit_id":"62e0248f00d4b07314d824a9711d8e045ea22e98"},{"author":{"_account_id":1297,"name":"Joshua Harlow","email":"jxharlow@godaddy.com","username":"harlowja"},"change_message_id":"daa66ae9ce6570a08d428dc5a676490d63972afc","unresolved":false,"context_lines":[{"line_number":2,"context_line":"\u003d\u003d\u003d\u003d"},{"line_number":3,"context_line":""},{"line_number":4,"context_line":"The Tooz project aims to provided a coordination API which help developpers to"},{"line_number":5,"context_line":"build distributed applications."},{"line_number":6,"context_line":""}],"source_content_type":"text/x-rst","patch_set":1,"id":"AAAATn%2F9snk%3D","line":5,"updated":"2013-12-07 03:29:35.000000000","message":"What about adding in a locking API also??\n\nSo \u0027coordination and locking API\u0027 ;)","commit_id":"62e0248f00d4b07314d824a9711d8e045ea22e98"},{"author":{"_account_id":7450,"name":"Yassine Lamgarchal","email":"yassine.lamgarchal@redhat.com","username":"yassine.lamgarchal"},"change_message_id":"066018af36bb96cc1a407411186e80a3f9c5dc3e","unresolved":false,"context_lines":[{"line_number":2,"context_line":"\u003d\u003d\u003d\u003d"},{"line_number":3,"context_line":""},{"line_number":4,"context_line":"The Tooz project aims to provided a coordination API which help developpers to"},{"line_number":5,"context_line":"build distributed applications."},{"line_number":6,"context_line":""}],"source_content_type":"text/x-rst","patch_set":1,"id":"AAAATn%2F9sQY%3D","line":5,"in_reply_to":"AAAATn%2F9snk%3D","updated":"2013-12-09 11:19:06.000000000","message":"Thanks for your remark Joshua :), we plan to add a lock service API as well.\n\nBy \"coordination\" i mean all distributed common primitives we can encounter when building distributed applications like group membership, distributed lock, leader election, distributed barrier and so on. The distributed lock is kind of coordination.\n\nBy the way i\u0027ve read your interesting wiki page https://wiki.openstack.org/wiki/StructuredWorkflowLocks , i think Tooz is the good place for that :-).","commit_id":"62e0248f00d4b07314d824a9711d8e045ea22e98"},{"author":{"_account_id":8122,"name":"Cyril Roelandt","email":"cyril@redhat.com","username":"cyril.roelandt.enovance"},"change_message_id":"ae093f98d11ad807cd24593ad7382b8fc35f41ce","unresolved":false,"context_lines":[{"line_number":1,"context_line":"tooz"},{"line_number":2,"context_line":"\u003d\u003d\u003d\u003d"},{"line_number":3,"context_line":""},{"line_number":4,"context_line":"The Tooz project aims to centralize the most common distributed primitives"},{"line_number":5,"context_line":"like group membership protocol, lock service and leader election by providing"},{"line_number":6,"context_line":"a coordination API helping developers to build distributed applications."}],"source_content_type":"text/x-rst","patch_set":2,"id":"AAAATn%2F9pD8%3D","line":4,"updated":"2013-12-09 12:17:37.000000000","message":"Here, I\u0027d say \"aim at centralizing\".","commit_id":"db1708709fc5c9685eb443cd70f0ec798f0f487b"},{"author":{"_account_id":7450,"name":"Yassine Lamgarchal","email":"yassine.lamgarchal@redhat.com","username":"yassine.lamgarchal"},"change_message_id":"25c1314310e6eeae3ae955a2ca30a3854931e209","unresolved":false,"context_lines":[{"line_number":1,"context_line":"tooz"},{"line_number":2,"context_line":"\u003d\u003d\u003d\u003d"},{"line_number":3,"context_line":""},{"line_number":4,"context_line":"The Tooz project aims to centralize the most common distributed primitives"},{"line_number":5,"context_line":"like group membership protocol, lock service and leader election by providing"},{"line_number":6,"context_line":"a coordination API helping developers to build distributed applications."}],"source_content_type":"text/x-rst","patch_set":2,"id":"AAAATn%2F9o2A%3D","line":4,"in_reply_to":"AAAATn%2F9pD8%3D","updated":"2013-12-09 14:12:50.000000000","message":"Done","commit_id":"db1708709fc5c9685eb443cd70f0ec798f0f487b"}],"run_tests.sh":[{"author":{"_account_id":1669,"name":"Julien Danjou","display_name":"jd","email":"julien@danjou.info","username":"jdanjou"},"change_message_id":"948bf304832534f3521281ae4401178fdfb7dc3c","unresolved":false,"context_lines":[{"line_number":32,"context_line":""},{"line_number":33,"context_line":"trap \"clean_exit\" EXIT"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"wget http://apache.mirrors.multidist.eu/zookeeper/zookeeper-3.4.5/zookeeper-3.4.5.tar.gz"},{"line_number":36,"context_line":"tar xzf ./zookeeper-3.4.5.tar.gz -C $ZOO_TMP_DIR --strip-components 1"},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"config_zookeeper"}],"source_content_type":"text/x-sh","patch_set":14,"id":"AAAATn%2F9Ebc%3D","line":35,"updated":"2013-12-17 04:13:25.000000000","message":"That worries me a bit because it\u0027s likely the source of troubles, and that does not validate Tooz against something standard like Ubuntu LTS.\n\nI imagine you did that change for CentOS not having zookeeper, but I think it\u0027s just better to not run the tests if Zookeeper is not installed at all.","commit_id":"c13d3194100715afe057e71870ab050447813af7"},{"author":{"_account_id":7450,"name":"Yassine Lamgarchal","email":"yassine.lamgarchal@redhat.com","username":"yassine.lamgarchal"},"change_message_id":"3b26b8c6555955f5463fabcb2fc41436c3c6ba5f","unresolved":false,"context_lines":[{"line_number":32,"context_line":""},{"line_number":33,"context_line":"trap \"clean_exit\" EXIT"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"wget http://apache.mirrors.multidist.eu/zookeeper/zookeeper-3.4.5/zookeeper-3.4.5.tar.gz"},{"line_number":36,"context_line":"tar xzf ./zookeeper-3.4.5.tar.gz -C $ZOO_TMP_DIR --strip-components 1"},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"config_zookeeper"}],"source_content_type":"text/x-sh","patch_set":14,"id":"AAAATn%2F9C1c%3D","line":35,"in_reply_to":"AAAATn%2F9EZY%3D","updated":"2013-12-17 11:46:36.000000000","message":"Thanks for your comments.\n\n@Julien: Yes, i did it for CentOS :/ which has no zookeeper package at all. LGTM, i will skip the tests if zookeeper is not installed then.\n\n@Joshua: I will use your \"fake client\" and create a driver by using it thus i could create a new scenario in unit-tests :-).\n\nI will do it in another patch.","commit_id":"c13d3194100715afe057e71870ab050447813af7"},{"author":{"_account_id":1669,"name":"Julien Danjou","display_name":"jd","email":"julien@danjou.info","username":"jdanjou"},"change_message_id":"9ff9db78d0a7643d73418ceb8ea32e380a71ba24","unresolved":false,"context_lines":[{"line_number":32,"context_line":""},{"line_number":33,"context_line":"trap \"clean_exit\" EXIT"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"wget http://apache.mirrors.multidist.eu/zookeeper/zookeeper-3.4.5/zookeeper-3.4.5.tar.gz"},{"line_number":36,"context_line":"tar xzf ./zookeeper-3.4.5.tar.gz -C $ZOO_TMP_DIR --strip-components 1"},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"config_zookeeper"}],"source_content_type":"text/x-sh","patch_set":14,"id":"AAAATn%2F9EZY%3D","line":35,"in_reply_to":"AAAATn%2F9EaE%3D","updated":"2013-12-17 04:23:27.000000000","message":"Agreed. As I explained to Yassine, the plan is to have both integration tests with a real ZK instance if available, and having a fake client like you have in TF so it can be manipulated to raise fake error. I think Yassine will do that in a subsequent patch.","commit_id":"c13d3194100715afe057e71870ab050447813af7"},{"author":{"_account_id":1297,"name":"Joshua Harlow","email":"jxharlow@godaddy.com","username":"harlowja"},"change_message_id":"dad466318320084a6d49417fe1137175cfd00c03","unresolved":false,"context_lines":[{"line_number":32,"context_line":""},{"line_number":33,"context_line":"trap \"clean_exit\" EXIT"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"wget http://apache.mirrors.multidist.eu/zookeeper/zookeeper-3.4.5/zookeeper-3.4.5.tar.gz"},{"line_number":36,"context_line":"tar xzf ./zookeeper-3.4.5.tar.gz -C $ZOO_TMP_DIR --strip-components 1"},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"config_zookeeper"}],"source_content_type":"text/x-sh","patch_set":14,"id":"AAAATn%2F9EaE%3D","line":35,"in_reply_to":"AAAATn%2F9Ebc%3D","updated":"2013-12-17 04:19:30.000000000","message":"Agreed, for tests, in taskflow I created a in-memory mostly functional zookeeper \u0027fake client\u0027 that u can just use in place of the regular kazoo client. This \u0027fake client\u0027 provides enough of the functionality to test the basics (of course not all the functionality zookeeper provides). Once that lands maybe we can work on figuring out how to use it here. Otherwise we need to likely work on the infra folks to get them to have a way to start zookeeper (likely we need this someday anyway).\n\nA similar script I have:\n\nhttps://review.openstack.org/#/c/62093/5/tools/run_zookeeper.sh","commit_id":"c13d3194100715afe057e71870ab050447813af7"},{"author":{"_account_id":1669,"name":"Julien Danjou","display_name":"jd","email":"julien@danjou.info","username":"jdanjou"},"change_message_id":"0aa0a9f6da6a2e29b65f58bcde9232e92281430f","unresolved":false,"context_lines":[{"line_number":17,"context_line":"}"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"if [ ! -d $ZOO_CONF ]; then"},{"line_number":20,"context_line":"    echo \"Zookeeper package not found, tests are skipped.\""},{"line_number":21,"context_line":"    rm -rf ${ZOO_TMP_DIR}"},{"line_number":22,"context_line":"    exit 0"},{"line_number":23,"context_line":"fi"}],"source_content_type":"text/x-sh","patch_set":18,"id":"AAAATn%2F9AmE%3D","line":20,"updated":"2013-12-17 18:48:18.000000000","message":"Well, no that is extreme. You don\u0027t want to skip all the tests, just don\u0027t try to copy things around and start ZooKeeper.\n\nThen your Python code should run OK if it can\u0027t connect to ZooKeeper, raising a SkipTest exception to bypass it.","commit_id":"25721125ed966c829f4580504f4010f07f06d93b"},{"author":{"_account_id":7450,"name":"Yassine Lamgarchal","email":"yassine.lamgarchal@redhat.com","username":"yassine.lamgarchal"},"change_message_id":"896f8117fa15d6f4e422878dcf2ed9525cdc58bb","unresolved":false,"context_lines":[{"line_number":17,"context_line":"}"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"if [ ! -d $ZOO_CONF ]; then"},{"line_number":20,"context_line":"    echo \"Zookeeper package not found, tests are skipped.\""},{"line_number":21,"context_line":"    rm -rf ${ZOO_TMP_DIR}"},{"line_number":22,"context_line":"    exit 0"},{"line_number":23,"context_line":"fi"}],"source_content_type":"text/x-sh","patch_set":18,"id":"AAAATn%2F8%2F3U%3D","line":20,"in_reply_to":"AAAATn%2F9AmE%3D","updated":"2013-12-17 21:43:10.000000000","message":"Done","commit_id":"25721125ed966c829f4580504f4010f07f06d93b"}],"setup.cfg":[{"author":{"_account_id":688,"name":"Sandy Walsh","email":"sandy.walsh@rackspace.com","username":"sandy-walsh"},"change_message_id":"53c29b3c2650fe21039d3786ce75ef011de780db","unresolved":false,"context_lines":[{"line_number":1,"context_line":"[metadata]"},{"line_number":2,"context_line":"name \u003d tooz"},{"line_number":3,"context_line":"author \u003d Tooz developpers"},{"line_number":4,"context_line":"author-email \u003d tooz-dev@lists.launchpad.net"},{"line_number":5,"context_line":"summary \u003d Coordination library for distributed systems."},{"line_number":6,"context_line":"description-file \u003d README.rst"}],"source_content_type":"text/x-ttcn-cfg","patch_set":1,"id":"AAAATn%2F9t3w%3D","line":3,"updated":"2013-12-06 19:51:26.000000000","message":"developers","commit_id":"62e0248f00d4b07314d824a9711d8e045ea22e98"},{"author":{"_account_id":7450,"name":"Yassine Lamgarchal","email":"yassine.lamgarchal@redhat.com","username":"yassine.lamgarchal"},"change_message_id":"066018af36bb96cc1a407411186e80a3f9c5dc3e","unresolved":false,"context_lines":[{"line_number":1,"context_line":"[metadata]"},{"line_number":2,"context_line":"name \u003d tooz"},{"line_number":3,"context_line":"author \u003d Tooz developpers"},{"line_number":4,"context_line":"author-email \u003d tooz-dev@lists.launchpad.net"},{"line_number":5,"context_line":"summary \u003d Coordination library for distributed systems."},{"line_number":6,"context_line":"description-file \u003d README.rst"}],"source_content_type":"text/x-ttcn-cfg","patch_set":1,"id":"AAAATn%2F9sQQ%3D","line":3,"in_reply_to":"AAAATn%2F9t3w%3D","updated":"2013-12-09 11:19:06.000000000","message":"Thanks!","commit_id":"62e0248f00d4b07314d824a9711d8e045ea22e98"},{"author":{"_account_id":1669,"name":"Julien Danjou","display_name":"jd","email":"julien@danjou.info","username":"jdanjou"},"change_message_id":"4b2c08cf9c95537995edc361105233e8f16e4348","unresolved":false,"context_lines":[{"line_number":12,"context_line":"    License :: OSI Approved :: Apache Software License"},{"line_number":13,"context_line":"    Operating System :: POSIX :: Linux"},{"line_number":14,"context_line":"    Programming Language :: Python"},{"line_number":15,"context_line":"    Topic :: System :: Coordination"},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"[files]"},{"line_number":18,"context_line":"packages \u003d"}],"source_content_type":"text/x-ttcn-cfg","patch_set":1,"id":"AAAATn%2F9vug%3D","line":15,"updated":"2013-12-06 13:25:51.000000000","message":"This is not a valid classifier","commit_id":"62e0248f00d4b07314d824a9711d8e045ea22e98"},{"author":{"_account_id":7450,"name":"Yassine Lamgarchal","email":"yassine.lamgarchal@redhat.com","username":"yassine.lamgarchal"},"change_message_id":"066018af36bb96cc1a407411186e80a3f9c5dc3e","unresolved":false,"context_lines":[{"line_number":12,"context_line":"    License :: OSI Approved :: Apache Software License"},{"line_number":13,"context_line":"    Operating System :: POSIX :: Linux"},{"line_number":14,"context_line":"    Programming Language :: Python"},{"line_number":15,"context_line":"    Topic :: System :: Coordination"},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"[files]"},{"line_number":18,"context_line":"packages \u003d"}],"source_content_type":"text/x-ttcn-cfg","patch_set":1,"id":"AAAATn%2F9vdA%3D","line":15,"in_reply_to":"AAAATn%2F9vug%3D","updated":"2013-12-09 11:19:06.000000000","message":"I replaced it by \"Topic :: System :: Distributed Computing\".","commit_id":"62e0248f00d4b07314d824a9711d8e045ea22e98"},{"author":{"_account_id":8122,"name":"Cyril Roelandt","email":"cyril@redhat.com","username":"cyril.roelandt.enovance"},"change_message_id":"ae093f98d11ad807cd24593ad7382b8fc35f41ce","unresolved":false,"context_lines":[{"line_number":11,"context_line":"    Intended Audience :: Information Technology"},{"line_number":12,"context_line":"    License :: OSI Approved :: Apache Software License"},{"line_number":13,"context_line":"    Operating System :: POSIX :: Linux"},{"line_number":14,"context_line":"    Programming Language :: Python"},{"line_number":15,"context_line":"    Topic :: System :: Distributed Computing"},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"[files]"}],"source_content_type":"text/x-ttcn-cfg","patch_set":2,"id":"AAAATn%2F9pDo%3D","line":14,"updated":"2013-12-09 12:17:37.000000000","message":"You should probably add:\n\nProgramming Language :: Python :: 2.7\n\nAnd all supported versions of Python.","commit_id":"db1708709fc5c9685eb443cd70f0ec798f0f487b"},{"author":{"_account_id":7450,"name":"Yassine Lamgarchal","email":"yassine.lamgarchal@redhat.com","username":"yassine.lamgarchal"},"change_message_id":"25c1314310e6eeae3ae955a2ca30a3854931e209","unresolved":false,"context_lines":[{"line_number":11,"context_line":"    Intended Audience :: Information Technology"},{"line_number":12,"context_line":"    License :: OSI Approved :: Apache Software License"},{"line_number":13,"context_line":"    Operating System :: POSIX :: Linux"},{"line_number":14,"context_line":"    Programming Language :: Python"},{"line_number":15,"context_line":"    Topic :: System :: Distributed Computing"},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"[files]"}],"source_content_type":"text/x-ttcn-cfg","patch_set":2,"id":"AAAATn%2F9o1g%3D","line":14,"in_reply_to":"AAAATn%2F9pDo%3D","updated":"2013-12-09 14:12:50.000000000","message":"Done","commit_id":"db1708709fc5c9685eb443cd70f0ec798f0f487b"}],"setup.py":[{"author":{"_account_id":8122,"name":"Cyril Roelandt","email":"cyril@redhat.com","username":"cyril.roelandt.enovance"},"change_message_id":"014b39545df38d5d29b8662c47cffbd24951713a","unresolved":false,"context_lines":[{"line_number":19,"context_line":"import os"},{"line_number":20,"context_line":"import setuptools"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"os.environ[\"PBR_VERSION\"] \u003d \"0.1\""},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"setuptools.setup("},{"line_number":25,"context_line":"    setup_requires\u003d[\u0027pbr\u0027],"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAATn%2F9pWc%3D","line":22,"updated":"2013-12-09 10:51:42.000000000","message":"This is a dirty hack needed when you\u0027re not inside a git repository and using pbr. Could you remove it ?","commit_id":"62e0248f00d4b07314d824a9711d8e045ea22e98"},{"author":{"_account_id":7450,"name":"Yassine Lamgarchal","email":"yassine.lamgarchal@redhat.com","username":"yassine.lamgarchal"},"change_message_id":"066018af36bb96cc1a407411186e80a3f9c5dc3e","unresolved":false,"context_lines":[{"line_number":19,"context_line":"import os"},{"line_number":20,"context_line":"import setuptools"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"os.environ[\"PBR_VERSION\"] \u003d \"0.1\""},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"setuptools.setup("},{"line_number":25,"context_line":"    setup_requires\u003d[\u0027pbr\u0027],"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAATn%2F9pTI%3D","line":22,"in_reply_to":"AAAATn%2F9pWc%3D","updated":"2013-12-09 11:19:06.000000000","message":"Sure, we are clean in Tooz :-).","commit_id":"62e0248f00d4b07314d824a9711d8e045ea22e98"},{"author":{"_account_id":8122,"name":"Cyril Roelandt","email":"cyril@redhat.com","username":"cyril.roelandt.enovance"},"change_message_id":"ae093f98d11ad807cd24593ad7382b8fc35f41ce","unresolved":false,"context_lines":[{"line_number":1,"context_line":"#!/usr/bin/env python"},{"line_number":2,"context_line":"# Copyright (c) 2013 Hewlett-Packard Development Company, L.P."},{"line_number":3,"context_line":"#"},{"line_number":4,"context_line":"# Licensed under the Apache License, Version 2.0 (the \"License\");"},{"line_number":5,"context_line":"# you may not use this file except in compliance with the License."}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAATn%2F9pDg%3D","line":2,"updated":"2013-12-09 12:17:37.000000000","message":"I don\u0027t think so.","commit_id":"db1708709fc5c9685eb443cd70f0ec798f0f487b"},{"author":{"_account_id":7450,"name":"Yassine Lamgarchal","email":"yassine.lamgarchal@redhat.com","username":"yassine.lamgarchal"},"change_message_id":"25c1314310e6eeae3ae955a2ca30a3854931e209","unresolved":false,"context_lines":[{"line_number":1,"context_line":"#!/usr/bin/env python"},{"line_number":2,"context_line":"# Copyright (c) 2013 Hewlett-Packard Development Company, L.P."},{"line_number":3,"context_line":"#"},{"line_number":4,"context_line":"# Licensed under the Apache License, Version 2.0 (the \"License\");"},{"line_number":5,"context_line":"# you may not use this file except in compliance with the License."}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAATn%2F9oyc%3D","line":2,"in_reply_to":"AAAATn%2F9pDg%3D","updated":"2013-12-09 14:12:50.000000000","message":"This come from openstack/requirements.","commit_id":"db1708709fc5c9685eb443cd70f0ec798f0f487b"},{"author":{"_account_id":1669,"name":"Julien Danjou","display_name":"jd","email":"julien@danjou.info","username":"jdanjou"},"change_message_id":"e66bd648d72d3c286518057034164c15270f5ad2","unresolved":false,"context_lines":[{"line_number":1,"context_line":"#!/usr/bin/env python"},{"line_number":2,"context_line":"# Copyright (c) 2013 Hewlett-Packard Development Company, L.P."},{"line_number":3,"context_line":"#"},{"line_number":4,"context_line":"# Licensed under the Apache License, Version 2.0 (the \"License\");"},{"line_number":5,"context_line":"# you may not use this file except in compliance with the License."}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAATn%2F9osM%3D","line":2,"in_reply_to":"AAAATn%2F9pDg%3D","updated":"2013-12-09 13:38:55.000000000","message":"This is actually correct.","commit_id":"db1708709fc5c9685eb443cd70f0ec798f0f487b"}],"tooz/__init__.py":[{"author":{"_account_id":9107,"name":"Victor Stinner","email":"vstinner@redhat.com","username":"haypo"},"change_message_id":"0e444af86d0daa2d46c4941e2ec8a5ef08935a3e","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# -*- coding: utf-8 -*-"},{"line_number":2,"context_line":""},{"line_number":3,"context_line":"# vim: tabstop\u003d4 shiftwidth\u003d4 softtabstop\u003d4"},{"line_number":4,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAATn%2F9vzo%3D","line":1,"updated":"2013-12-06 13:44:55.000000000","message":"the encoding is uselss for empty files :)","commit_id":"62e0248f00d4b07314d824a9711d8e045ea22e98"},{"author":{"_account_id":7450,"name":"Yassine Lamgarchal","email":"yassine.lamgarchal@redhat.com","username":"yassine.lamgarchal"},"change_message_id":"066018af36bb96cc1a407411186e80a3f9c5dc3e","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# -*- coding: utf-8 -*-"},{"line_number":2,"context_line":""},{"line_number":3,"context_line":"# vim: tabstop\u003d4 shiftwidth\u003d4 softtabstop\u003d4"},{"line_number":4,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAATn%2F9vc4%3D","line":1,"in_reply_to":"AAAATn%2F9vzo%3D","updated":"2013-12-09 11:19:06.000000000","message":"Done","commit_id":"62e0248f00d4b07314d824a9711d8e045ea22e98"}],"tooz/api.py":[{"author":{"_account_id":1669,"name":"Julien Danjou","display_name":"jd","email":"julien@danjou.info","username":"jdanjou"},"change_message_id":"b3d1449d0b4dca3bea6f1e118e191b6032349150","unresolved":false,"context_lines":[{"line_number":18,"context_line":""},{"line_number":19,"context_line":"import abc"},{"line_number":20,"context_line":"import copy"},{"line_number":21,"context_line":"import six"},{"line_number":22,"context_line":"from stevedore import driver"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"TOOZ_BACKENDS_NAMESPACE \u003d \"tooz.backends\""}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAATn%2F9v0o%3D","line":21,"updated":"2013-12-06 13:09:43.000000000","message":"insert an empty line between copy and six because six and stevedore are not part of stdlib.","commit_id":"62e0248f00d4b07314d824a9711d8e045ea22e98"},{"author":{"_account_id":7450,"name":"Yassine Lamgarchal","email":"yassine.lamgarchal@redhat.com","username":"yassine.lamgarchal"},"change_message_id":"066018af36bb96cc1a407411186e80a3f9c5dc3e","unresolved":false,"context_lines":[{"line_number":18,"context_line":""},{"line_number":19,"context_line":"import abc"},{"line_number":20,"context_line":"import copy"},{"line_number":21,"context_line":"import six"},{"line_number":22,"context_line":"from stevedore import driver"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"TOOZ_BACKENDS_NAMESPACE \u003d \"tooz.backends\""}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAATn%2F9pqw%3D","line":21,"in_reply_to":"AAAATn%2F9v0o%3D","updated":"2013-12-09 11:19:06.000000000","message":"Done","commit_id":"62e0248f00d4b07314d824a9711d8e045ea22e98"},{"author":{"_account_id":1669,"name":"Julien Danjou","display_name":"jd","email":"julien@danjou.info","username":"jdanjou"},"change_message_id":"b3d1449d0b4dca3bea6f1e118e191b6032349150","unresolved":false,"context_lines":[{"line_number":24,"context_line":"TOOZ_BACKENDS_NAMESPACE \u003d \"tooz.backends\""},{"line_number":25,"context_line":""},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"class API(object):"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"    #TODO(yassine)"},{"line_number":30,"context_line":"    #Replace kwargs by something more simple."}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAATn%2F9v0E%3D","line":27,"updated":"2013-12-06 13:09:43.000000000","message":"That should be named with something more interesting than API. Otherwise it\u0027s like calling this file \"file.py\" :-P\n\n\nSince you call something implementing that a coordinator, let\u0027s call that Coordinator.","commit_id":"62e0248f00d4b07314d824a9711d8e045ea22e98"},{"author":{"_account_id":7450,"name":"Yassine Lamgarchal","email":"yassine.lamgarchal@redhat.com","username":"yassine.lamgarchal"},"change_message_id":"066018af36bb96cc1a407411186e80a3f9c5dc3e","unresolved":false,"context_lines":[{"line_number":24,"context_line":"TOOZ_BACKENDS_NAMESPACE \u003d \"tooz.backends\""},{"line_number":25,"context_line":""},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"class API(object):"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"    #TODO(yassine)"},{"line_number":30,"context_line":"    #Replace kwargs by something more simple."}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAATn%2F9sPQ%3D","line":27,"in_reply_to":"AAAATn%2F9t24%3D","updated":"2013-12-09 11:19:06.000000000","message":"Thanks Sandy, I think \u0027Coordinator\u0027 is a good name for the api :-).","commit_id":"62e0248f00d4b07314d824a9711d8e045ea22e98"},{"author":{"_account_id":7450,"name":"Yassine Lamgarchal","email":"yassine.lamgarchal@redhat.com","username":"yassine.lamgarchal"},"change_message_id":"066018af36bb96cc1a407411186e80a3f9c5dc3e","unresolved":false,"context_lines":[{"line_number":24,"context_line":"TOOZ_BACKENDS_NAMESPACE \u003d \"tooz.backends\""},{"line_number":25,"context_line":""},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"class API(object):"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"    #TODO(yassine)"},{"line_number":30,"context_line":"    #Replace kwargs by something more simple."}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAATn%2F9sQM%3D","line":27,"in_reply_to":"AAAATn%2F9v0E%3D","updated":"2013-12-09 11:19:06.000000000","message":"Done","commit_id":"62e0248f00d4b07314d824a9711d8e045ea22e98"},{"author":{"_account_id":688,"name":"Sandy Walsh","email":"sandy.walsh@rackspace.com","username":"sandy-walsh"},"change_message_id":"53c29b3c2650fe21039d3786ce75ef011de780db","unresolved":false,"context_lines":[{"line_number":24,"context_line":"TOOZ_BACKENDS_NAMESPACE \u003d \"tooz.backends\""},{"line_number":25,"context_line":""},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"class API(object):"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"    #TODO(yassine)"},{"line_number":30,"context_line":"    #Replace kwargs by something more simple."}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAATn%2F9t24%3D","line":27,"in_reply_to":"AAAATn%2F9v0E%3D","updated":"2013-12-06 19:51:26.000000000","message":"I think this is fine as the namespace handled the descriptive part. \n\nThough, perhaps consider bringing this into the __init__ file so we can do tooz.API vs. tooz.api.API","commit_id":"62e0248f00d4b07314d824a9711d8e045ea22e98"},{"author":{"_account_id":9107,"name":"Victor Stinner","email":"vstinner@redhat.com","username":"haypo"},"change_message_id":"0e444af86d0daa2d46c4941e2ec8a5ef08935a3e","unresolved":false,"context_lines":[{"line_number":28,"context_line":""},{"line_number":29,"context_line":"    #TODO(yassine)"},{"line_number":30,"context_line":"    #Replace kwargs by something more simple."},{"line_number":31,"context_line":"    def __init__(self, backend, kwargs):"},{"line_number":32,"context_line":"        \"\"\"Initialize and load the backend."},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"        Keyword arguments:"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAATn%2F9vyw%3D","line":31,"updated":"2013-12-06 13:44:55.000000000","message":"Why not writing **kwargs, or hosts\u003d...? Or (self, backend, hosts) if the parameter is mandatory.","commit_id":"62e0248f00d4b07314d824a9711d8e045ea22e98"},{"author":{"_account_id":7450,"name":"Yassine Lamgarchal","email":"yassine.lamgarchal@redhat.com","username":"yassine.lamgarchal"},"change_message_id":"066018af36bb96cc1a407411186e80a3f9c5dc3e","unresolved":false,"context_lines":[{"line_number":28,"context_line":""},{"line_number":29,"context_line":"    #TODO(yassine)"},{"line_number":30,"context_line":"    #Replace kwargs by something more simple."},{"line_number":31,"context_line":"    def __init__(self, backend, kwargs):"},{"line_number":32,"context_line":"        \"\"\"Initialize and load the backend."},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"        Keyword arguments:"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAATn%2F9sOo%3D","line":31,"in_reply_to":"AAAATn%2F9t2k%3D","updated":"2013-12-09 11:19:06.000000000","message":"For now we are using a simple dictionary, i\u0027m looking to something more simpler and easily understandable. Maybe to replace kwargs by the url pattern like \"zookeeper://...\".","commit_id":"62e0248f00d4b07314d824a9711d8e045ea22e98"},{"author":{"_account_id":7450,"name":"Yassine Lamgarchal","email":"yassine.lamgarchal@redhat.com","username":"yassine.lamgarchal"},"change_message_id":"066018af36bb96cc1a407411186e80a3f9c5dc3e","unresolved":false,"context_lines":[{"line_number":28,"context_line":""},{"line_number":29,"context_line":"    #TODO(yassine)"},{"line_number":30,"context_line":"    #Replace kwargs by something more simple."},{"line_number":31,"context_line":"    def __init__(self, backend, kwargs):"},{"line_number":32,"context_line":"        \"\"\"Initialize and load the backend."},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"        Keyword arguments:"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAATn%2F9sO0%3D","line":31,"in_reply_to":"AAAATn%2F9vyw%3D","updated":"2013-12-09 11:19:06.000000000","message":"I prefer to use a simple dictionary because it simplify the creation of the unit tests classes by testscenarios. The only mandatory parameter is \"backend\", the API should be fully agnostic to parameters which are specific to a backend.","commit_id":"62e0248f00d4b07314d824a9711d8e045ea22e98"},{"author":{"_account_id":688,"name":"Sandy Walsh","email":"sandy.walsh@rackspace.com","username":"sandy-walsh"},"change_message_id":"53c29b3c2650fe21039d3786ce75ef011de780db","unresolved":false,"context_lines":[{"line_number":28,"context_line":""},{"line_number":29,"context_line":"    #TODO(yassine)"},{"line_number":30,"context_line":"    #Replace kwargs by something more simple."},{"line_number":31,"context_line":"    def __init__(self, backend, kwargs):"},{"line_number":32,"context_line":"        \"\"\"Initialize and load the backend."},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"        Keyword arguments:"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAATn%2F9t2k%3D","line":31,"in_reply_to":"AAAATn%2F9vyw%3D","updated":"2013-12-06 19:51:26.000000000","message":"or consider passing in a config dictionary (not oslo, keep it simple).","commit_id":"62e0248f00d4b07314d824a9711d8e045ea22e98"},{"author":{"_account_id":1297,"name":"Joshua Harlow","email":"jxharlow@godaddy.com","username":"harlowja"},"change_message_id":"423eae9b793df05432afa66216c2bd5a9e66b0b8","unresolved":false,"context_lines":[{"line_number":32,"context_line":"        \"\"\"Initialize and load the backend."},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"        Keyword arguments:"},{"line_number":35,"context_line":"        backend -- possible backends are \"zookeeper\"."},{"line_number":36,"context_line":"        kwargs -- for zookeeper it must contains the key \"hosts\" associated"},{"line_number":37,"context_line":"        to the list of zookeeper servers in the form \"ip:port2, ip2:port2\". For"},{"line_number":38,"context_line":"        all backends the key \"member_id\" associated to the identifier of the"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAATn%2F9sxc%3D","line":35,"updated":"2013-12-07 00:52:31.000000000","message":"Seems like u shouldn\u0027t list the possible ones, as using entrypoints means that anyone can make there own. Maybe better worded as \u0027the current tooz provided backends are zookeeper\u0027?","commit_id":"62e0248f00d4b07314d824a9711d8e045ea22e98"},{"author":{"_account_id":7450,"name":"Yassine Lamgarchal","email":"yassine.lamgarchal@redhat.com","username":"yassine.lamgarchal"},"change_message_id":"066018af36bb96cc1a407411186e80a3f9c5dc3e","unresolved":false,"context_lines":[{"line_number":32,"context_line":"        \"\"\"Initialize and load the backend."},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"        Keyword arguments:"},{"line_number":35,"context_line":"        backend -- possible backends are \"zookeeper\"."},{"line_number":36,"context_line":"        kwargs -- for zookeeper it must contains the key \"hosts\" associated"},{"line_number":37,"context_line":"        to the list of zookeeper servers in the form \"ip:port2, ip2:port2\". For"},{"line_number":38,"context_line":"        all backends the key \"member_id\" associated to the identifier of the"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAATn%2F9sOc%3D","line":35,"in_reply_to":"AAAATn%2F9sxc%3D","updated":"2013-12-09 11:19:06.000000000","message":"You are right, thanks :-).","commit_id":"62e0248f00d4b07314d824a9711d8e045ea22e98"},{"author":{"_account_id":1297,"name":"Joshua Harlow","email":"jxharlow@godaddy.com","username":"harlowja"},"change_message_id":"423eae9b793df05432afa66216c2bd5a9e66b0b8","unresolved":false,"context_lines":[{"line_number":33,"context_line":""},{"line_number":34,"context_line":"        Keyword arguments:"},{"line_number":35,"context_line":"        backend -- possible backends are \"zookeeper\"."},{"line_number":36,"context_line":"        kwargs -- for zookeeper it must contains the key \"hosts\" associated"},{"line_number":37,"context_line":"        to the list of zookeeper servers in the form \"ip:port2, ip2:port2\". For"},{"line_number":38,"context_line":"        all backends the key \"member_id\" associated to the identifier of the"},{"line_number":39,"context_line":"        caller must be provided."}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAATn%2F9sxg%3D","line":36,"updated":"2013-12-07 00:52:31.000000000","message":"Seems like u should just say? Since in the future there might be more than zookeeper.\n\n  kwargs: additional backend specific options","commit_id":"62e0248f00d4b07314d824a9711d8e045ea22e98"},{"author":{"_account_id":688,"name":"Sandy Walsh","email":"sandy.walsh@rackspace.com","username":"sandy-walsh"},"change_message_id":"53c29b3c2650fe21039d3786ce75ef011de780db","unresolved":false,"context_lines":[{"line_number":33,"context_line":""},{"line_number":34,"context_line":"        Keyword arguments:"},{"line_number":35,"context_line":"        backend -- possible backends are \"zookeeper\"."},{"line_number":36,"context_line":"        kwargs -- for zookeeper it must contains the key \"hosts\" associated"},{"line_number":37,"context_line":"        to the list of zookeeper servers in the form \"ip:port2, ip2:port2\". For"},{"line_number":38,"context_line":"        all backends the key \"member_id\" associated to the identifier of the"},{"line_number":39,"context_line":"        caller must be provided."}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAATn%2F9t2c%3D","line":36,"updated":"2013-12-06 19:51:26.000000000","message":"use python docstrings for parameter descriptions","commit_id":"62e0248f00d4b07314d824a9711d8e045ea22e98"},{"author":{"_account_id":7450,"name":"Yassine Lamgarchal","email":"yassine.lamgarchal@redhat.com","username":"yassine.lamgarchal"},"change_message_id":"066018af36bb96cc1a407411186e80a3f9c5dc3e","unresolved":false,"context_lines":[{"line_number":33,"context_line":""},{"line_number":34,"context_line":"        Keyword arguments:"},{"line_number":35,"context_line":"        backend -- possible backends are \"zookeeper\"."},{"line_number":36,"context_line":"        kwargs -- for zookeeper it must contains the key \"hosts\" associated"},{"line_number":37,"context_line":"        to the list of zookeeper servers in the form \"ip:port2, ip2:port2\". For"},{"line_number":38,"context_line":"        all backends the key \"member_id\" associated to the identifier of the"},{"line_number":39,"context_line":"        caller must be provided."}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAATn%2F9sOQ%3D","line":36,"in_reply_to":"AAAATn%2F9sxg%3D","updated":"2013-12-09 11:19:06.000000000","message":"Yes! :)\n\nIt\u0027s not the right place to document the parameters specific to a backend, i\u0027ll do it in zookeeper.py of course.","commit_id":"62e0248f00d4b07314d824a9711d8e045ea22e98"},{"author":{"_account_id":1669,"name":"Julien Danjou","display_name":"jd","email":"julien@danjou.info","username":"jdanjou"},"change_message_id":"b3d1449d0b4dca3bea6f1e118e191b6032349150","unresolved":false,"context_lines":[{"line_number":41,"context_line":"        mgr \u003d driver.DriverManager(namespace\u003dTOOZ_BACKENDS_NAMESPACE,"},{"line_number":42,"context_line":"                                   name\u003dbackend,"},{"line_number":43,"context_line":"                                   invoke_on_load\u003dTrue,"},{"line_number":44,"context_line":"                                   invoke_kwds\u003dcopy.deepcopy(kwargs))"},{"line_number":45,"context_line":"        self._driver \u003d mgr.driver"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"    def start(self):"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAATn%2F9v0c%3D","line":44,"updated":"2013-12-06 13:09:43.000000000","message":"Not sure you really want a deepcopy, it\u0027s expensive and not justified I think.","commit_id":"62e0248f00d4b07314d824a9711d8e045ea22e98"},{"author":{"_account_id":9107,"name":"Victor Stinner","email":"vstinner@redhat.com","username":"haypo"},"change_message_id":"0e444af86d0daa2d46c4941e2ec8a5ef08935a3e","unresolved":false,"context_lines":[{"line_number":41,"context_line":"        mgr \u003d driver.DriverManager(namespace\u003dTOOZ_BACKENDS_NAMESPACE,"},{"line_number":42,"context_line":"                                   name\u003dbackend,"},{"line_number":43,"context_line":"                                   invoke_on_load\u003dTrue,"},{"line_number":44,"context_line":"                                   invoke_kwds\u003dcopy.deepcopy(kwargs))"},{"line_number":45,"context_line":"        self._driver \u003d mgr.driver"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"    def start(self):"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAATn%2F9vyU%3D","line":44,"updated":"2013-12-06 13:44:55.000000000","message":"copy.deepcopy() should be avoided when possible. If DriverManager modifies kwargs, DriverManager should copy the dictionary, but not this function.","commit_id":"62e0248f00d4b07314d824a9711d8e045ea22e98"},{"author":{"_account_id":7450,"name":"Yassine Lamgarchal","email":"yassine.lamgarchal@redhat.com","username":"yassine.lamgarchal"},"change_message_id":"066018af36bb96cc1a407411186e80a3f9c5dc3e","unresolved":false,"context_lines":[{"line_number":41,"context_line":"        mgr \u003d driver.DriverManager(namespace\u003dTOOZ_BACKENDS_NAMESPACE,"},{"line_number":42,"context_line":"                                   name\u003dbackend,"},{"line_number":43,"context_line":"                                   invoke_on_load\u003dTrue,"},{"line_number":44,"context_line":"                                   invoke_kwds\u003dcopy.deepcopy(kwargs))"},{"line_number":45,"context_line":"        self._driver \u003d mgr.driver"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"    def start(self):"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAATn%2F9sNo%3D","line":44,"in_reply_to":"AAAATn%2F9v0c%3D","updated":"2013-12-09 11:19:06.000000000","message":"Done","commit_id":"62e0248f00d4b07314d824a9711d8e045ea22e98"},{"author":{"_account_id":7450,"name":"Yassine Lamgarchal","email":"yassine.lamgarchal@redhat.com","username":"yassine.lamgarchal"},"change_message_id":"066018af36bb96cc1a407411186e80a3f9c5dc3e","unresolved":false,"context_lines":[{"line_number":41,"context_line":"        mgr \u003d driver.DriverManager(namespace\u003dTOOZ_BACKENDS_NAMESPACE,"},{"line_number":42,"context_line":"                                   name\u003dbackend,"},{"line_number":43,"context_line":"                                   invoke_on_load\u003dTrue,"},{"line_number":44,"context_line":"                                   invoke_kwds\u003dcopy.deepcopy(kwargs))"},{"line_number":45,"context_line":"        self._driver \u003d mgr.driver"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"    def start(self):"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAATn%2F9sNk%3D","line":44,"in_reply_to":"AAAATn%2F9vyU%3D","updated":"2013-12-09 11:19:06.000000000","message":"Done","commit_id":"62e0248f00d4b07314d824a9711d8e045ea22e98"},{"author":{"_account_id":1669,"name":"Julien Danjou","display_name":"jd","email":"julien@danjou.info","username":"jdanjou"},"change_message_id":"b3d1449d0b4dca3bea6f1e118e191b6032349150","unresolved":false,"context_lines":[{"line_number":61,"context_line":"        self._driver.stop()"},{"line_number":62,"context_line":""},{"line_number":63,"context_line":"    def create_group(self, group_id):"},{"line_number":64,"context_line":"        \"\"\"Request the creation of a group.\"\"\""},{"line_number":65,"context_line":"        self._driver.create_group(group_id)"},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"    def get_all_groups_ids(self):"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAATn%2F9vz8%3D","line":64,"updated":"2013-12-06 13:09:43.000000000","message":"Bonus would be to describe the type of the argument, in this case group_id.\n\nI\u0027m also not sure the user will be able to always chose the group_id? anyway we can change that later if needed.","commit_id":"62e0248f00d4b07314d824a9711d8e045ea22e98"},{"author":{"_account_id":7450,"name":"Yassine Lamgarchal","email":"yassine.lamgarchal@redhat.com","username":"yassine.lamgarchal"},"change_message_id":"066018af36bb96cc1a407411186e80a3f9c5dc3e","unresolved":false,"context_lines":[{"line_number":61,"context_line":"        self._driver.stop()"},{"line_number":62,"context_line":""},{"line_number":63,"context_line":"    def create_group(self, group_id):"},{"line_number":64,"context_line":"        \"\"\"Request the creation of a group.\"\"\""},{"line_number":65,"context_line":"        self._driver.create_group(group_id)"},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"    def get_all_groups_ids(self):"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAATn%2F9sNU%3D","line":64,"in_reply_to":"AAAATn%2F9vz8%3D","updated":"2013-12-09 11:19:06.000000000","message":"Since we all like bonus, i\u0027ll document types of arguments :-).\n\nA group of services could agreed upon a specific group to join, for now the API allows to create a group. This raise the questions: when a group should be deleted ? Do we need kind of garbage collector ?","commit_id":"62e0248f00d4b07314d824a9711d8e045ea22e98"},{"author":{"_account_id":688,"name":"Sandy Walsh","email":"sandy.walsh@rackspace.com","username":"sandy-walsh"},"change_message_id":"53c29b3c2650fe21039d3786ce75ef011de780db","unresolved":false,"context_lines":[{"line_number":91,"context_line":"        self._driver.update_capabilities(group_id, capabilities)"},{"line_number":92,"context_line":""},{"line_number":93,"context_line":"    #TODO(yassine)"},{"line_number":94,"context_line":"    #def set_notifier_func(self, group_id, notifier):"},{"line_number":95,"context_line":"    #    self._driver.set_notifier_func(group_id, notifier)"},{"line_number":96,"context_line":""},{"line_number":97,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAATn%2F9t2I%3D","line":94,"updated":"2013-12-06 19:51:26.000000000","message":"no dead code","commit_id":"62e0248f00d4b07314d824a9711d8e045ea22e98"},{"author":{"_account_id":7450,"name":"Yassine Lamgarchal","email":"yassine.lamgarchal@redhat.com","username":"yassine.lamgarchal"},"change_message_id":"066018af36bb96cc1a407411186e80a3f9c5dc3e","unresolved":false,"context_lines":[{"line_number":91,"context_line":"        self._driver.update_capabilities(group_id, capabilities)"},{"line_number":92,"context_line":""},{"line_number":93,"context_line":"    #TODO(yassine)"},{"line_number":94,"context_line":"    #def set_notifier_func(self, group_id, notifier):"},{"line_number":95,"context_line":"    #    self._driver.set_notifier_func(group_id, notifier)"},{"line_number":96,"context_line":""},{"line_number":97,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAATn%2F9sP4%3D","line":94,"in_reply_to":"AAAATn%2F9t2I%3D","updated":"2013-12-09 11:19:06.000000000","message":"Done","commit_id":"62e0248f00d4b07314d824a9711d8e045ea22e98"},{"author":{"_account_id":8122,"name":"Cyril Roelandt","email":"cyril@redhat.com","username":"cyril.roelandt.enovance"},"change_message_id":"014b39545df38d5d29b8662c47cffbd24951713a","unresolved":false,"context_lines":[{"line_number":92,"context_line":""},{"line_number":93,"context_line":"    #TODO(yassine)"},{"line_number":94,"context_line":"    #def set_notifier_func(self, group_id, notifier):"},{"line_number":95,"context_line":"    #    self._driver.set_notifier_func(group_id, notifier)"},{"line_number":96,"context_line":""},{"line_number":97,"context_line":""},{"line_number":98,"context_line":"@six.add_metaclass(abc.ABCMeta)"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAATn%2F9pV8%3D","line":95,"updated":"2013-12-09 10:51:42.000000000","message":"+1. Either remove it, or raise NotImplementedError.","commit_id":"62e0248f00d4b07314d824a9711d8e045ea22e98"},{"author":{"_account_id":9107,"name":"Victor Stinner","email":"vstinner@redhat.com","username":"haypo"},"change_message_id":"0e444af86d0daa2d46c4941e2ec8a5ef08935a3e","unresolved":false,"context_lines":[{"line_number":96,"context_line":""},{"line_number":97,"context_line":""},{"line_number":98,"context_line":"@six.add_metaclass(abc.ABCMeta)"},{"line_number":99,"context_line":"class CoordinationDriver(object):"},{"line_number":100,"context_line":""},{"line_number":101,"context_line":"    @abc.abstractmethod"},{"line_number":102,"context_line":"    def start(self):"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAATn%2F9vyE%3D","line":99,"updated":"2013-12-06 13:44:55.000000000","message":"CoordinationDriver is the \"interface\" of API? If yes, why API is not a subclass of CoordinationDriver?","commit_id":"62e0248f00d4b07314d824a9711d8e045ea22e98"},{"author":{"_account_id":7450,"name":"Yassine Lamgarchal","email":"yassine.lamgarchal@redhat.com","username":"yassine.lamgarchal"},"change_message_id":"066018af36bb96cc1a407411186e80a3f9c5dc3e","unresolved":false,"context_lines":[{"line_number":96,"context_line":""},{"line_number":97,"context_line":""},{"line_number":98,"context_line":"@six.add_metaclass(abc.ABCMeta)"},{"line_number":99,"context_line":"class CoordinationDriver(object):"},{"line_number":100,"context_line":""},{"line_number":101,"context_line":"    @abc.abstractmethod"},{"line_number":102,"context_line":"    def start(self):"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAATn%2F9sPw%3D","line":99,"in_reply_to":"AAAATn%2F9vyE%3D","updated":"2013-12-09 11:19:06.000000000","message":"Done","commit_id":"62e0248f00d4b07314d824a9711d8e045ea22e98"},{"author":{"_account_id":688,"name":"Sandy Walsh","email":"sandy.walsh@rackspace.com","username":"sandy-walsh"},"change_message_id":"53c29b3c2650fe21039d3786ce75ef011de780db","unresolved":false,"context_lines":[{"line_number":135,"context_line":"        pass"},{"line_number":136,"context_line":""},{"line_number":137,"context_line":"    #TODO(yassine)"},{"line_number":138,"context_line":"    #@abc.abstractmethod"},{"line_number":139,"context_line":"    #def set_notifier_func(self, group_id, notifier):"},{"line_number":140,"context_line":"    #    pass"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAATn%2F9t2A%3D","line":138,"updated":"2013-12-06 19:51:26.000000000","message":"no dead code","commit_id":"62e0248f00d4b07314d824a9711d8e045ea22e98"},{"author":{"_account_id":7450,"name":"Yassine Lamgarchal","email":"yassine.lamgarchal@redhat.com","username":"yassine.lamgarchal"},"change_message_id":"066018af36bb96cc1a407411186e80a3f9c5dc3e","unresolved":false,"context_lines":[{"line_number":135,"context_line":"        pass"},{"line_number":136,"context_line":""},{"line_number":137,"context_line":"    #TODO(yassine)"},{"line_number":138,"context_line":"    #@abc.abstractmethod"},{"line_number":139,"context_line":"    #def set_notifier_func(self, group_id, notifier):"},{"line_number":140,"context_line":"    #    pass"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAATn%2F9sP0%3D","line":138,"in_reply_to":"AAAATn%2F9t2A%3D","updated":"2013-12-09 11:19:06.000000000","message":"Done","commit_id":"62e0248f00d4b07314d824a9711d8e045ea22e98"},{"author":{"_account_id":8122,"name":"Cyril Roelandt","email":"cyril@redhat.com","username":"cyril.roelandt.enovance"},"change_message_id":"ae093f98d11ad807cd24593ad7382b8fc35f41ce","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# -*- coding: utf-8 -*-"},{"line_number":2,"context_line":""},{"line_number":3,"context_line":"# vim: tabstop\u003d4 shiftwidth\u003d4 softtabstop\u003d4"},{"line_number":4,"context_line":""},{"line_number":5,"context_line":"#    Copyright (C) 2013 eNovance Inc. All Rights Reserved."},{"line_number":6,"context_line":"#"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAATn%2F9pDY%3D","line":3,"updated":"2013-12-09 12:17:37.000000000","message":"I really hate those. Not sure what the officiel OpenStack policy is, though.","commit_id":"db1708709fc5c9685eb443cd70f0ec798f0f487b"},{"author":{"_account_id":8122,"name":"Cyril Roelandt","email":"cyril@redhat.com","username":"cyril.roelandt.enovance"},"change_message_id":"ae093f98d11ad807cd24593ad7382b8fc35f41ce","unresolved":false,"context_lines":[{"line_number":50,"context_line":"        \"\"\"Request the creation of a group."},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"        :param group_id: the id of the group to create"},{"line_number":53,"context_line":"        :type group_id: str"},{"line_number":54,"context_line":"        \"\"\""},{"line_number":55,"context_line":"        pass"},{"line_number":56,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAATn%2F9pDM%3D","line":53,"updated":"2013-12-09 12:17:37.000000000","message":"Do we really want to have \":param\" and \":type\" ? I\u0027d rather have:\n\n\":param group_id: a string representing the id of the group to create.\"\n\nor something similar.","commit_id":"db1708709fc5c9685eb443cd70f0ec798f0f487b"},{"author":{"_account_id":7450,"name":"Yassine Lamgarchal","email":"yassine.lamgarchal@redhat.com","username":"yassine.lamgarchal"},"change_message_id":"25c1314310e6eeae3ae955a2ca30a3854931e209","unresolved":false,"context_lines":[{"line_number":50,"context_line":"        \"\"\"Request the creation of a group."},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"        :param group_id: the id of the group to create"},{"line_number":53,"context_line":"        :type group_id: str"},{"line_number":54,"context_line":"        \"\"\""},{"line_number":55,"context_line":"        pass"},{"line_number":56,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAATn%2F9oxE%3D","line":53,"in_reply_to":"AAAATn%2F9pDM%3D","updated":"2013-12-09 14:12:50.000000000","message":"I prefer to use sphinx\u0027s conventions.","commit_id":"db1708709fc5c9685eb443cd70f0ec798f0f487b"},{"author":{"_account_id":8122,"name":"Cyril Roelandt","email":"cyril@redhat.com","username":"cyril.roelandt.enovance"},"change_message_id":"ae093f98d11ad807cd24593ad7382b8fc35f41ce","unresolved":false,"context_lines":[{"line_number":81,"context_line":""},{"line_number":82,"context_line":"    @abc.abstractmethod"},{"line_number":83,"context_line":"    def get_members(self):"},{"line_number":84,"context_line":"        \"\"\"Return the list of all members of the specified group.\"\"\""},{"line_number":85,"context_line":"        pass"},{"line_number":86,"context_line":""},{"line_number":87,"context_line":"    @abc.abstractmethod"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAATn%2F9pC8%3D","line":84,"updated":"2013-12-09 12:17:37.000000000","message":"Do we want the list or a generator ?","commit_id":"db1708709fc5c9685eb443cd70f0ec798f0f487b"},{"author":{"_account_id":7450,"name":"Yassine Lamgarchal","email":"yassine.lamgarchal@redhat.com","username":"yassine.lamgarchal"},"change_message_id":"25c1314310e6eeae3ae955a2ca30a3854931e209","unresolved":false,"context_lines":[{"line_number":81,"context_line":""},{"line_number":82,"context_line":"    @abc.abstractmethod"},{"line_number":83,"context_line":"    def get_members(self):"},{"line_number":84,"context_line":"        \"\"\"Return the list of all members of the specified group.\"\"\""},{"line_number":85,"context_line":"        pass"},{"line_number":86,"context_line":""},{"line_number":87,"context_line":"    @abc.abstractmethod"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAATn%2F9ows%3D","line":84,"in_reply_to":"AAAATn%2F9pC8%3D","updated":"2013-12-09 14:12:50.000000000","message":"The list.","commit_id":"db1708709fc5c9685eb443cd70f0ec798f0f487b"},{"author":{"_account_id":8122,"name":"Cyril Roelandt","email":"cyril@redhat.com","username":"cyril.roelandt.enovance"},"change_message_id":"ae093f98d11ad807cd24593ad7382b8fc35f41ce","unresolved":false,"context_lines":[{"line_number":111,"context_line":""},{"line_number":112,"context_line":"    #TODO(yassine)"},{"line_number":113,"context_line":"    #Replace kwargs by something more simple."},{"line_number":114,"context_line":"    def __init__(self, backend, member_id, kwargs):"},{"line_number":115,"context_line":"        \"\"\"Initialize and load the backend."},{"line_number":116,"context_line":""},{"line_number":117,"context_line":"        :param backend: the current tooz provided backends are \u0027zookeeper\u0027"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAATn%2F9pCY%3D","line":114,"updated":"2013-12-09 12:17:37.000000000","message":"\"kwargs\" is weird, since we are used to reading \"**kwargs\", don\u0027t you think ?","commit_id":"db1708709fc5c9685eb443cd70f0ec798f0f487b"},{"author":{"_account_id":7450,"name":"Yassine Lamgarchal","email":"yassine.lamgarchal@redhat.com","username":"yassine.lamgarchal"},"change_message_id":"25c1314310e6eeae3ae955a2ca30a3854931e209","unresolved":false,"context_lines":[{"line_number":111,"context_line":""},{"line_number":112,"context_line":"    #TODO(yassine)"},{"line_number":113,"context_line":"    #Replace kwargs by something more simple."},{"line_number":114,"context_line":"    def __init__(self, backend, member_id, kwargs):"},{"line_number":115,"context_line":"        \"\"\"Initialize and load the backend."},{"line_number":116,"context_line":""},{"line_number":117,"context_line":"        :param backend: the current tooz provided backends are \u0027zookeeper\u0027"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAATn%2F9ovo%3D","line":114,"in_reply_to":"AAAATn%2F9pCY%3D","updated":"2013-12-09 14:12:50.000000000","message":"Yes, please read the comment above, i would like to change it.","commit_id":"db1708709fc5c9685eb443cd70f0ec798f0f487b"},{"author":{"_account_id":1669,"name":"Julien Danjou","display_name":"jd","email":"julien@danjou.info","username":"jdanjou"},"change_message_id":"0686413496bc9e89a27dcdb3bad8325b9ebbeec1","unresolved":false,"context_lines":[{"line_number":15,"context_line":"#    WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the"},{"line_number":16,"context_line":"#    License for the specific language governing permissions and limitations"},{"line_number":17,"context_line":"#    under the License."},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"import abc"},{"line_number":20,"context_line":"import six"},{"line_number":21,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATn%2F9oKU%3D","line":18,"updated":"2013-12-09 15:04:30.000000000","message":"I think you could rename this file to something better also. if it\u0027s about coordination subsystem, let\u0027s call it coordination.","commit_id":"73ef89698c4c771e7e628090a98424562440058e"},{"author":{"_account_id":1297,"name":"Joshua Harlow","email":"jxharlow@godaddy.com","username":"harlowja"},"change_message_id":"52a74ccfc0460fafaa57364cc06b63591d41902c","unresolved":false,"context_lines":[{"line_number":64,"context_line":"        pass"},{"line_number":65,"context_line":""},{"line_number":66,"context_line":"    @abc.abstractmethod"},{"line_number":67,"context_line":"    def join_group(self, group_id, capabilities):"},{"line_number":68,"context_line":"        \"\"\"Join a group and establish group membership."},{"line_number":69,"context_line":""},{"line_number":70,"context_line":"        :param group_id: the id of the group to join"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATn%2F9mVk%3D","line":67,"updated":"2013-12-09 19:59:12.000000000","message":"I\u0027m still a big fan of providing a callback which will be called here automatically if group membership is lost after joining.","commit_id":"73ef89698c4c771e7e628090a98424562440058e"},{"author":{"_account_id":1669,"name":"Julien Danjou","display_name":"jd","email":"julien@danjou.info","username":"jdanjou"},"change_message_id":"0686413496bc9e89a27dcdb3bad8325b9ebbeec1","unresolved":false,"context_lines":[{"line_number":117,"context_line":"        pass"},{"line_number":118,"context_line":""},{"line_number":119,"context_line":""},{"line_number":120,"context_line":"class Coordinator(CoordinationDriver):"},{"line_number":121,"context_line":""},{"line_number":122,"context_line":"    #TODO(yassine)"},{"line_number":123,"context_line":"    #Replace kwargs by something more simple."}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATn%2F9oI0%3D","line":120,"updated":"2013-12-09 15:04:30.000000000","message":"If the coordinator is just a wrapper around the driver, there\u0027s no need to have it.\n\nCoordinationDriver should be inherited only by actual driver.\n\nIn the end, all you need to do is to write a function like:\n\ndef get_coordinator(backend, member_id):\n    return driver.DriverManager(...).driver\n\nAnd delete this whole class.","commit_id":"73ef89698c4c771e7e628090a98424562440058e"},{"author":{"_account_id":1669,"name":"Julien Danjou","display_name":"jd","email":"julien@danjou.info","username":"jdanjou"},"change_message_id":"0686413496bc9e89a27dcdb3bad8325b9ebbeec1","unresolved":false,"context_lines":[{"line_number":169,"context_line":"    pass"},{"line_number":170,"context_line":""},{"line_number":171,"context_line":""},{"line_number":172,"context_line":"class GroupAlreadyExist(Exception):"},{"line_number":173,"context_line":"    pass"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATn%2F9oIY%3D","line":172,"updated":"2013-12-09 15:04:30.000000000","message":"I don\u0027t see where these 2 exceptions might be raised? If they\u0027re not useful now, don\u0027t add them.","commit_id":"73ef89698c4c771e7e628090a98424562440058e"}],"tooz/coordination.py":[{"author":{"_account_id":1669,"name":"Julien Danjou","display_name":"jd","email":"julien@danjou.info","username":"jdanjou"},"change_message_id":"948bf304832534f3521281ae4401178fdfb7dc3c","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# -*- coding: utf-8 -*-"},{"line_number":2,"context_line":""},{"line_number":3,"context_line":"# vim: tabstop\u003d4 shiftwidth\u003d4 softtabstop\u003d4"},{"line_number":4,"context_line":""},{"line_number":5,"context_line":"#    Copyright (C) 2013 eNovance Inc. All Rights Reserved."},{"line_number":6,"context_line":"#"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAATn%2F9EbU%3D","line":3,"updated":"2013-12-17 04:13:25.000000000","message":"We removed that from most OpenStack projects I don\u0027t think it\u0027s a good idea to have developement specific stuff here.","commit_id":"c13d3194100715afe057e71870ab050447813af7"},{"author":{"_account_id":7450,"name":"Yassine Lamgarchal","email":"yassine.lamgarchal@redhat.com","username":"yassine.lamgarchal"},"change_message_id":"3b26b8c6555955f5463fabcb2fc41436c3c6ba5f","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# -*- coding: utf-8 -*-"},{"line_number":2,"context_line":""},{"line_number":3,"context_line":"# vim: tabstop\u003d4 shiftwidth\u003d4 softtabstop\u003d4"},{"line_number":4,"context_line":""},{"line_number":5,"context_line":"#    Copyright (C) 2013 eNovance Inc. All Rights Reserved."},{"line_number":6,"context_line":"#"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAATn%2F9C8Q%3D","line":3,"in_reply_to":"AAAATn%2F9EbU%3D","updated":"2013-12-17 11:46:36.000000000","message":"Done","commit_id":"c13d3194100715afe057e71870ab050447813af7"},{"author":{"_account_id":1669,"name":"Julien Danjou","display_name":"jd","email":"julien@danjou.info","username":"jdanjou"},"change_message_id":"948bf304832534f3521281ae4401178fdfb7dc3c","unresolved":false,"context_lines":[{"line_number":34,"context_line":"        If needed, the establishment of a connection to the servers"},{"line_number":35,"context_line":"        is initiated."},{"line_number":36,"context_line":"        \"\"\""},{"line_number":37,"context_line":"        pass"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"    @abc.abstractmethod"},{"line_number":40,"context_line":"    def stop(self):"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAATn%2F9EbQ%3D","line":37,"updated":"2013-12-17 04:13:25.000000000","message":"You don\u0027t need all these \u0027pass\u0027 actually.","commit_id":"c13d3194100715afe057e71870ab050447813af7"},{"author":{"_account_id":7450,"name":"Yassine Lamgarchal","email":"yassine.lamgarchal@redhat.com","username":"yassine.lamgarchal"},"change_message_id":"3b26b8c6555955f5463fabcb2fc41436c3c6ba5f","unresolved":false,"context_lines":[{"line_number":34,"context_line":"        If needed, the establishment of a connection to the servers"},{"line_number":35,"context_line":"        is initiated."},{"line_number":36,"context_line":"        \"\"\""},{"line_number":37,"context_line":"        pass"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"    @abc.abstractmethod"},{"line_number":40,"context_line":"    def stop(self):"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAATn%2F9C40%3D","line":37,"in_reply_to":"AAAATn%2F9EbQ%3D","updated":"2013-12-17 11:46:36.000000000","message":"Done","commit_id":"c13d3194100715afe057e71870ab050447813af7"},{"author":{"_account_id":1669,"name":"Julien Danjou","display_name":"jd","email":"julien@danjou.info","username":"jdanjou"},"change_message_id":"948bf304832534f3521281ae4401178fdfb7dc3c","unresolved":false,"context_lines":[{"line_number":117,"context_line":"        pass"},{"line_number":118,"context_line":""},{"line_number":119,"context_line":""},{"line_number":120,"context_line":"class Coordinator(CoordinationDriver):"},{"line_number":121,"context_line":""},{"line_number":122,"context_line":"    #TODO(yassine)"},{"line_number":123,"context_line":"    #Replace kwargs by something more simple."}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAATn%2F9EbE%3D","line":120,"updated":"2013-12-17 04:13:25.000000000","message":"This class has no point at all and is wrong.\nI already wrote something about it, but if it\u0027s just going to be about loading the driver, just kill it and write a function\n\n  get_coordinator(backend, member_id, kwargs)\n\n\nthat does what __init__ currently does. The rest is just useless.\n\nAnd inheriting from CoordinationDriver if you\u0027re not a driver is *wrong*.","commit_id":"c13d3194100715afe057e71870ab050447813af7"},{"author":{"_account_id":7450,"name":"Yassine Lamgarchal","email":"yassine.lamgarchal@redhat.com","username":"yassine.lamgarchal"},"change_message_id":"3b26b8c6555955f5463fabcb2fc41436c3c6ba5f","unresolved":false,"context_lines":[{"line_number":117,"context_line":"        pass"},{"line_number":118,"context_line":""},{"line_number":119,"context_line":""},{"line_number":120,"context_line":"class Coordinator(CoordinationDriver):"},{"line_number":121,"context_line":""},{"line_number":122,"context_line":"    #TODO(yassine)"},{"line_number":123,"context_line":"    #Replace kwargs by something more simple."}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAATn%2F9C7I%3D","line":120,"in_reply_to":"AAAATn%2F9EbE%3D","updated":"2013-12-17 11:46:36.000000000","message":"Done","commit_id":"c13d3194100715afe057e71870ab050447813af7"},{"author":{"_account_id":9107,"name":"Victor Stinner","email":"vstinner@redhat.com","username":"haypo"},"change_message_id":"684378608d4ea62799c2a2e0a575423828833461","unresolved":false,"context_lines":[{"line_number":111,"context_line":""},{"line_number":112,"context_line":"    #TODO(yassine)"},{"line_number":113,"context_line":"    #Replace kwargs by something more simple."},{"line_number":114,"context_line":"def get_coordinator(backend, member_id, kwargs):"},{"line_number":115,"context_line":"    \"\"\"Initialize and load the backend."},{"line_number":116,"context_line":""},{"line_number":117,"context_line":"    :param backend: the current tooz provided backends are \u0027zookeeper\u0027"}],"source_content_type":"text/x-python","patch_set":22,"id":"AAAATn%2F89%2BQ%3D","line":114,"updated":"2013-12-18 10:05:10.000000000","message":"**kwargs may be more convinient, or better: explicitly list all available keys (ex: timeout\u003dNone, port\u003dNone).\n\nIf a key is mandatory, it should be a mandatory indexed parameter, ex: get_coordinator(backend, member_id, hosts).","commit_id":"02214932454a3dae78dcb7f6bbf48ec78376275d"},{"author":{"_account_id":7450,"name":"Yassine Lamgarchal","email":"yassine.lamgarchal@redhat.com","username":"yassine.lamgarchal"},"change_message_id":"87a2265a5b9877b7749ca74f3ed15ea9ad6b8854","unresolved":false,"context_lines":[{"line_number":111,"context_line":""},{"line_number":112,"context_line":"    #TODO(yassine)"},{"line_number":113,"context_line":"    #Replace kwargs by something more simple."},{"line_number":114,"context_line":"def get_coordinator(backend, member_id, kwargs):"},{"line_number":115,"context_line":"    \"\"\"Initialize and load the backend."},{"line_number":116,"context_line":""},{"line_number":117,"context_line":"    :param backend: the current tooz provided backends are \u0027zookeeper\u0027"}],"source_content_type":"text/x-python","patch_set":22,"id":"AAAATn%2F89mY%3D","line":114,"in_reply_to":"AAAATn%2F89%2BQ%3D","updated":"2013-12-18 13:58:19.000000000","message":"Done","commit_id":"02214932454a3dae78dcb7f6bbf48ec78376275d"},{"author":{"_account_id":9107,"name":"Victor Stinner","email":"vstinner@redhat.com","username":"haypo"},"change_message_id":"684378608d4ea62799c2a2e0a575423828833461","unresolved":false,"context_lines":[{"line_number":128,"context_line":"                                invoke_kwds\u003dkwargs).driver"},{"line_number":129,"context_line":""},{"line_number":130,"context_line":""},{"line_number":131,"context_line":"class ToozNamespaceNotCreated(Exception):"},{"line_number":132,"context_line":"    pass"},{"line_number":133,"context_line":""},{"line_number":134,"context_line":""}],"source_content_type":"text/x-python","patch_set":22,"id":"AAAATn%2F895U%3D","line":131,"updated":"2013-12-18 10:05:10.000000000","message":"Could you add at least one line to describe each exception?","commit_id":"02214932454a3dae78dcb7f6bbf48ec78376275d"},{"author":{"_account_id":7450,"name":"Yassine Lamgarchal","email":"yassine.lamgarchal@redhat.com","username":"yassine.lamgarchal"},"change_message_id":"87a2265a5b9877b7749ca74f3ed15ea9ad6b8854","unresolved":false,"context_lines":[{"line_number":128,"context_line":"                                invoke_kwds\u003dkwargs).driver"},{"line_number":129,"context_line":""},{"line_number":130,"context_line":""},{"line_number":131,"context_line":"class ToozNamespaceNotCreated(Exception):"},{"line_number":132,"context_line":"    pass"},{"line_number":133,"context_line":""},{"line_number":134,"context_line":""}],"source_content_type":"text/x-python","patch_set":22,"id":"AAAATn%2F89rw%3D","line":131,"in_reply_to":"AAAATn%2F895U%3D","updated":"2013-12-18 13:58:19.000000000","message":"Done","commit_id":"02214932454a3dae78dcb7f6bbf48ec78376275d"},{"author":{"_account_id":9107,"name":"Victor Stinner","email":"vstinner@redhat.com","username":"haypo"},"change_message_id":"684378608d4ea62799c2a2e0a575423828833461","unresolved":false,"context_lines":[{"line_number":144,"context_line":"    pass"},{"line_number":145,"context_line":""},{"line_number":146,"context_line":""},{"line_number":147,"context_line":"class GroupAlreadyExist(Exception):"},{"line_number":148,"context_line":"    pass"},{"line_number":149,"context_line":""},{"line_number":150,"context_line":""}],"source_content_type":"text/x-python","patch_set":22,"id":"AAAATn%2F894k%3D","line":147,"updated":"2013-12-18 10:05:10.000000000","message":"Do you really need so much specific exceptions? Do you expect the caller to behave differently on error depending on the exact exception type? In my experience, exceptions are just passed to the caller of the caller, or logged and that\u0027s all.\n\nI mean: why using a specific exception instead of ValueError?","commit_id":"02214932454a3dae78dcb7f6bbf48ec78376275d"},{"author":{"_account_id":7450,"name":"Yassine Lamgarchal","email":"yassine.lamgarchal@redhat.com","username":"yassine.lamgarchal"},"change_message_id":"87a2265a5b9877b7749ca74f3ed15ea9ad6b8854","unresolved":false,"context_lines":[{"line_number":144,"context_line":"    pass"},{"line_number":145,"context_line":""},{"line_number":146,"context_line":""},{"line_number":147,"context_line":"class GroupAlreadyExist(Exception):"},{"line_number":148,"context_line":"    pass"},{"line_number":149,"context_line":""},{"line_number":150,"context_line":""}],"source_content_type":"text/x-python","patch_set":22,"id":"AAAATn%2F89E8%3D","line":147,"in_reply_to":"AAAATn%2F894k%3D","updated":"2013-12-18 13:58:19.000000000","message":"Yes, these exceptions are part of the Tooz API, it is very helpful for understanding a problem. This way you can know exactly what went wrong and act appropriately (for instance, the caller can choose different log level).\n\nIn addition, ValueError/KeyError are exceptions raised by Python standard library it will make the operator work hard to distinguish between the Tooz exceptions and the Python standard library exceptions...","commit_id":"02214932454a3dae78dcb7f6bbf48ec78376275d"},{"author":{"_account_id":9107,"name":"Victor Stinner","email":"vstinner@redhat.com","username":"haypo"},"change_message_id":"5e2f86fd364f033563fd0a01a320e07cf86dd309","unresolved":false,"context_lines":[{"line_number":128,"context_line":"                                invoke_kwds\u003dkwargs).driver"},{"line_number":129,"context_line":""},{"line_number":130,"context_line":""},{"line_number":131,"context_line":"class ToozInternalError(Exception):"},{"line_number":132,"context_line":"    \"\"\"Exception raised when an internal error occurs, for instance in"},{"line_number":133,"context_line":"    case of server internal error."},{"line_number":134,"context_line":"    \"\"\""}],"source_content_type":"text/x-python","patch_set":23,"id":"AAAATn%2F88OU%3D","line":131,"updated":"2013-12-18 15:11:58.000000000","message":"You should rename it to ToozError. \"Internal\" term is useless.","commit_id":"79116c7db01d27cd517925dbc88e6b0a95b37ff3"},{"author":{"_account_id":7450,"name":"Yassine Lamgarchal","email":"yassine.lamgarchal@redhat.com","username":"yassine.lamgarchal"},"change_message_id":"f6844ce642176223da78b66808ae22a658aa7996","unresolved":false,"context_lines":[{"line_number":128,"context_line":"                                invoke_kwds\u003dkwargs).driver"},{"line_number":129,"context_line":""},{"line_number":130,"context_line":""},{"line_number":131,"context_line":"class ToozInternalError(Exception):"},{"line_number":132,"context_line":"    \"\"\"Exception raised when an internal error occurs, for instance in"},{"line_number":133,"context_line":"    case of server internal error."},{"line_number":134,"context_line":"    \"\"\""}],"source_content_type":"text/x-python","patch_set":23,"id":"AAAATn%2F88MU%3D","line":131,"in_reply_to":"AAAATn%2F88OU%3D","updated":"2013-12-19 11:29:31.000000000","message":"Done","commit_id":"79116c7db01d27cd517925dbc88e6b0a95b37ff3"},{"author":{"_account_id":9107,"name":"Victor Stinner","email":"vstinner@redhat.com","username":"haypo"},"change_message_id":"5e2f86fd364f033563fd0a01a320e07cf86dd309","unresolved":false,"context_lines":[{"line_number":134,"context_line":"    \"\"\""},{"line_number":135,"context_line":""},{"line_number":136,"context_line":""},{"line_number":137,"context_line":"class ToozConnectionError(Exception):"},{"line_number":138,"context_line":"    \"\"\"Exception raised when the client cannot manage to connect to the"},{"line_number":139,"context_line":"    server."},{"line_number":140,"context_line":"    \"\"\""}],"source_content_type":"text/x-python","patch_set":23,"id":"AAAATn%2F88OI%3D","line":137,"updated":"2013-12-18 15:11:58.000000000","message":"All these exceptions should maybe inherit from ToozError.","commit_id":"79116c7db01d27cd517925dbc88e6b0a95b37ff3"},{"author":{"_account_id":7450,"name":"Yassine Lamgarchal","email":"yassine.lamgarchal@redhat.com","username":"yassine.lamgarchal"},"change_message_id":"f6844ce642176223da78b66808ae22a658aa7996","unresolved":false,"context_lines":[{"line_number":134,"context_line":"    \"\"\""},{"line_number":135,"context_line":""},{"line_number":136,"context_line":""},{"line_number":137,"context_line":"class ToozConnectionError(Exception):"},{"line_number":138,"context_line":"    \"\"\"Exception raised when the client cannot manage to connect to the"},{"line_number":139,"context_line":"    server."},{"line_number":140,"context_line":"    \"\"\""}],"source_content_type":"text/x-python","patch_set":23,"id":"AAAATn%2F88MQ%3D","line":137,"in_reply_to":"AAAATn%2F88OI%3D","updated":"2013-12-19 11:29:31.000000000","message":"Done","commit_id":"79116c7db01d27cd517925dbc88e6b0a95b37ff3"}],"tooz/drivers/__init__.py":[{"author":{"_account_id":1669,"name":"Julien Danjou","display_name":"jd","email":"julien@danjou.info","username":"jdanjou"},"change_message_id":"b3d1449d0b4dca3bea6f1e118e191b6032349150","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# -*- coding: utf-8 -*-"},{"line_number":2,"context_line":""},{"line_number":3,"context_line":"# vim: tabstop\u003d4 shiftwidth\u003d4 softtabstop\u003d4"},{"line_number":4,"context_line":""},{"line_number":5,"context_line":"#    Copyright (C) 2013 eNovance Inc. All Rights Reserved."}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAATn%2F9vz0%3D","line":2,"updated":"2013-12-06 13:09:43.000000000","message":"No license in empty files.","commit_id":"62e0248f00d4b07314d824a9711d8e045ea22e98"},{"author":{"_account_id":7450,"name":"Yassine Lamgarchal","email":"yassine.lamgarchal@redhat.com","username":"yassine.lamgarchal"},"change_message_id":"066018af36bb96cc1a407411186e80a3f9c5dc3e","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# -*- coding: utf-8 -*-"},{"line_number":2,"context_line":""},{"line_number":3,"context_line":"# vim: tabstop\u003d4 shiftwidth\u003d4 softtabstop\u003d4"},{"line_number":4,"context_line":""},{"line_number":5,"context_line":"#    Copyright (C) 2013 eNovance Inc. All Rights Reserved."}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAATn%2F9vcs%3D","line":2,"in_reply_to":"AAAATn%2F9vz0%3D","updated":"2013-12-09 11:19:06.000000000","message":"Done","commit_id":"62e0248f00d4b07314d824a9711d8e045ea22e98"},{"author":{"_account_id":9107,"name":"Victor Stinner","email":"vstinner@redhat.com","username":"haypo"},"change_message_id":"0e444af86d0daa2d46c4941e2ec8a5ef08935a3e","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# -*- coding: utf-8 -*-"},{"line_number":2,"context_line":""},{"line_number":3,"context_line":"# vim: tabstop\u003d4 shiftwidth\u003d4 softtabstop\u003d4"},{"line_number":4,"context_line":""},{"line_number":5,"context_line":"#    Copyright (C) 2013 eNovance Inc. All Rights Reserved."},{"line_number":6,"context_line":"#"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAATn%2F9vx0%3D","line":3,"updated":"2013-12-06 13:44:55.000000000","message":"coding and vim headers may be avoided in empty files","commit_id":"62e0248f00d4b07314d824a9711d8e045ea22e98"},{"author":{"_account_id":7450,"name":"Yassine Lamgarchal","email":"yassine.lamgarchal@redhat.com","username":"yassine.lamgarchal"},"change_message_id":"066018af36bb96cc1a407411186e80a3f9c5dc3e","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# -*- coding: utf-8 -*-"},{"line_number":2,"context_line":""},{"line_number":3,"context_line":"# vim: tabstop\u003d4 shiftwidth\u003d4 softtabstop\u003d4"},{"line_number":4,"context_line":""},{"line_number":5,"context_line":"#    Copyright (C) 2013 eNovance Inc. All Rights Reserved."},{"line_number":6,"context_line":"#"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAATn%2F9vcw%3D","line":3,"in_reply_to":"AAAATn%2F9vx0%3D","updated":"2013-12-09 11:19:06.000000000","message":"Done","commit_id":"62e0248f00d4b07314d824a9711d8e045ea22e98"}],"tooz/drivers/zookeeper.py":[{"author":{"_account_id":9107,"name":"Victor Stinner","email":"vstinner@redhat.com","username":"haypo"},"change_message_id":"0e444af86d0daa2d46c4941e2ec8a5ef08935a3e","unresolved":false,"context_lines":[{"line_number":16,"context_line":""},{"line_number":17,"context_line":"from kazoo import client"},{"line_number":18,"context_line":"from kazoo import exceptions"},{"line_number":19,"context_line":"from tooz import api"},{"line_number":20,"context_line":"from tooz import exception"},{"line_number":21,"context_line":"from tooz.models import Member"},{"line_number":22,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAATn%2F9vxk%3D","line":19,"updated":"2013-12-06 13:44:55.000000000","message":"you should add an empty line between external (kazoo) imports and internal (tooz) imports:\nhttp://docs.openstack.org/developer/hacking/#imports\n\nIf I understood OpenStack guide lines, you should only import symbols, Member is a class","commit_id":"62e0248f00d4b07314d824a9711d8e045ea22e98"},{"author":{"_account_id":7450,"name":"Yassine Lamgarchal","email":"yassine.lamgarchal@redhat.com","username":"yassine.lamgarchal"},"change_message_id":"066018af36bb96cc1a407411186e80a3f9c5dc3e","unresolved":false,"context_lines":[{"line_number":16,"context_line":""},{"line_number":17,"context_line":"from kazoo import client"},{"line_number":18,"context_line":"from kazoo import exceptions"},{"line_number":19,"context_line":"from tooz import api"},{"line_number":20,"context_line":"from tooz import exception"},{"line_number":21,"context_line":"from tooz.models import Member"},{"line_number":22,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAATn%2F9sLo%3D","line":19,"in_reply_to":"AAAATn%2F9vxk%3D","updated":"2013-12-09 11:19:06.000000000","message":"Done","commit_id":"62e0248f00d4b07314d824a9711d8e045ea22e98"},{"author":{"_account_id":688,"name":"Sandy Walsh","email":"sandy.walsh@rackspace.com","username":"sandy-walsh"},"change_message_id":"53c29b3c2650fe21039d3786ce75ef011de780db","unresolved":false,"context_lines":[{"line_number":18,"context_line":"from kazoo import exceptions"},{"line_number":19,"context_line":"from tooz import api"},{"line_number":20,"context_line":"from tooz import exception"},{"line_number":21,"context_line":"from tooz.models import Member"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"_TOOZ_NAMESPACE \u003d \"tooz\""},{"line_number":24,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAATn%2F9t1c%3D","line":21,"updated":"2013-12-06 19:51:26.000000000","message":"import modules not classes","commit_id":"62e0248f00d4b07314d824a9711d8e045ea22e98"},{"author":{"_account_id":7450,"name":"Yassine Lamgarchal","email":"yassine.lamgarchal@redhat.com","username":"yassine.lamgarchal"},"change_message_id":"066018af36bb96cc1a407411186e80a3f9c5dc3e","unresolved":false,"context_lines":[{"line_number":18,"context_line":"from kazoo import exceptions"},{"line_number":19,"context_line":"from tooz import api"},{"line_number":20,"context_line":"from tooz import exception"},{"line_number":21,"context_line":"from tooz.models import Member"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"_TOOZ_NAMESPACE \u003d \"tooz\""},{"line_number":24,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAATn%2F9sL4%3D","line":21,"in_reply_to":"AAAATn%2F9t1c%3D","updated":"2013-12-09 11:19:06.000000000","message":"Done","commit_id":"62e0248f00d4b07314d824a9711d8e045ea22e98"},{"author":{"_account_id":9107,"name":"Victor Stinner","email":"vstinner@redhat.com","username":"haypo"},"change_message_id":"0e444af86d0daa2d46c4941e2ec8a5ef08935a3e","unresolved":false,"context_lines":[{"line_number":23,"context_line":"_TOOZ_NAMESPACE \u003d \"tooz\""},{"line_number":24,"context_line":""},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"class ZooKeeperDriver(api.CoordinationDriver):"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"    def __init__(self, **kwargs):"},{"line_number":29,"context_line":"        if not all(kwargs[\"hosts\"] and kwargs[\"member_id\"]):"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAATn%2F9vwE%3D","line":26,"updated":"2013-12-06 13:44:55.000000000","message":"I don\u0027t know ZooKeeper, kazoo calls are blocking and may take a long time? If yes, do you know if there is an asynchronous API? It may be interesting to prepare the API for long blocking calls.","commit_id":"62e0248f00d4b07314d824a9711d8e045ea22e98"},{"author":{"_account_id":7450,"name":"Yassine Lamgarchal","email":"yassine.lamgarchal@redhat.com","username":"yassine.lamgarchal"},"change_message_id":"066018af36bb96cc1a407411186e80a3f9c5dc3e","unresolved":false,"context_lines":[{"line_number":23,"context_line":"_TOOZ_NAMESPACE \u003d \"tooz\""},{"line_number":24,"context_line":""},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"class ZooKeeperDriver(api.CoordinationDriver):"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"    def __init__(self, **kwargs):"},{"line_number":29,"context_line":"        if not all(kwargs[\"hosts\"] and kwargs[\"member_id\"]):"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAATn%2F9pYI%3D","line":26,"in_reply_to":"AAAATn%2F9st8%3D","updated":"2013-12-09 11:19:06.000000000","message":"Thanks!\n\nI think we need to design an async api in order to be consistent with all backends and not just Kazoo.","commit_id":"62e0248f00d4b07314d824a9711d8e045ea22e98"},{"author":{"_account_id":1297,"name":"Joshua Harlow","email":"jxharlow@godaddy.com","username":"harlowja"},"change_message_id":"c73ec92abb8b9c105560a0e6916876d6880cdcb7","unresolved":false,"context_lines":[{"line_number":23,"context_line":"_TOOZ_NAMESPACE \u003d \"tooz\""},{"line_number":24,"context_line":""},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"class ZooKeeperDriver(api.CoordinationDriver):"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"    def __init__(self, **kwargs):"},{"line_number":29,"context_line":"        if not all(kwargs[\"hosts\"] and kwargs[\"member_id\"]):"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAATn%2F9st8%3D","line":26,"in_reply_to":"AAAATn%2F9vwE%3D","updated":"2013-12-07 01:52:03.000000000","message":"From what I understand there is a way to use it in a async style.\n\nBut its not in the style of http://docs.python.org/dev/library/concurrent.futures.html#future-objects (which is where the python community seems to be headed). But it seems like this driver could return futures that wrap how kazoo supports asynchronous activities if this is desired.\n\nSee: https://github.com/python-zk/kazoo/blob/master/kazoo/client.py#L933 (get_async as an example).\n\nSee the below handler client option (and associated comment) that can be passed into the client can alleviate this; use a gevent, eventlet, other non-blocking handler.","commit_id":"62e0248f00d4b07314d824a9711d8e045ea22e98"},{"author":{"_account_id":9107,"name":"Victor Stinner","email":"vstinner@redhat.com","username":"haypo"},"change_message_id":"0e444af86d0daa2d46c4941e2ec8a5ef08935a3e","unresolved":false,"context_lines":[{"line_number":27,"context_line":""},{"line_number":28,"context_line":"    def __init__(self, **kwargs):"},{"line_number":29,"context_line":"        if not all(kwargs[\"hosts\"] and kwargs[\"member_id\"]):"},{"line_number":30,"context_line":"            raise KeyError(\"hosts\u003d%s, member_id\u003d%s\" % (kwargs[\"hosts\"],"},{"line_number":31,"context_line":"                           kwargs[\"member_id\"]))"},{"line_number":32,"context_line":"        self._member_id \u003d kwargs[\"member_id\"]"},{"line_number":33,"context_line":"        self._client \u003d client.KazooClient(hosts\u003dkwargs[\"hosts\"])"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAATn%2F9vuY%3D","line":30,"updated":"2013-12-06 13:44:55.000000000","message":"on error, I prefer to format values using %r. It\u0027s more readable and provides also the type.","commit_id":"62e0248f00d4b07314d824a9711d8e045ea22e98"},{"author":{"_account_id":7450,"name":"Yassine Lamgarchal","email":"yassine.lamgarchal@redhat.com","username":"yassine.lamgarchal"},"change_message_id":"066018af36bb96cc1a407411186e80a3f9c5dc3e","unresolved":false,"context_lines":[{"line_number":27,"context_line":""},{"line_number":28,"context_line":"    def __init__(self, **kwargs):"},{"line_number":29,"context_line":"        if not all(kwargs[\"hosts\"] and kwargs[\"member_id\"]):"},{"line_number":30,"context_line":"            raise KeyError(\"hosts\u003d%s, member_id\u003d%s\" % (kwargs[\"hosts\"],"},{"line_number":31,"context_line":"                           kwargs[\"member_id\"]))"},{"line_number":32,"context_line":"        self._member_id \u003d kwargs[\"member_id\"]"},{"line_number":33,"context_line":"        self._client \u003d client.KazooClient(hosts\u003dkwargs[\"hosts\"])"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAATn%2F9pRY%3D","line":30,"in_reply_to":"AAAATn%2F9vuY%3D","updated":"2013-12-09 11:19:06.000000000","message":"Done","commit_id":"62e0248f00d4b07314d824a9711d8e045ea22e98"},{"author":{"_account_id":1297,"name":"Joshua Harlow","email":"jxharlow@godaddy.com","username":"harlowja"},"change_message_id":"c73ec92abb8b9c105560a0e6916876d6880cdcb7","unresolved":false,"context_lines":[{"line_number":30,"context_line":"            raise KeyError(\"hosts\u003d%s, member_id\u003d%s\" % (kwargs[\"hosts\"],"},{"line_number":31,"context_line":"                           kwargs[\"member_id\"]))"},{"line_number":32,"context_line":"        self._member_id \u003d kwargs[\"member_id\"]"},{"line_number":33,"context_line":"        self._client \u003d client.KazooClient(hosts\u003dkwargs[\"hosts\"])"},{"line_number":34,"context_line":"        super(ZooKeeperDriver, self).__init__()"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"    def start(self):"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAATn%2F9suk%3D","line":33,"updated":"2013-12-07 01:52:03.000000000","message":"U probably also want to allow a \u0027handler\u0027 to be provided here. The following package (not in kazoo at the moment) allows for better usage of eventlet in kazoo (via passing in a different handler). Its also useful in non-eventlet cases (where someone may want to use the gevent handler, or a new XYZ handler). That handler is pretty extensively used inside kazoo for event handling so allowing it to be passed in will mean this driver can be used in more environment types.\n\nSee: https://pypi.python.org/pypi/kazoo-eventlet-handler\n\nSee: https://github.com/python-zk/kazoo/blob/master/kazoo/client.py#L115","commit_id":"62e0248f00d4b07314d824a9711d8e045ea22e98"},{"author":{"_account_id":9107,"name":"Victor Stinner","email":"vstinner@redhat.com","username":"haypo"},"change_message_id":"0e444af86d0daa2d46c4941e2ec8a5ef08935a3e","unresolved":false,"context_lines":[{"line_number":30,"context_line":"            raise KeyError(\"hosts\u003d%s, member_id\u003d%s\" % (kwargs[\"hosts\"],"},{"line_number":31,"context_line":"                           kwargs[\"member_id\"]))"},{"line_number":32,"context_line":"        self._member_id \u003d kwargs[\"member_id\"]"},{"line_number":33,"context_line":"        self._client \u003d client.KazooClient(hosts\u003dkwargs[\"hosts\"])"},{"line_number":34,"context_line":"        super(ZooKeeperDriver, self).__init__()"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"    def start(self):"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAATn%2F9vxE%3D","line":33,"updated":"2013-12-06 13:44:55.000000000","message":"member_id and client can be public attributes, \"we\u0027re all consenting adults here\" ;-)","commit_id":"62e0248f00d4b07314d824a9711d8e045ea22e98"},{"author":{"_account_id":7450,"name":"Yassine Lamgarchal","email":"yassine.lamgarchal@redhat.com","username":"yassine.lamgarchal"},"change_message_id":"066018af36bb96cc1a407411186e80a3f9c5dc3e","unresolved":false,"context_lines":[{"line_number":30,"context_line":"            raise KeyError(\"hosts\u003d%s, member_id\u003d%s\" % (kwargs[\"hosts\"],"},{"line_number":31,"context_line":"                           kwargs[\"member_id\"]))"},{"line_number":32,"context_line":"        self._member_id \u003d kwargs[\"member_id\"]"},{"line_number":33,"context_line":"        self._client \u003d client.KazooClient(hosts\u003dkwargs[\"hosts\"])"},{"line_number":34,"context_line":"        super(ZooKeeperDriver, self).__init__()"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"    def start(self):"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAATn%2F9pZY%3D","line":33,"in_reply_to":"AAAATn%2F9suk%3D","updated":"2013-12-09 11:19:06.000000000","message":"Thanks Joshua!! A lot of things i have to check here :-) !","commit_id":"62e0248f00d4b07314d824a9711d8e045ea22e98"},{"author":{"_account_id":1669,"name":"Julien Danjou","display_name":"jd","email":"julien@danjou.info","username":"jdanjou"},"change_message_id":"b3d1449d0b4dca3bea6f1e118e191b6032349150","unresolved":false,"context_lines":[{"line_number":35,"context_line":""},{"line_number":36,"context_line":"    def start(self):"},{"line_number":37,"context_line":"        self._client.start()"},{"line_number":38,"context_line":"        self._client.ensure_path(\"/%s\" % _TOOZ_NAMESPACE)"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"    def stop(self):"},{"line_number":41,"context_line":"        self._client.stop()"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAATn%2F9vzk%3D","line":38,"updated":"2013-12-06 13:09:43.000000000","message":"I\u0027m worried that two different applications using tooz might collapse there.\n\nMaybe setting the default namespace  should be done via __init__ ?","commit_id":"62e0248f00d4b07314d824a9711d8e045ea22e98"},{"author":{"_account_id":7450,"name":"Yassine Lamgarchal","email":"yassine.lamgarchal@redhat.com","username":"yassine.lamgarchal"},"change_message_id":"066018af36bb96cc1a407411186e80a3f9c5dc3e","unresolved":false,"context_lines":[{"line_number":35,"context_line":""},{"line_number":36,"context_line":"    def start(self):"},{"line_number":37,"context_line":"        self._client.start()"},{"line_number":38,"context_line":"        self._client.ensure_path(\"/%s\" % _TOOZ_NAMESPACE)"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"    def stop(self):"},{"line_number":41,"context_line":"        self._client.stop()"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAATn%2F9pVo%3D","line":38,"in_reply_to":"AAAATn%2F9vzk%3D","updated":"2013-12-09 11:19:06.000000000","message":"Actually, ensure_path() must be called when the connection to the servers is established just after the call to start(). I do not want to move these calls in __init__() in order to differentiate the creation of the object from the connection initialization. \n\nEven if the znode \u0027 \"/%s\" % _TOOZ_NAMESPACE\u0027  is already created ZooKeeper/Kazoo will handle it, it\u0027s just a security to be sure that this znode will always be there.\n\nhttp://kazoo.readthedocs.org/en/latest/_modules/kazoo/client.html#KazooClient.ensure_path","commit_id":"62e0248f00d4b07314d824a9711d8e045ea22e98"},{"author":{"_account_id":1297,"name":"Joshua Harlow","email":"jxharlow@godaddy.com","username":"harlowja"},"change_message_id":"423eae9b793df05432afa66216c2bd5a9e66b0b8","unresolved":false,"context_lines":[{"line_number":46,"context_line":"        except exceptions.NodeExistsError:"},{"line_number":47,"context_line":"            raise exception.GroupAlreadyExist(\"group_id\u003d%s\" % group_id)"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"    def join_group(self, group_id, capabilities\u003d\"\"):"},{"line_number":50,"context_line":"        self._client.create(self._path_member(group_id, self._member_id),"},{"line_number":51,"context_line":"                            value\u003dcapabilities, ephemeral\u003dTrue)"},{"line_number":52,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAATn%2F9sx0%3D","line":49,"updated":"2013-12-07 00:52:31.000000000","message":"This one is interesting, it would be nice to allow this function to take a callback which will be called if somehow the client loses the group membership (the client disconnects, network failure...). Using zookeeper u can\u0027t assume that a client once it joins a group will be forever in that group, since after joining a group it is entirely possible that the network connection (or similar event) could drop, and then this group membership would automatically be lost. It\u0027d be nice to allow on joining a way to get signaled if and when this happens.","commit_id":"62e0248f00d4b07314d824a9711d8e045ea22e98"},{"author":{"_account_id":7450,"name":"Yassine Lamgarchal","email":"yassine.lamgarchal@redhat.com","username":"yassine.lamgarchal"},"change_message_id":"066018af36bb96cc1a407411186e80a3f9c5dc3e","unresolved":false,"context_lines":[{"line_number":46,"context_line":"        except exceptions.NodeExistsError:"},{"line_number":47,"context_line":"            raise exception.GroupAlreadyExist(\"group_id\u003d%s\" % group_id)"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"    def join_group(self, group_id, capabilities\u003d\"\"):"},{"line_number":50,"context_line":"        self._client.create(self._path_member(group_id, self._member_id),"},{"line_number":51,"context_line":"                            value\u003dcapabilities, ephemeral\u003dTrue)"},{"line_number":52,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAATn%2F9pU4%3D","line":49,"in_reply_to":"AAAATn%2F9sx0%3D","updated":"2013-12-09 11:19:06.000000000","message":"You are perfectly right Joshua, and i want to add that this notification mechanism is mandatory if we want to make the Ceilometer central agent highly available.\n\nI\u0027ve deliberately postponed this feature since this feature will be hard to develop in other backends like memcached, this is a key part we have to design too.","commit_id":"62e0248f00d4b07314d824a9711d8e045ea22e98"},{"author":{"_account_id":9107,"name":"Victor Stinner","email":"vstinner@redhat.com","username":"haypo"},"change_message_id":"0e444af86d0daa2d46c4941e2ec8a5ef08935a3e","unresolved":false,"context_lines":[{"line_number":53,"context_line":"    def leave_group(self, group_id):"},{"line_number":54,"context_line":"        self._client.delete(self._path_member(group_id, self._member_id))"},{"line_number":55,"context_line":""},{"line_number":56,"context_line":"    def get_members(self, group_id):"},{"line_number":57,"context_line":"        members \u003d []"},{"line_number":58,"context_line":"        member_ids \u003d self._client.get_children(\"/%s/%s\" % (_TOOZ_NAMESPACE,"},{"line_number":59,"context_line":"                                                           group_id))"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAATn%2F9vuw%3D","line":56,"updated":"2013-12-06 13:44:55.000000000","message":"It may be interesting to modify this method to return a generator (yield), or maybe add a iter_members(). I don\u0027t know if there is an use case for an iterator.","commit_id":"62e0248f00d4b07314d824a9711d8e045ea22e98"},{"author":{"_account_id":688,"name":"Sandy Walsh","email":"sandy.walsh@rackspace.com","username":"sandy-walsh"},"change_message_id":"53c29b3c2650fe21039d3786ce75ef011de780db","unresolved":false,"context_lines":[{"line_number":58,"context_line":"        member_ids \u003d self._client.get_children(\"/%s/%s\" % (_TOOZ_NAMESPACE,"},{"line_number":59,"context_line":"                                                           group_id))"},{"line_number":60,"context_line":"        for member_id in member_ids:"},{"line_number":61,"context_line":"            capabilities \u003d self._client.get(self._path_member(group_id,"},{"line_number":62,"context_line":"                                                              member_id))"},{"line_number":63,"context_line":"            members.append(Member(group_id, member_id, capabilities[0]))"},{"line_number":64,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAATn%2F9t0o%3D","line":61,"updated":"2013-12-06 19:51:26.000000000","message":"do we want Zookeeper exceptions getting through to the caller? Should we wrap these in Tooz-consistent exceptions?","commit_id":"62e0248f00d4b07314d824a9711d8e045ea22e98"},{"author":{"_account_id":7450,"name":"Yassine Lamgarchal","email":"yassine.lamgarchal@redhat.com","username":"yassine.lamgarchal"},"change_message_id":"066018af36bb96cc1a407411186e80a3f9c5dc3e","unresolved":false,"context_lines":[{"line_number":58,"context_line":"        member_ids \u003d self._client.get_children(\"/%s/%s\" % (_TOOZ_NAMESPACE,"},{"line_number":59,"context_line":"                                                           group_id))"},{"line_number":60,"context_line":"        for member_id in member_ids:"},{"line_number":61,"context_line":"            capabilities \u003d self._client.get(self._path_member(group_id,"},{"line_number":62,"context_line":"                                                              member_id))"},{"line_number":63,"context_line":"            members.append(Member(group_id, member_id, capabilities[0]))"},{"line_number":64,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAATn%2F9pUs%3D","line":61,"in_reply_to":"AAAATn%2F9t0o%3D","updated":"2013-12-09 11:19:06.000000000","message":"I think we have to wrap all Zookeeper exception in Tooz-consistent exceptions indeed.","commit_id":"62e0248f00d4b07314d824a9711d8e045ea22e98"},{"author":{"_account_id":1297,"name":"Joshua Harlow","email":"jxharlow@godaddy.com","username":"harlowja"},"change_message_id":"423eae9b793df05432afa66216c2bd5a9e66b0b8","unresolved":false,"context_lines":[{"line_number":69,"context_line":"        return Member(group_id, member_id, capabilities)"},{"line_number":70,"context_line":""},{"line_number":71,"context_line":"    def update_capabilities(self, group_id, capabilities):"},{"line_number":72,"context_line":"        self._client.set(self._path_member(group_id, self._member_id),"},{"line_number":73,"context_line":"                         capabilities)"},{"line_number":74,"context_line":""},{"line_number":75,"context_line":"    def get_member_capabilities(self, group_id, member_id):"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAATn%2F9sxk%3D","line":72,"updated":"2013-12-07 00:52:31.000000000","message":"Same question as sandys above, any client calls likely can throw KazooExceptions, which probably should be wrapped into some sort of tooz specific errors.","commit_id":"62e0248f00d4b07314d824a9711d8e045ea22e98"},{"author":{"_account_id":7450,"name":"Yassine Lamgarchal","email":"yassine.lamgarchal@redhat.com","username":"yassine.lamgarchal"},"change_message_id":"066018af36bb96cc1a407411186e80a3f9c5dc3e","unresolved":false,"context_lines":[{"line_number":69,"context_line":"        return Member(group_id, member_id, capabilities)"},{"line_number":70,"context_line":""},{"line_number":71,"context_line":"    def update_capabilities(self, group_id, capabilities):"},{"line_number":72,"context_line":"        self._client.set(self._path_member(group_id, self._member_id),"},{"line_number":73,"context_line":"                         capabilities)"},{"line_number":74,"context_line":""},{"line_number":75,"context_line":"    def get_member_capabilities(self, group_id, member_id):"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAATn%2F9pUM%3D","line":72,"in_reply_to":"AAAATn%2F9sxk%3D","updated":"2013-12-09 11:19:06.000000000","message":"Indeed.","commit_id":"62e0248f00d4b07314d824a9711d8e045ea22e98"},{"author":{"_account_id":9107,"name":"Victor Stinner","email":"vstinner@redhat.com","username":"haypo"},"change_message_id":"0e444af86d0daa2d46c4941e2ec8a5ef08935a3e","unresolved":false,"context_lines":[{"line_number":76,"context_line":"        return self._client.get(self._path_member(group_id, member_id))[0]"},{"line_number":77,"context_line":""},{"line_number":78,"context_line":"    def get_all_groups_ids(self):"},{"line_number":79,"context_line":"        groups \u003d self._client.get_children(\"/%s\" % _TOOZ_NAMESPACE)"},{"line_number":80,"context_line":"        return groups"},{"line_number":81,"context_line":""},{"line_number":82,"context_line":"    def _path_member(self, group_id, member_id):"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAATn%2F9vus%3D","line":79,"updated":"2013-12-06 13:44:55.000000000","message":"just write return :-)","commit_id":"62e0248f00d4b07314d824a9711d8e045ea22e98"},{"author":{"_account_id":7450,"name":"Yassine Lamgarchal","email":"yassine.lamgarchal@redhat.com","username":"yassine.lamgarchal"},"change_message_id":"066018af36bb96cc1a407411186e80a3f9c5dc3e","unresolved":false,"context_lines":[{"line_number":76,"context_line":"        return self._client.get(self._path_member(group_id, member_id))[0]"},{"line_number":77,"context_line":""},{"line_number":78,"context_line":"    def get_all_groups_ids(self):"},{"line_number":79,"context_line":"        groups \u003d self._client.get_children(\"/%s\" % _TOOZ_NAMESPACE)"},{"line_number":80,"context_line":"        return groups"},{"line_number":81,"context_line":""},{"line_number":82,"context_line":"    def _path_member(self, group_id, member_id):"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAATn%2F9vMw%3D","line":79,"in_reply_to":"AAAATn%2F9vus%3D","updated":"2013-12-09 11:19:06.000000000","message":"Done","commit_id":"62e0248f00d4b07314d824a9711d8e045ea22e98"},{"author":{"_account_id":1297,"name":"Joshua Harlow","email":"jxharlow@godaddy.com","username":"harlowja"},"change_message_id":"423eae9b793df05432afa66216c2bd5a9e66b0b8","unresolved":false,"context_lines":[{"line_number":80,"context_line":"        return groups"},{"line_number":81,"context_line":""},{"line_number":82,"context_line":"    def _path_member(self, group_id, member_id):"},{"line_number":83,"context_line":"        return \"/%s/%s/%s\" % (_TOOZ_NAMESPACE, group_id, member_id)"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAATn%2F9sxo%3D","line":83,"updated":"2013-12-07 00:52:31.000000000","message":"I think this util method can help here.\n\nhttps://github.com/python-zk/kazoo/blob/master/kazoo/protocol/paths.py#L19","commit_id":"62e0248f00d4b07314d824a9711d8e045ea22e98"},{"author":{"_account_id":7450,"name":"Yassine Lamgarchal","email":"yassine.lamgarchal@redhat.com","username":"yassine.lamgarchal"},"change_message_id":"066018af36bb96cc1a407411186e80a3f9c5dc3e","unresolved":false,"context_lines":[{"line_number":80,"context_line":"        return groups"},{"line_number":81,"context_line":""},{"line_number":82,"context_line":"    def _path_member(self, group_id, member_id):"},{"line_number":83,"context_line":"        return \"/%s/%s/%s\" % (_TOOZ_NAMESPACE, group_id, member_id)"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAATn%2F9pTM%3D","line":83,"in_reply_to":"AAAATn%2F9sxo%3D","updated":"2013-12-09 11:19:06.000000000","message":"Thanks!\nDone :-)","commit_id":"62e0248f00d4b07314d824a9711d8e045ea22e98"},{"author":{"_account_id":8122,"name":"Cyril Roelandt","email":"cyril@redhat.com","username":"cyril.roelandt.enovance"},"change_message_id":"ae093f98d11ad807cd24593ad7382b8fc35f41ce","unresolved":false,"context_lines":[{"line_number":27,"context_line":"class ZooKeeperDriver(api.CoordinationDriver):"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"    def __init__(self, member_id, **kwargs):"},{"line_number":30,"context_line":"        \"\"\":param kwargs: it must contains the key \"hosts\" associated"},{"line_number":31,"context_line":"        to the list of zookeeper servers in the form \"ip:port2, ip2:port2\"."},{"line_number":32,"context_line":"        \"\"\""},{"line_number":33,"context_line":"        if not all(kwargs[\"hosts\"] and member_id):"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAATn%2F9pCU%3D","line":30,"updated":"2013-12-09 12:17:37.000000000","message":"contain*","commit_id":"db1708709fc5c9685eb443cd70f0ec798f0f487b"},{"author":{"_account_id":7450,"name":"Yassine Lamgarchal","email":"yassine.lamgarchal@redhat.com","username":"yassine.lamgarchal"},"change_message_id":"25c1314310e6eeae3ae955a2ca30a3854931e209","unresolved":false,"context_lines":[{"line_number":27,"context_line":"class ZooKeeperDriver(api.CoordinationDriver):"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"    def __init__(self, member_id, **kwargs):"},{"line_number":30,"context_line":"        \"\"\":param kwargs: it must contains the key \"hosts\" associated"},{"line_number":31,"context_line":"        to the list of zookeeper servers in the form \"ip:port2, ip2:port2\"."},{"line_number":32,"context_line":"        \"\"\""},{"line_number":33,"context_line":"        if not all(kwargs[\"hosts\"] and member_id):"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAATn%2F9os4%3D","line":30,"in_reply_to":"AAAATn%2F9pCU%3D","updated":"2013-12-09 14:12:50.000000000","message":"Done","commit_id":"db1708709fc5c9685eb443cd70f0ec798f0f487b"},{"author":{"_account_id":8122,"name":"Cyril Roelandt","email":"cyril@redhat.com","username":"cyril.roelandt.enovance"},"change_message_id":"ae093f98d11ad807cd24593ad7382b8fc35f41ce","unresolved":false,"context_lines":[{"line_number":30,"context_line":"        \"\"\":param kwargs: it must contains the key \"hosts\" associated"},{"line_number":31,"context_line":"        to the list of zookeeper servers in the form \"ip:port2, ip2:port2\"."},{"line_number":32,"context_line":"        \"\"\""},{"line_number":33,"context_line":"        if not all(kwargs[\"hosts\"] and member_id):"},{"line_number":34,"context_line":"            raise KeyError(\"hosts\u003d%r, member_id\u003d%r\" % (kwargs[\"hosts\"],"},{"line_number":35,"context_line":"                           member_id))"},{"line_number":36,"context_line":"        self._member_id \u003d member_id"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAATn%2F9pB4%3D","line":33,"updated":"2013-12-09 12:17:37.000000000","message":"Is \"kwargs[\"hosts\"] and member_id\" an iterable ?","commit_id":"db1708709fc5c9685eb443cd70f0ec798f0f487b"},{"author":{"_account_id":7450,"name":"Yassine Lamgarchal","email":"yassine.lamgarchal@redhat.com","username":"yassine.lamgarchal"},"change_message_id":"25c1314310e6eeae3ae955a2ca30a3854931e209","unresolved":false,"context_lines":[{"line_number":30,"context_line":"        \"\"\":param kwargs: it must contains the key \"hosts\" associated"},{"line_number":31,"context_line":"        to the list of zookeeper servers in the form \"ip:port2, ip2:port2\"."},{"line_number":32,"context_line":"        \"\"\""},{"line_number":33,"context_line":"        if not all(kwargs[\"hosts\"] and member_id):"},{"line_number":34,"context_line":"            raise KeyError(\"hosts\u003d%r, member_id\u003d%r\" % (kwargs[\"hosts\"],"},{"line_number":35,"context_line":"                           member_id))"},{"line_number":36,"context_line":"        self._member_id \u003d member_id"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAATn%2F9opY%3D","line":33,"in_reply_to":"AAAATn%2F9pB4%3D","updated":"2013-12-09 14:12:50.000000000","message":"No, thanks :) !","commit_id":"db1708709fc5c9685eb443cd70f0ec798f0f487b"},{"author":{"_account_id":1297,"name":"Joshua Harlow","email":"jxharlow@godaddy.com","username":"harlowja"},"change_message_id":"52a74ccfc0460fafaa57364cc06b63591d41902c","unresolved":false,"context_lines":[{"line_number":33,"context_line":"        if not all((kwargs[\"hosts\"], member_id)):"},{"line_number":34,"context_line":"            raise KeyError(\"hosts\u003d%r, member_id\u003d%r\" % (kwargs[\"hosts\"],"},{"line_number":35,"context_line":"                           member_id))"},{"line_number":36,"context_line":"        self._member_id \u003d member_id"},{"line_number":37,"context_line":"        self._coord \u003d client.KazooClient(hosts\u003dkwargs[\"hosts\"])"},{"line_number":38,"context_line":"        super(ZooKeeperDriver, self).__init__()"},{"line_number":39,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATn%2F9mVc%3D","line":36,"updated":"2013-12-09 19:59:12.000000000","message":"I\u0027d still recommend passing through \u0027handler\u0027","commit_id":"73ef89698c4c771e7e628090a98424562440058e"},{"author":{"_account_id":6924,"name":"Pradeep Kilambi","email":"pkilambi@redhat.com","username":"pkilambi"},"change_message_id":"7fe45f19667153a55ba0596cc241b806afa53b00","unresolved":false,"context_lines":[{"line_number":38,"context_line":"        super(ZooKeeperDriver, self).__init__()"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"    def start(self):"},{"line_number":41,"context_line":"        self._coord.start()"},{"line_number":42,"context_line":"        self._coord.ensure_path(\"/%s\" % _TOOZ_NAMESPACE)"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"    def stop(self):"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATn%2F9mNM%3D","line":41,"updated":"2013-12-09 20:33:30.000000000","message":"Do we want to ensure zookeeper session is alive before connecting? If not we might want to handle that timeout here.","commit_id":"73ef89698c4c771e7e628090a98424562440058e"},{"author":{"_account_id":1297,"name":"Joshua Harlow","email":"jxharlow@godaddy.com","username":"harlowja"},"change_message_id":"e7c6f9ced15cc6a72646671125cda9e68f2c36d2","unresolved":false,"context_lines":[{"line_number":38,"context_line":"        super(ZooKeeperDriver, self).__init__()"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"    def start(self):"},{"line_number":41,"context_line":"        self._coord.start()"},{"line_number":42,"context_line":"        self._coord.ensure_path(\"/%s\" % _TOOZ_NAMESPACE)"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"    def stop(self):"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATn%2F9ll4%3D","line":41,"in_reply_to":"AAAATn%2F9mNM%3D","updated":"2013-12-09 22:32:52.000000000","message":"I\u0027d recommend wrapping with a exception block and translating it, although every usage of the \u0027self._coord\u0027 could have lost that connection, so u can\u0027t really ever have a guarantee that the session is alive. That\u0027s the nature of remote client/servers.","commit_id":"73ef89698c4c771e7e628090a98424562440058e"},{"author":{"_account_id":1297,"name":"Joshua Harlow","email":"jxharlow@godaddy.com","username":"harlowja"},"change_message_id":"52a74ccfc0460fafaa57364cc06b63591d41902c","unresolved":false,"context_lines":[{"line_number":47,"context_line":"    def create_group(self, group_id):"},{"line_number":48,"context_line":"        try:"},{"line_number":49,"context_line":"            self._coord.create(\"/%s/%s\" % (_TOOZ_NAMESPACE, group_id))"},{"line_number":50,"context_line":"        except exceptions.NodeExistsError:"},{"line_number":51,"context_line":"            raise api.GroupAlreadyExist(\"group_id\u003d%s\" % group_id)"},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"    def join_group(self, group_id, capabilities\u003d\"\"):"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATn%2F9mVM%3D","line":50,"updated":"2013-12-09 19:59:12.000000000","message":"This can also throw the more generic \u0027kazoo.exceptions.KazooException\u0027, not just \u0027kazoo.exceptions.NodeExistsError\u0027, I would think u don\u0027t want either becoming visible to users.","commit_id":"73ef89698c4c771e7e628090a98424562440058e"},{"author":{"_account_id":1297,"name":"Joshua Harlow","email":"jxharlow@godaddy.com","username":"harlowja"},"change_message_id":"52a74ccfc0460fafaa57364cc06b63591d41902c","unresolved":false,"context_lines":[{"line_number":62,"context_line":"        member_ids \u003d self._coord.get_children(\"/%s/%s\" % (_TOOZ_NAMESPACE,"},{"line_number":63,"context_line":"                                              group_id))"},{"line_number":64,"context_line":"        for member_id in member_ids:"},{"line_number":65,"context_line":"            capabilities \u003d self._coord.get(self._path_member(group_id,"},{"line_number":66,"context_line":"                                           member_id))"},{"line_number":67,"context_line":"            members.append(models.Member(group_id, member_id, capabilities[0]))"},{"line_number":68,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATn%2F9mVI%3D","line":65,"updated":"2013-12-09 19:59:12.000000000","message":"Same exception visibility problem.","commit_id":"73ef89698c4c771e7e628090a98424562440058e"},{"author":{"_account_id":1297,"name":"Joshua Harlow","email":"jxharlow@godaddy.com","username":"harlowja"},"change_message_id":"123a98861d71d6396a7992586f7d8641116d86c4","unresolved":false,"context_lines":[{"line_number":38,"context_line":"        super(ZooKeeperDriver, self).__init__()"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"    def start(self):"},{"line_number":41,"context_line":"        self._coord.start()"},{"line_number":42,"context_line":"        self._coord.ensure_path(paths.join(\"/\", _TOOZ_NAMESPACE))"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"    def stop(self):"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAATn%2F9gzM%3D","line":41,"updated":"2013-12-10 18:46:05.000000000","message":"So looking at this.\n\nI think u want to do the following.\n\ntry:\n  self._coord.start()\nexcept self._coord.handler.timeout_exception as e:\n  raise ToozConnectionFailure(\"Connect failure: %s\" % e)","commit_id":"10099bb32e6fe2e6fc16141086f271591480f0f5"},{"author":{"_account_id":7450,"name":"Yassine Lamgarchal","email":"yassine.lamgarchal@redhat.com","username":"yassine.lamgarchal"},"change_message_id":"3d0c01b0133c1434fc80521768ebe99b9fc07fed","unresolved":false,"context_lines":[{"line_number":38,"context_line":"        super(ZooKeeperDriver, self).__init__()"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"    def start(self):"},{"line_number":41,"context_line":"        self._coord.start()"},{"line_number":42,"context_line":"        self._coord.ensure_path(paths.join(\"/\", _TOOZ_NAMESPACE))"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"    def stop(self):"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAATn%2F9UzU%3D","line":41,"in_reply_to":"AAAATn%2F9gzM%3D","updated":"2013-12-12 16:42:30.000000000","message":"Done","commit_id":"10099bb32e6fe2e6fc16141086f271591480f0f5"},{"author":{"_account_id":1297,"name":"Joshua Harlow","email":"jxharlow@godaddy.com","username":"harlowja"},"change_message_id":"123a98861d71d6396a7992586f7d8641116d86c4","unresolved":false,"context_lines":[{"line_number":39,"context_line":""},{"line_number":40,"context_line":"    def start(self):"},{"line_number":41,"context_line":"        self._coord.start()"},{"line_number":42,"context_line":"        self._coord.ensure_path(paths.join(\"/\", _TOOZ_NAMESPACE))"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"    def stop(self):"},{"line_number":45,"context_line":"        self._coord.stop()"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAATn%2F9gy8%3D","line":42,"updated":"2013-12-10 18:46:05.000000000","message":"Then this one also deserves another try: except block dealing with failures to ensure_path, since after start() and ensure_path() the connection might have been lost (or other failures may happen that u don\u0027t want exposed).","commit_id":"10099bb32e6fe2e6fc16141086f271591480f0f5"},{"author":{"_account_id":7450,"name":"Yassine Lamgarchal","email":"yassine.lamgarchal@redhat.com","username":"yassine.lamgarchal"},"change_message_id":"3d0c01b0133c1434fc80521768ebe99b9fc07fed","unresolved":false,"context_lines":[{"line_number":39,"context_line":""},{"line_number":40,"context_line":"    def start(self):"},{"line_number":41,"context_line":"        self._coord.start()"},{"line_number":42,"context_line":"        self._coord.ensure_path(paths.join(\"/\", _TOOZ_NAMESPACE))"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"    def stop(self):"},{"line_number":45,"context_line":"        self._coord.stop()"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAATn%2F9UzQ%3D","line":42,"in_reply_to":"AAAATn%2F9gy8%3D","updated":"2013-12-12 16:42:30.000000000","message":"Done","commit_id":"10099bb32e6fe2e6fc16141086f271591480f0f5"},{"author":{"_account_id":1297,"name":"Joshua Harlow","email":"jxharlow@godaddy.com","username":"harlowja"},"change_message_id":"123a98861d71d6396a7992586f7d8641116d86c4","unresolved":false,"context_lines":[{"line_number":77,"context_line":"                                               \"has not been created\" %"},{"line_number":78,"context_line":"                                               (self._member_id, group_id))"},{"line_number":79,"context_line":"        except exceptions.ZookeeperError:"},{"line_number":80,"context_line":"            raise coordination.ToozInternalError()"},{"line_number":81,"context_line":""},{"line_number":82,"context_line":"    def get_members(self, group_id):"},{"line_number":83,"context_line":"        member_ids \u003d []"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAATn%2F9gz8%3D","line":80,"updated":"2013-12-10 18:46:05.000000000","message":"Seems like u should at least provide the message of the previous failure?\n\nexcept exceptions.ZookeeperError as e:\n   raise coordination.ToozInternalError(\"Internal error: %s\" % (e))","commit_id":"10099bb32e6fe2e6fc16141086f271591480f0f5"},{"author":{"_account_id":7450,"name":"Yassine Lamgarchal","email":"yassine.lamgarchal@redhat.com","username":"yassine.lamgarchal"},"change_message_id":"3d0c01b0133c1434fc80521768ebe99b9fc07fed","unresolved":false,"context_lines":[{"line_number":77,"context_line":"                                               \"has not been created\" %"},{"line_number":78,"context_line":"                                               (self._member_id, group_id))"},{"line_number":79,"context_line":"        except exceptions.ZookeeperError:"},{"line_number":80,"context_line":"            raise coordination.ToozInternalError()"},{"line_number":81,"context_line":""},{"line_number":82,"context_line":"    def get_members(self, group_id):"},{"line_number":83,"context_line":"        member_ids \u003d []"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAATn%2F9UzM%3D","line":80,"in_reply_to":"AAAATn%2F9gz8%3D","updated":"2013-12-12 16:42:30.000000000","message":"Done","commit_id":"10099bb32e6fe2e6fc16141086f271591480f0f5"},{"author":{"_account_id":1297,"name":"Joshua Harlow","email":"jxharlow@godaddy.com","username":"harlowja"},"change_message_id":"123a98861d71d6396a7992586f7d8641116d86c4","unresolved":false,"context_lines":[{"line_number":156,"context_line":"            raise coordination.ToozNamespaceNotCreated(\"tooz namespace has \""},{"line_number":157,"context_line":"                                                       \"not been created\")"},{"line_number":158,"context_line":"        except exceptions.ZookeeperError:"},{"line_number":159,"context_line":"            raise coordination.ToozInternalError()"},{"line_number":160,"context_line":"        return group_ids"},{"line_number":161,"context_line":""},{"line_number":162,"context_line":"    def _path_member(self, group_id, member_id):"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAATn%2F9gz0%3D","line":159,"updated":"2013-12-10 18:46:05.000000000","message":"Same as above.","commit_id":"10099bb32e6fe2e6fc16141086f271591480f0f5"},{"author":{"_account_id":7450,"name":"Yassine Lamgarchal","email":"yassine.lamgarchal@redhat.com","username":"yassine.lamgarchal"},"change_message_id":"3d0c01b0133c1434fc80521768ebe99b9fc07fed","unresolved":false,"context_lines":[{"line_number":156,"context_line":"            raise coordination.ToozNamespaceNotCreated(\"tooz namespace has \""},{"line_number":157,"context_line":"                                                       \"not been created\")"},{"line_number":158,"context_line":"        except exceptions.ZookeeperError:"},{"line_number":159,"context_line":"            raise coordination.ToozInternalError()"},{"line_number":160,"context_line":"        return group_ids"},{"line_number":161,"context_line":""},{"line_number":162,"context_line":"    def _path_member(self, group_id, member_id):"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAATn%2F9UzI%3D","line":159,"in_reply_to":"AAAATn%2F9gz0%3D","updated":"2013-12-12 16:42:30.000000000","message":"Done","commit_id":"10099bb32e6fe2e6fc16141086f271591480f0f5"},{"author":{"_account_id":1669,"name":"Julien Danjou","display_name":"jd","email":"julien@danjou.info","username":"jdanjou"},"change_message_id":"948bf304832534f3521281ae4401178fdfb7dc3c","unresolved":false,"context_lines":[{"line_number":59,"context_line":"            raise coordination.GroupAlreadyExist(\"group_id\u003d%s\" % group_id)"},{"line_number":60,"context_line":"        except exceptions.NoNodeError:"},{"line_number":61,"context_line":"            raise coordination.ToozNamespaceNotCreated(\"tooz namespace has \""},{"line_number":62,"context_line":"                                                       \"not been created\")"},{"line_number":63,"context_line":"        except exceptions.ZookeeperError as e:"},{"line_number":64,"context_line":"            raise coordination.ToozInternalError(str(e))"},{"line_number":65,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAATn%2F9EbA%3D","line":62,"updated":"2013-12-17 04:13:25.000000000","message":"code alignment seems weird here and in all exceptions below.","commit_id":"c13d3194100715afe057e71870ab050447813af7"},{"author":{"_account_id":7450,"name":"Yassine Lamgarchal","email":"yassine.lamgarchal@redhat.com","username":"yassine.lamgarchal"},"change_message_id":"3b26b8c6555955f5463fabcb2fc41436c3c6ba5f","unresolved":false,"context_lines":[{"line_number":59,"context_line":"            raise coordination.GroupAlreadyExist(\"group_id\u003d%s\" % group_id)"},{"line_number":60,"context_line":"        except exceptions.NoNodeError:"},{"line_number":61,"context_line":"            raise coordination.ToozNamespaceNotCreated(\"tooz namespace has \""},{"line_number":62,"context_line":"                                                       \"not been created\")"},{"line_number":63,"context_line":"        except exceptions.ZookeeperError as e:"},{"line_number":64,"context_line":"            raise coordination.ToozInternalError(str(e))"},{"line_number":65,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAATn%2F9C24%3D","line":62,"in_reply_to":"AAAATn%2F9EbA%3D","updated":"2013-12-17 11:46:36.000000000","message":"Done","commit_id":"c13d3194100715afe057e71870ab050447813af7"},{"author":{"_account_id":1669,"name":"Julien Danjou","display_name":"jd","email":"julien@danjou.info","username":"jdanjou"},"change_message_id":"948bf304832534f3521281ae4401178fdfb7dc3c","unresolved":false,"context_lines":[{"line_number":167,"context_line":"            raise coordination.ToozInternalError(str(e))"},{"line_number":168,"context_line":"        return group_ids"},{"line_number":169,"context_line":""},{"line_number":170,"context_line":"    def _path_member(self, group_id, member_id):"},{"line_number":171,"context_line":"        return paths.join(\"/\", _TOOZ_NAMESPACE, group_id, member_id)"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAATn%2F9Ea0%3D","line":170,"updated":"2013-12-17 04:13:25.000000000","message":"@staticmethod","commit_id":"c13d3194100715afe057e71870ab050447813af7"},{"author":{"_account_id":7450,"name":"Yassine Lamgarchal","email":"yassine.lamgarchal@redhat.com","username":"yassine.lamgarchal"},"change_message_id":"3b26b8c6555955f5463fabcb2fc41436c3c6ba5f","unresolved":false,"context_lines":[{"line_number":167,"context_line":"            raise coordination.ToozInternalError(str(e))"},{"line_number":168,"context_line":"        return group_ids"},{"line_number":169,"context_line":""},{"line_number":170,"context_line":"    def _path_member(self, group_id, member_id):"},{"line_number":171,"context_line":"        return paths.join(\"/\", _TOOZ_NAMESPACE, group_id, member_id)"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAATn%2F9C2c%3D","line":170,"in_reply_to":"AAAATn%2F9Ea0%3D","updated":"2013-12-17 11:46:36.000000000","message":"Done","commit_id":"c13d3194100715afe057e71870ab050447813af7"},{"author":{"_account_id":9107,"name":"Victor Stinner","email":"vstinner@redhat.com","username":"haypo"},"change_message_id":"684378608d4ea62799c2a2e0a575423828833461","unresolved":false,"context_lines":[{"line_number":68,"context_line":"            self._coord.create(self._path_member(group_id, self._member_id),"},{"line_number":69,"context_line":"                               value\u003dcapabilities, ephemeral\u003dTrue)"},{"line_number":70,"context_line":"        except exceptions.NodeExistsError:"},{"line_number":71,"context_line":"            raise coordination.MemberAlreadyExist(\"member_id\u003d%s\" %"},{"line_number":72,"context_line":"                                                  self._member_id)"},{"line_number":73,"context_line":"        except exceptions.NoNodeError:"},{"line_number":74,"context_line":"            raise coordination.GroupNotCreated(\"group \u0027%s\u0027 has not been \""}],"source_content_type":"text/x-python","patch_set":22,"id":"AAAATn%2F8980%3D","line":71,"updated":"2013-12-18 10:05:10.000000000","message":"MemberAlreadyExist(self._member_id) is maybe better to retrieve the member identifer in the caller in case of error. KeyError() uses the same API. If you prefer a message, the message should indicate that an error occurred: \"member already exists: %s\" % self._member_id.","commit_id":"02214932454a3dae78dcb7f6bbf48ec78376275d"},{"author":{"_account_id":7450,"name":"Yassine Lamgarchal","email":"yassine.lamgarchal@redhat.com","username":"yassine.lamgarchal"},"change_message_id":"87a2265a5b9877b7749ca74f3ed15ea9ad6b8854","unresolved":false,"context_lines":[{"line_number":68,"context_line":"            self._coord.create(self._path_member(group_id, self._member_id),"},{"line_number":69,"context_line":"                               value\u003dcapabilities, ephemeral\u003dTrue)"},{"line_number":70,"context_line":"        except exceptions.NodeExistsError:"},{"line_number":71,"context_line":"            raise coordination.MemberAlreadyExist(\"member_id\u003d%s\" %"},{"line_number":72,"context_line":"                                                  self._member_id)"},{"line_number":73,"context_line":"        except exceptions.NoNodeError:"},{"line_number":74,"context_line":"            raise coordination.GroupNotCreated(\"group \u0027%s\u0027 has not been \""}],"source_content_type":"text/x-python","patch_set":22,"id":"AAAATn%2F88%2F4%3D","line":71,"in_reply_to":"AAAATn%2F8980%3D","updated":"2013-12-18 13:58:19.000000000","message":"Done","commit_id":"02214932454a3dae78dcb7f6bbf48ec78376275d"},{"author":{"_account_id":9107,"name":"Victor Stinner","email":"vstinner@redhat.com","username":"haypo"},"change_message_id":"684378608d4ea62799c2a2e0a575423828833461","unresolved":false,"context_lines":[{"line_number":71,"context_line":"            raise coordination.MemberAlreadyExist(\"member_id\u003d%s\" %"},{"line_number":72,"context_line":"                                                  self._member_id)"},{"line_number":73,"context_line":"        except exceptions.NoNodeError:"},{"line_number":74,"context_line":"            raise coordination.GroupNotCreated(\"group \u0027%s\u0027 has not been \""},{"line_number":75,"context_line":"                                               \"created\" % _TOOZ_NAMESPACE)"},{"line_number":76,"context_line":"        except exceptions.ZookeeperError as e:"},{"line_number":77,"context_line":"            raise coordination.ToozInternalError(str(e))"}],"source_content_type":"text/x-python","patch_set":22,"id":"AAAATn%2F8974%3D","line":74,"updated":"2013-12-18 10:05:10.000000000","message":"I don\u0027t know the error NoNodeError, but it looks precise than \"group not created\". You should not loose information, you should explain the error in the message. Example: GroupNotCreated(\"No running zookeepr node\") or GroupNotCreated(\"Cannot join a group: there is no running zookeepr node\").","commit_id":"02214932454a3dae78dcb7f6bbf48ec78376275d"},{"author":{"_account_id":7450,"name":"Yassine Lamgarchal","email":"yassine.lamgarchal@redhat.com","username":"yassine.lamgarchal"},"change_message_id":"87a2265a5b9877b7749ca74f3ed15ea9ad6b8854","unresolved":false,"context_lines":[{"line_number":71,"context_line":"            raise coordination.MemberAlreadyExist(\"member_id\u003d%s\" %"},{"line_number":72,"context_line":"                                                  self._member_id)"},{"line_number":73,"context_line":"        except exceptions.NoNodeError:"},{"line_number":74,"context_line":"            raise coordination.GroupNotCreated(\"group \u0027%s\u0027 has not been \""},{"line_number":75,"context_line":"                                               \"created\" % _TOOZ_NAMESPACE)"},{"line_number":76,"context_line":"        except exceptions.ZookeeperError as e:"},{"line_number":77,"context_line":"            raise coordination.ToozInternalError(str(e))"}],"source_content_type":"text/x-python","patch_set":22,"id":"AAAATn%2F886Q%3D","line":74,"in_reply_to":"AAAATn%2F8974%3D","updated":"2013-12-18 13:58:19.000000000","message":"The NoNodeError exception is raised when the parent node has not been created https://github.com/python-zk/kazoo/blob/master/kazoo/client.py#L737\n\nIn this case it *precisely* means that the caller hadn\u0027t created the group it tried to join so we don\u0027t loose information. Howewer, i will update the message.","commit_id":"02214932454a3dae78dcb7f6bbf48ec78376275d"},{"author":{"_account_id":9107,"name":"Victor Stinner","email":"vstinner@redhat.com","username":"haypo"},"change_message_id":"684378608d4ea62799c2a2e0a575423828833461","unresolved":false,"context_lines":[{"line_number":85,"context_line":"                                               \"has not been created\" %"},{"line_number":86,"context_line":"                                               (self._member_id, group_id))"},{"line_number":87,"context_line":"        except exceptions.ZookeeperError as e:"},{"line_number":88,"context_line":"            raise coordination.ToozInternalError(str(e))"},{"line_number":89,"context_line":""},{"line_number":90,"context_line":"    def get_members(self, group_id):"},{"line_number":91,"context_line":"        member_ids \u003d []"}],"source_content_type":"text/x-python","patch_set":22,"id":"AAAATn%2F897U%3D","line":88,"updated":"2013-12-18 10:05:10.000000000","message":"What is an \"internal\" error?","commit_id":"02214932454a3dae78dcb7f6bbf48ec78376275d"},{"author":{"_account_id":7450,"name":"Yassine Lamgarchal","email":"yassine.lamgarchal@redhat.com","username":"yassine.lamgarchal"},"change_message_id":"87a2265a5b9877b7749ca74f3ed15ea9ad6b8854","unresolved":false,"context_lines":[{"line_number":85,"context_line":"                                               \"has not been created\" %"},{"line_number":86,"context_line":"                                               (self._member_id, group_id))"},{"line_number":87,"context_line":"        except exceptions.ZookeeperError as e:"},{"line_number":88,"context_line":"            raise coordination.ToozInternalError(str(e))"},{"line_number":89,"context_line":""},{"line_number":90,"context_line":"    def get_members(self, group_id):"},{"line_number":91,"context_line":"        member_ids \u003d []"}],"source_content_type":"text/x-python","patch_set":22,"id":"AAAATn%2F885c%3D","line":88,"in_reply_to":"AAAATn%2F897U%3D","updated":"2013-12-18 13:58:19.000000000","message":"It\u0027s an error raised by the server itself.","commit_id":"02214932454a3dae78dcb7f6bbf48ec78376275d"},{"author":{"_account_id":9107,"name":"Victor Stinner","email":"vstinner@redhat.com","username":"haypo"},"change_message_id":"684378608d4ea62799c2a2e0a575423828833461","unresolved":false,"context_lines":[{"line_number":94,"context_line":"                                                             _TOOZ_NAMESPACE,"},{"line_number":95,"context_line":"                                                             group_id))"},{"line_number":96,"context_line":"        except exceptions.NoNodeError:"},{"line_number":97,"context_line":"            raise coordination.InvalidGroup(\"group \u0027%s\u0027 doesn\u0027t exist\" %"},{"line_number":98,"context_line":"                                            group_id)"},{"line_number":99,"context_line":"        except exceptions.ZookeeperError as e:"},{"line_number":100,"context_line":"            raise coordination.ToozInternalError(str(e))"}],"source_content_type":"text/x-python","patch_set":22,"id":"AAAATn%2F897I%3D","line":97,"updated":"2013-12-18 10:05:10.000000000","message":"\"does not\" instead of \"doesn\u0027t\"","commit_id":"02214932454a3dae78dcb7f6bbf48ec78376275d"},{"author":{"_account_id":7450,"name":"Yassine Lamgarchal","email":"yassine.lamgarchal@redhat.com","username":"yassine.lamgarchal"},"change_message_id":"87a2265a5b9877b7749ca74f3ed15ea9ad6b8854","unresolved":false,"context_lines":[{"line_number":94,"context_line":"                                                             _TOOZ_NAMESPACE,"},{"line_number":95,"context_line":"                                                             group_id))"},{"line_number":96,"context_line":"        except exceptions.NoNodeError:"},{"line_number":97,"context_line":"            raise coordination.InvalidGroup(\"group \u0027%s\u0027 doesn\u0027t exist\" %"},{"line_number":98,"context_line":"                                            group_id)"},{"line_number":99,"context_line":"        except exceptions.ZookeeperError as e:"},{"line_number":100,"context_line":"            raise coordination.ToozInternalError(str(e))"}],"source_content_type":"text/x-python","patch_set":22,"id":"AAAATn%2F884Y%3D","line":97,"in_reply_to":"AAAATn%2F897I%3D","updated":"2013-12-18 13:58:19.000000000","message":"Done","commit_id":"02214932454a3dae78dcb7f6bbf48ec78376275d"},{"author":{"_account_id":9107,"name":"Victor Stinner","email":"vstinner@redhat.com","username":"haypo"},"change_message_id":"684378608d4ea62799c2a2e0a575423828833461","unresolved":false,"context_lines":[{"line_number":119,"context_line":"        try:"},{"line_number":120,"context_line":"            capabilities \u003d self._coord.get(self._path_member(group_id,"},{"line_number":121,"context_line":"                                                             member_id))"},{"line_number":122,"context_line":"        except exceptions.NoNodeError:"},{"line_number":123,"context_line":"            raise coordination.MemberNotJoined(\"member \u0027%s\u0027 has not joined \""},{"line_number":124,"context_line":"                                               \"the group \u0027%s\u0027 or the group \""},{"line_number":125,"context_line":"                                               \"has not been created\" %"}],"source_content_type":"text/x-python","patch_set":22,"id":"AAAATn%2F896g%3D","line":122,"updated":"2013-12-18 10:05:10.000000000","message":"these two except blocks look to be duplicated. You should wrap kazoo calls in a function or context manager which converts kazoo exceptions to tooz exceptions. Maybe at least for the ZookeeperError \u003d\u003e ToozInternalError.","commit_id":"02214932454a3dae78dcb7f6bbf48ec78376275d"},{"author":{"_account_id":7450,"name":"Yassine Lamgarchal","email":"yassine.lamgarchal@redhat.com","username":"yassine.lamgarchal"},"change_message_id":"87a2265a5b9877b7749ca74f3ed15ea9ad6b8854","unresolved":false,"context_lines":[{"line_number":119,"context_line":"        try:"},{"line_number":120,"context_line":"            capabilities \u003d self._coord.get(self._path_member(group_id,"},{"line_number":121,"context_line":"                                                             member_id))"},{"line_number":122,"context_line":"        except exceptions.NoNodeError:"},{"line_number":123,"context_line":"            raise coordination.MemberNotJoined(\"member \u0027%s\u0027 has not joined \""},{"line_number":124,"context_line":"                                               \"the group \u0027%s\u0027 or the group \""},{"line_number":125,"context_line":"                                               \"has not been created\" %"}],"source_content_type":"text/x-python","patch_set":22,"id":"AAAATn%2F8808%3D","line":122,"in_reply_to":"AAAATn%2F896g%3D","updated":"2013-12-18 13:58:19.000000000","message":"Actually, they are not duplicated, NoNodeError means that the requested node /group_id/member_id does not exist. In Tooz it means that the group has not been created or the member has not joined that group (when a member join a group it create a znode).\n\nA ZooKeeperError could always occur in case the server has an internal error.","commit_id":"02214932454a3dae78dcb7f6bbf48ec78376275d"},{"author":{"_account_id":9107,"name":"Victor Stinner","email":"vstinner@redhat.com","username":"haypo"},"change_message_id":"5e2f86fd364f033563fd0a01a320e07cf86dd309","unresolved":false,"context_lines":[{"line_number":46,"context_line":"        try:"},{"line_number":47,"context_line":"            self._coord.ensure_path(paths.join(\"/\", _TOOZ_NAMESPACE))"},{"line_number":48,"context_line":"        except exceptions.KazooException as e:"},{"line_number":49,"context_line":"            raise coordination.ToozConnectionError(\"connection error: %s\""},{"line_number":50,"context_line":"                                                   % (e))"},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"    def stop(self):"}],"source_content_type":"text/x-python","patch_set":23,"id":"AAAATn%2F88Ng%3D","line":49,"updated":"2013-12-18 15:11:58.000000000","message":"this except block is duplicated, you should add a private method (ex: \"def wrap_kazoo(func, *args, **kw):\") which implements this try/except.","commit_id":"79116c7db01d27cd517925dbc88e6b0a95b37ff3"},{"author":{"_account_id":7450,"name":"Yassine Lamgarchal","email":"yassine.lamgarchal@redhat.com","username":"yassine.lamgarchal"},"change_message_id":"f6844ce642176223da78b66808ae22a658aa7996","unresolved":false,"context_lines":[{"line_number":46,"context_line":"        try:"},{"line_number":47,"context_line":"            self._coord.ensure_path(paths.join(\"/\", _TOOZ_NAMESPACE))"},{"line_number":48,"context_line":"        except exceptions.KazooException as e:"},{"line_number":49,"context_line":"            raise coordination.ToozConnectionError(\"connection error: %s\""},{"line_number":50,"context_line":"                                                   % (e))"},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"    def stop(self):"}],"source_content_type":"text/x-python","patch_set":23,"id":"AAAATn%2F83wQ%3D","line":49,"in_reply_to":"AAAATn%2F88Ng%3D","updated":"2013-12-19 11:29:31.000000000","message":"Done","commit_id":"79116c7db01d27cd517925dbc88e6b0a95b37ff3"}],"tooz/exceptions.py":[{"author":{"_account_id":1669,"name":"Julien Danjou","display_name":"jd","email":"julien@danjou.info","username":"jdanjou"},"change_message_id":"b3d1449d0b4dca3bea6f1e118e191b6032349150","unresolved":false,"context_lines":[{"line_number":16,"context_line":"#    License for the specific language governing permissions and limitations"},{"line_number":17,"context_line":"#    under the License."},{"line_number":18,"context_line":""},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"class ToozException(Exception):"},{"line_number":21,"context_line":"    \"\"\"Base class for Tooz exceptions.\"\"\""},{"line_number":22,"context_line":"    pass"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAATn%2F9vzg%3D","line":19,"updated":"2013-12-06 13:09:43.000000000","message":"I hate these exceptions.py files. Don\u0027t do that, declare the exception where they make sense.","commit_id":"62e0248f00d4b07314d824a9711d8e045ea22e98"},{"author":{"_account_id":7450,"name":"Yassine Lamgarchal","email":"yassine.lamgarchal@redhat.com","username":"yassine.lamgarchal"},"change_message_id":"066018af36bb96cc1a407411186e80a3f9c5dc3e","unresolved":false,"context_lines":[{"line_number":16,"context_line":"#    License for the specific language governing permissions and limitations"},{"line_number":17,"context_line":"#    under the License."},{"line_number":18,"context_line":""},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"class ToozException(Exception):"},{"line_number":21,"context_line":"    \"\"\"Base class for Tooz exceptions.\"\"\""},{"line_number":22,"context_line":"    pass"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAATn%2F9uwI%3D","line":19,"in_reply_to":"AAAATn%2F9vuA%3D","updated":"2013-12-09 11:19:06.000000000","message":"Done","commit_id":"62e0248f00d4b07314d824a9711d8e045ea22e98"},{"author":{"_account_id":9107,"name":"Victor Stinner","email":"vstinner@redhat.com","username":"haypo"},"change_message_id":"0e444af86d0daa2d46c4941e2ec8a5ef08935a3e","unresolved":false,"context_lines":[{"line_number":16,"context_line":"#    License for the specific language governing permissions and limitations"},{"line_number":17,"context_line":"#    under the License."},{"line_number":18,"context_line":""},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"class ToozException(Exception):"},{"line_number":21,"context_line":"    \"\"\"Base class for Tooz exceptions.\"\"\""},{"line_number":22,"context_line":"    pass"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAATn%2F9vuA%3D","line":19,"in_reply_to":"AAAATn%2F9vzg%3D","updated":"2013-12-06 13:44:55.000000000","message":"Agreed.","commit_id":"62e0248f00d4b07314d824a9711d8e045ea22e98"},{"author":{"_account_id":7450,"name":"Yassine Lamgarchal","email":"yassine.lamgarchal@redhat.com","username":"yassine.lamgarchal"},"change_message_id":"066018af36bb96cc1a407411186e80a3f9c5dc3e","unresolved":false,"context_lines":[{"line_number":16,"context_line":"#    License for the specific language governing permissions and limitations"},{"line_number":17,"context_line":"#    under the License."},{"line_number":18,"context_line":""},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"class ToozException(Exception):"},{"line_number":21,"context_line":"    \"\"\"Base class for Tooz exceptions.\"\"\""},{"line_number":22,"context_line":"    pass"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAATn%2F9uwM%3D","line":19,"in_reply_to":"AAAATn%2F9vzg%3D","updated":"2013-12-09 11:19:06.000000000","message":"Done","commit_id":"62e0248f00d4b07314d824a9711d8e045ea22e98"},{"author":{"_account_id":9107,"name":"Victor Stinner","email":"vstinner@redhat.com","username":"haypo"},"change_message_id":"0e444af86d0daa2d46c4941e2ec8a5ef08935a3e","unresolved":false,"context_lines":[{"line_number":17,"context_line":"#    under the License."},{"line_number":18,"context_line":""},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"class ToozException(Exception):"},{"line_number":21,"context_line":"    \"\"\"Base class for Tooz exceptions.\"\"\""},{"line_number":22,"context_line":"    pass"},{"line_number":23,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAATn%2F9vtg%3D","line":20,"updated":"2013-12-06 13:44:55.000000000","message":"I used such base class in the past, but now I think that it\u0027s bad practice. It\u0027s better to inherit from standard exceptions to have a better hierarchy of exceptions.","commit_id":"62e0248f00d4b07314d824a9711d8e045ea22e98"},{"author":{"_account_id":7450,"name":"Yassine Lamgarchal","email":"yassine.lamgarchal@redhat.com","username":"yassine.lamgarchal"},"change_message_id":"066018af36bb96cc1a407411186e80a3f9c5dc3e","unresolved":false,"context_lines":[{"line_number":17,"context_line":"#    under the License."},{"line_number":18,"context_line":""},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"class ToozException(Exception):"},{"line_number":21,"context_line":"    \"\"\"Base class for Tooz exceptions.\"\"\""},{"line_number":22,"context_line":"    pass"},{"line_number":23,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAATn%2F9uvU%3D","line":20,"in_reply_to":"AAAATn%2F9vtg%3D","updated":"2013-12-09 11:19:06.000000000","message":"Done","commit_id":"62e0248f00d4b07314d824a9711d8e045ea22e98"},{"author":{"_account_id":9107,"name":"Victor Stinner","email":"vstinner@redhat.com","username":"haypo"},"change_message_id":"0e444af86d0daa2d46c4941e2ec8a5ef08935a3e","unresolved":false,"context_lines":[{"line_number":22,"context_line":"    pass"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"class InvalidGroup(ToozException):"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"    def __init__(self, message):"},{"line_number":28,"context_line":"        ToozException.__init__(self, message)"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAATn%2F9vtc%3D","line":25,"updated":"2013-12-06 13:44:55.000000000","message":"ex: inherit from ValueError... Or don\u0027t use your custom exception and simply raise ValueError.","commit_id":"62e0248f00d4b07314d824a9711d8e045ea22e98"},{"author":{"_account_id":7450,"name":"Yassine Lamgarchal","email":"yassine.lamgarchal@redhat.com","username":"yassine.lamgarchal"},"change_message_id":"066018af36bb96cc1a407411186e80a3f9c5dc3e","unresolved":false,"context_lines":[{"line_number":22,"context_line":"    pass"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"class InvalidGroup(ToozException):"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"    def __init__(self, message):"},{"line_number":28,"context_line":"        ToozException.__init__(self, message)"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAATn%2F9uvQ%3D","line":25,"in_reply_to":"AAAATn%2F9vtc%3D","updated":"2013-12-09 11:19:06.000000000","message":"I\u0027ll inherit from Exception then.","commit_id":"62e0248f00d4b07314d824a9711d8e045ea22e98"},{"author":{"_account_id":9107,"name":"Victor Stinner","email":"vstinner@redhat.com","username":"haypo"},"change_message_id":"0e444af86d0daa2d46c4941e2ec8a5ef08935a3e","unresolved":false,"context_lines":[{"line_number":23,"context_line":""},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"class InvalidGroup(ToozException):"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"    def __init__(self, message):"},{"line_number":28,"context_line":"        ToozException.__init__(self, message)"},{"line_number":29,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAATn%2F9vt4%3D","line":26,"updated":"2013-12-06 13:44:55.000000000","message":"PEP 8 requires an empty line here? (I prefer no empty line)","commit_id":"62e0248f00d4b07314d824a9711d8e045ea22e98"},{"author":{"_account_id":7450,"name":"Yassine Lamgarchal","email":"yassine.lamgarchal@redhat.com","username":"yassine.lamgarchal"},"change_message_id":"066018af36bb96cc1a407411186e80a3f9c5dc3e","unresolved":false,"context_lines":[{"line_number":23,"context_line":""},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"class InvalidGroup(ToozException):"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"    def __init__(self, message):"},{"line_number":28,"context_line":"        ToozException.__init__(self, message)"},{"line_number":29,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAATn%2F9uu4%3D","line":26,"in_reply_to":"AAAATn%2F9vt4%3D","updated":"2013-12-09 11:19:06.000000000","message":"Done","commit_id":"62e0248f00d4b07314d824a9711d8e045ea22e98"},{"author":{"_account_id":688,"name":"Sandy Walsh","email":"sandy.walsh@rackspace.com","username":"sandy-walsh"},"change_message_id":"53c29b3c2650fe21039d3786ce75ef011de780db","unresolved":false,"context_lines":[{"line_number":24,"context_line":""},{"line_number":25,"context_line":"class InvalidGroup(ToozException):"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"    def __init__(self, message):"},{"line_number":28,"context_line":"        ToozException.__init__(self, message)"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAATn%2F9tzc%3D","line":27,"updated":"2013-12-06 19:51:26.000000000","message":"don\u0027t need to override if you\u0027re not changing anything.","commit_id":"62e0248f00d4b07314d824a9711d8e045ea22e98"},{"author":{"_account_id":7450,"name":"Yassine Lamgarchal","email":"yassine.lamgarchal@redhat.com","username":"yassine.lamgarchal"},"change_message_id":"066018af36bb96cc1a407411186e80a3f9c5dc3e","unresolved":false,"context_lines":[{"line_number":24,"context_line":""},{"line_number":25,"context_line":"class InvalidGroup(ToozException):"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"    def __init__(self, message):"},{"line_number":28,"context_line":"        ToozException.__init__(self, message)"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAATn%2F9pZ4%3D","line":27,"in_reply_to":"AAAATn%2F9tzc%3D","updated":"2013-12-09 11:19:06.000000000","message":"Done","commit_id":"62e0248f00d4b07314d824a9711d8e045ea22e98"},{"author":{"_account_id":9107,"name":"Victor Stinner","email":"vstinner@redhat.com","username":"haypo"},"change_message_id":"0e444af86d0daa2d46c4941e2ec8a5ef08935a3e","unresolved":false,"context_lines":[{"line_number":28,"context_line":"        ToozException.__init__(self, message)"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"class GroupAlreadyExist(ToozException):"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"    def __init__(self, message):"},{"line_number":34,"context_line":"        ToozException.__init__(self, message)"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAATn%2F9vs8%3D","line":31,"updated":"2013-12-06 13:44:55.000000000","message":"ex: inherit from KeyError, or simply refuse KeyError\n\nIt sounds a little bit weird to me to read \"AlreadyExist\" in a class name, I would expect this information in the error message. Sorry, I don\u0027t have a better suggestion for the exception name.","commit_id":"62e0248f00d4b07314d824a9711d8e045ea22e98"},{"author":{"_account_id":7450,"name":"Yassine Lamgarchal","email":"yassine.lamgarchal@redhat.com","username":"yassine.lamgarchal"},"change_message_id":"066018af36bb96cc1a407411186e80a3f9c5dc3e","unresolved":false,"context_lines":[{"line_number":28,"context_line":"        ToozException.__init__(self, message)"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"class GroupAlreadyExist(ToozException):"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"    def __init__(self, message):"},{"line_number":34,"context_line":"        ToozException.__init__(self, message)"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAATn%2F9utk%3D","line":31,"in_reply_to":"AAAATn%2F9vs8%3D","updated":"2013-12-09 11:19:06.000000000","message":"This exception is raised when you attempt to create an existing group, i think the name is a good one.","commit_id":"62e0248f00d4b07314d824a9711d8e045ea22e98"}],"tooz/models.py":[{"author":{"_account_id":688,"name":"Sandy Walsh","email":"sandy.walsh@rackspace.com","username":"sandy-walsh"},"change_message_id":"53c29b3c2650fe21039d3786ce75ef011de780db","unresolved":false,"context_lines":[{"line_number":18,"context_line":""},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"class Member(object):"},{"line_number":21,"context_line":"    \"\"\"The object representation of a member of a group."},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"    A member is composed of a member identifier, a group identifier and"},{"line_number":24,"context_line":"    capabilities. The capabilities correspond to an arbitrary string defined by"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAATn%2F9tzM%3D","line":21,"updated":"2013-12-06 19:51:26.000000000","message":"\"The member of a group.\" perhaps?","commit_id":"62e0248f00d4b07314d824a9711d8e045ea22e98"},{"author":{"_account_id":7450,"name":"Yassine Lamgarchal","email":"yassine.lamgarchal@redhat.com","username":"yassine.lamgarchal"},"change_message_id":"066018af36bb96cc1a407411186e80a3f9c5dc3e","unresolved":false,"context_lines":[{"line_number":18,"context_line":""},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"class Member(object):"},{"line_number":21,"context_line":"    \"\"\"The object representation of a member of a group."},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"    A member is composed of a member identifier, a group identifier and"},{"line_number":24,"context_line":"    capabilities. The capabilities correspond to an arbitrary string defined by"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAATn%2F9sL8%3D","line":21,"in_reply_to":"AAAATn%2F9tzM%3D","updated":"2013-12-09 11:19:06.000000000","message":"Done","commit_id":"62e0248f00d4b07314d824a9711d8e045ea22e98"},{"author":{"_account_id":688,"name":"Sandy Walsh","email":"sandy.walsh@rackspace.com","username":"sandy-walsh"},"change_message_id":"53c29b3c2650fe21039d3786ce75ef011de780db","unresolved":false,"context_lines":[{"line_number":23,"context_line":"    A member is composed of a member identifier, a group identifier and"},{"line_number":24,"context_line":"    capabilities. The capabilities correspond to an arbitrary string defined by"},{"line_number":25,"context_line":"    the user of the API, for instance it could be a string resulting from JSON"},{"line_number":26,"context_line":"    serialization, Google Protocol Buffers, MsgPack and so on."},{"line_number":27,"context_line":"    \"\"\""},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"    def __init__(self, group_id, member_id, capabilities):"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAATn%2F9tyc%3D","line":26,"updated":"2013-12-06 19:51:26.000000000","message":"an example of capabilities would be useful:\n\nis it like \"fast, no_replication, unicode\"? Would a richer data structure be more useful? Do we care about the data structure at all? Can it just be a \"thing\"?","commit_id":"62e0248f00d4b07314d824a9711d8e045ea22e98"},{"author":{"_account_id":1669,"name":"Julien Danjou","display_name":"jd","email":"julien@danjou.info","username":"jdanjou"},"change_message_id":"b3d1449d0b4dca3bea6f1e118e191b6032349150","unresolved":false,"context_lines":[{"line_number":23,"context_line":"    A member is composed of a member identifier, a group identifier and"},{"line_number":24,"context_line":"    capabilities. The capabilities correspond to an arbitrary string defined by"},{"line_number":25,"context_line":"    the user of the API, for instance it could be a string resulting from JSON"},{"line_number":26,"context_line":"    serialization, Google Protocol Buffers, MsgPack and so on."},{"line_number":27,"context_line":"    \"\"\""},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"    def __init__(self, group_id, member_id, capabilities):"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAATn%2F9vzU%3D","line":26,"updated":"2013-12-06 13:09:43.000000000","message":"let\u0027s say \"a string\" then.","commit_id":"62e0248f00d4b07314d824a9711d8e045ea22e98"},{"author":{"_account_id":7450,"name":"Yassine Lamgarchal","email":"yassine.lamgarchal@redhat.com","username":"yassine.lamgarchal"},"change_message_id":"066018af36bb96cc1a407411186e80a3f9c5dc3e","unresolved":false,"context_lines":[{"line_number":23,"context_line":"    A member is composed of a member identifier, a group identifier and"},{"line_number":24,"context_line":"    capabilities. The capabilities correspond to an arbitrary string defined by"},{"line_number":25,"context_line":"    the user of the API, for instance it could be a string resulting from JSON"},{"line_number":26,"context_line":"    serialization, Google Protocol Buffers, MsgPack and so on."},{"line_number":27,"context_line":"    \"\"\""},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"    def __init__(self, group_id, member_id, capabilities):"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAATn%2F9sMA%3D","line":26,"in_reply_to":"AAAATn%2F9tyc%3D","updated":"2013-12-09 11:19:06.000000000","message":"Actually, it could be anything you want :-). Ideally, Tooz will be fully agnostic to it, for him it\u0027s just a raw bytes string.\n\nA use case for capabilities is in Nova. Indeed we could store the ComputeNode table in Tooz, i.e. the amount of memory available, the number of pcpus and so on... All kind of information which can be leveraged by the scheduler and lighten the database. \n\nThis is just an example but it can be used in more various ways, depending on the project and needs.\n\nWe will give more details in a wiki page. I hope it makes sense.","commit_id":"62e0248f00d4b07314d824a9711d8e045ea22e98"},{"author":{"_account_id":7450,"name":"Yassine Lamgarchal","email":"yassine.lamgarchal@redhat.com","username":"yassine.lamgarchal"},"change_message_id":"066018af36bb96cc1a407411186e80a3f9c5dc3e","unresolved":false,"context_lines":[{"line_number":23,"context_line":"    A member is composed of a member identifier, a group identifier and"},{"line_number":24,"context_line":"    capabilities. The capabilities correspond to an arbitrary string defined by"},{"line_number":25,"context_line":"    the user of the API, for instance it could be a string resulting from JSON"},{"line_number":26,"context_line":"    serialization, Google Protocol Buffers, MsgPack and so on."},{"line_number":27,"context_line":"    \"\"\""},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"    def __init__(self, group_id, member_id, capabilities):"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAATn%2F9u6U%3D","line":26,"in_reply_to":"AAAATn%2F9vrY%3D","updated":"2013-12-09 11:19:06.000000000","message":"There will be additional documentation for capabilities.","commit_id":"62e0248f00d4b07314d824a9711d8e045ea22e98"},{"author":{"_account_id":7450,"name":"Yassine Lamgarchal","email":"yassine.lamgarchal@redhat.com","username":"yassine.lamgarchal"},"change_message_id":"066018af36bb96cc1a407411186e80a3f9c5dc3e","unresolved":false,"context_lines":[{"line_number":23,"context_line":"    A member is composed of a member identifier, a group identifier and"},{"line_number":24,"context_line":"    capabilities. The capabilities correspond to an arbitrary string defined by"},{"line_number":25,"context_line":"    the user of the API, for instance it could be a string resulting from JSON"},{"line_number":26,"context_line":"    serialization, Google Protocol Buffers, MsgPack and so on."},{"line_number":27,"context_line":"    \"\"\""},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"    def __init__(self, group_id, member_id, capabilities):"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAATn%2F9u7E%3D","line":26,"in_reply_to":"AAAATn%2F9vzU%3D","updated":"2013-12-09 11:19:06.000000000","message":"Done","commit_id":"62e0248f00d4b07314d824a9711d8e045ea22e98"},{"author":{"_account_id":9107,"name":"Victor Stinner","email":"vstinner@redhat.com","username":"haypo"},"change_message_id":"0e444af86d0daa2d46c4941e2ec8a5ef08935a3e","unresolved":false,"context_lines":[{"line_number":23,"context_line":"    A member is composed of a member identifier, a group identifier and"},{"line_number":24,"context_line":"    capabilities. The capabilities correspond to an arbitrary string defined by"},{"line_number":25,"context_line":"    the user of the API, for instance it could be a string resulting from JSON"},{"line_number":26,"context_line":"    serialization, Google Protocol Buffers, MsgPack and so on."},{"line_number":27,"context_line":"    \"\"\""},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"    def __init__(self, group_id, member_id, capabilities):"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAATn%2F9vrY%3D","line":26,"in_reply_to":"AAAATn%2F9vzU%3D","updated":"2013-12-06 13:44:55.000000000","message":"a \"bytes string\" to be more explicit\n\nI\u0027m not sure that Member is the best place to document capabilities.","commit_id":"62e0248f00d4b07314d824a9711d8e045ea22e98"},{"author":{"_account_id":1669,"name":"Julien Danjou","display_name":"jd","email":"julien@danjou.info","username":"jdanjou"},"change_message_id":"b3d1449d0b4dca3bea6f1e118e191b6032349150","unresolved":false,"context_lines":[{"line_number":31,"context_line":"        self._member_id \u003d member_id"},{"line_number":32,"context_line":"        self._capabilities \u003d capabilities"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"    @property"},{"line_number":35,"context_line":"    def group_id(self):"},{"line_number":36,"context_line":"        return self._group_id"},{"line_number":37,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAATn%2F9vzQ%3D","line":34,"updated":"2013-12-06 13:09:43.000000000","message":"Not sure you want to do all of that, just use standard attributes.","commit_id":"62e0248f00d4b07314d824a9711d8e045ea22e98"},{"author":{"_account_id":9107,"name":"Victor Stinner","email":"vstinner@redhat.com","username":"haypo"},"change_message_id":"0e444af86d0daa2d46c4941e2ec8a5ef08935a3e","unresolved":false,"context_lines":[{"line_number":31,"context_line":"        self._member_id \u003d member_id"},{"line_number":32,"context_line":"        self._capabilities \u003d capabilities"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"    @property"},{"line_number":35,"context_line":"    def group_id(self):"},{"line_number":36,"context_line":"        return self._group_id"},{"line_number":37,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAATn%2F9vr8%3D","line":34,"in_reply_to":"AAAATn%2F9vzQ%3D","updated":"2013-12-06 13:44:55.000000000","message":"Agreed, again, we are consentent adults ;)","commit_id":"62e0248f00d4b07314d824a9711d8e045ea22e98"},{"author":{"_account_id":7450,"name":"Yassine Lamgarchal","email":"yassine.lamgarchal@redhat.com","username":"yassine.lamgarchal"},"change_message_id":"066018af36bb96cc1a407411186e80a3f9c5dc3e","unresolved":false,"context_lines":[{"line_number":31,"context_line":"        self._member_id \u003d member_id"},{"line_number":32,"context_line":"        self._capabilities \u003d capabilities"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"    @property"},{"line_number":35,"context_line":"    def group_id(self):"},{"line_number":36,"context_line":"        return self._group_id"},{"line_number":37,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAATn%2F9u6I%3D","line":34,"in_reply_to":"AAAATn%2F9vzQ%3D","updated":"2013-12-09 11:19:06.000000000","message":"Done","commit_id":"62e0248f00d4b07314d824a9711d8e045ea22e98"}],"tooz/tests/__init__.py":[{"author":{"_account_id":1669,"name":"Julien Danjou","display_name":"jd","email":"julien@danjou.info","username":"jdanjou"},"change_message_id":"b3d1449d0b4dca3bea6f1e118e191b6032349150","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# -*- coding: utf-8 -*-"},{"line_number":2,"context_line":""},{"line_number":3,"context_line":"# vim: tabstop\u003d4 shiftwidth\u003d4 softtabstop\u003d4"},{"line_number":4,"context_line":""},{"line_number":5,"context_line":"#    Copyright (C) 2013 eNovance Inc. All Rights Reserved."}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAATn%2F9vzM%3D","line":2,"updated":"2013-12-06 13:09:43.000000000","message":"No license in empty files","commit_id":"62e0248f00d4b07314d824a9711d8e045ea22e98"},{"author":{"_account_id":7450,"name":"Yassine Lamgarchal","email":"yassine.lamgarchal@redhat.com","username":"yassine.lamgarchal"},"change_message_id":"066018af36bb96cc1a407411186e80a3f9c5dc3e","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# -*- coding: utf-8 -*-"},{"line_number":2,"context_line":""},{"line_number":3,"context_line":"# vim: tabstop\u003d4 shiftwidth\u003d4 softtabstop\u003d4"},{"line_number":4,"context_line":""},{"line_number":5,"context_line":"#    Copyright (C) 2013 eNovance Inc. All Rights Reserved."}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAATn%2F9vc0%3D","line":2,"in_reply_to":"AAAATn%2F9vzM%3D","updated":"2013-12-09 11:19:06.000000000","message":"Done","commit_id":"62e0248f00d4b07314d824a9711d8e045ea22e98"}],"tooz/tests/test_api.py":[{"author":{"_account_id":688,"name":"Sandy Walsh","email":"sandy.walsh@rackspace.com","username":"sandy-walsh"},"change_message_id":"53c29b3c2650fe21039d3786ce75ef011de780db","unresolved":false,"context_lines":[{"line_number":17,"context_line":"#    under the License."},{"line_number":18,"context_line":""},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"from testscenarios import TestWithScenarios"},{"line_number":21,"context_line":"from tooz.api import API"},{"line_number":22,"context_line":"from uuid import uuid4"},{"line_number":23,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAATn%2F9tyY%3D","line":20,"updated":"2013-12-06 19:51:26.000000000","message":"import module, not class","commit_id":"62e0248f00d4b07314d824a9711d8e045ea22e98"},{"author":{"_account_id":9107,"name":"Victor Stinner","email":"vstinner@redhat.com","username":"haypo"},"change_message_id":"0e444af86d0daa2d46c4941e2ec8a5ef08935a3e","unresolved":false,"context_lines":[{"line_number":18,"context_line":""},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"from testscenarios import TestWithScenarios"},{"line_number":21,"context_line":"from tooz.api import API"},{"line_number":22,"context_line":"from uuid import uuid4"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"zookeeper_tests \u003d (\u0027zookeeper_tests\u0027, {\u0027backend\u0027: \u0027zookeeper\u0027,"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAATn%2F9vpY%3D","line":21,"updated":"2013-12-06 13:44:55.000000000","message":"tooz import should be at the end, with a new line","commit_id":"62e0248f00d4b07314d824a9711d8e045ea22e98"},{"author":{"_account_id":7450,"name":"Yassine Lamgarchal","email":"yassine.lamgarchal@redhat.com","username":"yassine.lamgarchal"},"change_message_id":"066018af36bb96cc1a407411186e80a3f9c5dc3e","unresolved":false,"context_lines":[{"line_number":18,"context_line":""},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"from testscenarios import TestWithScenarios"},{"line_number":21,"context_line":"from tooz.api import API"},{"line_number":22,"context_line":"from uuid import uuid4"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"zookeeper_tests \u003d (\u0027zookeeper_tests\u0027, {\u0027backend\u0027: \u0027zookeeper\u0027,"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAATn%2F9u%2BA%3D","line":21,"in_reply_to":"AAAATn%2F9vpY%3D","updated":"2013-12-09 11:19:06.000000000","message":"Done","commit_id":"62e0248f00d4b07314d824a9711d8e045ea22e98"},{"author":{"_account_id":688,"name":"Sandy Walsh","email":"sandy.walsh@rackspace.com","username":"sandy-walsh"},"change_message_id":"53c29b3c2650fe21039d3786ce75ef011de780db","unresolved":false,"context_lines":[{"line_number":21,"context_line":"from tooz.api import API"},{"line_number":22,"context_line":"from uuid import uuid4"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"zookeeper_tests \u003d (\u0027zookeeper_tests\u0027, {\u0027backend\u0027: \u0027zookeeper\u0027,"},{"line_number":25,"context_line":"                                       \u0027kwargs\u0027: {\u0027hosts\u0027: \u0027127.0.0.1:2181\u0027}})"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAATn%2F9txw%3D","line":24,"updated":"2013-12-06 19:51:26.000000000","message":"This is an integration test. We should be very strict on not mixing integration with unit tests. A FakeDriver would be a good start.","commit_id":"62e0248f00d4b07314d824a9711d8e045ea22e98"},{"author":{"_account_id":9107,"name":"Victor Stinner","email":"vstinner@redhat.com","username":"haypo"},"change_message_id":"0e444af86d0daa2d46c4941e2ec8a5ef08935a3e","unresolved":false,"context_lines":[{"line_number":27,"context_line":""},{"line_number":28,"context_line":"class TestAPI(TestWithScenarios):"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"    scenarios \u003d [zookeeper_tests]"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"    def setUp(self):"},{"line_number":33,"context_line":"        self.group_id_test \u003d self._get_random_uuid()"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAATn%2F9vpM%3D","line":30,"updated":"2013-12-06 13:44:55.000000000","message":"why do you need a zookeeper_tests variable?","commit_id":"62e0248f00d4b07314d824a9711d8e045ea22e98"},{"author":{"_account_id":7450,"name":"Yassine Lamgarchal","email":"yassine.lamgarchal@redhat.com","username":"yassine.lamgarchal"},"change_message_id":"066018af36bb96cc1a407411186e80a3f9c5dc3e","unresolved":false,"context_lines":[{"line_number":27,"context_line":""},{"line_number":28,"context_line":"class TestAPI(TestWithScenarios):"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"    scenarios \u003d [zookeeper_tests]"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"    def setUp(self):"},{"line_number":33,"context_line":"        self.group_id_test \u003d self._get_random_uuid()"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAATn%2F9u%2Fw%3D","line":30,"in_reply_to":"AAAATn%2F9vpM%3D","updated":"2013-12-09 11:19:06.000000000","message":"In order to facilitate the integration of future backends and make it more visible.","commit_id":"62e0248f00d4b07314d824a9711d8e045ea22e98"},{"author":{"_account_id":9107,"name":"Victor Stinner","email":"vstinner@redhat.com","username":"haypo"},"change_message_id":"0e444af86d0daa2d46c4941e2ec8a5ef08935a3e","unresolved":false,"context_lines":[{"line_number":31,"context_line":""},{"line_number":32,"context_line":"    def setUp(self):"},{"line_number":33,"context_line":"        self.group_id_test \u003d self._get_random_uuid()"},{"line_number":34,"context_line":"        self.member_id_test \u003d self._get_random_uuid()"},{"line_number":35,"context_line":"        self.kwargs[\u0027member_id\u0027] \u003d self.member_id_test"},{"line_number":36,"context_line":"        self._client \u003d API(self.backend, self.kwargs)"},{"line_number":37,"context_line":"        self._client.start()"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAATn%2F9vqk%3D","line":34,"updated":"2013-12-06 13:44:55.000000000","message":"a backend may require a specific group or member identifier, you may add create_group_id() and create_member_id() methods (the default implementation would just call _get_random_uuid())\n\nyou may remove the \"_test\" suffix from those attributes.","commit_id":"62e0248f00d4b07314d824a9711d8e045ea22e98"},{"author":{"_account_id":7450,"name":"Yassine Lamgarchal","email":"yassine.lamgarchal@redhat.com","username":"yassine.lamgarchal"},"change_message_id":"066018af36bb96cc1a407411186e80a3f9c5dc3e","unresolved":false,"context_lines":[{"line_number":31,"context_line":""},{"line_number":32,"context_line":"    def setUp(self):"},{"line_number":33,"context_line":"        self.group_id_test \u003d self._get_random_uuid()"},{"line_number":34,"context_line":"        self.member_id_test \u003d self._get_random_uuid()"},{"line_number":35,"context_line":"        self.kwargs[\u0027member_id\u0027] \u003d self.member_id_test"},{"line_number":36,"context_line":"        self._client \u003d API(self.backend, self.kwargs)"},{"line_number":37,"context_line":"        self._client.start()"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAATn%2F9vCc%3D","line":34,"in_reply_to":"AAAATn%2F9vqk%3D","updated":"2013-12-09 11:19:06.000000000","message":"A random uuid is sufficient for all tests, i don\u0027t think we need a custom generator id here. Furthermore, this unit tests suite must be fully agnostic to all backends.","commit_id":"62e0248f00d4b07314d824a9711d8e045ea22e98"},{"author":{"_account_id":9107,"name":"Victor Stinner","email":"vstinner@redhat.com","username":"haypo"},"change_message_id":"0e444af86d0daa2d46c4941e2ec8a5ef08935a3e","unresolved":false,"context_lines":[{"line_number":32,"context_line":"    def setUp(self):"},{"line_number":33,"context_line":"        self.group_id_test \u003d self._get_random_uuid()"},{"line_number":34,"context_line":"        self.member_id_test \u003d self._get_random_uuid()"},{"line_number":35,"context_line":"        self.kwargs[\u0027member_id\u0027] \u003d self.member_id_test"},{"line_number":36,"context_line":"        self._client \u003d API(self.backend, self.kwargs)"},{"line_number":37,"context_line":"        self._client.start()"},{"line_number":38,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAATn%2F9vq8%3D","line":35,"updated":"2013-12-06 13:44:55.000000000","message":"where does kwargs come from? From TestWithScenarios?","commit_id":"62e0248f00d4b07314d824a9711d8e045ea22e98"},{"author":{"_account_id":7450,"name":"Yassine Lamgarchal","email":"yassine.lamgarchal@redhat.com","username":"yassine.lamgarchal"},"change_message_id":"066018af36bb96cc1a407411186e80a3f9c5dc3e","unresolved":false,"context_lines":[{"line_number":32,"context_line":"    def setUp(self):"},{"line_number":33,"context_line":"        self.group_id_test \u003d self._get_random_uuid()"},{"line_number":34,"context_line":"        self.member_id_test \u003d self._get_random_uuid()"},{"line_number":35,"context_line":"        self.kwargs[\u0027member_id\u0027] \u003d self.member_id_test"},{"line_number":36,"context_line":"        self._client \u003d API(self.backend, self.kwargs)"},{"line_number":37,"context_line":"        self._client.start()"},{"line_number":38,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAATn%2F9vD0%3D","line":35,"in_reply_to":"AAAATn%2F9vq8%3D","updated":"2013-12-09 11:19:06.000000000","message":"Yes.","commit_id":"62e0248f00d4b07314d824a9711d8e045ea22e98"},{"author":{"_account_id":9107,"name":"Victor Stinner","email":"vstinner@redhat.com","username":"haypo"},"change_message_id":"0e444af86d0daa2d46c4941e2ec8a5ef08935a3e","unresolved":false,"context_lines":[{"line_number":45,"context_line":"        self.assertIn(self.group_id_test, all_group_ids)"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"    def test_get_all_groups_ids(self):"},{"line_number":48,"context_line":"        test_groups_ids \u003d [self._get_random_uuid() for _ in xrange(0, 5)]"},{"line_number":49,"context_line":"        for group_id in test_groups_ids:"},{"line_number":50,"context_line":"            self._client.create_group(group_id)"},{"line_number":51,"context_line":"        created_groups \u003d self._client.get_all_groups_ids()"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAATn%2F9vqM%3D","line":48,"updated":"2013-12-06 13:44:55.000000000","message":"reuse create_group_id() here if you chose to add such method","commit_id":"62e0248f00d4b07314d824a9711d8e045ea22e98"},{"author":{"_account_id":9107,"name":"Victor Stinner","email":"vstinner@redhat.com","username":"haypo"},"change_message_id":"0e444af86d0daa2d46c4941e2ec8a5ef08935a3e","unresolved":false,"context_lines":[{"line_number":63,"context_line":"        self._client.create_group(self.group_id_test)"},{"line_number":64,"context_line":"        self._client.join_group(self.group_id_test)"},{"line_number":65,"context_line":"        member_objects \u003d self._client.get_members(self.group_id_test)"},{"line_number":66,"context_line":"        member_list \u003d [member.member_id for member in member_objects]"},{"line_number":67,"context_line":"        self.assertIn(self.member_id_test, member_list)"},{"line_number":68,"context_line":"        self._client.leave_group(self.group_id_test)"},{"line_number":69,"context_line":"        new_member_objects \u003d self._client.get_members(self.group_id_test)"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAATn%2F9vqE%3D","line":66,"updated":"2013-12-06 13:44:55.000000000","message":"member_ids name would be less confusing","commit_id":"62e0248f00d4b07314d824a9711d8e045ea22e98"},{"author":{"_account_id":7450,"name":"Yassine Lamgarchal","email":"yassine.lamgarchal@redhat.com","username":"yassine.lamgarchal"},"change_message_id":"066018af36bb96cc1a407411186e80a3f9c5dc3e","unresolved":false,"context_lines":[{"line_number":63,"context_line":"        self._client.create_group(self.group_id_test)"},{"line_number":64,"context_line":"        self._client.join_group(self.group_id_test)"},{"line_number":65,"context_line":"        member_objects \u003d self._client.get_members(self.group_id_test)"},{"line_number":66,"context_line":"        member_list \u003d [member.member_id for member in member_objects]"},{"line_number":67,"context_line":"        self.assertIn(self.member_id_test, member_list)"},{"line_number":68,"context_line":"        self._client.leave_group(self.group_id_test)"},{"line_number":69,"context_line":"        new_member_objects \u003d self._client.get_members(self.group_id_test)"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAATn%2F9vFI%3D","line":66,"in_reply_to":"AAAATn%2F9vqE%3D","updated":"2013-12-09 11:19:06.000000000","message":"Done","commit_id":"62e0248f00d4b07314d824a9711d8e045ea22e98"},{"author":{"_account_id":8122,"name":"Cyril Roelandt","email":"cyril@redhat.com","username":"cyril.roelandt.enovance"},"change_message_id":"ae093f98d11ad807cd24593ad7382b8fc35f41ce","unresolved":false,"context_lines":[{"line_number":27,"context_line":""},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"class TestAPI(testscenarios.TestWithScenarios):"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"    scenarios \u003d [zookeeper_tests]"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"    def setUp(self):"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAATn%2F9pB0%3D","line":30,"updated":"2013-12-09 12:17:37.000000000","message":"These tests are not run yet, should we add them ?","commit_id":"db1708709fc5c9685eb443cd70f0ec798f0f487b"},{"author":{"_account_id":7450,"name":"Yassine Lamgarchal","email":"yassine.lamgarchal@redhat.com","username":"yassine.lamgarchal"},"change_message_id":"25c1314310e6eeae3ae955a2ca30a3854931e209","unresolved":false,"context_lines":[{"line_number":27,"context_line":""},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"class TestAPI(testscenarios.TestWithScenarios):"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"    scenarios \u003d [zookeeper_tests]"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"    def setUp(self):"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAATn%2F9op4%3D","line":30,"in_reply_to":"AAAATn%2F9pB0%3D","updated":"2013-12-09 14:12:50.000000000","message":"Yes i need the most feedbacks. For now, you can run a local zookeeper and run the tests before we automate it in the CI.","commit_id":"db1708709fc5c9685eb443cd70f0ec798f0f487b"},{"author":{"_account_id":6924,"name":"Pradeep Kilambi","email":"pkilambi@redhat.com","username":"pkilambi"},"change_message_id":"5ad3d2ee46c58f7ad28cf7d926b2084c4ce9e862","unresolved":false,"context_lines":[{"line_number":22,"context_line":""},{"line_number":23,"context_line":"import tooz.api"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"zookeeper_tests \u003d (\u0027zookeeper_tests\u0027, {\u0027backend\u0027: \u0027zookeeper\u0027,"},{"line_number":26,"context_line":"                                       \u0027kwargs\u0027: {\u0027hosts\u0027: \u0027127.0.0.1:2181\u0027}})"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATn%2F9mXI%3D","line":25,"updated":"2013-12-09 19:50:54.000000000","message":"Did you consider mocking out the backend?","commit_id":"73ef89698c4c771e7e628090a98424562440058e"}],"tooz/tests/test_coordination.py":[{"author":{"_account_id":1669,"name":"Julien Danjou","display_name":"jd","email":"julien@danjou.info","username":"jdanjou"},"change_message_id":"4dca5bd62bdc9e5b1bfc1a4c7ac9d64035d5f557","unresolved":false,"context_lines":[{"line_number":25,"context_line":"                                       \u0027kwargs\u0027: {\u0027hosts\u0027: \u0027127.0.0.1:2181\u0027}})"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"class TestAPI(testscenarios.TestWithScenarios):"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"    scenarios \u003d [zookeeper_tests]"},{"line_number":31,"context_line":""}],"source_content_type":"text/x-python","patch_set":20,"id":"AAAATn%2F8%2FqM%3D","line":28,"updated":"2013-12-17 22:31:05.000000000","message":"Add testtools.TestCase in the inheritance list","commit_id":"86526930703c4f9c5a056cf93de0add1bd379e62"}]}
