)]}'
{"trove/common/apischema.py":[{"author":{"_account_id":6156,"name":"Justin Hopper","email":"justin.hopper@hp.com","username":"justin-hopper"},"change_message_id":"7b945c0657b228577d686305748ef8f24d4939f7","unresolved":false,"context_lines":[{"line_number":147,"context_line":"        \"host\": host_string"},{"line_number":148,"context_line":"    }"},{"line_number":149,"context_line":"}"},{"line_number":150,"context_line":""},{"line_number":151,"context_line":""},{"line_number":152,"context_line":"users_list \u003d {"},{"line_number":153,"context_line":"    \"type\": \"array\","}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAQn%2F%2Fp3Q%3D","line":150,"updated":"2013-07-25 18:44:49.000000000","message":"this appears to be an individual user - so I suggest dropping \"_list\"","commit_id":"0272b18a209e911b3db5a0187c6772bcb273b2a0"},{"author":{"_account_id":6156,"name":"Justin Hopper","email":"justin.hopper@hp.com","username":"justin-hopper"},"change_message_id":"7b945c0657b228577d686305748ef8f24d4939f7","unresolved":false,"context_lines":[{"line_number":157,"context_line":"        \"required\": [\"name\", \"password\"],"},{"line_number":158,"context_line":"        \"additionalProperties\": False,"},{"line_number":159,"context_line":"        \"properties\": {"},{"line_number":160,"context_line":"            \"name\": non_empty_string,"},{"line_number":161,"context_line":"            \"password\": non_empty_string,"},{"line_number":162,"context_line":"            \"host\": host_string,"},{"line_number":163,"context_line":"            \"databases\": databases_ref_list"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAQn%2F%2Fp3I%3D","line":160,"updated":"2013-07-25 18:44:49.000000000","message":"since it appears we have  more stringent validation, we should change this to \"name_string\"","commit_id":"0272b18a209e911b3db5a0187c6772bcb273b2a0"},{"author":{"_account_id":6156,"name":"Justin Hopper","email":"justin.hopper@hp.com","username":"justin-hopper"},"change_message_id":"cf52d2a9b83ea533d963d08bc95a474874b6564e","unresolved":false,"context_lines":[{"line_number":138,"context_line":"    }"},{"line_number":139,"context_line":"}"},{"line_number":140,"context_line":""},{"line_number":141,"context_line":"user_attributes_list \u003d {"},{"line_number":142,"context_line":"    \"type\": \"object\","},{"line_number":143,"context_line":"    \"additionalProperties\": False,"},{"line_number":144,"context_line":"    \"minProperties\": 1,"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAQn%2F%2Fhmw%3D","line":141,"updated":"2013-07-29 20:44:57.000000000","message":"small nit - since user is unfortunately already taken, how about \"user_attributes\"","commit_id":"94d562a3855a9551723e06849b2eba295a4fff57"},{"author":{"_account_id":7796,"name":"Riddhi Shah","email":"ridhi.j.shah@gmail.com","username":"ridhi-j-shah"},"change_message_id":"66dddb16b9633d19b1d092be475a54341af47f6c","unresolved":false,"context_lines":[{"line_number":138,"context_line":"    }"},{"line_number":139,"context_line":"}"},{"line_number":140,"context_line":""},{"line_number":141,"context_line":"user_attributes_list \u003d {"},{"line_number":142,"context_line":"    \"type\": \"object\","},{"line_number":143,"context_line":"    \"additionalProperties\": False,"},{"line_number":144,"context_line":"    \"minProperties\": 1,"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAQn%2F%2Fhd0%3D","line":141,"in_reply_to":"AAAAQn%2F%2Fhmw%3D","updated":"2013-07-31 21:10:35.000000000","message":"Done","commit_id":"94d562a3855a9551723e06849b2eba295a4fff57"},{"author":{"_account_id":6156,"name":"Justin Hopper","email":"justin.hopper@hp.com","username":"justin-hopper"},"change_message_id":"cf52d2a9b83ea533d963d08bc95a474874b6564e","unresolved":false,"context_lines":[{"line_number":158,"context_line":"        \"required\": [\"name\", \"password\"],"},{"line_number":159,"context_line":"        \"additionalProperties\": False,"},{"line_number":160,"context_line":"        \"properties\": {"},{"line_number":161,"context_line":"            \"name\": name_string,"},{"line_number":162,"context_line":"            \"password\": non_empty_string,"},{"line_number":163,"context_line":"            \"host\": host_string,"},{"line_number":164,"context_line":"            \"databases\": databases_ref_list"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAQn%2F%2Fhmo%3D","line":161,"updated":"2013-07-29 20:44:57.000000000","message":"excellent!","commit_id":"94d562a3855a9551723e06849b2eba295a4fff57"}],"trove/common/exception.py":[{"author":{"_account_id":1375,"name":"Ed Cranford","email":"ed.cranford@gmail.com","username":"ed--cranford"},"change_message_id":"58d6429f7a7045c7e5ea8162f3e05393b9dd6b22","unresolved":false,"context_lines":[{"line_number":287,"context_line":"    message \u003d _(\"Swift account not accessible for tenant %(tenant_id)s.\")"},{"line_number":288,"context_line":""},{"line_number":289,"context_line":""},{"line_number":290,"context_line":"class UserAttributesNotFound(BadRequest):"},{"line_number":291,"context_line":""},{"line_number":292,"context_line":"    message \u003d _(\"Atleast one attribute for update needs to be specified.\")"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAPn%2F%2FY%2F0%3D","line":290,"updated":"2013-07-02 20:51:09.000000000","message":"I think this would be more useful as ArgumentsRequired, subbing from ArgumentRequired, and including a list of expected args.","commit_id":"ea313cd24691041702e42cc6b8a8731a0b3bb496"},{"author":{"_account_id":7796,"name":"Riddhi Shah","email":"ridhi.j.shah@gmail.com","username":"ridhi-j-shah"},"change_message_id":"4c507dd797c02bd56a13420b66f006bd7370702e","unresolved":false,"context_lines":[{"line_number":287,"context_line":"    message \u003d _(\"Swift account not accessible for tenant %(tenant_id)s.\")"},{"line_number":288,"context_line":""},{"line_number":289,"context_line":""},{"line_number":290,"context_line":"class UserAttributesNotFound(BadRequest):"},{"line_number":291,"context_line":""},{"line_number":292,"context_line":"    message \u003d _(\"Atleast one attribute for update needs to be specified.\")"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAPn%2F%2FWNE%3D","line":290,"in_reply_to":"AAAAPn%2F%2FY%2F0%3D","updated":"2013-07-03 15:57:25.000000000","message":"Since the error is thrown only when all the 3 arguments are missing, is it not sufficient if the error message is like this: \"Argument --new_name or --new_host or --new_password required??\" \nIs there are need to sub from the other class??","commit_id":"ea313cd24691041702e42cc6b8a8731a0b3bb496"},{"author":{"_account_id":6156,"name":"Justin Hopper","email":"justin.hopper@hp.com","username":"justin-hopper"},"change_message_id":"cf52d2a9b83ea533d963d08bc95a474874b6564e","unresolved":false,"context_lines":[{"line_number":287,"context_line":"    message \u003d _(\"Swift account not accessible for tenant %(tenant_id)s.\")"},{"line_number":288,"context_line":""},{"line_number":289,"context_line":""},{"line_number":290,"context_line":"class UserAttributesNotFound(BadRequest):"},{"line_number":291,"context_line":""},{"line_number":292,"context_line":"    message \u003d _(\"Atleast one of the following attributes needs \""},{"line_number":293,"context_line":"                \"to be specified: %(req_attrs)s\")"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAQn%2F%2FhmU%3D","line":290,"updated":"2013-07-29 20:44:57.000000000","message":"API Validation will catch this issue before this exception raised right?","commit_id":"94d562a3855a9551723e06849b2eba295a4fff57"},{"author":{"_account_id":7796,"name":"Riddhi Shah","email":"ridhi.j.shah@gmail.com","username":"ridhi-j-shah"},"change_message_id":"66dddb16b9633d19b1d092be475a54341af47f6c","unresolved":false,"context_lines":[{"line_number":287,"context_line":"    message \u003d _(\"Swift account not accessible for tenant %(tenant_id)s.\")"},{"line_number":288,"context_line":""},{"line_number":289,"context_line":""},{"line_number":290,"context_line":"class UserAttributesNotFound(BadRequest):"},{"line_number":291,"context_line":""},{"line_number":292,"context_line":"    message \u003d _(\"Atleast one of the following attributes needs \""},{"line_number":293,"context_line":"                \"to be specified: %(req_attrs)s\")"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAQn%2F%2FZMM%3D","line":290,"in_reply_to":"AAAAQn%2F%2FhmU%3D","updated":"2013-07-31 21:10:35.000000000","message":"Yes. You are right. Validation catches this before and hence does not need to be included.","commit_id":"94d562a3855a9551723e06849b2eba295a4fff57"}],"trove/extensions/mysql/models.py":[{"author":{"_account_id":6156,"name":"Justin Hopper","email":"justin.hopper@hp.com","username":"justin-hopper"},"change_message_id":"cf52d2a9b83ea533d963d08bc95a474874b6564e","unresolved":false,"context_lines":[{"line_number":156,"context_line":"                marker\u003duserhost,"},{"line_number":157,"context_line":"                include_marker\u003dTrue)"},{"line_number":158,"context_line":"            if (len(existing_users) \u003e 0 and"},{"line_number":159,"context_line":"                    str(existing_users[0].name) \u003d\u003d str(user) and"},{"line_number":160,"context_line":"                    str(existing_users[0].host) \u003d\u003d str(host)):"},{"line_number":161,"context_line":"                raise exception.UserAlreadyExists(name\u003duser,"},{"line_number":162,"context_line":"                                                  host\u003dhost)"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAQn%2F%2FhmA%3D","line":159,"updated":"2013-07-29 20:44:57.000000000","message":"is \"str()\" required here or would simple comparison work?  It should work to compare None to a str or an empty to None, etc etc,","commit_id":"94d562a3855a9551723e06849b2eba295a4fff57"},{"author":{"_account_id":7796,"name":"Riddhi Shah","email":"ridhi.j.shah@gmail.com","username":"ridhi-j-shah"},"change_message_id":"66dddb16b9633d19b1d092be475a54341af47f6c","unresolved":false,"context_lines":[{"line_number":156,"context_line":"                marker\u003duserhost,"},{"line_number":157,"context_line":"                include_marker\u003dTrue)"},{"line_number":158,"context_line":"            if (len(existing_users) \u003e 0 and"},{"line_number":159,"context_line":"                    str(existing_users[0].name) \u003d\u003d str(user) and"},{"line_number":160,"context_line":"                    str(existing_users[0].host) \u003d\u003d str(host)):"},{"line_number":161,"context_line":"                raise exception.UserAlreadyExists(name\u003duser,"},{"line_number":162,"context_line":"                                                  host\u003dhost)"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAQn%2F%2FZi8%3D","line":159,"in_reply_to":"AAAAQn%2F%2FhmA%3D","updated":"2013-07-31 21:10:35.000000000","message":"Yes the simple comparison works! Thanks for that one.","commit_id":"94d562a3855a9551723e06849b2eba295a4fff57"}],"trove/extensions/mysql/service.py":[{"author":{"_account_id":1375,"name":"Ed Cranford","email":"ed.cranford@gmail.com","username":"ed--cranford"},"change_message_id":"58d6429f7a7045c7e5ea8162f3e05393b9dd6b22","unresolved":false,"context_lines":[{"line_number":144,"context_line":"        user \u003d None"},{"line_number":145,"context_line":"        user_attrs \u003d body[\u0027user\u0027]"},{"line_number":146,"context_line":"        if not user_attrs:"},{"line_number":147,"context_line":"            raise exception.UserAttributesNotFound(uuid\u003did)"},{"line_number":148,"context_line":"        try:"},{"line_number":149,"context_line":"            user \u003d models.User.load(context, instance_id, username, hostname)"},{"line_number":150,"context_line":"        except (ValueError, AttributeError) as e:"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAPn%2F%2FY%2Fs%3D","line":147,"updated":"2013-07-02 20:51:09.000000000","message":"Can\u0027t hurt to include in the message which fields are missing.","commit_id":"ea313cd24691041702e42cc6b8a8731a0b3bb496"},{"author":{"_account_id":6156,"name":"Justin Hopper","email":"justin.hopper@hp.com","username":"justin-hopper"},"change_message_id":"c961df4f5497d78b4dacce2a0ced64c071b8ab37","unresolved":false,"context_lines":[{"line_number":144,"context_line":"        user \u003d None"},{"line_number":145,"context_line":"        user_attrs \u003d body[\u0027user\u0027]"},{"line_number":146,"context_line":"        if not user_attrs:"},{"line_number":147,"context_line":"            raise exception.UserAttributesNotFound(uuid\u003did)"},{"line_number":148,"context_line":"        try:"},{"line_number":149,"context_line":"            user \u003d models.User.load(context, instance_id, username, hostname)"},{"line_number":150,"context_line":"        except (ValueError, AttributeError) as e:"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAPn%2F%2FY7g%3D","line":147,"in_reply_to":"AAAAPn%2F%2FY%2Fs%3D","updated":"2013-07-02 20:55:58.000000000","message":"This will be made obsolete by the api schema validation","commit_id":"ea313cd24691041702e42cc6b8a8731a0b3bb496"},{"author":{"_account_id":1375,"name":"Ed Cranford","email":"ed.cranford@gmail.com","username":"ed--cranford"},"change_message_id":"0402f96cffab9e637320df2aa7062efec562c17c","unresolved":false,"context_lines":[{"line_number":144,"context_line":"        user \u003d None"},{"line_number":145,"context_line":"        user_attrs \u003d body[\u0027user\u0027]"},{"line_number":146,"context_line":"        if not user_attrs:"},{"line_number":147,"context_line":"            raise exception.UserAttributesNotFound(uuid\u003did)"},{"line_number":148,"context_line":"        try:"},{"line_number":149,"context_line":"            user \u003d models.User.load(context, instance_id, username, hostname)"},{"line_number":150,"context_line":"        except (ValueError, AttributeError) as e:"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAPn%2F%2FY6A%3D","line":147,"in_reply_to":"AAAAPn%2F%2FY7g%3D","updated":"2013-07-02 21:08:42.000000000","message":"Fair enough.","commit_id":"ea313cd24691041702e42cc6b8a8731a0b3bb496"},{"author":{"_account_id":6156,"name":"Justin Hopper","email":"justin.hopper@hp.com","username":"justin-hopper"},"change_message_id":"cf52d2a9b83ea533d963d08bc95a474874b6564e","unresolved":false,"context_lines":[{"line_number":136,"context_line":"        LOG.info(_(\"req : \u0027%s\u0027\\n\\n\") % req)"},{"line_number":137,"context_line":"        context \u003d req.environ[wsgi.CONTEXT_KEY]"},{"line_number":138,"context_line":"        username, hostname \u003d unquote_user_host(id)"},{"line_number":139,"context_line":"        if not body:"},{"line_number":140,"context_line":"            req_attrs \u003d [\u0027new_name\u0027, \u0027new_host\u0027, \u0027new_password\u0027]"},{"line_number":141,"context_line":"            raise exception.UserAttributesNotFound(uuid\u003did,"},{"line_number":142,"context_line":"                                                   req_attrs\u003dreq_attrs)"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAQn%2F%2Fhls%3D","line":139,"updated":"2013-07-29 20:44:57.000000000","message":"Will this ever be true?  Shouldn\u0027t the API validation prevent this condition","commit_id":"94d562a3855a9551723e06849b2eba295a4fff57"},{"author":{"_account_id":7796,"name":"Riddhi Shah","email":"ridhi.j.shah@gmail.com","username":"ridhi-j-shah"},"change_message_id":"66dddb16b9633d19b1d092be475a54341af47f6c","unresolved":false,"context_lines":[{"line_number":136,"context_line":"        LOG.info(_(\"req : \u0027%s\u0027\\n\\n\") % req)"},{"line_number":137,"context_line":"        context \u003d req.environ[wsgi.CONTEXT_KEY]"},{"line_number":138,"context_line":"        username, hostname \u003d unquote_user_host(id)"},{"line_number":139,"context_line":"        if not body:"},{"line_number":140,"context_line":"            req_attrs \u003d [\u0027new_name\u0027, \u0027new_host\u0027, \u0027new_password\u0027]"},{"line_number":141,"context_line":"            raise exception.UserAttributesNotFound(uuid\u003did,"},{"line_number":142,"context_line":"                                                   req_attrs\u003dreq_attrs)"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAQn%2F%2FZio%3D","line":139,"in_reply_to":"AAAAQn%2F%2Fhls%3D","updated":"2013-07-31 21:10:35.000000000","message":"Taken care by validation.","commit_id":"94d562a3855a9551723e06849b2eba295a4fff57"}],"trove/guestagent/manager/mysql_service.py":[{"author":{"_account_id":1375,"name":"Ed Cranford","email":"ed.cranford@gmail.com","username":"ed--cranford"},"change_message_id":"58d6429f7a7045c7e5ea8162f3e05393b9dd6b22","unresolved":false,"context_lines":[{"line_number":351,"context_line":"                        host \u003d user.host"},{"line_number":352,"context_line":"                    else:"},{"line_number":353,"context_line":"                        host \u003d user_attrs[\u0027host\u0027]"},{"line_number":354,"context_line":"                    self.grant_access(user_attrs[\u0027name\u0027], host, dbases_access)"},{"line_number":355,"context_line":""},{"line_number":356,"context_line":"    def create_database(self, databases):"},{"line_number":357,"context_line":"        \"\"\"Create the list of specified databases\"\"\""}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAPn%2F%2FY%2FI%3D","line":354,"updated":"2013-07-02 20:51:09.000000000","message":"dbases_access doesn\u0027t appear to be a token defined anywhere.","commit_id":"ea313cd24691041702e42cc6b8a8731a0b3bb496"},{"author":{"_account_id":7796,"name":"Riddhi Shah","email":"ridhi.j.shah@gmail.com","username":"ridhi-j-shah"},"change_message_id":"4c507dd797c02bd56a13420b66f006bd7370702e","unresolved":false,"context_lines":[{"line_number":351,"context_line":"                        host \u003d user.host"},{"line_number":352,"context_line":"                    else:"},{"line_number":353,"context_line":"                        host \u003d user_attrs[\u0027host\u0027]"},{"line_number":354,"context_line":"                    self.grant_access(user_attrs[\u0027name\u0027], host, dbases_access)"},{"line_number":355,"context_line":""},{"line_number":356,"context_line":"    def create_database(self, databases):"},{"line_number":357,"context_line":"        \"\"\"Create the list of specified databases\"\"\""}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAPn%2F%2FWMw%3D","line":354,"in_reply_to":"AAAAPn%2F%2FY%2FI%3D","updated":"2013-07-03 15:57:25.000000000","message":"Good catch...it should actually be db_access defined above!","commit_id":"ea313cd24691041702e42cc6b8a8731a0b3bb496"},{"author":{"_account_id":6156,"name":"Justin Hopper","email":"justin.hopper@hp.com","username":"justin-hopper"},"change_message_id":"cf52d2a9b83ea533d963d08bc95a474874b6564e","unresolved":false,"context_lines":[{"line_number":330,"context_line":"            t \u003d text(str(q))"},{"line_number":331,"context_line":"            db_result \u003d client.execute(t)"},{"line_number":332,"context_line":"            for db in db_result:"},{"line_number":333,"context_line":"                LOG.debug(\"\\t db: %s\" % db)"},{"line_number":334,"context_line":"                grantee.add(db[\u0027grantee\u0027])"},{"line_number":335,"context_line":"                if db[\u0027grantee\u0027] \u003d\u003d \"\u0027%s\u0027@\u0027%s\u0027\" % (user.name, user.host):"},{"line_number":336,"context_line":"                    db_name \u003d db[\u0027table_schema\u0027]"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAQn%2F%2Fhhc%3D","line":333,"updated":"2013-07-29 20:44:57.000000000","message":"does this reveal sensitive information?  If so we probably shouldn\u0027t log it OR we should mask it.","commit_id":"94d562a3855a9551723e06849b2eba295a4fff57"},{"author":{"_account_id":7796,"name":"Riddhi Shah","email":"ridhi.j.shah@gmail.com","username":"ridhi-j-shah"},"change_message_id":"66dddb16b9633d19b1d092be475a54341af47f6c","unresolved":false,"context_lines":[{"line_number":330,"context_line":"            t \u003d text(str(q))"},{"line_number":331,"context_line":"            db_result \u003d client.execute(t)"},{"line_number":332,"context_line":"            for db in db_result:"},{"line_number":333,"context_line":"                LOG.debug(\"\\t db: %s\" % db)"},{"line_number":334,"context_line":"                grantee.add(db[\u0027grantee\u0027])"},{"line_number":335,"context_line":"                if db[\u0027grantee\u0027] \u003d\u003d \"\u0027%s\u0027@\u0027%s\u0027\" % (user.name, user.host):"},{"line_number":336,"context_line":"                    db_name \u003d db[\u0027table_schema\u0027]"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAQn%2F%2FZic%3D","line":333,"in_reply_to":"AAAAQn%2F%2Fhhc%3D","updated":"2013-07-31 21:10:35.000000000","message":"Done","commit_id":"94d562a3855a9551723e06849b2eba295a4fff57"}],"trove/guestagent/query.py":[{"author":{"_account_id":1375,"name":"Ed Cranford","email":"ed.cranford@gmail.com","username":"ed--cranford"},"change_message_id":"58d6429f7a7045c7e5ea8162f3e05393b9dd6b22","unresolved":false,"context_lines":[{"line_number":341,"context_line":"        return \"\""},{"line_number":342,"context_line":""},{"line_number":343,"context_line":"    def __str__(self):"},{"line_number":344,"context_line":"        query \u003d [\"CREATE USER :user@:host\","},{"line_number":345,"context_line":"                 self._identity,"},{"line_number":346,"context_line":"                 ]"},{"line_number":347,"context_line":"        query \u003d [q for q in query if q]"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAPn%2F%2FY8g%3D","line":344,"updated":"2013-07-02 20:51:09.000000000","message":"Well, that explains plenty.","commit_id":"ea313cd24691041702e42cc6b8a8731a0b3bb496"}],"trove/tests/fakes/guestagent.py":[{"author":{"_account_id":1375,"name":"Ed Cranford","email":"ed.cranford@gmail.com","username":"ed--cranford"},"change_message_id":"58d6429f7a7045c7e5ea8162f3e05393b9dd6b22","unresolved":false,"context_lines":[{"line_number":99,"context_line":"        c3 \u003d user_attrs[\u0027password\u0027] is not None"},{"line_number":100,"context_line":"        uname \u003d username"},{"line_number":101,"context_line":"        hname \u003d hostname"},{"line_number":102,"context_line":"        if c1 and not c2 and not c3:"},{"line_number":103,"context_line":"            self._create_user({"},{"line_number":104,"context_line":"                \"_name\": user_attrs[\u0027name\u0027],"},{"line_number":105,"context_line":"                \"_host\": hostname,"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAPn%2F%2FZAE%3D","line":102,"updated":"2013-07-02 20:51:09.000000000","message":"the names c1, c2, and c3 aren\u0027t very clear mnemonics. Plus, should we add more functionality to this method later, it\u0027s going to get even more difficult to manage these.\n\nIs there a way to keep from having to repeat this? Maybe build the user dict first, modify it, and then call _create_user once with the right data?","commit_id":"ea313cd24691041702e42cc6b8a8731a0b3bb496"}],"trove/tests/unittests/guestagent/test_query.py":[{"author":{"_account_id":1375,"name":"Ed Cranford","email":"ed.cranford@gmail.com","username":"ed--cranford"},"change_message_id":"58d6429f7a7045c7e5ea8162f3e05393b9dd6b22","unresolved":false,"context_lines":[{"line_number":351,"context_line":"        hostname \u003d \u0027localhost\u0027"},{"line_number":352,"context_line":"        password \u003d \u0027password123\u0027"},{"line_number":353,"context_line":"        cu \u003d query.CreateUser(user\u003dusername, host\u003dhostname, clear\u003dpassword)"},{"line_number":354,"context_line":"        self.assertEqual(str(cu), \"CREATE USER :user@:host \""},{"line_number":355,"context_line":"                                  \"IDENTIFIED BY \u0027password123\u0027;\")"},{"line_number":356,"context_line":""},{"line_number":357,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAPn%2F%2FY9Q%3D","line":354,"updated":"2013-07-02 20:51:09.000000000","message":"Probably a very good thing to notice that none of the user and host data is actually present in this string. We should probably look into that.","commit_id":"ea313cd24691041702e42cc6b8a8731a0b3bb496"}],"trove/tests/unittests/mysql/test_user_controller.py":[{"author":{"_account_id":6156,"name":"Justin Hopper","email":"justin.hopper@hp.com","username":"justin-hopper"},"change_message_id":"7b945c0657b228577d686305748ef8f24d4939f7","unresolved":false,"context_lines":[{"line_number":198,"context_line":"        self.assertThat(errors[2].message,"},{"line_number":199,"context_line":"                        Equals(\"\u0027\u0027 does not match \u0027^.*[0-9a-zA-Z]+.*$\u0027\"))"},{"line_number":200,"context_line":"        self.assertThat(errors[1].path.pop(), Equals(\"name\"))"},{"line_number":201,"context_line":""},{"line_number":202,"context_line":""},{"line_number":203,"context_line":"class TestUserAccessController(TestCase):"},{"line_number":204,"context_line":"    def test_validate_update_db(self):"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAQn%2F%2FpyU%3D","line":201,"updated":"2013-07-25 18:44:49.000000000","message":"I don\u0027t see any tests for the new schema","commit_id":"0272b18a209e911b3db5a0187c6772bcb273b2a0"}]}
