)]}'
{"keystoneclient/v3/groups.py":[{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"e23ec1ccfbabb072ab6ce97423abd3f0cbc72987","unresolved":false,"context_lines":[{"line_number":31,"context_line":"            \u0027name\u0027: name if name is not None else self.name,"},{"line_number":32,"context_line":"            \u0027description\u0027: (description"},{"line_number":33,"context_line":"                            if description is not None"},{"line_number":34,"context_line":"                            else self.description),"},{"line_number":35,"context_line":"        }"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAM3%2F%2F%2FSY%3D","line":34,"updated":"2012-12-17 18:41:17.000000000","message":"not sure if this is how the other active record-y update methods are implemented, but it\u0027s not necessary with the patch semantics to ensure that ever attribute is included.","commit_id":"564d9f87a95ca06f5555a4710ada51460eb9641f"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"80a24c373e392f4f654de965962b23e10786117b","unresolved":false,"context_lines":[{"line_number":31,"context_line":"            \u0027name\u0027: name if name is not None else self.name,"},{"line_number":32,"context_line":"            \u0027description\u0027: (description"},{"line_number":33,"context_line":"                            if description is not None"},{"line_number":34,"context_line":"                            else self.description),"},{"line_number":35,"context_line":"        }"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAM3%2F%2F%2BL4%3D","line":34,"in_reply_to":"AAAAM3%2F%2F%2FSY%3D","updated":"2012-12-18 14:26:10.000000000","message":"Other entities seem to do it this way (see projects.py)","commit_id":"564d9f87a95ca06f5555a4710ada51460eb9641f"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"e23ec1ccfbabb072ab6ce97423abd3f0cbc72987","unresolved":false,"context_lines":[{"line_number":38,"context_line":"            retval \u003d self.manager.update(self.id, **kwargs)"},{"line_number":39,"context_line":"            self \u003d retval"},{"line_number":40,"context_line":"        except Exception:"},{"line_number":41,"context_line":"            retval \u003d None"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"        return retval"},{"line_number":44,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAM3%2F%2F%2FSM%3D","line":41,"updated":"2012-12-17 18:41:17.000000000","message":"eek","commit_id":"564d9f87a95ca06f5555a4710ada51460eb9641f"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"80a24c373e392f4f654de965962b23e10786117b","unresolved":false,"context_lines":[{"line_number":38,"context_line":"            retval \u003d self.manager.update(self.id, **kwargs)"},{"line_number":39,"context_line":"            self \u003d retval"},{"line_number":40,"context_line":"        except Exception:"},{"line_number":41,"context_line":"            retval \u003d None"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"        return retval"},{"line_number":44,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAM3%2F%2F%2BL0%3D","line":41,"in_reply_to":"AAAAM3%2F%2F%2FSM%3D","updated":"2012-12-18 14:26:10.000000000","message":"Indeed - although this is common to others (e.g. projects) - is it documented that attributes that do not exist in the entity are silently ignored?","commit_id":"564d9f87a95ca06f5555a4710ada51460eb9641f"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"5eef7efdd10dc941dfb095a6dbce2fd9a855c7ca","unresolved":false,"context_lines":[{"line_number":59,"context_line":"        if user:"},{"line_number":60,"context_line":"            base_url \u003d \u0027/users/%s\u0027 % base.getid(user)"},{"line_number":61,"context_line":"        elif domain:"},{"line_number":62,"context_line":"            base_url \u003d \u0027/domains/%s\u0027 % base.getid(domain)"},{"line_number":63,"context_line":"        else:"},{"line_number":64,"context_line":"            base_url \u003d None"},{"line_number":65,"context_line":"        return super(GroupManager, self).list("}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAM3%2F%2F6xc%3D","line":62,"updated":"2012-12-21 03:24:21.000000000","message":"This can be removed (GET /domains/{domain_id}/groups vs GET /groups?domain_id\u003d{domain_id}) and the method simplified.","commit_id":"f74deabcfd8085411a7b3b4b1503275013fc4500"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"ebcbcb50d1880a6b3c04116b536462867edc406f","unresolved":false,"context_lines":[{"line_number":59,"context_line":"        if user:"},{"line_number":60,"context_line":"            base_url \u003d \u0027/users/%s\u0027 % base.getid(user)"},{"line_number":61,"context_line":"        elif domain:"},{"line_number":62,"context_line":"            base_url \u003d \u0027/domains/%s\u0027 % base.getid(domain)"},{"line_number":63,"context_line":"        else:"},{"line_number":64,"context_line":"            base_url \u003d None"},{"line_number":65,"context_line":"        return super(GroupManager, self).list("}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAM3%2F%2F6W0%3D","line":62,"in_reply_to":"AAAAM3%2F%2F6xc%3D","updated":"2012-12-21 09:50:10.000000000","message":"Done","commit_id":"f74deabcfd8085411a7b3b4b1503275013fc4500"}],"keystoneclient/v3/roles.py":[{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"3c50dff7a013ed04bf0cab18ce67574935fcffaa","unresolved":false,"context_lines":[{"line_number":60,"context_line":""},{"line_number":61,"context_line":"        return base_url % params"},{"line_number":62,"context_line":""},{"line_number":63,"context_line":"    def _require_domain_xor_project(self, domain, project):"},{"line_number":64,"context_line":"        if (domain and project) or (not domain and not project):"},{"line_number":65,"context_line":"            msg \u003d \u0027Specify either a domain or project, not both\u0027"},{"line_number":66,"context_line":"            raise exceptions.ValidationError(msg)"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAMX%2F%2F0rk%3D","line":63,"updated":"2012-12-13 22:45:42.000000000","message":"Nice naming!","commit_id":"97b7819002fb95c9abeb65554fa3184810d179b6"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"e23ec1ccfbabb072ab6ce97423abd3f0cbc72987","unresolved":false,"context_lines":[{"line_number":56,"context_line":"        elif project:"},{"line_number":57,"context_line":"            params[\u0027project_id\u0027] \u003d base.getid(project)"},{"line_number":58,"context_line":"            base_url \u003d (\u0027/projects/%(project_id)s/%(obj_type)s/\u0027"},{"line_number":59,"context_line":"                        \u0027%(user_or_group_id)s\u0027)"},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"        return base_url % params"},{"line_number":62,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAM3%2F%2F%2FQk%3D","line":59,"updated":"2012-12-17 18:41:17.000000000","message":"i find this implementation harder to follow than something a bit more explicit:\n\n  params \u003d {}\n\n  if project:\n    params[\u0027project_id\u0027] \u003d base.getid(project)\n    base_url \u003d \u0027/projects/%(project_id)s\u0027\n  elif domain:\n    params[\u0027domain_id\u0027] \u003d base.getid(domain)\n    base_url \u003d \u0027/domains/%(domain_id)s\u0027\n\n  if user:\n    params[\u0027user_id\u0027] \u003d base.getid(user)\n    base_url +\u003d \u0027/users/%(user_id)s\u0027\n  elif group:\n    params[\u0027group_id\u0027] \u003d base.getid(group)\n    base_url +\u003d \u0027/groups/%(group_id)s\u0027\n\n  return base_url % params","commit_id":"564d9f87a95ca06f5555a4710ada51460eb9641f"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"80a24c373e392f4f654de965962b23e10786117b","unresolved":false,"context_lines":[{"line_number":56,"context_line":"        elif project:"},{"line_number":57,"context_line":"            params[\u0027project_id\u0027] \u003d base.getid(project)"},{"line_number":58,"context_line":"            base_url \u003d (\u0027/projects/%(project_id)s/%(obj_type)s/\u0027"},{"line_number":59,"context_line":"                        \u0027%(user_or_group_id)s\u0027)"},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"        return base_url % params"},{"line_number":62,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAM3%2F%2F%2BLw%3D","line":59,"in_reply_to":"AAAAM3%2F%2F%2FQk%3D","updated":"2012-12-18 14:26:10.000000000","message":"Done","commit_id":"564d9f87a95ca06f5555a4710ada51460eb9641f"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"e23ec1ccfbabb072ab6ce97423abd3f0cbc72987","unresolved":false,"context_lines":[{"line_number":60,"context_line":""},{"line_number":61,"context_line":"        return base_url % params"},{"line_number":62,"context_line":""},{"line_number":63,"context_line":"    def _require_domain_xor_project(self, domain, project):"},{"line_number":64,"context_line":"        if (domain and project) or (not domain and not project):"},{"line_number":65,"context_line":"            msg \u003d \u0027Specify either a domain or project, not both\u0027"},{"line_number":66,"context_line":"            raise exceptions.ValidationError(msg)"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAM3%2F%2F%2FRw%3D","line":63,"updated":"2012-12-17 18:41:17.000000000","message":"thank you! :)","commit_id":"564d9f87a95ca06f5555a4710ada51460eb9641f"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"80a24c373e392f4f654de965962b23e10786117b","unresolved":false,"context_lines":[{"line_number":60,"context_line":""},{"line_number":61,"context_line":"        return base_url % params"},{"line_number":62,"context_line":""},{"line_number":63,"context_line":"    def _require_domain_xor_project(self, domain, project):"},{"line_number":64,"context_line":"        if (domain and project) or (not domain and not project):"},{"line_number":65,"context_line":"            msg \u003d \u0027Specify either a domain or project, not both\u0027"},{"line_number":66,"context_line":"            raise exceptions.ValidationError(msg)"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAM3%2F%2F%2BLs%3D","line":63,"in_reply_to":"AAAAM3%2F%2F%2FRw%3D","updated":"2012-12-18 14:26:10.000000000","message":"You\u0027re welcome :-)","commit_id":"564d9f87a95ca06f5555a4710ada51460eb9641f"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"e23ec1ccfbabb072ab6ce97423abd3f0cbc72987","unresolved":false,"context_lines":[{"line_number":106,"context_line":"        return super(RoleManager, self).delete("},{"line_number":107,"context_line":"            role_id\u003dbase.getid(role))"},{"line_number":108,"context_line":""},{"line_number":109,"context_line":"    def grant(self, role, user, group, domain\u003dNone, project\u003dNone):"},{"line_number":110,"context_line":"        \"\"\"Grants a role to a user or group on a domain or project.\"\"\""},{"line_number":111,"context_line":"        self._require_domain_xor_project(domain, project)"},{"line_number":112,"context_line":"        self._require_user_xor_group(user, group)"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAM3%2F%2F%2FQQ%3D","line":109,"updated":"2012-12-17 18:41:17.000000000","message":"user and group should both default to None","commit_id":"564d9f87a95ca06f5555a4710ada51460eb9641f"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"80a24c373e392f4f654de965962b23e10786117b","unresolved":false,"context_lines":[{"line_number":106,"context_line":"        return super(RoleManager, self).delete("},{"line_number":107,"context_line":"            role_id\u003dbase.getid(role))"},{"line_number":108,"context_line":""},{"line_number":109,"context_line":"    def grant(self, role, user, group, domain\u003dNone, project\u003dNone):"},{"line_number":110,"context_line":"        \"\"\"Grants a role to a user or group on a domain or project.\"\"\""},{"line_number":111,"context_line":"        self._require_domain_xor_project(domain, project)"},{"line_number":112,"context_line":"        self._require_user_xor_group(user, group)"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAM3%2F%2F%2BLo%3D","line":109,"in_reply_to":"AAAAM3%2F%2F%2FQQ%3D","updated":"2012-12-18 14:26:10.000000000","message":"Done","commit_id":"564d9f87a95ca06f5555a4710ada51460eb9641f"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"e23ec1ccfbabb072ab6ce97423abd3f0cbc72987","unresolved":false,"context_lines":[{"line_number":115,"context_line":"            base_url\u003dself._role_grants_base_url(user, group, domain, project),"},{"line_number":116,"context_line":"            role_id\u003dbase.getid(role))"},{"line_number":117,"context_line":""},{"line_number":118,"context_line":"    def check(self, role, user, group, domain\u003dNone, project\u003dNone):"},{"line_number":119,"context_line":"        \"\"\"Checks if a user or group has a role on a domain or project.\"\"\""},{"line_number":120,"context_line":"        self._require_domain_xor_project(domain, project)"},{"line_number":121,"context_line":"        self._require_user_xor_group(user, group)"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAM3%2F%2F%2FQM%3D","line":118,"updated":"2012-12-17 18:41:17.000000000","message":"same as above","commit_id":"564d9f87a95ca06f5555a4710ada51460eb9641f"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"80a24c373e392f4f654de965962b23e10786117b","unresolved":false,"context_lines":[{"line_number":115,"context_line":"            base_url\u003dself._role_grants_base_url(user, group, domain, project),"},{"line_number":116,"context_line":"            role_id\u003dbase.getid(role))"},{"line_number":117,"context_line":""},{"line_number":118,"context_line":"    def check(self, role, user, group, domain\u003dNone, project\u003dNone):"},{"line_number":119,"context_line":"        \"\"\"Checks if a user or group has a role on a domain or project.\"\"\""},{"line_number":120,"context_line":"        self._require_domain_xor_project(domain, project)"},{"line_number":121,"context_line":"        self._require_user_xor_group(user, group)"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAM3%2F%2F%2BLk%3D","line":118,"in_reply_to":"AAAAM3%2F%2F%2FQM%3D","updated":"2012-12-18 14:26:10.000000000","message":"Done","commit_id":"564d9f87a95ca06f5555a4710ada51460eb9641f"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"e23ec1ccfbabb072ab6ce97423abd3f0cbc72987","unresolved":false,"context_lines":[{"line_number":124,"context_line":"            base_url\u003dself._role_grants_base_url(user, group, domain, project),"},{"line_number":125,"context_line":"            role_id\u003dbase.getid(role))"},{"line_number":126,"context_line":""},{"line_number":127,"context_line":"    def revoke(self, role, user, group, domain\u003dNone, project\u003dNone):"},{"line_number":128,"context_line":"        \"\"\"Revokes a role from a user or group on a domain or project.\"\"\""},{"line_number":129,"context_line":"        self._require_domain_xor_project(domain, project)"},{"line_number":130,"context_line":"        self._require_user_xor_group(user, group)"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAM3%2F%2F%2FQI%3D","line":127,"updated":"2012-12-17 18:41:17.000000000","message":"same as above","commit_id":"564d9f87a95ca06f5555a4710ada51460eb9641f"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"80a24c373e392f4f654de965962b23e10786117b","unresolved":false,"context_lines":[{"line_number":124,"context_line":"            base_url\u003dself._role_grants_base_url(user, group, domain, project),"},{"line_number":125,"context_line":"            role_id\u003dbase.getid(role))"},{"line_number":126,"context_line":""},{"line_number":127,"context_line":"    def revoke(self, role, user, group, domain\u003dNone, project\u003dNone):"},{"line_number":128,"context_line":"        \"\"\"Revokes a role from a user or group on a domain or project.\"\"\""},{"line_number":129,"context_line":"        self._require_domain_xor_project(domain, project)"},{"line_number":130,"context_line":"        self._require_user_xor_group(user, group)"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAM3%2F%2F%2BLg%3D","line":127,"in_reply_to":"AAAAM3%2F%2F%2FQI%3D","updated":"2012-12-18 14:26:10.000000000","message":"Done","commit_id":"564d9f87a95ca06f5555a4710ada51460eb9641f"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"9b56e05eb27ce5571a710b814f92827c77c1517f","unresolved":false,"context_lines":[{"line_number":42,"context_line":""},{"line_number":43,"context_line":"        if project:"},{"line_number":44,"context_line":"            params[\u0027project_id\u0027] \u003d base.getid(project)"},{"line_number":45,"context_line":"            base_url \u003d \u0027/projects/%(project_id)s\u0027"},{"line_number":46,"context_line":"        elif domain:"},{"line_number":47,"context_line":"            params[\u0027domain_id\u0027] \u003d base.getid(domain)"},{"line_number":48,"context_line":"            base_url \u003d \u0027/domains/%(domain_id)s\u0027"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAM3%2F%2F9Rk%3D","line":45,"updated":"2012-12-18 23:17:57.000000000","message":"I am a bit confused with these APIs. Role grants to a user for a project or domain make sense.\n\n/domains/domainId/users/userId/roles/roleId\n\n/projects/projectId/users/userId/roles/roleId\n\nBut these new APIs doesn\u0027t make much sense to me.\n\n/domains/domainId/roles/roleId\n\n/users/userId/roles/roleId\n\n/groups/groupId/roles/roleId\n\nHow can you grant for a domain without specify who you granting the role to? Or grant the role to user without any project or domain? That would be just like global roles, which we no longer support.","commit_id":"8b3a3f986246bd43ff05b4c9295c76a4b4d907f9"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"8da9b5cb1bc6a22228026ff41c5ebcfe111aa62f","unresolved":false,"context_lines":[{"line_number":42,"context_line":""},{"line_number":43,"context_line":"        if project:"},{"line_number":44,"context_line":"            params[\u0027project_id\u0027] \u003d base.getid(project)"},{"line_number":45,"context_line":"            base_url \u003d \u0027/projects/%(project_id)s\u0027"},{"line_number":46,"context_line":"        elif domain:"},{"line_number":47,"context_line":"            params[\u0027domain_id\u0027] \u003d base.getid(domain)"},{"line_number":48,"context_line":"            base_url \u003d \u0027/domains/%(domain_id)s\u0027"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAM3%2F%2F8%2FQ%3D","line":45,"in_reply_to":"AAAAM3%2F%2F9Rk%3D","updated":"2012-12-19 09:38:30.000000000","message":"You are correct, you need a role as well.  The \"key\" you are applying to this url to gets appended in the supper class - you need to follow the logic of this module (and indeed all the v3 client entity implementations - since this is how they have been designed).  So in the case of, say:\n\nbase_url \u003d \"/domains/domain-id/group/group-id\"\n..the super class will add the \"role/role-id\" bit to the end of the url before sending it off\n\nDoes that answer your question, or am I missing your issue?","commit_id":"8b3a3f986246bd43ff05b4c9295c76a4b4d907f9"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"5eef7efdd10dc941dfb095a6dbce2fd9a855c7ca","unresolved":false,"context_lines":[{"line_number":37,"context_line":""},{"line_number":38,"context_line":"    def _role_grants_base_url(self, user, group, domain, project):"},{"line_number":39,"context_line":"    # When called, we have already checked that only one of user \u0026 group and"},{"line_number":40,"context_line":"    # one of domain \u0026 project have been specified"},{"line_number":41,"context_line":"        params \u003d {}"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"        if project:"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAM3%2F%2F6xI%3D","line":40,"updated":"2012-12-21 03:24:21.000000000","message":"Indent to match code block","commit_id":"f74deabcfd8085411a7b3b4b1503275013fc4500"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"ebcbcb50d1880a6b3c04116b536462867edc406f","unresolved":false,"context_lines":[{"line_number":37,"context_line":""},{"line_number":38,"context_line":"    def _role_grants_base_url(self, user, group, domain, project):"},{"line_number":39,"context_line":"    # When called, we have already checked that only one of user \u0026 group and"},{"line_number":40,"context_line":"    # one of domain \u0026 project have been specified"},{"line_number":41,"context_line":"        params \u003d {}"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"        if project:"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAM3%2F%2F6Wo%3D","line":40,"in_reply_to":"AAAAM3%2F%2F6xI%3D","updated":"2012-12-21 09:50:10.000000000","message":"Done","commit_id":"f74deabcfd8085411a7b3b4b1503275013fc4500"}],"keystoneclient/v3/users.py":[{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"e23ec1ccfbabb072ab6ce97423abd3f0cbc72987","unresolved":false,"context_lines":[{"line_number":34,"context_line":"    key \u003d \u0027user\u0027"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"    def _require_user_and_group(self, user, group):"},{"line_number":37,"context_line":"        if not user or not group:"},{"line_number":38,"context_line":"            msg \u003d \u0027Specify both a user and a group\u0027"},{"line_number":39,"context_line":"            raise exceptions.ValidationError(msg)"},{"line_number":40,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAM3%2F%2F%2FPI%3D","line":37,"updated":"2012-12-17 18:41:17.000000000","message":"Would personally prefer:\n\n  if not (user and group):","commit_id":"564d9f87a95ca06f5555a4710ada51460eb9641f"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"80a24c373e392f4f654de965962b23e10786117b","unresolved":false,"context_lines":[{"line_number":34,"context_line":"    key \u003d \u0027user\u0027"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"    def _require_user_and_group(self, user, group):"},{"line_number":37,"context_line":"        if not user or not group:"},{"line_number":38,"context_line":"            msg \u003d \u0027Specify both a user and a group\u0027"},{"line_number":39,"context_line":"            raise exceptions.ValidationError(msg)"},{"line_number":40,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAM3%2F%2F%2BLc%3D","line":37,"in_reply_to":"AAAAM3%2F%2F%2FPI%3D","updated":"2012-12-18 14:26:10.000000000","message":"Done","commit_id":"564d9f87a95ca06f5555a4710ada51460eb9641f"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"e23ec1ccfbabb072ab6ce97423abd3f0cbc72987","unresolved":false,"context_lines":[{"line_number":49,"context_line":"            description\u003ddescription,"},{"line_number":50,"context_line":"            enabled\u003denabled)"},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"    def list(self, project\u003dNone, domain\u003dNone, group\u003dNone):"},{"line_number":53,"context_line":"        return super(UserManager, self).list("},{"line_number":54,"context_line":"            domain_id\u003dbase.getid(domain),"},{"line_number":55,"context_line":"            project_id\u003dbase.getid(project),"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAM3%2F%2F%2FPQ%3D","line":52,"updated":"2012-12-17 18:41:17.000000000","message":"Adding group_id here will result in:\n\n    GET /users?group_id\u003dabc123\n\nI don\u0027t think that\u0027s what you want, as group_id isn\u0027t an attribute of users, as project_id and domain_id are.","commit_id":"564d9f87a95ca06f5555a4710ada51460eb9641f"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"3623b3ee9799c031f985ef98ceb671cff9c6899d","unresolved":false,"context_lines":[{"line_number":49,"context_line":"            description\u003ddescription,"},{"line_number":50,"context_line":"            enabled\u003denabled)"},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"    def list(self, project\u003dNone, domain\u003dNone, group\u003dNone):"},{"line_number":53,"context_line":"        return super(UserManager, self).list("},{"line_number":54,"context_line":"            domain_id\u003dbase.getid(domain),"},{"line_number":55,"context_line":"            project_id\u003dbase.getid(project),"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAM3%2F%2F9vk%3D","line":52,"in_reply_to":"AAAAM3%2F%2F%2BLE%3D","updated":"2012-12-18 17:51:27.000000000","message":"Ah, so the method signature makes sense, but the method itself needs to make two different calls depending on if group ID is provided or not. With a group ID, you need to build a base_url with the group_id before requesting the collection of users. Without it, you\u0027re just filtering GET /v3/users by attributes (default project ID and/or owning domain ID).","commit_id":"564d9f87a95ca06f5555a4710ada51460eb9641f"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"80a24c373e392f4f654de965962b23e10786117b","unresolved":false,"context_lines":[{"line_number":49,"context_line":"            description\u003ddescription,"},{"line_number":50,"context_line":"            enabled\u003denabled)"},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"    def list(self, project\u003dNone, domain\u003dNone, group\u003dNone):"},{"line_number":53,"context_line":"        return super(UserManager, self).list("},{"line_number":54,"context_line":"            domain_id\u003dbase.getid(domain),"},{"line_number":55,"context_line":"            project_id\u003dbase.getid(project),"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAM3%2F%2F%2BLE%3D","line":52,"in_reply_to":"AAAAM3%2F%2F%2FPQ%3D","updated":"2012-12-18 14:26:10.000000000","message":"So this is intended to implement:\n\nList users who are members of a group: `GET /groups/{group_id}/users`\n\nI agree that group_id is not an attribute of a user itself - although logically seems to fit here.  Alternatively, we could of course have \"list_members_of group\" - which in some way seems on odd thing in the user entity manager...","commit_id":"564d9f87a95ca06f5555a4710ada51460eb9641f"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"5eef7efdd10dc941dfb095a6dbce2fd9a855c7ca","unresolved":false,"context_lines":[{"line_number":76,"context_line":"            description\u003ddescription,"},{"line_number":77,"context_line":"            enabled\u003denabled)"},{"line_number":78,"context_line":""},{"line_number":79,"context_line":"    def add_to_group(self, user, group):"},{"line_number":80,"context_line":"        self._require_user_and_group(user, group)"},{"line_number":81,"context_line":""},{"line_number":82,"context_line":"        base_url \u003d \u0027/groups/%s\u0027 % base.getid(group)"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAM3%2F%2F6gM%3D","line":79,"updated":"2012-12-21 03:24:21.000000000","message":"I keep coming back to this APi thinking that between the manager reference, method name, and arguments, its painfully obvious that you\u0027re working with groups:\n\n  c.groups.add_to_group(user\u003dmy_user, group\u003dmy_group)\n  c.groups.check_in_group(user\u003dmy_user, group\u003dmy_group)\n  c.groups.remove_from_group(user\u003dmy_user, group\u003dmy_group)\n\nRoles calls these grant() / check() / revoke(); how about add() / check() / remove()? (Wish we had a better term than \"check\" though).","commit_id":"f74deabcfd8085411a7b3b4b1503275013fc4500"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"6c501b0e09b00fb823e11a688687f8f2b60c5121","unresolved":false,"context_lines":[{"line_number":76,"context_line":"            description\u003ddescription,"},{"line_number":77,"context_line":"            enabled\u003denabled)"},{"line_number":78,"context_line":""},{"line_number":79,"context_line":"    def add_to_group(self, user, group):"},{"line_number":80,"context_line":"        self._require_user_and_group(user, group)"},{"line_number":81,"context_line":""},{"line_number":82,"context_line":"        base_url \u003d \u0027/groups/%s\u0027 % base.getid(group)"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAM3%2F%2F6MI%3D","line":79,"in_reply_to":"AAAAM3%2F%2F6Wc%3D","updated":"2012-12-21 15:17:40.000000000","message":"Wow, I didn\u0027t actually realize this was in user manager! So, if I start all over thinking about this again...\n\nIt makes sense that this is in user manager as you\u0027re ultimately working with a collection of users (i.e. a group), just like the root collection of users (i.e. /v3/users vs /v3/groups/{group_id}/users).\n\nSo my \"painfully obvious\" description of this API is painfully wrong, and should actually read:\n\n  c.users.add_to_group(user\u003dmy_user, group\u003dmy_group)\n  c.users.check_in_group(user\u003dmy_user, group\u003dmy_group)\n  c.users.remove_from_group(user\u003dmy_user, group\u003dmy_group)\n\nNow this API makes much more sense!","commit_id":"f74deabcfd8085411a7b3b4b1503275013fc4500"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"ebcbcb50d1880a6b3c04116b536462867edc406f","unresolved":false,"context_lines":[{"line_number":76,"context_line":"            description\u003ddescription,"},{"line_number":77,"context_line":"            enabled\u003denabled)"},{"line_number":78,"context_line":""},{"line_number":79,"context_line":"    def add_to_group(self, user, group):"},{"line_number":80,"context_line":"        self._require_user_and_group(user, group)"},{"line_number":81,"context_line":""},{"line_number":82,"context_line":"        base_url \u003d \u0027/groups/%s\u0027 % base.getid(group)"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAM3%2F%2F6Wc%3D","line":79,"in_reply_to":"AAAAM3%2F%2F6gM%3D","updated":"2012-12-21 09:50:10.000000000","message":"I wrestled with this one too.  I originally had them in groups, but then was thinking about if we were talking about this in \"attribute\" terms - would we say \"add the group organizational attribute to the user\" or \"add the user to the group organizational attribute\".  I think the former, and hence sided with keeping this in the user manager.  However, I think we can argue this both ways - if you feel that it fits better in groups, I\u0027m fine with moving it.","commit_id":"f74deabcfd8085411a7b3b4b1503275013fc4500"}],"tests/v3/test_groups.py":[{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"7d75d669f2c91c62a5c83d7d43453502b5ed78a5","unresolved":false,"context_lines":[{"line_number":1,"context_line":"import uuid"},{"line_number":2,"context_line":""},{"line_number":3,"context_line":"from keystoneclient.v3 import groups"},{"line_number":4,"context_line":"from tests.v3 import utils"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAMX%2F%2F0us%3D","line":1,"updated":"2012-12-13 22:10:33.000000000","message":"Need copyright header","commit_id":"97b7819002fb95c9abeb65554fa3184810d179b6"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"3fdf7d0912e733b1cba90e7f35d9bd85a2d57337","unresolved":false,"context_lines":[{"line_number":32,"context_line":"    def new_ref(self, **kwargs):"},{"line_number":33,"context_line":"        kwargs \u003d super(GroupTests, self).new_ref(**kwargs)"},{"line_number":34,"context_line":"        kwargs.setdefault(\u0027name\u0027, uuid.uuid4().hex)"},{"line_number":35,"context_line":"        return kwargs"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAM3%2F%2F6LE%3D","line":35,"updated":"2012-12-21 15:21:36.000000000","message":"I expected GET /users/{user_id}/groups to be tested here, but I actually don\u0027t see a test for it at all... did I miss it or does it need to be added?","commit_id":"f74deabcfd8085411a7b3b4b1503275013fc4500"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"353ec4873f3a74722fd957d239da0aca40de8f66","unresolved":false,"context_lines":[{"line_number":32,"context_line":"    def new_ref(self, **kwargs):"},{"line_number":33,"context_line":"        kwargs \u003d super(GroupTests, self).new_ref(**kwargs)"},{"line_number":34,"context_line":"        kwargs.setdefault(\u0027name\u0027, uuid.uuid4().hex)"},{"line_number":35,"context_line":"        return kwargs"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAM3%2F%2F57M%3D","line":35,"in_reply_to":"AAAAM3%2F%2F6LE%3D","updated":"2012-12-21 18:27:25.000000000","message":"Good catch, will add","commit_id":"f74deabcfd8085411a7b3b4b1503275013fc4500"}],"tests/v3/test_roles.py":[{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"e23ec1ccfbabb072ab6ce97423abd3f0cbc72987","unresolved":false,"context_lines":[{"line_number":12,"context_line":"# distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT"},{"line_number":13,"context_line":"# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the"},{"line_number":14,"context_line":"# License for the specific language governing permissions and limitations"},{"line_number":15,"context_line":"# under the License."},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"import httplib2"},{"line_number":18,"context_line":"import urlparse"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAM3%2F%2F%2FPE%3D","line":15,"updated":"2012-12-17 18:41:17.000000000","message":"thanks","commit_id":"564d9f87a95ca06f5555a4710ada51460eb9641f"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"80a24c373e392f4f654de965962b23e10786117b","unresolved":false,"context_lines":[{"line_number":12,"context_line":"# distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT"},{"line_number":13,"context_line":"# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the"},{"line_number":14,"context_line":"# License for the specific language governing permissions and limitations"},{"line_number":15,"context_line":"# under the License."},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"import httplib2"},{"line_number":18,"context_line":"import urlparse"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAM3%2F%2F%2BJY%3D","line":15,"in_reply_to":"AAAAM3%2F%2F%2FPE%3D","updated":"2012-12-18 14:26:10.000000000","message":"You\u0027re welcome!","commit_id":"564d9f87a95ca06f5555a4710ada51460eb9641f"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"e23ec1ccfbabb072ab6ce97423abd3f0cbc72987","unresolved":false,"context_lines":[{"line_number":58,"context_line":"        self.mox.ReplayAll()"},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"        self.manager.grant(role\u003dref[\u0027id\u0027], domain\u003ddomain_id,"},{"line_number":61,"context_line":"                           group\u003dNone, user\u003duser_id)"},{"line_number":62,"context_line":""},{"line_number":63,"context_line":"    def test_domain_group_role_grant(self):"},{"line_number":64,"context_line":"        group_id \u003d uuid.uuid4().hex"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAM3%2F%2F%2FPA%3D","line":61,"updated":"2012-12-17 18:41:17.000000000","message":"remove the group kwarg, it should default to None","commit_id":"564d9f87a95ca06f5555a4710ada51460eb9641f"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"80a24c373e392f4f654de965962b23e10786117b","unresolved":false,"context_lines":[{"line_number":58,"context_line":"        self.mox.ReplayAll()"},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"        self.manager.grant(role\u003dref[\u0027id\u0027], domain\u003ddomain_id,"},{"line_number":61,"context_line":"                           group\u003dNone, user\u003duser_id)"},{"line_number":62,"context_line":""},{"line_number":63,"context_line":"    def test_domain_group_role_grant(self):"},{"line_number":64,"context_line":"        group_id \u003d uuid.uuid4().hex"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAM3%2F%2F%2BJA%3D","line":61,"in_reply_to":"AAAAM3%2F%2F%2FPA%3D","updated":"2012-12-18 14:26:10.000000000","message":"Done","commit_id":"564d9f87a95ca06f5555a4710ada51460eb9641f"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"e23ec1ccfbabb072ab6ce97423abd3f0cbc72987","unresolved":false,"context_lines":[{"line_number":81,"context_line":"        self.mox.ReplayAll()"},{"line_number":82,"context_line":""},{"line_number":83,"context_line":"        self.manager.grant(role\u003dref[\u0027id\u0027], domain\u003ddomain_id,"},{"line_number":84,"context_line":"                           group\u003dgroup_id, user\u003dNone)"},{"line_number":85,"context_line":""},{"line_number":86,"context_line":"    def test_domain_role_list(self):"},{"line_number":87,"context_line":"        user_id \u003d uuid.uuid4().hex"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAM3%2F%2F%2FO0%3D","line":84,"updated":"2012-12-17 18:41:17.000000000","message":"remove the user kwarg, same reason as above","commit_id":"564d9f87a95ca06f5555a4710ada51460eb9641f"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"80a24c373e392f4f654de965962b23e10786117b","unresolved":false,"context_lines":[{"line_number":81,"context_line":"        self.mox.ReplayAll()"},{"line_number":82,"context_line":""},{"line_number":83,"context_line":"        self.manager.grant(role\u003dref[\u0027id\u0027], domain\u003ddomain_id,"},{"line_number":84,"context_line":"                           group\u003dgroup_id, user\u003dNone)"},{"line_number":85,"context_line":""},{"line_number":86,"context_line":"    def test_domain_role_list(self):"},{"line_number":87,"context_line":"        user_id \u003d uuid.uuid4().hex"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAM3%2F%2F%2BI8%3D","line":84,"in_reply_to":"AAAAM3%2F%2F%2FO0%3D","updated":"2012-12-18 14:26:10.000000000","message":"Done","commit_id":"564d9f87a95ca06f5555a4710ada51460eb9641f"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"e23ec1ccfbabb072ab6ce97423abd3f0cbc72987","unresolved":false,"context_lines":[{"line_number":171,"context_line":"        self.mox.ReplayAll()"},{"line_number":172,"context_line":""},{"line_number":173,"context_line":"        self.manager.check(role\u003dref[\u0027id\u0027], domain\u003ddomain_id,"},{"line_number":174,"context_line":"                           group\u003dgroup_id, user\u003dNone)"},{"line_number":175,"context_line":""},{"line_number":176,"context_line":"    def test_domain_role_revoke(self):"},{"line_number":177,"context_line":"        user_id \u003d uuid.uuid4().hex"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAM3%2F%2F%2FOo%3D","line":174,"updated":"2012-12-17 18:41:17.000000000","message":"remove user kwarg","commit_id":"564d9f87a95ca06f5555a4710ada51460eb9641f"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"80a24c373e392f4f654de965962b23e10786117b","unresolved":false,"context_lines":[{"line_number":171,"context_line":"        self.mox.ReplayAll()"},{"line_number":172,"context_line":""},{"line_number":173,"context_line":"        self.manager.check(role\u003dref[\u0027id\u0027], domain\u003ddomain_id,"},{"line_number":174,"context_line":"                           group\u003dgroup_id, user\u003dNone)"},{"line_number":175,"context_line":""},{"line_number":176,"context_line":"    def test_domain_role_revoke(self):"},{"line_number":177,"context_line":"        user_id \u003d uuid.uuid4().hex"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAM3%2F%2F%2BI4%3D","line":174,"in_reply_to":"AAAAM3%2F%2F%2FOo%3D","updated":"2012-12-18 14:26:10.000000000","message":"Done","commit_id":"564d9f87a95ca06f5555a4710ada51460eb9641f"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"e23ec1ccfbabb072ab6ce97423abd3f0cbc72987","unresolved":false,"context_lines":[{"line_number":217,"context_line":"        self.mox.ReplayAll()"},{"line_number":218,"context_line":""},{"line_number":219,"context_line":"        self.manager.revoke(role\u003dref[\u0027id\u0027], domain\u003ddomain_id,"},{"line_number":220,"context_line":"                            group\u003dgroup_id, user\u003dNone)"},{"line_number":221,"context_line":""},{"line_number":222,"context_line":"    def test_project_role_grant(self):"},{"line_number":223,"context_line":"        user_id \u003d uuid.uuid4().hex"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAM3%2F%2F%2FOk%3D","line":220,"updated":"2012-12-17 18:41:17.000000000","message":"remove user kwarg","commit_id":"564d9f87a95ca06f5555a4710ada51460eb9641f"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"80a24c373e392f4f654de965962b23e10786117b","unresolved":false,"context_lines":[{"line_number":217,"context_line":"        self.mox.ReplayAll()"},{"line_number":218,"context_line":""},{"line_number":219,"context_line":"        self.manager.revoke(role\u003dref[\u0027id\u0027], domain\u003ddomain_id,"},{"line_number":220,"context_line":"                            group\u003dgroup_id, user\u003dNone)"},{"line_number":221,"context_line":""},{"line_number":222,"context_line":"    def test_project_role_grant(self):"},{"line_number":223,"context_line":"        user_id \u003d uuid.uuid4().hex"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAM3%2F%2F%2BI0%3D","line":220,"in_reply_to":"AAAAM3%2F%2F%2FOk%3D","updated":"2012-12-18 14:26:10.000000000","message":"Done","commit_id":"564d9f87a95ca06f5555a4710ada51460eb9641f"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"e23ec1ccfbabb072ab6ce97423abd3f0cbc72987","unresolved":false,"context_lines":[{"line_number":240,"context_line":"        self.mox.ReplayAll()"},{"line_number":241,"context_line":""},{"line_number":242,"context_line":"        self.manager.grant(role\u003dref[\u0027id\u0027], project\u003dproject_id,"},{"line_number":243,"context_line":"                           group\u003dNone, user\u003duser_id)"},{"line_number":244,"context_line":""},{"line_number":245,"context_line":"    def test_project_group_role_grant(self):"},{"line_number":246,"context_line":"        group_id \u003d uuid.uuid4().hex"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAM3%2F%2F%2FOg%3D","line":243,"updated":"2012-12-17 18:41:17.000000000","message":"same","commit_id":"564d9f87a95ca06f5555a4710ada51460eb9641f"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"80a24c373e392f4f654de965962b23e10786117b","unresolved":false,"context_lines":[{"line_number":240,"context_line":"        self.mox.ReplayAll()"},{"line_number":241,"context_line":""},{"line_number":242,"context_line":"        self.manager.grant(role\u003dref[\u0027id\u0027], project\u003dproject_id,"},{"line_number":243,"context_line":"                           group\u003dNone, user\u003duser_id)"},{"line_number":244,"context_line":""},{"line_number":245,"context_line":"    def test_project_group_role_grant(self):"},{"line_number":246,"context_line":"        group_id \u003d uuid.uuid4().hex"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAM3%2F%2F%2BIw%3D","line":243,"in_reply_to":"AAAAM3%2F%2F%2FOg%3D","updated":"2012-12-18 14:26:10.000000000","message":"Done","commit_id":"564d9f87a95ca06f5555a4710ada51460eb9641f"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"e23ec1ccfbabb072ab6ce97423abd3f0cbc72987","unresolved":false,"context_lines":[{"line_number":263,"context_line":"        self.mox.ReplayAll()"},{"line_number":264,"context_line":""},{"line_number":265,"context_line":"        self.manager.grant(role\u003dref[\u0027id\u0027], project\u003dproject_id,"},{"line_number":266,"context_line":"                           group\u003dgroup_id, user\u003dNone)"},{"line_number":267,"context_line":""},{"line_number":268,"context_line":"    def test_project_role_list(self):"},{"line_number":269,"context_line":"        user_id \u003d uuid.uuid4().hex"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAM3%2F%2F%2FOc%3D","line":266,"updated":"2012-12-17 18:41:17.000000000","message":"same","commit_id":"564d9f87a95ca06f5555a4710ada51460eb9641f"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"80a24c373e392f4f654de965962b23e10786117b","unresolved":false,"context_lines":[{"line_number":263,"context_line":"        self.mox.ReplayAll()"},{"line_number":264,"context_line":""},{"line_number":265,"context_line":"        self.manager.grant(role\u003dref[\u0027id\u0027], project\u003dproject_id,"},{"line_number":266,"context_line":"                           group\u003dgroup_id, user\u003dNone)"},{"line_number":267,"context_line":""},{"line_number":268,"context_line":"    def test_project_role_list(self):"},{"line_number":269,"context_line":"        user_id \u003d uuid.uuid4().hex"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAM3%2F%2F%2BIs%3D","line":266,"in_reply_to":"AAAAM3%2F%2F%2FOc%3D","updated":"2012-12-18 14:26:10.000000000","message":"Done","commit_id":"564d9f87a95ca06f5555a4710ada51460eb9641f"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"e23ec1ccfbabb072ab6ce97423abd3f0cbc72987","unresolved":false,"context_lines":[{"line_number":330,"context_line":"        self.mox.ReplayAll()"},{"line_number":331,"context_line":""},{"line_number":332,"context_line":"        self.manager.check(role\u003dref[\u0027id\u0027], project\u003dproject_id,"},{"line_number":333,"context_line":"                           group\u003dNone, user\u003duser_id)"},{"line_number":334,"context_line":""},{"line_number":335,"context_line":"    def test_project_group_role_check(self):"},{"line_number":336,"context_line":"        group_id \u003d uuid.uuid4().hex"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAM3%2F%2F%2FOY%3D","line":333,"updated":"2012-12-17 18:41:17.000000000","message":"same","commit_id":"564d9f87a95ca06f5555a4710ada51460eb9641f"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"80a24c373e392f4f654de965962b23e10786117b","unresolved":false,"context_lines":[{"line_number":330,"context_line":"        self.mox.ReplayAll()"},{"line_number":331,"context_line":""},{"line_number":332,"context_line":"        self.manager.check(role\u003dref[\u0027id\u0027], project\u003dproject_id,"},{"line_number":333,"context_line":"                           group\u003dNone, user\u003duser_id)"},{"line_number":334,"context_line":""},{"line_number":335,"context_line":"    def test_project_group_role_check(self):"},{"line_number":336,"context_line":"        group_id \u003d uuid.uuid4().hex"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAM3%2F%2F%2BIo%3D","line":333,"in_reply_to":"AAAAM3%2F%2F%2FOY%3D","updated":"2012-12-18 14:26:10.000000000","message":"Done","commit_id":"564d9f87a95ca06f5555a4710ada51460eb9641f"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"e23ec1ccfbabb072ab6ce97423abd3f0cbc72987","unresolved":false,"context_lines":[{"line_number":353,"context_line":"        self.mox.ReplayAll()"},{"line_number":354,"context_line":""},{"line_number":355,"context_line":"        self.manager.check(role\u003dref[\u0027id\u0027], project\u003dproject_id,"},{"line_number":356,"context_line":"                           group\u003dgroup_id, user\u003dNone)"},{"line_number":357,"context_line":""},{"line_number":358,"context_line":"    def test_project_role_revoke(self):"},{"line_number":359,"context_line":"        user_id \u003d uuid.uuid4().hex"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAM3%2F%2F%2FOU%3D","line":356,"updated":"2012-12-17 18:41:17.000000000","message":"same","commit_id":"564d9f87a95ca06f5555a4710ada51460eb9641f"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"e23ec1ccfbabb072ab6ce97423abd3f0cbc72987","unresolved":false,"context_lines":[{"line_number":376,"context_line":"        self.mox.ReplayAll()"},{"line_number":377,"context_line":""},{"line_number":378,"context_line":"        self.manager.revoke(role\u003dref[\u0027id\u0027], project\u003dproject_id,"},{"line_number":379,"context_line":"                            group\u003dNone, user\u003duser_id)"},{"line_number":380,"context_line":""},{"line_number":381,"context_line":"    def test_project_group_role_revoke(self):"},{"line_number":382,"context_line":"        group_id \u003d uuid.uuid4().hex"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAM3%2F%2F%2FOQ%3D","line":379,"updated":"2012-12-17 18:41:17.000000000","message":"same","commit_id":"564d9f87a95ca06f5555a4710ada51460eb9641f"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"80a24c373e392f4f654de965962b23e10786117b","unresolved":false,"context_lines":[{"line_number":376,"context_line":"        self.mox.ReplayAll()"},{"line_number":377,"context_line":""},{"line_number":378,"context_line":"        self.manager.revoke(role\u003dref[\u0027id\u0027], project\u003dproject_id,"},{"line_number":379,"context_line":"                            group\u003dNone, user\u003duser_id)"},{"line_number":380,"context_line":""},{"line_number":381,"context_line":"    def test_project_group_role_revoke(self):"},{"line_number":382,"context_line":"        group_id \u003d uuid.uuid4().hex"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAM3%2F%2F%2BIk%3D","line":379,"in_reply_to":"AAAAM3%2F%2F%2FOQ%3D","updated":"2012-12-18 14:26:10.000000000","message":"Done","commit_id":"564d9f87a95ca06f5555a4710ada51460eb9641f"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"e23ec1ccfbabb072ab6ce97423abd3f0cbc72987","unresolved":false,"context_lines":[{"line_number":399,"context_line":"        self.mox.ReplayAll()"},{"line_number":400,"context_line":""},{"line_number":401,"context_line":"        self.manager.revoke(role\u003dref[\u0027id\u0027], project\u003dproject_id,"},{"line_number":402,"context_line":"                            group\u003dgroup_id, user\u003dNone)"},{"line_number":403,"context_line":""},{"line_number":404,"context_line":"    def test_domain_project_role_grant_fails(self):"},{"line_number":405,"context_line":"        user_id \u003d uuid.uuid4().hex"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAM3%2F%2F%2FOM%3D","line":402,"updated":"2012-12-17 18:41:17.000000000","message":"same","commit_id":"564d9f87a95ca06f5555a4710ada51460eb9641f"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"80a24c373e392f4f654de965962b23e10786117b","unresolved":false,"context_lines":[{"line_number":399,"context_line":"        self.mox.ReplayAll()"},{"line_number":400,"context_line":""},{"line_number":401,"context_line":"        self.manager.revoke(role\u003dref[\u0027id\u0027], project\u003dproject_id,"},{"line_number":402,"context_line":"                            group\u003dgroup_id, user\u003dNone)"},{"line_number":403,"context_line":""},{"line_number":404,"context_line":"    def test_domain_project_role_grant_fails(self):"},{"line_number":405,"context_line":"        user_id \u003d uuid.uuid4().hex"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAM3%2F%2F%2BIc%3D","line":402,"in_reply_to":"AAAAM3%2F%2F%2FOM%3D","updated":"2012-12-18 14:26:10.000000000","message":"Done","commit_id":"564d9f87a95ca06f5555a4710ada51460eb9641f"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"e23ec1ccfbabb072ab6ce97423abd3f0cbc72987","unresolved":false,"context_lines":[{"line_number":413,"context_line":"            role\u003dref[\u0027id\u0027],"},{"line_number":414,"context_line":"            domain\u003ddomain_id,"},{"line_number":415,"context_line":"            project\u003dproject_id,"},{"line_number":416,"context_line":"            group\u003dNone,"},{"line_number":417,"context_line":"            user\u003duser_id)"},{"line_number":418,"context_line":""},{"line_number":419,"context_line":"    def test_domain_project_role_list_fails(self):"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAM3%2F%2F%2FOI%3D","line":416,"updated":"2012-12-17 18:41:17.000000000","message":"remove","commit_id":"564d9f87a95ca06f5555a4710ada51460eb9641f"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"80a24c373e392f4f654de965962b23e10786117b","unresolved":false,"context_lines":[{"line_number":413,"context_line":"            role\u003dref[\u0027id\u0027],"},{"line_number":414,"context_line":"            domain\u003ddomain_id,"},{"line_number":415,"context_line":"            project\u003dproject_id,"},{"line_number":416,"context_line":"            group\u003dNone,"},{"line_number":417,"context_line":"            user\u003duser_id)"},{"line_number":418,"context_line":""},{"line_number":419,"context_line":"    def test_domain_project_role_list_fails(self):"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAM3%2F%2F%2BIY%3D","line":416,"in_reply_to":"AAAAM3%2F%2F%2FOI%3D","updated":"2012-12-18 14:26:10.000000000","message":"Done","commit_id":"564d9f87a95ca06f5555a4710ada51460eb9641f"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"e23ec1ccfbabb072ab6ce97423abd3f0cbc72987","unresolved":false,"context_lines":[{"line_number":426,"context_line":"            self.manager.list,"},{"line_number":427,"context_line":"            domain\u003ddomain_id,"},{"line_number":428,"context_line":"            project\u003dproject_id,"},{"line_number":429,"context_line":"            group\u003dNone,"},{"line_number":430,"context_line":"            user\u003duser_id)"},{"line_number":431,"context_line":""},{"line_number":432,"context_line":"    def test_domain_project_role_check_fails(self):"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAM3%2F%2F%2FOE%3D","line":429,"updated":"2012-12-17 18:41:17.000000000","message":"remove","commit_id":"564d9f87a95ca06f5555a4710ada51460eb9641f"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"80a24c373e392f4f654de965962b23e10786117b","unresolved":false,"context_lines":[{"line_number":426,"context_line":"            self.manager.list,"},{"line_number":427,"context_line":"            domain\u003ddomain_id,"},{"line_number":428,"context_line":"            project\u003dproject_id,"},{"line_number":429,"context_line":"            group\u003dNone,"},{"line_number":430,"context_line":"            user\u003duser_id)"},{"line_number":431,"context_line":""},{"line_number":432,"context_line":"    def test_domain_project_role_check_fails(self):"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAM3%2F%2F%2BIU%3D","line":429,"in_reply_to":"AAAAM3%2F%2F%2FOE%3D","updated":"2012-12-18 14:26:10.000000000","message":"Done","commit_id":"564d9f87a95ca06f5555a4710ada51460eb9641f"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"e23ec1ccfbabb072ab6ce97423abd3f0cbc72987","unresolved":false,"context_lines":[{"line_number":441,"context_line":"            role\u003dref[\u0027id\u0027],"},{"line_number":442,"context_line":"            domain\u003ddomain_id,"},{"line_number":443,"context_line":"            project\u003dproject_id,"},{"line_number":444,"context_line":"            group\u003dNone,"},{"line_number":445,"context_line":"            user\u003duser_id)"},{"line_number":446,"context_line":""},{"line_number":447,"context_line":"    def test_domain_project_role_revoke_fails(self):"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAM3%2F%2F%2FOA%3D","line":444,"updated":"2012-12-17 18:41:17.000000000","message":"remove","commit_id":"564d9f87a95ca06f5555a4710ada51460eb9641f"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"80a24c373e392f4f654de965962b23e10786117b","unresolved":false,"context_lines":[{"line_number":441,"context_line":"            role\u003dref[\u0027id\u0027],"},{"line_number":442,"context_line":"            domain\u003ddomain_id,"},{"line_number":443,"context_line":"            project\u003dproject_id,"},{"line_number":444,"context_line":"            group\u003dNone,"},{"line_number":445,"context_line":"            user\u003duser_id)"},{"line_number":446,"context_line":""},{"line_number":447,"context_line":"    def test_domain_project_role_revoke_fails(self):"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAM3%2F%2F%2BIQ%3D","line":444,"in_reply_to":"AAAAM3%2F%2F%2FOA%3D","updated":"2012-12-18 14:26:10.000000000","message":"Done","commit_id":"564d9f87a95ca06f5555a4710ada51460eb9641f"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"e23ec1ccfbabb072ab6ce97423abd3f0cbc72987","unresolved":false,"context_lines":[{"line_number":456,"context_line":"            role\u003dref[\u0027id\u0027],"},{"line_number":457,"context_line":"            domain\u003ddomain_id,"},{"line_number":458,"context_line":"            project\u003dproject_id,"},{"line_number":459,"context_line":"            group\u003dNone,"},{"line_number":460,"context_line":"            user\u003duser_id)"},{"line_number":461,"context_line":""},{"line_number":462,"context_line":"    def test_user_group_role_grant_fails(self):"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAM3%2F%2F%2FN8%3D","line":459,"updated":"2012-12-17 18:41:17.000000000","message":"remove","commit_id":"564d9f87a95ca06f5555a4710ada51460eb9641f"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"80a24c373e392f4f654de965962b23e10786117b","unresolved":false,"context_lines":[{"line_number":456,"context_line":"            role\u003dref[\u0027id\u0027],"},{"line_number":457,"context_line":"            domain\u003ddomain_id,"},{"line_number":458,"context_line":"            project\u003dproject_id,"},{"line_number":459,"context_line":"            group\u003dNone,"},{"line_number":460,"context_line":"            user\u003duser_id)"},{"line_number":461,"context_line":""},{"line_number":462,"context_line":"    def test_user_group_role_grant_fails(self):"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAM3%2F%2F%2BIM%3D","line":459,"in_reply_to":"AAAAM3%2F%2F%2FN8%3D","updated":"2012-12-18 14:26:10.000000000","message":"Done","commit_id":"564d9f87a95ca06f5555a4710ada51460eb9641f"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"e23ec1ccfbabb072ab6ce97423abd3f0cbc72987","unresolved":false,"context_lines":[{"line_number":469,"context_line":"            exceptions.ValidationError,"},{"line_number":470,"context_line":"            self.manager.grant,"},{"line_number":471,"context_line":"            role\u003dref[\u0027id\u0027],"},{"line_number":472,"context_line":"            domain\u003dNone,"},{"line_number":473,"context_line":"            project\u003dproject_id,"},{"line_number":474,"context_line":"            group\u003dgroup_id,"},{"line_number":475,"context_line":"            user\u003duser_id)"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAM3%2F%2F%2FN0%3D","line":472,"updated":"2012-12-17 18:41:17.000000000","message":"remove","commit_id":"564d9f87a95ca06f5555a4710ada51460eb9641f"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"80a24c373e392f4f654de965962b23e10786117b","unresolved":false,"context_lines":[{"line_number":469,"context_line":"            exceptions.ValidationError,"},{"line_number":470,"context_line":"            self.manager.grant,"},{"line_number":471,"context_line":"            role\u003dref[\u0027id\u0027],"},{"line_number":472,"context_line":"            domain\u003dNone,"},{"line_number":473,"context_line":"            project\u003dproject_id,"},{"line_number":474,"context_line":"            group\u003dgroup_id,"},{"line_number":475,"context_line":"            user\u003duser_id)"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAM3%2F%2F%2BII%3D","line":472,"in_reply_to":"AAAAM3%2F%2F%2FN0%3D","updated":"2012-12-18 14:26:10.000000000","message":"Done","commit_id":"564d9f87a95ca06f5555a4710ada51460eb9641f"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"e23ec1ccfbabb072ab6ce97423abd3f0cbc72987","unresolved":false,"context_lines":[{"line_number":482,"context_line":"        self.assertRaises("},{"line_number":483,"context_line":"            exceptions.ValidationError,"},{"line_number":484,"context_line":"            self.manager.list,"},{"line_number":485,"context_line":"            domain\u003dNone,"},{"line_number":486,"context_line":"            project\u003dproject_id,"},{"line_number":487,"context_line":"            group\u003dgroup_id,"},{"line_number":488,"context_line":"            user\u003duser_id)"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAM3%2F%2F%2FNw%3D","line":485,"updated":"2012-12-17 18:41:17.000000000","message":"remove","commit_id":"564d9f87a95ca06f5555a4710ada51460eb9641f"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"80a24c373e392f4f654de965962b23e10786117b","unresolved":false,"context_lines":[{"line_number":482,"context_line":"        self.assertRaises("},{"line_number":483,"context_line":"            exceptions.ValidationError,"},{"line_number":484,"context_line":"            self.manager.list,"},{"line_number":485,"context_line":"            domain\u003dNone,"},{"line_number":486,"context_line":"            project\u003dproject_id,"},{"line_number":487,"context_line":"            group\u003dgroup_id,"},{"line_number":488,"context_line":"            user\u003duser_id)"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAM3%2F%2F%2BIE%3D","line":485,"in_reply_to":"AAAAM3%2F%2F%2FNw%3D","updated":"2012-12-18 14:26:10.000000000","message":"Done","commit_id":"564d9f87a95ca06f5555a4710ada51460eb9641f"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"e23ec1ccfbabb072ab6ce97423abd3f0cbc72987","unresolved":false,"context_lines":[{"line_number":497,"context_line":"            exceptions.ValidationError,"},{"line_number":498,"context_line":"            self.manager.check,"},{"line_number":499,"context_line":"            role\u003dref[\u0027id\u0027],"},{"line_number":500,"context_line":"            domain\u003dNone,"},{"line_number":501,"context_line":"            project\u003dproject_id,"},{"line_number":502,"context_line":"            group\u003dgroup_id,"},{"line_number":503,"context_line":"            user\u003duser_id)"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAM3%2F%2F%2FNk%3D","line":500,"updated":"2012-12-17 18:41:17.000000000","message":"remove","commit_id":"564d9f87a95ca06f5555a4710ada51460eb9641f"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"80a24c373e392f4f654de965962b23e10786117b","unresolved":false,"context_lines":[{"line_number":497,"context_line":"            exceptions.ValidationError,"},{"line_number":498,"context_line":"            self.manager.check,"},{"line_number":499,"context_line":"            role\u003dref[\u0027id\u0027],"},{"line_number":500,"context_line":"            domain\u003dNone,"},{"line_number":501,"context_line":"            project\u003dproject_id,"},{"line_number":502,"context_line":"            group\u003dgroup_id,"},{"line_number":503,"context_line":"            user\u003duser_id)"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAM3%2F%2F%2BIA%3D","line":500,"in_reply_to":"AAAAM3%2F%2F%2FNk%3D","updated":"2012-12-18 14:26:10.000000000","message":"Done","commit_id":"564d9f87a95ca06f5555a4710ada51460eb9641f"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"e23ec1ccfbabb072ab6ce97423abd3f0cbc72987","unresolved":false,"context_lines":[{"line_number":508,"context_line":"        project_id \u003d uuid.uuid4().hex"},{"line_number":509,"context_line":"        ref \u003d self.new_ref()"},{"line_number":510,"context_line":""},{"line_number":511,"context_line":"        self.assertRaises("},{"line_number":512,"context_line":"            exceptions.ValidationError,"},{"line_number":513,"context_line":"            self.manager.revoke,"},{"line_number":514,"context_line":"            role\u003dref[\u0027id\u0027],"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAM3%2F%2F%2FNY%3D","line":511,"updated":"2012-12-17 18:41:17.000000000","message":"There\u0027s another syntax you can use for these, if you prefer:\n\n  with self.assertRaises(exceptions.ValidationError):\n    self.manager.revoke(...)","commit_id":"564d9f87a95ca06f5555a4710ada51460eb9641f"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"80a24c373e392f4f654de965962b23e10786117b","unresolved":false,"context_lines":[{"line_number":508,"context_line":"        project_id \u003d uuid.uuid4().hex"},{"line_number":509,"context_line":"        ref \u003d self.new_ref()"},{"line_number":510,"context_line":""},{"line_number":511,"context_line":"        self.assertRaises("},{"line_number":512,"context_line":"            exceptions.ValidationError,"},{"line_number":513,"context_line":"            self.manager.revoke,"},{"line_number":514,"context_line":"            role\u003dref[\u0027id\u0027],"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAM3%2F%2F%2BH4%3D","line":511,"in_reply_to":"AAAAM3%2F%2F%2FNY%3D","updated":"2012-12-18 14:26:10.000000000","message":"Thanks, I\u0027ll look at that","commit_id":"564d9f87a95ca06f5555a4710ada51460eb9641f"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"e23ec1ccfbabb072ab6ce97423abd3f0cbc72987","unresolved":false,"context_lines":[{"line_number":512,"context_line":"            exceptions.ValidationError,"},{"line_number":513,"context_line":"            self.manager.revoke,"},{"line_number":514,"context_line":"            role\u003dref[\u0027id\u0027],"},{"line_number":515,"context_line":"            domain\u003dNone,"},{"line_number":516,"context_line":"            project\u003dproject_id,"},{"line_number":517,"context_line":"            group\u003dgroup_id,"},{"line_number":518,"context_line":"            user\u003duser_id)"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAM3%2F%2F%2FNg%3D","line":515,"updated":"2012-12-17 18:41:17.000000000","message":"remove","commit_id":"564d9f87a95ca06f5555a4710ada51460eb9641f"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"80a24c373e392f4f654de965962b23e10786117b","unresolved":false,"context_lines":[{"line_number":512,"context_line":"            exceptions.ValidationError,"},{"line_number":513,"context_line":"            self.manager.revoke,"},{"line_number":514,"context_line":"            role\u003dref[\u0027id\u0027],"},{"line_number":515,"context_line":"            domain\u003dNone,"},{"line_number":516,"context_line":"            project\u003dproject_id,"},{"line_number":517,"context_line":"            group\u003dgroup_id,"},{"line_number":518,"context_line":"            user\u003duser_id)"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAM3%2F%2F%2BH0%3D","line":515,"in_reply_to":"AAAAM3%2F%2F%2FNg%3D","updated":"2012-12-18 14:26:10.000000000","message":"Done","commit_id":"564d9f87a95ca06f5555a4710ada51460eb9641f"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"ddc00bed7cbbf7bd8512bcde83a8acd4cf25200b","unresolved":false,"context_lines":[{"line_number":146,"context_line":"        self.mox.ReplayAll()"},{"line_number":147,"context_line":""},{"line_number":148,"context_line":"        self.manager.check(role\u003dref[\u0027id\u0027], domain\u003ddomain_id,"},{"line_number":149,"context_line":"                           group\u003dNone, user\u003duser_id)"},{"line_number":150,"context_line":""},{"line_number":151,"context_line":"    def test_domain_group_role_check(self):"},{"line_number":152,"context_line":"        group_id \u003d uuid.uuid4().hex"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAM3%2F%2F6f8%3D","line":149,"updated":"2012-12-21 03:29:47.000000000","message":"Remove group","commit_id":"f74deabcfd8085411a7b3b4b1503275013fc4500"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"ebcbcb50d1880a6b3c04116b536462867edc406f","unresolved":false,"context_lines":[{"line_number":146,"context_line":"        self.mox.ReplayAll()"},{"line_number":147,"context_line":""},{"line_number":148,"context_line":"        self.manager.check(role\u003dref[\u0027id\u0027], domain\u003ddomain_id,"},{"line_number":149,"context_line":"                           group\u003dNone, user\u003duser_id)"},{"line_number":150,"context_line":""},{"line_number":151,"context_line":"    def test_domain_group_role_check(self):"},{"line_number":152,"context_line":"        group_id \u003d uuid.uuid4().hex"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAM3%2F%2F6WY%3D","line":149,"in_reply_to":"AAAAM3%2F%2F6f8%3D","updated":"2012-12-21 09:50:10.000000000","message":"Done","commit_id":"f74deabcfd8085411a7b3b4b1503275013fc4500"}],"tests/v3/test_users.py":[{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"e23ec1ccfbabb072ab6ce97423abd3f0cbc72987","unresolved":false,"context_lines":[{"line_number":80,"context_line":"            .AndReturn((resp, resp[\u0027body\u0027]))"},{"line_number":81,"context_line":"        self.mox.ReplayAll()"},{"line_number":82,"context_line":""},{"line_number":83,"context_line":"        self.manager.remove_from_group(user\u003dref[\u0027id\u0027], group\u003dgroup_id)"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAM3%2F%2F%2FMg%3D","line":83,"updated":"2012-12-17 18:41:17.000000000","message":"add test_check_user_in_group and test_list_user_groups","commit_id":"564d9f87a95ca06f5555a4710ada51460eb9641f"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"80a24c373e392f4f654de965962b23e10786117b","unresolved":false,"context_lines":[{"line_number":80,"context_line":"            .AndReturn((resp, resp[\u0027body\u0027]))"},{"line_number":81,"context_line":"        self.mox.ReplayAll()"},{"line_number":82,"context_line":""},{"line_number":83,"context_line":"        self.manager.remove_from_group(user\u003dref[\u0027id\u0027], group\u003dgroup_id)"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAM3%2F%2F%2BJc%3D","line":83,"in_reply_to":"AAAAM3%2F%2F%2FMg%3D","updated":"2012-12-18 14:26:10.000000000","message":"Done","commit_id":"564d9f87a95ca06f5555a4710ada51460eb9641f"}]}
