)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"b2e0e9c1a3d6e95b4fcab0153fb805afe35a848a","unresolved":false,"context_lines":[{"line_number":7,"context_line":"Create user returns 400 without a password"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"If it is intended to create a new user without password (is optional)"},{"line_number":10,"context_line":"keystone create-user --name \u003cname\u003e"},{"line_number":11,"context_line":"keystone fails returning error 400."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"The change consist in checking if the request has password: None"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"AAAATn%2F9%2Fwc%3D","line":10,"updated":"2013-12-03 23:47:28.000000000","message":"Should this be user-create?\n\nI may also rephrase this as:\n\nWhen creating a new user without a password (optional) the server will return a 400 status code.  Example call:\n\n  keystone user-create --name \u003cname\u003e","commit_id":"2e838a20245d5c1377faa67d24a86eb39a07d237"}],"keystone/common/utils.py":[{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"a9dd31157983f44db9c62d9969aa7400add64007","unresolved":false,"context_lines":[{"line_number":88,"context_line":"def hash_user_password(user):"},{"line_number":89,"context_line":"    \"\"\"Hash a user dict\u0027s password without modifying the passed-in dict.\"\"\""},{"line_number":90,"context_line":"    try:"},{"line_number":91,"context_line":"        password \u003d user[\u0027password\u0027]"},{"line_number":92,"context_line":"        if password is None:"},{"line_number":93,"context_line":"            return user"},{"line_number":94,"context_line":"    except KeyError:"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATn%2F90F4%3D","line":91,"updated":"2013-12-05 16:38:29.000000000","message":"change this to user.get(\u0027password\u0027) such that you also handle the case of no password in the request the same way","commit_id":"a96c2ed6083b9bcc5038e758f3d91ff4fb660990"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"19ecdc98785340268b7ce37a76c752277fe537ab","unresolved":false,"context_lines":[{"line_number":88,"context_line":"def hash_user_password(user):"},{"line_number":89,"context_line":"    \"\"\"Hash a user dict\u0027s password without modifying the passed-in dict.\"\"\""},{"line_number":90,"context_line":"    try:"},{"line_number":91,"context_line":"        password \u003d user[\u0027password\u0027]"},{"line_number":92,"context_line":"        if password is None:"},{"line_number":93,"context_line":"            return user"},{"line_number":94,"context_line":"    except KeyError:"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATn%2F9zyU%3D","line":91,"in_reply_to":"AAAATn%2F90F4%3D","updated":"2013-12-05 17:23:11.000000000","message":"It\u0027s handle by the except KeyError, but I would rather see that removed in favor of the user.get method.","commit_id":"a96c2ed6083b9bcc5038e758f3d91ff4fb660990"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"35a898dfd5ee76a46afa7b72337b8f1dd2a5ca7f","unresolved":false,"context_lines":[{"line_number":92,"context_line":"        if password is None:"},{"line_number":93,"context_line":"            return user"},{"line_number":94,"context_line":"    except KeyError:"},{"line_number":95,"context_line":"        return user"},{"line_number":96,"context_line":"    else:"},{"line_number":97,"context_line":"        return dict(user, password\u003dhash_password(password))"},{"line_number":98,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATn%2F9zyg%3D","line":95,"updated":"2013-12-05 17:20:34.000000000","message":"just realized the above is being handled by the existing try/except -- eliminating it would be appreciated so you\u0027re not returning \u0027user\u0027 twice though, to handle basically the same condition seperately","commit_id":"a96c2ed6083b9bcc5038e758f3d91ff4fb660990"},{"author":{"_account_id":9450,"name":"Juan Manuel Ollé","email":"juan.m.olle@intel.com","username":"jmolle"},"change_message_id":"9766455a58bd01f9fa08adea125798656f56faaf","unresolved":false,"context_lines":[{"line_number":92,"context_line":"        if password is None:"},{"line_number":93,"context_line":"            return user"},{"line_number":94,"context_line":"    except KeyError:"},{"line_number":95,"context_line":"        return user"},{"line_number":96,"context_line":"    else:"},{"line_number":97,"context_line":"        return dict(user, password\u003dhash_password(password))"},{"line_number":98,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATn%2F9zxQ%3D","line":95,"in_reply_to":"AAAATn%2F9zyg%3D","updated":"2013-12-05 17:23:24.000000000","message":"Yes I already see it, in fact due to the return in the if body, the else statement is not needed any more, but I prefer to keep it, what do you think?","commit_id":"a96c2ed6083b9bcc5038e758f3d91ff4fb660990"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"a9dd31157983f44db9c62d9969aa7400add64007","unresolved":false,"context_lines":[{"line_number":100,"context_line":"def hash_ldap_user_password(user):"},{"line_number":101,"context_line":"    \"\"\"Hash a user dict\u0027s password without modifying the passed-in dict.\"\"\""},{"line_number":102,"context_line":"    try:"},{"line_number":103,"context_line":"        password \u003d user[\u0027password\u0027]"},{"line_number":104,"context_line":"        if password is None:"},{"line_number":105,"context_line":"            return user"},{"line_number":106,"context_line":"    except KeyError:"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATn%2F90Fw%3D","line":103,"updated":"2013-12-05 16:38:29.000000000","message":"same as above","commit_id":"a96c2ed6083b9bcc5038e758f3d91ff4fb660990"}],"keystone/tests/test_backend.py":[{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"a9dd31157983f44db9c62d9969aa7400add64007","unresolved":false,"context_lines":[{"line_number":1775,"context_line":"        user \u003d {\u0027id\u0027: \u0027fake1\u0027, \u0027name\u0027: \u0027fake1\u0027, \u0027password\u0027: None,"},{"line_number":1776,"context_line":"                \u0027domain_id\u0027: DEFAULT_DOMAIN_ID}"},{"line_number":1777,"context_line":"        self.identity_api.create_user(\u0027fake1\u0027, user)"},{"line_number":1778,"context_line":"        self.identity_api.get_user(\u0027fake1\u0027)"},{"line_number":1779,"context_line":""},{"line_number":1780,"context_line":"    def test_create_user_invalid_name_fails(self):"},{"line_number":1781,"context_line":"        user \u003d {\u0027id\u0027: \u0027fake1\u0027, \u0027name\u0027: None,"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATn%2F90FU%3D","line":1778,"updated":"2013-12-05 16:38:29.000000000","message":"you should also verify that the user can\u0027t subsequently be authenticated with an empty string or null (i\u0027m not sure this is explicitly tested somewhere else)","commit_id":"a96c2ed6083b9bcc5038e758f3d91ff4fb660990"},{"author":{"_account_id":6460,"name":"Brad Topol","email":"btopol@us.ibm.com","username":"btopol"},"change_message_id":"738acb57738e6ac7c911eab7616436fc72e445f5","unresolved":false,"context_lines":[{"line_number":1765,"context_line":"                          \u0027fake1\u0027,"},{"line_number":1766,"context_line":"                          user)"},{"line_number":1767,"context_line":""},{"line_number":1768,"context_line":"    def test_create_user_missed_password_works(self):"},{"line_number":1769,"context_line":"        user \u003d {\u0027id\u0027: \u0027fake1\u0027, \u0027name\u0027: \u0027fake1\u0027,"},{"line_number":1770,"context_line":"                \u0027domain_id\u0027: DEFAULT_DOMAIN_ID}"},{"line_number":1771,"context_line":"        self.identity_api.create_user(\u0027fake1\u0027, user)"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAATn%2F9mqw%3D","line":1768,"updated":"2013-12-09 19:03:03.000000000","message":"I don\u0027t understand the name of this function.  If you are testing to see if create user missed password  \"works\"  then why does the test case check for an AssertionError?","commit_id":"f65dea410710b37ed814dafe9c705345c5a1926a"},{"author":{"_account_id":6460,"name":"Brad Topol","email":"btopol@us.ibm.com","username":"btopol"},"change_message_id":"cbfee76049933a16366ade02e599fa48a64c178b","unresolved":false,"context_lines":[{"line_number":1765,"context_line":"                          \u0027fake1\u0027,"},{"line_number":1766,"context_line":"                          user)"},{"line_number":1767,"context_line":""},{"line_number":1768,"context_line":"    def test_create_user_missed_password_works(self):"},{"line_number":1769,"context_line":"        user \u003d {\u0027id\u0027: \u0027fake1\u0027, \u0027name\u0027: \u0027fake1\u0027,"},{"line_number":1770,"context_line":"                \u0027domain_id\u0027: DEFAULT_DOMAIN_ID}"},{"line_number":1771,"context_line":"        self.identity_api.create_user(\u0027fake1\u0027, user)"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAATn%2F9mOg%3D","line":1768,"in_reply_to":"AAAATn%2F9mqw%3D","updated":"2013-12-09 20:29:14.000000000","message":"So instead of changing the name of the function just add the comment suggested below.","commit_id":"f65dea410710b37ed814dafe9c705345c5a1926a"},{"author":{"_account_id":6460,"name":"Brad Topol","email":"btopol@us.ibm.com","username":"btopol"},"change_message_id":"cbfee76049933a16366ade02e599fa48a64c178b","unresolved":false,"context_lines":[{"line_number":1770,"context_line":"                \u0027domain_id\u0027: DEFAULT_DOMAIN_ID}"},{"line_number":1771,"context_line":"        self.identity_api.create_user(\u0027fake1\u0027, user)"},{"line_number":1772,"context_line":"        self.identity_api.get_user(\u0027fake1\u0027)"},{"line_number":1773,"context_line":"        self.assertRaises(AssertionError,"},{"line_number":1774,"context_line":"                          self.identity_api.authenticate,"},{"line_number":1775,"context_line":"                          user_id\u003d\u0027fake1\u0027,"},{"line_number":1776,"context_line":"                          password\u003d\u0027\u0027)"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAATn%2F9mPg%3D","line":1773,"updated":"2013-12-09 20:29:14.000000000","message":"Add a comment  here that says \"Make sure  the user is not allowed to login with a password that  is empty string or None\"","commit_id":"f65dea410710b37ed814dafe9c705345c5a1926a"},{"author":{"_account_id":6460,"name":"Brad Topol","email":"btopol@us.ibm.com","username":"btopol"},"change_message_id":"738acb57738e6ac7c911eab7616436fc72e445f5","unresolved":false,"context_lines":[{"line_number":1779,"context_line":"                          user_id\u003d\u0027fake1\u0027,"},{"line_number":1780,"context_line":"                          password\u003dNone)"},{"line_number":1781,"context_line":""},{"line_number":1782,"context_line":"    def test_create_user_none_password_works(self):"},{"line_number":1783,"context_line":"        user \u003d {\u0027id\u0027: \u0027fake1\u0027, \u0027name\u0027: \u0027fake1\u0027, \u0027password\u0027: None,"},{"line_number":1784,"context_line":"                \u0027domain_id\u0027: DEFAULT_DOMAIN_ID}"},{"line_number":1785,"context_line":"        self.identity_api.create_user(\u0027fake1\u0027, user)"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAATn%2F9mq8%3D","line":1782,"updated":"2013-12-09 19:03:03.000000000","message":"I don\u0027t understand the name of this function.  If you are testing to see if none password \"works\"  why does the test case check for an AssertionError?","commit_id":"f65dea410710b37ed814dafe9c705345c5a1926a"},{"author":{"_account_id":6460,"name":"Brad Topol","email":"btopol@us.ibm.com","username":"btopol"},"change_message_id":"cbfee76049933a16366ade02e599fa48a64c178b","unresolved":false,"context_lines":[{"line_number":1779,"context_line":"                          user_id\u003d\u0027fake1\u0027,"},{"line_number":1780,"context_line":"                          password\u003dNone)"},{"line_number":1781,"context_line":""},{"line_number":1782,"context_line":"    def test_create_user_none_password_works(self):"},{"line_number":1783,"context_line":"        user \u003d {\u0027id\u0027: \u0027fake1\u0027, \u0027name\u0027: \u0027fake1\u0027, \u0027password\u0027: None,"},{"line_number":1784,"context_line":"                \u0027domain_id\u0027: DEFAULT_DOMAIN_ID}"},{"line_number":1785,"context_line":"        self.identity_api.create_user(\u0027fake1\u0027, user)"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAATn%2F9mOo%3D","line":1782,"in_reply_to":"AAAATn%2F9mq8%3D","updated":"2013-12-09 20:29:14.000000000","message":"So instead of changing the name of the function just add the comment suggested below.","commit_id":"f65dea410710b37ed814dafe9c705345c5a1926a"},{"author":{"_account_id":6460,"name":"Brad Topol","email":"btopol@us.ibm.com","username":"btopol"},"change_message_id":"cbfee76049933a16366ade02e599fa48a64c178b","unresolved":false,"context_lines":[{"line_number":1784,"context_line":"                \u0027domain_id\u0027: DEFAULT_DOMAIN_ID}"},{"line_number":1785,"context_line":"        self.identity_api.create_user(\u0027fake1\u0027, user)"},{"line_number":1786,"context_line":"        self.identity_api.get_user(\u0027fake1\u0027)"},{"line_number":1787,"context_line":"        self.assertRaises(AssertionError,"},{"line_number":1788,"context_line":"                          self.identity_api.authenticate,"},{"line_number":1789,"context_line":"                          user_id\u003d\u0027fake1\u0027,"},{"line_number":1790,"context_line":"                          password\u003d\u0027\u0027)"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAATn%2F9mO4%3D","line":1787,"updated":"2013-12-09 20:29:14.000000000","message":"Add a comment  here that says \"Make sure  the user is not allowed to login with a password that  is empty string or None\"","commit_id":"f65dea410710b37ed814dafe9c705345c5a1926a"}],"keystone/tests/test_utils.py":[{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"fee63f3834c6f8a136bb9ca1026a05579b15df9a","unresolved":false,"context_lines":[{"line_number":83,"context_line":"        user \u003d {\"email\": None,"},{"line_number":84,"context_line":"                \"enabled\": True,"},{"line_number":85,"context_line":"                \"name\": \"hthtest\","},{"line_number":86,"context_line":"                \"tenantId\": None}"},{"line_number":87,"context_line":"        hashed \u003d utils.hash_user_password(user)"},{"line_number":88,"context_line":"        self.assertEqual(user, hashed)"},{"line_number":89,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAATn%2F9mi4%3D","line":86,"updated":"2013-12-09 19:17:57.000000000","message":"you don\u0027t need other attributes as we only care about the password attribute. I think you can also consolidate code. For example,\n\nfor user in [{}, {\u0027password\u0027: None}, {\u0027password\u0027: \u0027\u0027}]:\n    hashed \u003d utils.hash_user_password(user)\n    self.assertEqual(user, hashed)","commit_id":"f65dea410710b37ed814dafe9c705345c5a1926a"},{"author":{"_account_id":9450,"name":"Juan Manuel Ollé","email":"juan.m.olle@intel.com","username":"jmolle"},"change_message_id":"0ce707ed663e16f77190f91e131ce1d970a47778","unresolved":false,"context_lines":[{"line_number":83,"context_line":"        user \u003d {\"email\": None,"},{"line_number":84,"context_line":"                \"enabled\": True,"},{"line_number":85,"context_line":"                \"name\": \"hthtest\","},{"line_number":86,"context_line":"                \"tenantId\": None}"},{"line_number":87,"context_line":"        hashed \u003d utils.hash_user_password(user)"},{"line_number":88,"context_line":"        self.assertEqual(user, hashed)"},{"line_number":89,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAATn%2F9maA%3D","line":86,"in_reply_to":"AAAATn%2F9mcs%3D","updated":"2013-12-09 19:41:51.000000000","message":"David: Agree, is what Leandro comment, I\u0027ll change it, but I prefer to keep utils.hash_user_password(user) in the original method because is what I\u0027m testing if you agree with it","commit_id":"f65dea410710b37ed814dafe9c705345c5a1926a"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"49492e8144a197a3e24e582e2155dd82c838ee04","unresolved":false,"context_lines":[{"line_number":83,"context_line":"        user \u003d {\"email\": None,"},{"line_number":84,"context_line":"                \"enabled\": True,"},{"line_number":85,"context_line":"                \"name\": \"hthtest\","},{"line_number":86,"context_line":"                \"tenantId\": None}"},{"line_number":87,"context_line":"        hashed \u003d utils.hash_user_password(user)"},{"line_number":88,"context_line":"        self.assertEqual(user, hashed)"},{"line_number":89,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAATn%2F9mcs%3D","line":86,"in_reply_to":"AAAATn%2F9meE%3D","updated":"2013-12-09 19:37:52.000000000","message":"Something like this can decrease the duplication:\n\nEMPTY \u003d object()\ndef _hashed_user_password(self, password\u003dEMPTY):\n    user \u003d {\"email\": None,\n               \"enabled\": True,\n               \"name\": \"hthtest\",\n               \"tenantId\": None}\n    if password is not SENTINAL:\n        user[\u0027password\u0027] \u003d password\n    return utils.hash_user_password(user)","commit_id":"f65dea410710b37ed814dafe9c705345c5a1926a"},{"author":{"_account_id":9275,"name":"Leandro Ignacio Costantino","email":"leandro.i.costantino@intel.com","username":"lcostantino"},"change_message_id":"3460912c89a8b1540399a00026405387c83c996d","unresolved":false,"context_lines":[{"line_number":83,"context_line":"        user \u003d {\"email\": None,"},{"line_number":84,"context_line":"                \"enabled\": True,"},{"line_number":85,"context_line":"                \"name\": \"hthtest\","},{"line_number":86,"context_line":"                \"tenantId\": None}"},{"line_number":87,"context_line":"        hashed \u003d utils.hash_user_password(user)"},{"line_number":88,"context_line":"        self.assertEqual(user, hashed)"},{"line_number":89,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAATn%2F9meE%3D","line":86,"in_reply_to":"AAAATn%2F9mgc%3D","updated":"2013-12-09 19:29:43.000000000","message":"IMHO will be better to consolidate that common code in something like _test_hash_user_password(self, password ) and then \nkeep every test name.\n\nex: test_hash_user_pasword_without_password(self):\n              self._test_hash_user_pasword(password\u003dNone)\n\netc...","commit_id":"f65dea410710b37ed814dafe9c705345c5a1926a"},{"author":{"_account_id":9450,"name":"Juan Manuel Ollé","email":"juan.m.olle@intel.com","username":"jmolle"},"change_message_id":"52ac3edec77492f8ad5b667dce483da3cc42eff9","unresolved":false,"context_lines":[{"line_number":83,"context_line":"        user \u003d {\"email\": None,"},{"line_number":84,"context_line":"                \"enabled\": True,"},{"line_number":85,"context_line":"                \"name\": \"hthtest\","},{"line_number":86,"context_line":"                \"tenantId\": None}"},{"line_number":87,"context_line":"        hashed \u003d utils.hash_user_password(user)"},{"line_number":88,"context_line":"        self.assertEqual(user, hashed)"},{"line_number":89,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAATn%2F9mgc%3D","line":86,"in_reply_to":"AAAATn%2F9mi4%3D","updated":"2013-12-09 19:23:53.000000000","message":"Don\u0027t you think that split the test is better to localize a failure in the future? if we join all cases in a test, we could hide the problem","commit_id":"f65dea410710b37ed814dafe9c705345c5a1926a"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"e813e1320aabdea21a04bd7a6e1c53f533c6b410","unresolved":false,"context_lines":[{"line_number":79,"context_line":"        hashed \u003d utils.hash_password(bigboy)"},{"line_number":80,"context_line":"        self.assertTrue(utils.check_password(bigboy, hashed))"},{"line_number":81,"context_line":""},{"line_number":82,"context_line":"    OPTIONAL \u003d object()"},{"line_number":83,"context_line":""},{"line_number":84,"context_line":"    def _create_test_user(self, password\u003dOPTIONAL):"},{"line_number":85,"context_line":"        user \u003d {\"email\": None,"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAATn%2F9hIA%3D","line":82,"updated":"2013-12-10 17:17:12.000000000","message":"please move it to the top (line 70) so its easier to read the code","commit_id":"513f78198e6631ac13ed5e992e9883ebaa47812b"},{"author":{"_account_id":9450,"name":"Juan Manuel Ollé","email":"juan.m.olle@intel.com","username":"jmolle"},"change_message_id":"21c598c0bb7c9768a698b58ce491af2a7c8f5c0e","unresolved":false,"context_lines":[{"line_number":79,"context_line":"        hashed \u003d utils.hash_password(bigboy)"},{"line_number":80,"context_line":"        self.assertTrue(utils.check_password(bigboy, hashed))"},{"line_number":81,"context_line":""},{"line_number":82,"context_line":"    OPTIONAL \u003d object()"},{"line_number":83,"context_line":""},{"line_number":84,"context_line":"    def _create_test_user(self, password\u003dOPTIONAL):"},{"line_number":85,"context_line":"        user \u003d {\"email\": None,"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAATn%2F9hEs%3D","line":82,"in_reply_to":"AAAATn%2F9hIA%3D","updated":"2013-12-10 17:27:47.000000000","message":"I don\u0027t think moving it to the top it\u0027s clear, object should be created as close as possible to the place used (and the only place used is in this method)","commit_id":"513f78198e6631ac13ed5e992e9883ebaa47812b"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"e813e1320aabdea21a04bd7a6e1c53f533c6b410","unresolved":false,"context_lines":[{"line_number":85,"context_line":"        user \u003d {\"email\": None,"},{"line_number":86,"context_line":"                \"enabled\": True,"},{"line_number":87,"context_line":"                \"name\": \"hthtest\","},{"line_number":88,"context_line":"                \"tenantId\": None}"},{"line_number":89,"context_line":"        if password is not self.OPTIONAL:"},{"line_number":90,"context_line":"            user[\u0027password\u0027] \u003d password"},{"line_number":91,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAATn%2F9hH0%3D","line":88,"updated":"2013-12-10 17:17:12.000000000","message":"may want to remove \"email\", \"enabled\", and \"tenantId\". They are redundant as the values are already the default.","commit_id":"513f78198e6631ac13ed5e992e9883ebaa47812b"},{"author":{"_account_id":9450,"name":"Juan Manuel Ollé","email":"juan.m.olle@intel.com","username":"jmolle"},"change_message_id":"21c598c0bb7c9768a698b58ce491af2a7c8f5c0e","unresolved":false,"context_lines":[{"line_number":85,"context_line":"        user \u003d {\"email\": None,"},{"line_number":86,"context_line":"                \"enabled\": True,"},{"line_number":87,"context_line":"                \"name\": \"hthtest\","},{"line_number":88,"context_line":"                \"tenantId\": None}"},{"line_number":89,"context_line":"        if password is not self.OPTIONAL:"},{"line_number":90,"context_line":"            user[\u0027password\u0027] \u003d password"},{"line_number":91,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAATn%2F9hEU%3D","line":88,"in_reply_to":"AAAATn%2F9hH0%3D","updated":"2013-12-10 17:27:47.000000000","message":"Ok","commit_id":"513f78198e6631ac13ed5e992e9883ebaa47812b"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"e813e1320aabdea21a04bd7a6e1c53f533c6b410","unresolved":false,"context_lines":[{"line_number":97,"context_line":"        self.assertEqual(user, hashed)"},{"line_number":98,"context_line":""},{"line_number":99,"context_line":"    def test_hash_user_password_with_null_password(self):"},{"line_number":100,"context_line":"        user \u003d self._create_test_user(None)"},{"line_number":101,"context_line":"        hashed \u003d utils.hash_user_password(user)"},{"line_number":102,"context_line":"        self.assertEqual(user, hashed)"},{"line_number":103,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAATn%2F9hHg%3D","line":100,"updated":"2013-12-10 17:17:12.000000000","message":"password is keyword arg.\n\nuser \u003d self._create_test_user(password\u003dNone)\n\nplease do that for the other calls as well.","commit_id":"513f78198e6631ac13ed5e992e9883ebaa47812b"},{"author":{"_account_id":9450,"name":"Juan Manuel Ollé","email":"juan.m.olle@intel.com","username":"jmolle"},"change_message_id":"21c598c0bb7c9768a698b58ce491af2a7c8f5c0e","unresolved":false,"context_lines":[{"line_number":97,"context_line":"        self.assertEqual(user, hashed)"},{"line_number":98,"context_line":""},{"line_number":99,"context_line":"    def test_hash_user_password_with_null_password(self):"},{"line_number":100,"context_line":"        user \u003d self._create_test_user(None)"},{"line_number":101,"context_line":"        hashed \u003d utils.hash_user_password(user)"},{"line_number":102,"context_line":"        self.assertEqual(user, hashed)"},{"line_number":103,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAATn%2F9hEM%3D","line":100,"in_reply_to":"AAAATn%2F9hGE%3D","updated":"2013-12-10 17:27:47.000000000","message":"Agree with David","commit_id":"513f78198e6631ac13ed5e992e9883ebaa47812b"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"f1e241703137d5514fddfbbaf38c5f95f4659335","unresolved":false,"context_lines":[{"line_number":97,"context_line":"        self.assertEqual(user, hashed)"},{"line_number":98,"context_line":""},{"line_number":99,"context_line":"    def test_hash_user_password_with_null_password(self):"},{"line_number":100,"context_line":"        user \u003d self._create_test_user(None)"},{"line_number":101,"context_line":"        hashed \u003d utils.hash_user_password(user)"},{"line_number":102,"context_line":"        self.assertEqual(user, hashed)"},{"line_number":103,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAATn%2F9hGE%3D","line":100,"in_reply_to":"AAAATn%2F9hHg%3D","updated":"2013-12-10 17:20:58.000000000","message":"Is this just a preferred Keystone style item?  From a pure Python perspective this makes no difference.","commit_id":"513f78198e6631ac13ed5e992e9883ebaa47812b"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"e813e1320aabdea21a04bd7a6e1c53f533c6b410","unresolved":false,"context_lines":[{"line_number":103,"context_line":""},{"line_number":104,"context_line":"    def test_hash_user_password_with_empty_password(self):"},{"line_number":105,"context_line":"        password \u003d \u0027\u0027"},{"line_number":106,"context_line":"        user \u003d self._create_test_user(password)"},{"line_number":107,"context_line":"        user_hashed \u003d utils.hash_user_password(user)"},{"line_number":108,"context_line":"        password_hashed \u003d user_hashed[\u0027password\u0027]"},{"line_number":109,"context_line":"        self.assertTrue(utils.check_password(password, password_hashed))"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAATn%2F9hHc%3D","line":106,"updated":"2013-12-10 17:17:12.000000000","message":"user \u003d self._create_test_user(password\u003d\u0027\u0027)","commit_id":"513f78198e6631ac13ed5e992e9883ebaa47812b"}]}
