)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"924e57a989c377d85efaba9e2da08dee2a819888","unresolved":false,"context_lines":[{"line_number":10,"context_line":"following API calls through the"},{"line_number":11,"context_line":"python-keystoneclient:"},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"http://docs.openstack.org/api/openstack-identity-service/3/content/api-1.html"},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"Co-Authored-By: Raildo Mascena \u003craildo@lsd.ufcg.edu.br\u003e"},{"line_number":16,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":6,"id":"baa201ad_6e29f388","line":13,"updated":"2014-10-12 20:53:59.000000000","message":"\"Do not assume the reviewer has access to external web services/site.\" - See https://wiki.openstack.org/wiki/GitCommitMessages#Information_in_commit_messages\n\nDescribe the operations in the commit message rather than expecting the reviewer to access an external web site.","commit_id":"ab075ee0ebceb7af7152f0cc26014e36ed4fc460"}],"keystoneclient/base.py":[{"author":{"_account_id":9101,"name":"wanghong","email":"reviewwanghong@126.com","username":"wanghong"},"change_message_id":"b6b54d4ab81993793050a1b007c7e33ecec0b01d","unresolved":false,"context_lines":[{"line_number":308,"context_line":"        if dict_args_in_out is None:"},{"line_number":309,"context_line":"            dict_args_in_out \u003d {}"},{"line_number":310,"context_line":""},{"line_number":311,"context_line":"        inheritable \u003d \u0027\u0027"},{"line_number":312,"context_line":"        if \u0027inherited\u0027 in dict_args_in_out and dict_args_in_out[\u0027inherited\u0027]:"},{"line_number":313,"context_line":"            inheritable \u003d \u0027/inherited_to_projects\u0027"},{"line_number":314,"context_line":"        dict_args_in_out.pop(\u0027inherited\u0027, None)"}],"source_content_type":"text/x-python","patch_set":7,"id":"5a890539_d5ae8280","line":311,"updated":"2014-11-15 01:13:09.000000000","message":"I think we should do this within _role_grants_base_url method in roles.py instead.","commit_id":"31a83b053ae687f7cf3d6e27e6c12d7be1b2287f"},{"author":{"_account_id":9101,"name":"wanghong","email":"reviewwanghong@126.com","username":"wanghong"},"change_message_id":"3c482c0f62bcbaa0ccb3170a2543d20a9e3e841d","unresolved":false,"context_lines":[{"line_number":308,"context_line":"        if dict_args_in_out is None:"},{"line_number":309,"context_line":"            dict_args_in_out \u003d {}"},{"line_number":310,"context_line":""},{"line_number":311,"context_line":"        inheritable \u003d \u0027\u0027"},{"line_number":312,"context_line":"        if \u0027inherited\u0027 in dict_args_in_out and dict_args_in_out[\u0027inherited\u0027]:"},{"line_number":313,"context_line":"            inheritable \u003d \u0027/inherited_to_projects\u0027"},{"line_number":314,"context_line":"        dict_args_in_out.pop(\u0027inherited\u0027, None)"}],"source_content_type":"text/x-python","patch_set":7,"id":"5a890539_0d0fed37","line":311,"in_reply_to":"5a890539_03aef497","updated":"2014-11-18 01:25:33.000000000","message":"Maybe add a \u0027tail\u0027 parameter?","commit_id":"31a83b053ae687f7cf3d6e27e6c12d7be1b2287f"},{"author":{"_account_id":10046,"name":"Henrique Truta","email":"henrique@lsd.ufcg.edu.br","username":"henriquetruta"},"change_message_id":"f265e318e393b796548c5e01a6a09576bab9b1e3","unresolved":false,"context_lines":[{"line_number":308,"context_line":"        if dict_args_in_out is None:"},{"line_number":309,"context_line":"            dict_args_in_out \u003d {}"},{"line_number":310,"context_line":""},{"line_number":311,"context_line":"        inheritable \u003d \u0027\u0027"},{"line_number":312,"context_line":"        if \u0027inherited\u0027 in dict_args_in_out and dict_args_in_out[\u0027inherited\u0027]:"},{"line_number":313,"context_line":"            inheritable \u003d \u0027/inherited_to_projects\u0027"},{"line_number":314,"context_line":"        dict_args_in_out.pop(\u0027inherited\u0027, None)"}],"source_content_type":"text/x-python","patch_set":7,"id":"5a890539_bb4d2540","line":311,"in_reply_to":"5a890539_0d0fed37","updated":"2014-11-18 12:17:32.000000000","message":"Isn\u0027t it almost what I did in the other file?","commit_id":"31a83b053ae687f7cf3d6e27e6c12d7be1b2287f"},{"author":{"_account_id":10046,"name":"Henrique Truta","email":"henrique@lsd.ufcg.edu.br","username":"henriquetruta"},"change_message_id":"9a1671c7e8418d85ea07ec34a7ab62673df18e42","unresolved":false,"context_lines":[{"line_number":308,"context_line":"        if dict_args_in_out is None:"},{"line_number":309,"context_line":"            dict_args_in_out \u003d {}"},{"line_number":310,"context_line":""},{"line_number":311,"context_line":"        inheritable \u003d \u0027\u0027"},{"line_number":312,"context_line":"        if \u0027inherited\u0027 in dict_args_in_out and dict_args_in_out[\u0027inherited\u0027]:"},{"line_number":313,"context_line":"            inheritable \u003d \u0027/inherited_to_projects\u0027"},{"line_number":314,"context_line":"        dict_args_in_out.pop(\u0027inherited\u0027, None)"}],"source_content_type":"text/x-python","patch_set":7,"id":"5a890539_6b9f3951","line":311,"in_reply_to":"5a890539_3e5107d9","updated":"2014-11-19 14:54:36.000000000","message":"I agree with you. Where do I put this \"tail\" parameter?","commit_id":"31a83b053ae687f7cf3d6e27e6c12d7be1b2287f"},{"author":{"_account_id":9101,"name":"wanghong","email":"reviewwanghong@126.com","username":"wanghong"},"change_message_id":"04613838f99dbe961d98362fae23607daf20176a","unresolved":false,"context_lines":[{"line_number":308,"context_line":"        if dict_args_in_out is None:"},{"line_number":309,"context_line":"            dict_args_in_out \u003d {}"},{"line_number":310,"context_line":""},{"line_number":311,"context_line":"        inheritable \u003d \u0027\u0027"},{"line_number":312,"context_line":"        if \u0027inherited\u0027 in dict_args_in_out and dict_args_in_out[\u0027inherited\u0027]:"},{"line_number":313,"context_line":"            inheritable \u003d \u0027/inherited_to_projects\u0027"},{"line_number":314,"context_line":"        dict_args_in_out.pop(\u0027inherited\u0027, None)"}],"source_content_type":"text/x-python","patch_set":7,"id":"5a890539_3e5107d9","line":311,"in_reply_to":"5a890539_bb4d2540","updated":"2014-11-19 01:06:40.000000000","message":"No, I think that this file is a common module. So, we should not add *private* into this file. If another one wants to add another \u0027tail\u0027 into his url, should he modify this file too? But if you add a \u0027tail\u0027 process here, you and he can both add *private* in your own local files. This file only provides a capability that add tail in your url.","commit_id":"31a83b053ae687f7cf3d6e27e6c12d7be1b2287f"},{"author":{"_account_id":10046,"name":"Henrique Truta","email":"henrique@lsd.ufcg.edu.br","username":"henriquetruta"},"change_message_id":"0b70c2f5848aa3438bc66b8645e97dcb5c778a5f","unresolved":false,"context_lines":[{"line_number":308,"context_line":"        if dict_args_in_out is None:"},{"line_number":309,"context_line":"            dict_args_in_out \u003d {}"},{"line_number":310,"context_line":""},{"line_number":311,"context_line":"        inheritable \u003d \u0027\u0027"},{"line_number":312,"context_line":"        if \u0027inherited\u0027 in dict_args_in_out and dict_args_in_out[\u0027inherited\u0027]:"},{"line_number":313,"context_line":"            inheritable \u003d \u0027/inherited_to_projects\u0027"},{"line_number":314,"context_line":"        dict_args_in_out.pop(\u0027inherited\u0027, None)"}],"source_content_type":"text/x-python","patch_set":7,"id":"5a890539_03aef497","line":311,"in_reply_to":"5a890539_d5ae8280","updated":"2014-11-17 14:31:01.000000000","message":"Actually, we can\u0027t, since we don\u0027t know the exact order that _role_grants_base_url will be called. We need to put this here to ensure this will be put at the end of the URL","commit_id":"31a83b053ae687f7cf3d6e27e6c12d7be1b2287f"},{"author":{"_account_id":9101,"name":"wanghong","email":"reviewwanghong@126.com","username":"wanghong"},"change_message_id":"1e9d067fd0571fa4685bc3ffb9e7335ec9bad9a5","unresolved":false,"context_lines":[{"line_number":311,"context_line":"        inheritable \u003d \u0027\u0027"},{"line_number":312,"context_line":"        if \u0027inherited\u0027 in dict_args_in_out and dict_args_in_out[\u0027inherited\u0027]:"},{"line_number":313,"context_line":"            inheritable \u003d \u0027/inherited_to_projects\u0027"},{"line_number":314,"context_line":"        dict_args_in_out.pop(\u0027inherited\u0027, None)"},{"line_number":315,"context_line":""},{"line_number":316,"context_line":"        url \u003d dict_args_in_out.pop(\u0027base_url\u0027, None) or self.base_url or \u0027\u0027"},{"line_number":317,"context_line":"        url +\u003d \u0027/%s\u0027 % self.collection_key"}],"source_content_type":"text/x-python","patch_set":7,"id":"5a890539_9e573226","line":314,"updated":"2014-11-20 00:54:55.000000000","message":"I think this block can be removed.","commit_id":"31a83b053ae687f7cf3d6e27e6c12d7be1b2287f"},{"author":{"_account_id":9101,"name":"wanghong","email":"reviewwanghong@126.com","username":"wanghong"},"change_message_id":"1e9d067fd0571fa4685bc3ffb9e7335ec9bad9a5","unresolved":false,"context_lines":[{"line_number":321,"context_line":"        if entity_id is not None:"},{"line_number":322,"context_line":"            url +\u003d \u0027/%s\u0027 % entity_id"},{"line_number":323,"context_line":""},{"line_number":324,"context_line":"        url +\u003d inheritable"},{"line_number":325,"context_line":""},{"line_number":326,"context_line":"        return url"},{"line_number":327,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"5a890539_3e40fe55","line":324,"updated":"2014-11-20 00:54:55.000000000","message":"And, here, add:\n\nif \u0027tail\u0027 in dict_args_in_out and dict_args_in_out[\u0027tail\u0027]:\n    url +\u003d dict_args_in_out[\u0027tail\u0027]\n\nThen, we can specify tail\u003d\u0027/inherited_to_projects\u0027 in v3/roles.","commit_id":"31a83b053ae687f7cf3d6e27e6c12d7be1b2287f"},{"author":{"_account_id":10046,"name":"Henrique Truta","email":"henrique@lsd.ufcg.edu.br","username":"henriquetruta"},"change_message_id":"4fc94b3cb6f86cf7279980dcee37f7ecf559010b","unresolved":false,"context_lines":[{"line_number":321,"context_line":"        if entity_id is not None:"},{"line_number":322,"context_line":"            url +\u003d \u0027/%s\u0027 % entity_id"},{"line_number":323,"context_line":""},{"line_number":324,"context_line":"        url +\u003d inheritable"},{"line_number":325,"context_line":""},{"line_number":326,"context_line":"        return url"},{"line_number":327,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"5a890539_1c2f01a9","line":324,"in_reply_to":"5a890539_3e40fe55","updated":"2014-11-26 17:50:55.000000000","message":"Done.","commit_id":"31a83b053ae687f7cf3d6e27e6c12d7be1b2287f"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"8d62eb48fdd9856aec1bb7d1ecf2452dcb381ba1","unresolved":false,"context_lines":[{"line_number":303,"context_line":""},{"line_number":304,"context_line":"            /entities/{entity_id}"},{"line_number":305,"context_line":""},{"line_number":306,"context_line":"        If a `base_url` is provided, the generated URL will be appended to it."},{"line_number":307,"context_line":""},{"line_number":308,"context_line":"        \"\"\""},{"line_number":309,"context_line":"        if dict_args_in_out is None:"}],"source_content_type":"text/x-python","patch_set":12,"id":"1a6ced46_b7dcb4e5","line":306,"updated":"2015-03-26 00:18:34.000000000","message":"Update the docstring with info about \"tail\"","commit_id":"bbac9550044c928c6820a43d2172fe39ad421b57"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"f9c9c9a46962011ee0ba20abc05e30c84c04d1f3","unresolved":false,"context_lines":[{"line_number":303,"context_line":""},{"line_number":304,"context_line":"            /entities/{entity_id}"},{"line_number":305,"context_line":""},{"line_number":306,"context_line":"        If a `base_url` is provided, the generated URL will be appended to it."},{"line_number":307,"context_line":""},{"line_number":308,"context_line":"        \"\"\""},{"line_number":309,"context_line":"        if dict_args_in_out is None:"}],"source_content_type":"text/x-python","patch_set":12,"id":"fa963961_fbdbeceb","line":306,"in_reply_to":"1a6ced46_b7dcb4e5","updated":"2015-03-27 13:03:19.000000000","message":"++","commit_id":"bbac9550044c928c6820a43d2172fe39ad421b57"},{"author":{"_account_id":10046,"name":"Henrique Truta","email":"henrique@lsd.ufcg.edu.br","username":"henriquetruta"},"change_message_id":"39bcf5214400dc17491063ac018957c0a261a65f","unresolved":false,"context_lines":[{"line_number":303,"context_line":""},{"line_number":304,"context_line":"            /entities/{entity_id}"},{"line_number":305,"context_line":""},{"line_number":306,"context_line":"        If a `base_url` is provided, the generated URL will be appended to it."},{"line_number":307,"context_line":""},{"line_number":308,"context_line":"        \"\"\""},{"line_number":309,"context_line":"        if dict_args_in_out is None:"}],"source_content_type":"text/x-python","patch_set":12,"id":"fa963961_fe02ba3d","line":306,"in_reply_to":"fa963961_fbdbeceb","updated":"2015-03-27 13:22:27.000000000","message":"Done","commit_id":"bbac9550044c928c6820a43d2172fe39ad421b57"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"f9c9c9a46962011ee0ba20abc05e30c84c04d1f3","unresolved":false,"context_lines":[{"line_number":317,"context_line":"        if entity_id is not None:"},{"line_number":318,"context_line":"            url +\u003d \u0027/%s\u0027 % entity_id"},{"line_number":319,"context_line":""},{"line_number":320,"context_line":"        if \u0027tail\u0027 in dict_args_in_out and dict_args_in_out[\u0027tail\u0027]:"},{"line_number":321,"context_line":"            url +\u003d dict_args_in_out[\u0027tail\u0027]"},{"line_number":322,"context_line":""},{"line_number":323,"context_line":"        return url"}],"source_content_type":"text/x-python","patch_set":12,"id":"fa963961_7b959ce2","line":320,"updated":"2015-03-27 13:03:19.000000000","message":"Does this mean that tail can be supplied with a None? I would rather say that is has to have a value. There is no test for this either way.","commit_id":"bbac9550044c928c6820a43d2172fe39ad421b57"},{"author":{"_account_id":10046,"name":"Henrique Truta","email":"henrique@lsd.ufcg.edu.br","username":"henriquetruta"},"change_message_id":"39bcf5214400dc17491063ac018957c0a261a65f","unresolved":false,"context_lines":[{"line_number":317,"context_line":"        if entity_id is not None:"},{"line_number":318,"context_line":"            url +\u003d \u0027/%s\u0027 % entity_id"},{"line_number":319,"context_line":""},{"line_number":320,"context_line":"        if \u0027tail\u0027 in dict_args_in_out and dict_args_in_out[\u0027tail\u0027]:"},{"line_number":321,"context_line":"            url +\u003d dict_args_in_out[\u0027tail\u0027]"},{"line_number":322,"context_line":""},{"line_number":323,"context_line":"        return url"}],"source_content_type":"text/x-python","patch_set":12,"id":"fa963961_1eed5e8b","line":320,"in_reply_to":"fa963961_7b959ce2","updated":"2015-03-27 13:22:27.000000000","message":"Not sure if I understand your concern. Tail might not appear in the kwargs at all, it does not make sense being None. Maybe the second and clause is unecessary","commit_id":"bbac9550044c928c6820a43d2172fe39ad421b57"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"c7c650acda1cd7b7afa01f798e14b0ec51dee7df","unresolved":false,"context_lines":[{"line_number":319,"context_line":"        if entity_id is not None:"},{"line_number":320,"context_line":"            url +\u003d \u0027/%s\u0027 % entity_id"},{"line_number":321,"context_line":""},{"line_number":322,"context_line":"        if \u0027tail\u0027 in dict_args_in_out and dict_args_in_out[\u0027tail\u0027]:"},{"line_number":323,"context_line":"            url +\u003d dict_args_in_out[\u0027tail\u0027]"},{"line_number":324,"context_line":""},{"line_number":325,"context_line":"        return url"}],"source_content_type":"text/x-python","patch_set":13,"id":"baa041b7_c7b05e8e","line":322,"updated":"2015-04-02 00:18:22.000000000","message":"use dict_args_in_out.get(\u0027tail\u0027) instead.","commit_id":"5d3a559402f1ffa7f9f5dfe67481aaf20464977e"},{"author":{"_account_id":10046,"name":"Henrique Truta","email":"henrique@lsd.ufcg.edu.br","username":"henriquetruta"},"change_message_id":"f55283a0d22e91b4cd582ca78aabbb985d87374f","unresolved":false,"context_lines":[{"line_number":319,"context_line":"        if entity_id is not None:"},{"line_number":320,"context_line":"            url +\u003d \u0027/%s\u0027 % entity_id"},{"line_number":321,"context_line":""},{"line_number":322,"context_line":"        if \u0027tail\u0027 in dict_args_in_out and dict_args_in_out[\u0027tail\u0027]:"},{"line_number":323,"context_line":"            url +\u003d dict_args_in_out[\u0027tail\u0027]"},{"line_number":324,"context_line":""},{"line_number":325,"context_line":"        return url"}],"source_content_type":"text/x-python","patch_set":13,"id":"9aa53dc9_d37b947a","line":322,"in_reply_to":"baa041b7_c7b05e8e","updated":"2015-04-06 14:00:28.000000000","message":"Done","commit_id":"5d3a559402f1ffa7f9f5dfe67481aaf20464977e"}],"keystoneclient/tests/unit/v3/test_roles.py":[{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"8d62eb48fdd9856aec1bb7d1ecf2452dcb381ba1","unresolved":false,"context_lines":[{"line_number":55,"context_line":"                       \u0027inherited_to_projects\u0027],"},{"line_number":56,"context_line":"                      status_code\u003d201)"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"        self.manager.grant(role\u003dref[\u0027id\u0027], domain\u003ddomain_id, user\u003duser_id,"},{"line_number":59,"context_line":"                           os_inherit_extension_inherited\u003dTrue)"},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"    def test_domain_group_role_grant(self):"}],"source_content_type":"text/x-python","patch_set":12,"id":"1a6ced46_b703d440","line":58,"updated":"2015-03-26 00:18:34.000000000","message":"what is the server supposed to return here? should check it.\n\nThis comment applies to all these tests.","commit_id":"bbac9550044c928c6820a43d2172fe39ad421b57"},{"author":{"_account_id":10046,"name":"Henrique Truta","email":"henrique@lsd.ufcg.edu.br","username":"henriquetruta"},"change_message_id":"96cbd5ff771b3c55aa31ae37009f42d070b3c530","unresolved":false,"context_lines":[{"line_number":55,"context_line":"                       \u0027inherited_to_projects\u0027],"},{"line_number":56,"context_line":"                      status_code\u003d201)"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"        self.manager.grant(role\u003dref[\u0027id\u0027], domain\u003ddomain_id, user\u003duser_id,"},{"line_number":59,"context_line":"                           os_inherit_extension_inherited\u003dTrue)"},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"    def test_domain_group_role_grant(self):"}],"source_content_type":"text/x-python","patch_set":12,"id":"fa963961_82c49a92","line":58,"in_reply_to":"1a6ced46_b703d440","updated":"2015-03-26 13:24:38.000000000","message":"Actually, this is how every single teste on this module is done. How should this check be done?","commit_id":"bbac9550044c928c6820a43d2172fe39ad421b57"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"ac8009e841153167441828daa12dced483870683","unresolved":false,"context_lines":[{"line_number":55,"context_line":"                       \u0027inherited_to_projects\u0027],"},{"line_number":56,"context_line":"                      status_code\u003d201)"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"        self.manager.grant(role\u003dref[\u0027id\u0027], domain\u003ddomain_id, user\u003duser_id,"},{"line_number":59,"context_line":"                           os_inherit_extension_inherited\u003dTrue)"},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"    def test_domain_group_role_grant(self):"}],"source_content_type":"text/x-python","patch_set":12,"id":"da9b358b_9709452f","line":58,"in_reply_to":"fa963961_82c49a92","updated":"2015-03-30 19:49:45.000000000","message":"since you mock the response, you should check if the client correctly parses the expected response from the server. Like it is done here: https://github.com/openstack/python-keystoneclient/blob/master/keystoneclient/tests/unit/v3/test_projects.py#L166-L168","commit_id":"bbac9550044c928c6820a43d2172fe39ad421b57"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"22257e008aabd307c134de481ba085921d1f95c8","unresolved":false,"context_lines":[{"line_number":176,"context_line":"        self.manager.check(role\u003dref[\u0027id\u0027], domain\u003ddomain_id, group\u003dgroup_id)"},{"line_number":177,"context_line":""},{"line_number":178,"context_line":"    def test_domain_group_role_check_inherited(self):"},{"line_number":179,"context_line":"        return"},{"line_number":180,"context_line":"        group_id \u003d uuid.uuid4().hex"},{"line_number":181,"context_line":"        domain_id \u003d uuid.uuid4().hex"},{"line_number":182,"context_line":"        ref \u003d self.new_ref()"}],"source_content_type":"text/x-python","patch_set":12,"id":"1a6ced46_5d547ffe","line":179,"updated":"2015-03-26 00:29:26.000000000","message":"this makes it a lot easier to pass the test!","commit_id":"bbac9550044c928c6820a43d2172fe39ad421b57"},{"author":{"_account_id":10046,"name":"Henrique Truta","email":"henrique@lsd.ufcg.edu.br","username":"henriquetruta"},"change_message_id":"96cbd5ff771b3c55aa31ae37009f42d070b3c530","unresolved":false,"context_lines":[{"line_number":176,"context_line":"        self.manager.check(role\u003dref[\u0027id\u0027], domain\u003ddomain_id, group\u003dgroup_id)"},{"line_number":177,"context_line":""},{"line_number":178,"context_line":"    def test_domain_group_role_check_inherited(self):"},{"line_number":179,"context_line":"        return"},{"line_number":180,"context_line":"        group_id \u003d uuid.uuid4().hex"},{"line_number":181,"context_line":"        domain_id \u003d uuid.uuid4().hex"},{"line_number":182,"context_line":"        ref \u003d self.new_ref()"}],"source_content_type":"text/x-python","patch_set":12,"id":"fa963961_e23b669b","line":179,"in_reply_to":"1a6ced46_5d547ffe","updated":"2015-03-26 13:24:38.000000000","message":"what about the method above?","commit_id":"bbac9550044c928c6820a43d2172fe39ad421b57"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"e2c73ba00c784d44e228a1dade736a31cc210e29","unresolved":false,"context_lines":[{"line_number":81,"context_line":"                       \u0027inherited_to_projects\u0027],"},{"line_number":82,"context_line":"                      status_code\u003d201)"},{"line_number":83,"context_line":""},{"line_number":84,"context_line":"        self.manager.grant(role\u003dref[\u0027id\u0027], domain\u003ddomain_id, group\u003dgroup_id,"},{"line_number":85,"context_line":"                           use_inherit_extension\u003dTrue)"},{"line_number":86,"context_line":""},{"line_number":87,"context_line":"    def test_domain_role_list(self):"}],"source_content_type":"text/x-python","patch_set":13,"id":"baa041b7_bb68e0bb","line":84,"updated":"2015-04-01 18:00:52.000000000","message":"Test seems a little light.  I would have thought we should compare the result of True vs False for the param, to see that there is actually a difference.","commit_id":"5d3a559402f1ffa7f9f5dfe67481aaf20464977e"},{"author":{"_account_id":10046,"name":"Henrique Truta","email":"henrique@lsd.ufcg.edu.br","username":"henriquetruta"},"change_message_id":"4cdd0403409caf0400f1f21f3940e1f6b8089582","unresolved":false,"context_lines":[{"line_number":81,"context_line":"                       \u0027inherited_to_projects\u0027],"},{"line_number":82,"context_line":"                      status_code\u003d201)"},{"line_number":83,"context_line":""},{"line_number":84,"context_line":"        self.manager.grant(role\u003dref[\u0027id\u0027], domain\u003ddomain_id, group\u003dgroup_id,"},{"line_number":85,"context_line":"                           use_inherit_extension\u003dTrue)"},{"line_number":86,"context_line":""},{"line_number":87,"context_line":"    def test_domain_role_list(self):"}],"source_content_type":"text/x-python","patch_set":13,"id":"baa041b7_5bc55459","line":84,"in_reply_to":"baa041b7_bb68e0bb","updated":"2015-04-01 18:10:48.000000000","message":"Actually, I think this comparison is already done in Keystone itself. As it doesn\u0027t have any return, shouldn\u0027t the client only validate the call?","commit_id":"5d3a559402f1ffa7f9f5dfe67481aaf20464977e"},{"author":{"_account_id":10046,"name":"Henrique Truta","email":"henrique@lsd.ufcg.edu.br","username":"henriquetruta"},"change_message_id":"4cdd0403409caf0400f1f21f3940e1f6b8089582","unresolved":false,"context_lines":[{"line_number":109,"context_line":"        returned_list \u003d self.manager.list(domain\u003ddomain_id, user\u003duser_id,"},{"line_number":110,"context_line":"                                          use_inherit_extension\u003dTrue)"},{"line_number":111,"context_line":""},{"line_number":112,"context_line":"        self.assertEqual(len(ref_list), len(returned_list))"},{"line_number":113,"context_line":"        [self.assertIsInstance(r, self.model) for r in returned_list]"},{"line_number":114,"context_line":""},{"line_number":115,"context_line":"    def test_domain_group_role_list(self):"}],"source_content_type":"text/x-python","patch_set":13,"id":"baa041b7_9ba07c92","line":112,"updated":"2015-04-01 18:10:48.000000000","message":"BTW, I\u0027ve only added these validations on list methods because the remaining only need to validate the url call","commit_id":"5d3a559402f1ffa7f9f5dfe67481aaf20464977e"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"c7c650acda1cd7b7afa01f798e14b0ec51dee7df","unresolved":false,"context_lines":[{"line_number":109,"context_line":"        returned_list \u003d self.manager.list(domain\u003ddomain_id, user\u003duser_id,"},{"line_number":110,"context_line":"                                          use_inherit_extension\u003dTrue)"},{"line_number":111,"context_line":""},{"line_number":112,"context_line":"        self.assertEqual(len(ref_list), len(returned_list))"},{"line_number":113,"context_line":"        [self.assertIsInstance(r, self.model) for r in returned_list]"},{"line_number":114,"context_line":""},{"line_number":115,"context_line":"    def test_domain_group_role_list(self):"}],"source_content_type":"text/x-python","patch_set":13,"id":"baa041b7_474a0e85","line":112,"updated":"2015-04-02 00:18:22.000000000","message":"could use the HasLength matcher here.","commit_id":"5d3a559402f1ffa7f9f5dfe67481aaf20464977e"},{"author":{"_account_id":10046,"name":"Henrique Truta","email":"henrique@lsd.ufcg.edu.br","username":"henriquetruta"},"change_message_id":"f55283a0d22e91b4cd582ca78aabbb985d87374f","unresolved":false,"context_lines":[{"line_number":109,"context_line":"        returned_list \u003d self.manager.list(domain\u003ddomain_id, user\u003duser_id,"},{"line_number":110,"context_line":"                                          use_inherit_extension\u003dTrue)"},{"line_number":111,"context_line":""},{"line_number":112,"context_line":"        self.assertEqual(len(ref_list), len(returned_list))"},{"line_number":113,"context_line":"        [self.assertIsInstance(r, self.model) for r in returned_list]"},{"line_number":114,"context_line":""},{"line_number":115,"context_line":"    def test_domain_group_role_list(self):"}],"source_content_type":"text/x-python","patch_set":13,"id":"9aa53dc9_b3801048","line":112,"in_reply_to":"baa041b7_474a0e85","updated":"2015-04-06 14:00:28.000000000","message":"Done","commit_id":"5d3a559402f1ffa7f9f5dfe67481aaf20464977e"}],"keystoneclient/v3/roles.py":[{"author":{"_account_id":9101,"name":"wanghong","email":"reviewwanghong@126.com","username":"wanghong"},"change_message_id":"8c74a8b889e82ead0a03296523a36f2c843e2b14","unresolved":false,"context_lines":[{"line_number":50,"context_line":"            base_url \u003d \u0027/domains/%(domain_id)s\u0027"},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"            if inherited:"},{"line_number":53,"context_line":"                base_url \u003d \u0027OS-INHERIT\u0027 + base_url"},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"        if user:"},{"line_number":56,"context_line":"            params[\u0027user_id\u0027] \u003d base.getid(user)"}],"source_content_type":"text/x-python","patch_set":8,"id":"da86d52c_45beb4d5","line":53,"updated":"2015-02-03 01:54:40.000000000","message":"Should this be:\n\nbase_url \u003d \u0027/OS-INHERIT\u0027 + base_url?","commit_id":"26acd64d9f2bfe01710d4150695cb015a135f54e"},{"author":{"_account_id":10046,"name":"Henrique Truta","email":"henrique@lsd.ufcg.edu.br","username":"henriquetruta"},"change_message_id":"b66bb114c96e410bb1bc12b3a7e51b94074be5dc","unresolved":false,"context_lines":[{"line_number":50,"context_line":"            base_url \u003d \u0027/domains/%(domain_id)s\u0027"},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"            if inherited:"},{"line_number":53,"context_line":"                base_url \u003d \u0027OS-INHERIT\u0027 + base_url"},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"        if user:"},{"line_number":56,"context_line":"            params[\u0027user_id\u0027] \u003d base.getid(user)"}],"source_content_type":"text/x-python","patch_set":8,"id":"da86d52c_8703c70e","line":53,"in_reply_to":"da86d52c_45beb4d5","updated":"2015-02-19 16:39:35.000000000","message":"Done","commit_id":"26acd64d9f2bfe01710d4150695cb015a135f54e"},{"author":{"_account_id":9101,"name":"wanghong","email":"reviewwanghong@126.com","username":"wanghong"},"change_message_id":"8c74a8b889e82ead0a03296523a36f2c843e2b14","unresolved":false,"context_lines":[{"line_number":89,"context_line":""},{"line_number":90,"context_line":"    @utils.positional(enforcement\u003dutils.positional.WARN)"},{"line_number":91,"context_line":"    def list(self, user\u003dNone, group\u003dNone, domain\u003dNone,"},{"line_number":92,"context_line":"             project\u003dNone, inherited\u003dFalse, **kwargs):"},{"line_number":93,"context_line":"        \"\"\"Lists roles and role grants."},{"line_number":94,"context_line":""},{"line_number":95,"context_line":"        If no arguments are provided, all roles in the system will be"}],"source_content_type":"text/x-python","patch_set":8,"id":"da86d52c_25b700da","line":92,"updated":"2015-02-03 01:54:40.000000000","message":"I am not sure if we should change the name of inherited parameter.","commit_id":"26acd64d9f2bfe01710d4150695cb015a135f54e"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"22257e008aabd307c134de481ba085921d1f95c8","unresolved":false,"context_lines":[{"line_number":38,"context_line":"    key \u003d \u0027role\u0027"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"    def _role_grants_base_url(self, user, group, domain, project,"},{"line_number":41,"context_line":"                              os_inherit_extension_inherited):"},{"line_number":42,"context_line":"        # When called, we have already checked that only one of user \u0026 group"},{"line_number":43,"context_line":"        # and one of domain \u0026 project have been specified"},{"line_number":44,"context_line":"        params \u003d {}"}],"source_content_type":"text/x-python","patch_set":12,"id":"1a6ced46_5a6ac5ee","line":41,"updated":"2015-03-26 00:29:26.000000000","message":"suggest change variable name to use_inherit_extension","commit_id":"bbac9550044c928c6820a43d2172fe39ad421b57"},{"author":{"_account_id":10046,"name":"Henrique Truta","email":"henrique@lsd.ufcg.edu.br","username":"henriquetruta"},"change_message_id":"96cbd5ff771b3c55aa31ae37009f42d070b3c530","unresolved":false,"context_lines":[{"line_number":38,"context_line":"    key \u003d \u0027role\u0027"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"    def _role_grants_base_url(self, user, group, domain, project,"},{"line_number":41,"context_line":"                              os_inherit_extension_inherited):"},{"line_number":42,"context_line":"        # When called, we have already checked that only one of user \u0026 group"},{"line_number":43,"context_line":"        # and one of domain \u0026 project have been specified"},{"line_number":44,"context_line":"        params \u003d {}"}],"source_content_type":"text/x-python","patch_set":12,"id":"fa963961_c225025d","line":41,"in_reply_to":"1a6ced46_5a6ac5ee","updated":"2015-03-26 13:24:38.000000000","message":"I think it\u0027s better as it is, to make it consistent with the previous patch","commit_id":"bbac9550044c928c6820a43d2172fe39ad421b57"},{"author":{"_account_id":10046,"name":"Henrique Truta","email":"henrique@lsd.ufcg.edu.br","username":"henriquetruta"},"change_message_id":"39bcf5214400dc17491063ac018957c0a261a65f","unresolved":false,"context_lines":[{"line_number":38,"context_line":"    key \u003d \u0027role\u0027"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"    def _role_grants_base_url(self, user, group, domain, project,"},{"line_number":41,"context_line":"                              os_inherit_extension_inherited):"},{"line_number":42,"context_line":"        # When called, we have already checked that only one of user \u0026 group"},{"line_number":43,"context_line":"        # and one of domain \u0026 project have been specified"},{"line_number":44,"context_line":"        params \u003d {}"}],"source_content_type":"text/x-python","patch_set":12,"id":"fa963961_fed19afc","line":41,"in_reply_to":"fa963961_3b44b472","updated":"2015-03-27 13:22:27.000000000","message":"I was thinking about making it consistent with this previous patch: https://review.openstack.org/#/c/117300/11/keystoneclient/v3/role_assignments.py \nBut you have a good point. I\u0027ll make it as Brant suggested","commit_id":"bbac9550044c928c6820a43d2172fe39ad421b57"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"f9c9c9a46962011ee0ba20abc05e30c84c04d1f3","unresolved":false,"context_lines":[{"line_number":38,"context_line":"    key \u003d \u0027role\u0027"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"    def _role_grants_base_url(self, user, group, domain, project,"},{"line_number":41,"context_line":"                              os_inherit_extension_inherited):"},{"line_number":42,"context_line":"        # When called, we have already checked that only one of user \u0026 group"},{"line_number":43,"context_line":"        # and one of domain \u0026 project have been specified"},{"line_number":44,"context_line":"        params \u003d {}"}],"source_content_type":"text/x-python","patch_set":12,"id":"fa963961_3b44b472","line":41,"in_reply_to":"fa963961_c225025d","updated":"2015-03-27 13:03:19.000000000","message":"I\u0027m not sure I like either. What is this variable used for? If it is a boolean that indicates if the os-inherit extension is used then Brant\u0027s is much better. The current name doesn\u0027t help me understand what it does.","commit_id":"bbac9550044c928c6820a43d2172fe39ad421b57"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"22257e008aabd307c134de481ba085921d1f95c8","unresolved":false,"context_lines":[{"line_number":60,"context_line":"            params[\u0027group_id\u0027] \u003d base.getid(group)"},{"line_number":61,"context_line":"            base_url +\u003d \u0027/groups/%(group_id)s\u0027"},{"line_number":62,"context_line":""},{"line_number":63,"context_line":"        return base_url % params"},{"line_number":64,"context_line":""},{"line_number":65,"context_line":"    def _require_domain_xor_project(self, domain, project):"},{"line_number":66,"context_line":"        if domain and project:"}],"source_content_type":"text/x-python","patch_set":12,"id":"1a6ced46_3d018305","line":63,"updated":"2015-03-26 00:29:26.000000000","message":"why not do the work of adding \u0027/inherited_to_projects\u0027 in this function, since it\u0027s already dealing with os_inherit_extension_inherited?","commit_id":"bbac9550044c928c6820a43d2172fe39ad421b57"},{"author":{"_account_id":10046,"name":"Henrique Truta","email":"henrique@lsd.ufcg.edu.br","username":"henriquetruta"},"change_message_id":"96cbd5ff771b3c55aa31ae37009f42d070b3c530","unresolved":false,"context_lines":[{"line_number":60,"context_line":"            params[\u0027group_id\u0027] \u003d base.getid(group)"},{"line_number":61,"context_line":"            base_url +\u003d \u0027/groups/%(group_id)s\u0027"},{"line_number":62,"context_line":""},{"line_number":63,"context_line":"        return base_url % params"},{"line_number":64,"context_line":""},{"line_number":65,"context_line":"    def _require_domain_xor_project(self, domain, project):"},{"line_number":66,"context_line":"        if domain and project:"}],"source_content_type":"text/x-python","patch_set":12,"id":"fa963961_22eeeeec","line":63,"in_reply_to":"1a6ced46_3d018305","updated":"2015-03-26 13:24:38.000000000","message":"Because at this point there is still missing the \u0027roles\u0027 part in the url, which I think it would make a bigger change if made here and the flow would also be worse","commit_id":"bbac9550044c928c6820a43d2172fe39ad421b57"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"22257e008aabd307c134de481ba085921d1f95c8","unresolved":false,"context_lines":[{"line_number":99,"context_line":"        If a user or group is specified, you must also specify either a"},{"line_number":100,"context_line":"        domain or project to list role grants on that pair. And if"},{"line_number":101,"context_line":"        ``**kwargs`` are provided, then also filter roles with"},{"line_number":102,"context_line":"        attributes matching ``**kwargs``."},{"line_number":103,"context_line":"        \"\"\""},{"line_number":104,"context_line":""},{"line_number":105,"context_line":"        if os_inherit_extension_inherited:"}],"source_content_type":"text/x-python","patch_set":12,"id":"1a6ced46_fa55311e","line":102,"updated":"2015-03-26 00:29:26.000000000","message":"add docs for the os_inherit_extension_inherited parameter, too.","commit_id":"bbac9550044c928c6820a43d2172fe39ad421b57"},{"author":{"_account_id":10046,"name":"Henrique Truta","email":"henrique@lsd.ufcg.edu.br","username":"henriquetruta"},"change_message_id":"96cbd5ff771b3c55aa31ae37009f42d070b3c530","unresolved":false,"context_lines":[{"line_number":99,"context_line":"        If a user or group is specified, you must also specify either a"},{"line_number":100,"context_line":"        domain or project to list role grants on that pair. And if"},{"line_number":101,"context_line":"        ``**kwargs`` are provided, then also filter roles with"},{"line_number":102,"context_line":"        attributes matching ``**kwargs``."},{"line_number":103,"context_line":"        \"\"\""},{"line_number":104,"context_line":""},{"line_number":105,"context_line":"        if os_inherit_extension_inherited:"}],"source_content_type":"text/x-python","patch_set":12,"id":"fa963961_025e4ae9","line":102,"in_reply_to":"1a6ced46_fa55311e","updated":"2015-03-26 13:24:38.000000000","message":"Done","commit_id":"bbac9550044c928c6820a43d2172fe39ad421b57"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"22257e008aabd307c134de481ba085921d1f95c8","unresolved":false,"context_lines":[{"line_number":129,"context_line":"    @utils.positional(enforcement\u003dutils.positional.WARN)"},{"line_number":130,"context_line":"    def grant(self, role, user\u003dNone, group\u003dNone, domain\u003dNone, project\u003dNone,"},{"line_number":131,"context_line":"              os_inherit_extension_inherited\u003dFalse, **kwargs):"},{"line_number":132,"context_line":"        \"\"\"Grants a role to a user or group on a domain or project.\"\"\""},{"line_number":133,"context_line":"        self._require_domain_xor_project(domain, project)"},{"line_number":134,"context_line":"        self._require_user_xor_group(user, group)"},{"line_number":135,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"1a6ced46_1a53ed39","line":132,"updated":"2015-03-26 00:29:26.000000000","message":"add docs for the os_inherit_extension_inherited parameter","commit_id":"bbac9550044c928c6820a43d2172fe39ad421b57"},{"author":{"_account_id":10046,"name":"Henrique Truta","email":"henrique@lsd.ufcg.edu.br","username":"henriquetruta"},"change_message_id":"96cbd5ff771b3c55aa31ae37009f42d070b3c530","unresolved":false,"context_lines":[{"line_number":129,"context_line":"    @utils.positional(enforcement\u003dutils.positional.WARN)"},{"line_number":130,"context_line":"    def grant(self, role, user\u003dNone, group\u003dNone, domain\u003dNone, project\u003dNone,"},{"line_number":131,"context_line":"              os_inherit_extension_inherited\u003dFalse, **kwargs):"},{"line_number":132,"context_line":"        \"\"\"Grants a role to a user or group on a domain or project.\"\"\""},{"line_number":133,"context_line":"        self._require_domain_xor_project(domain, project)"},{"line_number":134,"context_line":"        self._require_user_xor_group(user, group)"},{"line_number":135,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"fa963961_e26246ad","line":132,"in_reply_to":"1a6ced46_1a53ed39","updated":"2015-03-26 13:24:38.000000000","message":"Done","commit_id":"bbac9550044c928c6820a43d2172fe39ad421b57"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"22257e008aabd307c134de481ba085921d1f95c8","unresolved":false,"context_lines":[{"line_number":145,"context_line":"    @utils.positional(enforcement\u003dutils.positional.WARN)"},{"line_number":146,"context_line":"    def check(self, role, user\u003dNone, group\u003dNone, domain\u003dNone, project\u003dNone,"},{"line_number":147,"context_line":"              os_inherit_extension_inherited\u003dFalse, **kwargs):"},{"line_number":148,"context_line":"        \"\"\"Checks if a user or group has a role on a domain or project.\"\"\""},{"line_number":149,"context_line":"        self._require_domain_xor_project(domain, project)"},{"line_number":150,"context_line":"        self._require_user_xor_group(user, group)"},{"line_number":151,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"1a6ced46_bd149344","line":148,"updated":"2015-03-26 00:29:26.000000000","message":"add docs for the os_inherit_extension_inherited parameter","commit_id":"bbac9550044c928c6820a43d2172fe39ad421b57"},{"author":{"_account_id":10046,"name":"Henrique Truta","email":"henrique@lsd.ufcg.edu.br","username":"henriquetruta"},"change_message_id":"96cbd5ff771b3c55aa31ae37009f42d070b3c530","unresolved":false,"context_lines":[{"line_number":145,"context_line":"    @utils.positional(enforcement\u003dutils.positional.WARN)"},{"line_number":146,"context_line":"    def check(self, role, user\u003dNone, group\u003dNone, domain\u003dNone, project\u003dNone,"},{"line_number":147,"context_line":"              os_inherit_extension_inherited\u003dFalse, **kwargs):"},{"line_number":148,"context_line":"        \"\"\"Checks if a user or group has a role on a domain or project.\"\"\""},{"line_number":149,"context_line":"        self._require_domain_xor_project(domain, project)"},{"line_number":150,"context_line":"        self._require_user_xor_group(user, group)"},{"line_number":151,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"fa963961_a25c3eee","line":148,"in_reply_to":"1a6ced46_bd149344","updated":"2015-03-26 13:24:38.000000000","message":"Done","commit_id":"bbac9550044c928c6820a43d2172fe39ad421b57"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"22257e008aabd307c134de481ba085921d1f95c8","unresolved":false,"context_lines":[{"line_number":157,"context_line":"        return super(RoleManager, self).head("},{"line_number":158,"context_line":"            base_url\u003dbase_url,"},{"line_number":159,"context_line":"            role_id\u003dbase.getid(role),"},{"line_number":160,"context_line":"            os_inherit_extension_inherited\u003dos_inherit_extension_inherited,"},{"line_number":161,"context_line":"            **kwargs)"},{"line_number":162,"context_line":""},{"line_number":163,"context_line":"    @utils.positional(enforcement\u003dutils.positional.WARN)"}],"source_content_type":"text/x-python","patch_set":12,"id":"1a6ced46_bd3bb3cf","line":160,"updated":"2015-03-26 00:29:26.000000000","message":"this argument is getting passed and used all over the place.","commit_id":"bbac9550044c928c6820a43d2172fe39ad421b57"},{"author":{"_account_id":10046,"name":"Henrique Truta","email":"henrique@lsd.ufcg.edu.br","username":"henriquetruta"},"change_message_id":"96cbd5ff771b3c55aa31ae37009f42d070b3c530","unresolved":false,"context_lines":[{"line_number":157,"context_line":"        return super(RoleManager, self).head("},{"line_number":158,"context_line":"            base_url\u003dbase_url,"},{"line_number":159,"context_line":"            role_id\u003dbase.getid(role),"},{"line_number":160,"context_line":"            os_inherit_extension_inherited\u003dos_inherit_extension_inherited,"},{"line_number":161,"context_line":"            **kwargs)"},{"line_number":162,"context_line":""},{"line_number":163,"context_line":"    @utils.positional(enforcement\u003dutils.positional.WARN)"}],"source_content_type":"text/x-python","patch_set":12,"id":"fa963961_e28c8637","line":160,"in_reply_to":"1a6ced46_bd3bb3cf","updated":"2015-03-26 13:24:38.000000000","message":"not sure if I get your point","commit_id":"bbac9550044c928c6820a43d2172fe39ad421b57"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"22257e008aabd307c134de481ba085921d1f95c8","unresolved":false,"context_lines":[{"line_number":163,"context_line":"    @utils.positional(enforcement\u003dutils.positional.WARN)"},{"line_number":164,"context_line":"    def revoke(self, role, user\u003dNone, group\u003dNone, domain\u003dNone, project\u003dNone,"},{"line_number":165,"context_line":"               os_inherit_extension_inherited\u003dFalse, **kwargs):"},{"line_number":166,"context_line":"        \"\"\"Revokes a role from a user or group on a domain or project.\"\"\""},{"line_number":167,"context_line":"        self._require_domain_xor_project(domain, project)"},{"line_number":168,"context_line":"        self._require_user_xor_group(user, group)"},{"line_number":169,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"1a6ced46_dd114f53","line":166,"updated":"2015-03-26 00:29:26.000000000","message":"add docs for the os_inherit_extension_inherited parameter","commit_id":"bbac9550044c928c6820a43d2172fe39ad421b57"},{"author":{"_account_id":10046,"name":"Henrique Truta","email":"henrique@lsd.ufcg.edu.br","username":"henriquetruta"},"change_message_id":"96cbd5ff771b3c55aa31ae37009f42d070b3c530","unresolved":false,"context_lines":[{"line_number":163,"context_line":"    @utils.positional(enforcement\u003dutils.positional.WARN)"},{"line_number":164,"context_line":"    def revoke(self, role, user\u003dNone, group\u003dNone, domain\u003dNone, project\u003dNone,"},{"line_number":165,"context_line":"               os_inherit_extension_inherited\u003dFalse, **kwargs):"},{"line_number":166,"context_line":"        \"\"\"Revokes a role from a user or group on a domain or project.\"\"\""},{"line_number":167,"context_line":"        self._require_domain_xor_project(domain, project)"},{"line_number":168,"context_line":"        self._require_user_xor_group(user, group)"},{"line_number":169,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"fa963961_6292b659","line":166,"in_reply_to":"1a6ced46_dd114f53","updated":"2015-03-26 13:24:38.000000000","message":"Done","commit_id":"bbac9550044c928c6820a43d2172fe39ad421b57"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"c7c650acda1cd7b7afa01f798e14b0ec51dee7df","unresolved":false,"context_lines":[{"line_number":90,"context_line":""},{"line_number":91,"context_line":"    @utils.positional(enforcement\u003dutils.positional.WARN)"},{"line_number":92,"context_line":"    def list(self, user\u003dNone, group\u003dNone, domain\u003dNone,"},{"line_number":93,"context_line":"             project\u003dNone, use_inherit_extension\u003dFalse, **kwargs):"},{"line_number":94,"context_line":"        \"\"\"Lists roles and role grants."},{"line_number":95,"context_line":""},{"line_number":96,"context_line":"        If no arguments are provided, all roles in the system will be"}],"source_content_type":"text/x-python","patch_set":13,"id":"baa041b7_872ff6a0","line":93,"updated":"2015-04-02 00:18:22.000000000","message":"why did the name change? it was os_inherit_extension_inherited, which I think was more self-explanatory.","commit_id":"5d3a559402f1ffa7f9f5dfe67481aaf20464977e"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"c9503843dece7484c90878f178e5958deb8cfd56","unresolved":false,"context_lines":[{"line_number":90,"context_line":""},{"line_number":91,"context_line":"    @utils.positional(enforcement\u003dutils.positional.WARN)"},{"line_number":92,"context_line":"    def list(self, user\u003dNone, group\u003dNone, domain\u003dNone,"},{"line_number":93,"context_line":"             project\u003dNone, use_inherit_extension\u003dFalse, **kwargs):"},{"line_number":94,"context_line":"        \"\"\"Lists roles and role grants."},{"line_number":95,"context_line":""},{"line_number":96,"context_line":"        If no arguments are provided, all roles in the system will be"}],"source_content_type":"text/x-python","patch_set":13,"id":"9aa53dc9_cea40b0a","line":93,"in_reply_to":"9aa53dc9_33bbe010","updated":"2015-04-06 14:17:56.000000000","message":"In patch set 12 I suggested to change the parameter to the _role_grants_base_url, not here.","commit_id":"5d3a559402f1ffa7f9f5dfe67481aaf20464977e"},{"author":{"_account_id":10046,"name":"Henrique Truta","email":"henrique@lsd.ufcg.edu.br","username":"henriquetruta"},"change_message_id":"f55283a0d22e91b4cd582ca78aabbb985d87374f","unresolved":false,"context_lines":[{"line_number":90,"context_line":""},{"line_number":91,"context_line":"    @utils.positional(enforcement\u003dutils.positional.WARN)"},{"line_number":92,"context_line":"    def list(self, user\u003dNone, group\u003dNone, domain\u003dNone,"},{"line_number":93,"context_line":"             project\u003dNone, use_inherit_extension\u003dFalse, **kwargs):"},{"line_number":94,"context_line":"        \"\"\"Lists roles and role grants."},{"line_number":95,"context_line":""},{"line_number":96,"context_line":"        If no arguments are provided, all roles in the system will be"}],"source_content_type":"text/x-python","patch_set":13,"id":"9aa53dc9_33bbe010","line":93,"in_reply_to":"baa041b7_872ff6a0","updated":"2015-04-06 14:00:28.000000000","message":"Actually, this change was your suggestion in the patch set 12","commit_id":"5d3a559402f1ffa7f9f5dfe67481aaf20464977e"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"c7c650acda1cd7b7afa01f798e14b0ec51dee7df","unresolved":false,"context_lines":[{"line_number":101,"context_line":"        ``**kwargs`` are provided, then also filter roles with"},{"line_number":102,"context_line":"        attributes matching ``**kwargs``."},{"line_number":103,"context_line":""},{"line_number":104,"context_line":"        If \u0027use_inherit_extension\u0027 is passed, then the OS-INHERIT will be"},{"line_number":105,"context_line":"        used, by appending \u0027OS-INHERIT\u0027 in the beggining and"},{"line_number":106,"context_line":"        \u0027inherited_to_projects\u0027 at the end of the URL. This extension assigns"},{"line_number":107,"context_line":"        roles across the projects subtree."}],"source_content_type":"text/x-python","patch_set":13,"id":"baa041b7_6755121c","line":104,"updated":"2015-04-02 00:18:22.000000000","message":"change \"the OS-INHERIT\" to \"OS-INHERIT\"","commit_id":"5d3a559402f1ffa7f9f5dfe67481aaf20464977e"},{"author":{"_account_id":10046,"name":"Henrique Truta","email":"henrique@lsd.ufcg.edu.br","username":"henriquetruta"},"change_message_id":"f55283a0d22e91b4cd582ca78aabbb985d87374f","unresolved":false,"context_lines":[{"line_number":101,"context_line":"        ``**kwargs`` are provided, then also filter roles with"},{"line_number":102,"context_line":"        attributes matching ``**kwargs``."},{"line_number":103,"context_line":""},{"line_number":104,"context_line":"        If \u0027use_inherit_extension\u0027 is passed, then the OS-INHERIT will be"},{"line_number":105,"context_line":"        used, by appending \u0027OS-INHERIT\u0027 in the beggining and"},{"line_number":106,"context_line":"        \u0027inherited_to_projects\u0027 at the end of the URL. This extension assigns"},{"line_number":107,"context_line":"        roles across the projects subtree."}],"source_content_type":"text/x-python","patch_set":13,"id":"9aa53dc9_b345b018","line":104,"in_reply_to":"baa041b7_6755121c","updated":"2015-04-06 14:00:28.000000000","message":"Done","commit_id":"5d3a559402f1ffa7f9f5dfe67481aaf20464977e"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"c7c650acda1cd7b7afa01f798e14b0ec51dee7df","unresolved":false,"context_lines":[{"line_number":102,"context_line":"        attributes matching ``**kwargs``."},{"line_number":103,"context_line":""},{"line_number":104,"context_line":"        If \u0027use_inherit_extension\u0027 is passed, then the OS-INHERIT will be"},{"line_number":105,"context_line":"        used, by appending \u0027OS-INHERIT\u0027 in the beggining and"},{"line_number":106,"context_line":"        \u0027inherited_to_projects\u0027 at the end of the URL. This extension assigns"},{"line_number":107,"context_line":"        roles across the projects subtree."},{"line_number":108,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":13,"id":"baa041b7_2736ea03","line":105,"updated":"2015-04-02 00:18:22.000000000","message":"change \"beggining\" to \"begining\"","commit_id":"5d3a559402f1ffa7f9f5dfe67481aaf20464977e"},{"author":{"_account_id":10046,"name":"Henrique Truta","email":"henrique@lsd.ufcg.edu.br","username":"henriquetruta"},"change_message_id":"f55283a0d22e91b4cd582ca78aabbb985d87374f","unresolved":false,"context_lines":[{"line_number":102,"context_line":"        attributes matching ``**kwargs``."},{"line_number":103,"context_line":""},{"line_number":104,"context_line":"        If \u0027use_inherit_extension\u0027 is passed, then the OS-INHERIT will be"},{"line_number":105,"context_line":"        used, by appending \u0027OS-INHERIT\u0027 in the beggining and"},{"line_number":106,"context_line":"        \u0027inherited_to_projects\u0027 at the end of the URL. This extension assigns"},{"line_number":107,"context_line":"        roles across the projects subtree."},{"line_number":108,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":13,"id":"9aa53dc9_7348482e","line":105,"in_reply_to":"baa041b7_2736ea03","updated":"2015-04-06 14:00:28.000000000","message":"Done","commit_id":"5d3a559402f1ffa7f9f5dfe67481aaf20464977e"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"c7c650acda1cd7b7afa01f798e14b0ec51dee7df","unresolved":false,"context_lines":[{"line_number":103,"context_line":""},{"line_number":104,"context_line":"        If \u0027use_inherit_extension\u0027 is passed, then the OS-INHERIT will be"},{"line_number":105,"context_line":"        used, by appending \u0027OS-INHERIT\u0027 in the beggining and"},{"line_number":106,"context_line":"        \u0027inherited_to_projects\u0027 at the end of the URL. This extension assigns"},{"line_number":107,"context_line":"        roles across the projects subtree."},{"line_number":108,"context_line":"        \"\"\""},{"line_number":109,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"baa041b7_073be6ec","line":106,"updated":"2015-04-02 00:18:22.000000000","message":"the usage text should be referring to a URL that users have no idea what it is. Just say why someone would use it.","commit_id":"5d3a559402f1ffa7f9f5dfe67481aaf20464977e"},{"author":{"_account_id":10046,"name":"Henrique Truta","email":"henrique@lsd.ufcg.edu.br","username":"henriquetruta"},"change_message_id":"f55283a0d22e91b4cd582ca78aabbb985d87374f","unresolved":false,"context_lines":[{"line_number":103,"context_line":""},{"line_number":104,"context_line":"        If \u0027use_inherit_extension\u0027 is passed, then the OS-INHERIT will be"},{"line_number":105,"context_line":"        used, by appending \u0027OS-INHERIT\u0027 in the beggining and"},{"line_number":106,"context_line":"        \u0027inherited_to_projects\u0027 at the end of the URL. This extension assigns"},{"line_number":107,"context_line":"        roles across the projects subtree."},{"line_number":108,"context_line":"        \"\"\""},{"line_number":109,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"9aa53dc9_736f2893","line":106,"in_reply_to":"baa041b7_073be6ec","updated":"2015-04-06 14:00:28.000000000","message":"Done","commit_id":"5d3a559402f1ffa7f9f5dfe67481aaf20464977e"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"c7c650acda1cd7b7afa01f798e14b0ec51dee7df","unresolved":false,"context_lines":[{"line_number":133,"context_line":""},{"line_number":134,"context_line":"    @utils.positional(enforcement\u003dutils.positional.WARN)"},{"line_number":135,"context_line":"    def grant(self, role, user\u003dNone, group\u003dNone, domain\u003dNone, project\u003dNone,"},{"line_number":136,"context_line":"              use_inherit_extension\u003dFalse, **kwargs):"},{"line_number":137,"context_line":"        \"\"\"Grants a role to a user or group on a domain or project."},{"line_number":138,"context_line":""},{"line_number":139,"context_line":"        If \u0027use_inherit_extension\u0027 is passed, then the OS-INHERIT will be"}],"source_content_type":"text/x-python","patch_set":13,"id":"baa041b7_271dca73","line":136,"updated":"2015-04-02 00:18:22.000000000","message":"why did the name change? it was os_inherit_extension_inherited, which I think was more self-explanatory.","commit_id":"5d3a559402f1ffa7f9f5dfe67481aaf20464977e"},{"author":{"_account_id":10046,"name":"Henrique Truta","email":"henrique@lsd.ufcg.edu.br","username":"henriquetruta"},"change_message_id":"f55283a0d22e91b4cd582ca78aabbb985d87374f","unresolved":false,"context_lines":[{"line_number":133,"context_line":""},{"line_number":134,"context_line":"    @utils.positional(enforcement\u003dutils.positional.WARN)"},{"line_number":135,"context_line":"    def grant(self, role, user\u003dNone, group\u003dNone, domain\u003dNone, project\u003dNone,"},{"line_number":136,"context_line":"              use_inherit_extension\u003dFalse, **kwargs):"},{"line_number":137,"context_line":"        \"\"\"Grants a role to a user or group on a domain or project."},{"line_number":138,"context_line":""},{"line_number":139,"context_line":"        If \u0027use_inherit_extension\u0027 is passed, then the OS-INHERIT will be"}],"source_content_type":"text/x-python","patch_set":13,"id":"9aa53dc9_f309f8de","line":136,"in_reply_to":"baa041b7_271dca73","updated":"2015-04-06 14:00:28.000000000","message":"See above","commit_id":"5d3a559402f1ffa7f9f5dfe67481aaf20464977e"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"c7c650acda1cd7b7afa01f798e14b0ec51dee7df","unresolved":false,"context_lines":[{"line_number":136,"context_line":"              use_inherit_extension\u003dFalse, **kwargs):"},{"line_number":137,"context_line":"        \"\"\"Grants a role to a user or group on a domain or project."},{"line_number":138,"context_line":""},{"line_number":139,"context_line":"        If \u0027use_inherit_extension\u0027 is passed, then the OS-INHERIT will be"},{"line_number":140,"context_line":"        used, by appending \u0027OS-INHERIT\u0027 in the beggining and"},{"line_number":141,"context_line":"        \u0027inherited_to_projects\u0027 at the end of the URL. This extension assigns"},{"line_number":142,"context_line":"        roles across the projects subtree."}],"source_content_type":"text/x-python","patch_set":13,"id":"baa041b7_0712c662","line":139,"updated":"2015-04-02 00:18:22.000000000","message":"I\u0027m not going to copy my comments from above.","commit_id":"5d3a559402f1ffa7f9f5dfe67481aaf20464977e"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"4d279449bfb6e8c3b7280607747f8e2ba8310bd6","unresolved":false,"context_lines":[{"line_number":135,"context_line":"              os_inherit_extension_inherited\u003dFalse, **kwargs):"},{"line_number":136,"context_line":"        \"\"\"Grants a role to a user or group on a domain or project."},{"line_number":137,"context_line":""},{"line_number":138,"context_line":"        If \u0027os_inherit_extension_inherited\u0027 is passed, then OS-INHERIT will be"},{"line_number":139,"context_line":"        used. It provides the ability for projects to inherit role assignments"},{"line_number":140,"context_line":"        from their domains or from projects in the hierarchy."},{"line_number":141,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":15,"id":"dac4157f_3cbe1d00","line":138,"updated":"2015-04-18 17:46:21.000000000","message":"change passed to \"True\"","commit_id":"57b0fe2c8f471c99de01aa59907fb50d5067da1f"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"4d279449bfb6e8c3b7280607747f8e2ba8310bd6","unresolved":false,"context_lines":[{"line_number":156,"context_line":"              os_inherit_extension_inherited\u003dFalse, **kwargs):"},{"line_number":157,"context_line":"        \"\"\"Checks if a user or group has a role on a domain or project."},{"line_number":158,"context_line":""},{"line_number":159,"context_line":"        If \u0027os_inherit_extension_inherited\u0027 is passed, then OS-INHERIT will be"},{"line_number":160,"context_line":"        used. It provides the ability for projects to inherit role assignments"},{"line_number":161,"context_line":"        from their domains or from projects in the hierarchy."},{"line_number":162,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":15,"id":"dac4157f_1cbb5910","line":159,"updated":"2015-04-18 17:46:21.000000000","message":"change passed to \"True\"","commit_id":"57b0fe2c8f471c99de01aa59907fb50d5067da1f"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"4d279449bfb6e8c3b7280607747f8e2ba8310bd6","unresolved":false,"context_lines":[{"line_number":179,"context_line":"               os_inherit_extension_inherited\u003dFalse, **kwargs):"},{"line_number":180,"context_line":"        \"\"\"Revokes a role from a user or group on a domain or project."},{"line_number":181,"context_line":""},{"line_number":182,"context_line":"        If \u0027os_inherit_extension_inherited\u0027 is passed, then OS-INHERIT will be"},{"line_number":183,"context_line":"        used. It provides the ability for projects to inherit role assignments"},{"line_number":184,"context_line":"        from their domains or from projects in the hierarchy."},{"line_number":185,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":15,"id":"dac4157f_fc3665b3","line":182,"updated":"2015-04-18 17:46:21.000000000","message":"change passed to \"True\"","commit_id":"57b0fe2c8f471c99de01aa59907fb50d5067da1f"}]}
