)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"16ce55e8713c40d8354852bfa7aadd4cfd6ada2c","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Thiago Paiva \u003cthiagop@lsd.ufcg.edu.br\u003e"},{"line_number":5,"context_line":"CommitDate: 2014-12-17 18:32:55 -0300"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Implementing hierarchical calls on keystoneclient v3 (python only)"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"This patch addresses changes needed to manage projects through"},{"line_number":10,"context_line":"keystoneclient API v3. The changes are:"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":14,"id":"3a961159_539eba55","line":7,"updated":"2014-12-29 01:26:23.000000000","message":"why does this have \"(python only)\"?","commit_id":"99f7e121ad632815d8307020d49f89b54b0ca4ad"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"215804e8e8260449767801925dafa2a517adfe9f","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Thiago Paiva \u003cthiagop@lsd.ufcg.edu.br\u003e"},{"line_number":5,"context_line":"CommitDate: 2014-12-17 18:32:55 -0300"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Implementing hierarchical calls on keystoneclient v3 (python only)"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"This patch addresses changes needed to manage projects through"},{"line_number":10,"context_line":"keystoneclient API v3. The changes are:"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":14,"id":"3a961159_66568b2c","line":7,"in_reply_to":"3a961159_46fd0f3b","updated":"2014-12-29 17:31:34.000000000","message":"The keystone command line doesn\u0027t support v3 and it\u0027s also deprecated, so no need to mention it here.","commit_id":"99f7e121ad632815d8307020d49f89b54b0ca4ad"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"3bad7b17638b898984b1f6c4da26529e04c75aea","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Thiago Paiva \u003cthiagop@lsd.ufcg.edu.br\u003e"},{"line_number":5,"context_line":"CommitDate: 2014-12-17 18:32:55 -0300"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Implementing hierarchical calls on keystoneclient v3 (python only)"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"This patch addresses changes needed to manage projects through"},{"line_number":10,"context_line":"keystoneclient API v3. The changes are:"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":14,"id":"3a961159_44bb3675","line":7,"in_reply_to":"3a961159_539eba55","updated":"2014-12-30 15:47:17.000000000","message":"Done","commit_id":"99f7e121ad632815d8307020d49f89b54b0ca4ad"},{"author":{"_account_id":8866,"name":"Raildo Mascena de Sousa Filho","email":"rmascena@redhat.com","username":"raildo"},"change_message_id":"239bd5fac1aaba125c3c56d25dfb86842e41842a","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Thiago Paiva \u003cthiagop@lsd.ufcg.edu.br\u003e"},{"line_number":5,"context_line":"CommitDate: 2014-12-17 18:32:55 -0300"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Implementing hierarchical calls on keystoneclient v3 (python only)"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"This patch addresses changes needed to manage projects through"},{"line_number":10,"context_line":"keystoneclient API v3. The changes are:"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":14,"id":"3a961159_46fd0f3b","line":7,"in_reply_to":"3a961159_539eba55","updated":"2014-12-29 17:28:40.000000000","message":"I think that is because this patch doesn\u0027t affect the keystone command line, just the \"python part\"","commit_id":"99f7e121ad632815d8307020d49f89b54b0ca4ad"},{"author":{"_account_id":8866,"name":"Raildo Mascena de Sousa Filho","email":"rmascena@redhat.com","username":"raildo"},"change_message_id":"759e01dab0e574fffbfe1a974b0adff1236feb0f","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Thiago Paiva \u003cthiagop@lsd.ufcg.edu.br\u003e"},{"line_number":5,"context_line":"CommitDate: 2014-12-17 18:32:55 -0300"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Implementing hierarchical calls on keystoneclient v3 (python only)"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"This patch addresses changes needed to manage projects through"},{"line_number":10,"context_line":"keystoneclient API v3. The changes are:"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":14,"id":"3a961159_61e59537","line":7,"in_reply_to":"3a961159_66568b2c","updated":"2014-12-29 17:40:00.000000000","message":"Ok, We implement just for OpenStack command line. So, I agree with you.","commit_id":"99f7e121ad632815d8307020d49f89b54b0ca4ad"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"26e52d35d4258603aaec3f965980e6eda59fb4c8","unresolved":false,"context_lines":[{"line_number":16,"context_line":"  new param \u0027subtree_as_list\u0027: If True, shows projects down the hierarchy"},{"line_number":17,"context_line":"  new param \u0027parents_as_list\u0027: If True, shows projects up the hierarchy"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"Co-Authored-By: Rodrigo Duarte \u003crodrigods@lsd.ufcg.edu.br\u003e"},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"Change-Id: I0f02a66e6a29584197ed00cb32caecb50956f458"},{"line_number":22,"context_line":"Implements: blueprint hierarchical-multitenancy"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":20,"id":"da86d52c_6583b804","line":19,"updated":"2015-02-03 02:01:28.000000000","message":"Why was afaranha@lsd.ufcg.edu.br removed as a co-author?","commit_id":"a7069e99d92a84b6b283506ed29e92094404aeab"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"36ce7257ff05860e4cbac4040ed3d53067bd35f9","unresolved":false,"context_lines":[{"line_number":16,"context_line":"  new param \u0027subtree_as_list\u0027: If True, shows projects down the hierarchy"},{"line_number":17,"context_line":"  new param \u0027parents_as_list\u0027: If True, shows projects up the hierarchy"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"Co-Authored-By: Rodrigo Duarte \u003crodrigods@lsd.ufcg.edu.br\u003e"},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"Change-Id: I0f02a66e6a29584197ed00cb32caecb50956f458"},{"line_number":22,"context_line":"Implements: blueprint hierarchical-multitenancy"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":20,"id":"da86d52c_e5588858","line":19,"in_reply_to":"da86d52c_6583b804","updated":"2015-02-03 02:13:16.000000000","message":"copy/paste during a rebase, will readd","commit_id":"a7069e99d92a84b6b283506ed29e92094404aeab"}],"keystoneclient/base.py":[{"author":{"_account_id":7191,"name":"Jamie Lennox","email":"jamielennox@gmail.com","username":"jamielennox"},"change_message_id":"b3a44026e2ae30d068c1ce242aad70fc4628d144","unresolved":false,"context_lines":[{"line_number":333,"context_line":"        if kwargs:"},{"line_number":334,"context_line":"            query \u003d \u0027?%s\u0027 % urllib.parse.urlencode(kwargs)"},{"line_number":335,"context_line":"        else:"},{"line_number":336,"context_line":"            query \u003d \u0027\u0027"},{"line_number":337,"context_line":"        return self._get("},{"line_number":338,"context_line":"            \u0027%(url)s%(query)s\u0027 % {"},{"line_number":339,"context_line":"                \u0027url\u0027: url,"}],"source_content_type":"text/x-python","patch_set":3,"id":"fa98f980_3bc6d968","line":336,"updated":"2014-09-04 05:26:33.000000000","message":"should make a function that standardizes this across all uses.","commit_id":"25ffbec665ce87aac763da611e6c30502a43db48"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"931cc99f2a30cd9d562b2a90b03af28e84005dbc","unresolved":false,"context_lines":[{"line_number":333,"context_line":"        if kwargs:"},{"line_number":334,"context_line":"            query \u003d \u0027?%s\u0027 % urllib.parse.urlencode(kwargs)"},{"line_number":335,"context_line":"        else:"},{"line_number":336,"context_line":"            query \u003d \u0027\u0027"},{"line_number":337,"context_line":"        return self._get("},{"line_number":338,"context_line":"            \u0027%(url)s%(query)s\u0027 % {"},{"line_number":339,"context_line":"                \u0027url\u0027: url,"}],"source_content_type":"text/x-python","patch_set":3,"id":"fa98f980_e30f86df","line":336,"in_reply_to":"fa98f980_3bc6d968","updated":"2014-09-10 18:27:25.000000000","message":"++\n\nbut I think it isn\u0027t in the scope of this patch","commit_id":"25ffbec665ce87aac763da611e6c30502a43db48"},{"author":{"_account_id":13478,"name":"Boris Bobrov","email":"b.bobrov@sap.com","username":"bbobrov"},"change_message_id":"cfa2f46a568d28e91976a6b57c30d598a98f36d2","unresolved":false,"context_lines":[{"line_number":333,"context_line":"    def get(self, **kwargs):"},{"line_number":334,"context_line":"        url \u003d self.build_url(dict_args_in_out\u003dkwargs)"},{"line_number":335,"context_line":""},{"line_number":336,"context_line":"        if kwargs:"},{"line_number":337,"context_line":"            query \u003d \u0027?%s\u0027 % urllib.parse.urlencode(kwargs)"},{"line_number":338,"context_line":"        else:"},{"line_number":339,"context_line":"            query \u003d \u0027\u0027"}],"source_content_type":"text/x-python","patch_set":9,"id":"5a890539_87d010ca","line":336,"updated":"2014-11-18 12:00:05.000000000","message":"There is _build_query some lines below, maybe it should be used for building the query?","commit_id":"521ca9c545d806de5aa112e5dc61418b42b9e9ef"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"8186900f07934f310c33833c521f8354be9ea4be","unresolved":false,"context_lines":[{"line_number":333,"context_line":"    def get(self, **kwargs):"},{"line_number":334,"context_line":"        url \u003d self.build_url(dict_args_in_out\u003dkwargs)"},{"line_number":335,"context_line":""},{"line_number":336,"context_line":"        if kwargs:"},{"line_number":337,"context_line":"            query \u003d \u0027?%s\u0027 % urllib.parse.urlencode(kwargs)"},{"line_number":338,"context_line":"        else:"},{"line_number":339,"context_line":"            query \u003d \u0027\u0027"}],"source_content_type":"text/x-python","patch_set":9,"id":"5a890539_7fc0ce2a","line":336,"in_reply_to":"5a890539_87d010ca","updated":"2014-11-19 18:29:05.000000000","message":"Done","commit_id":"521ca9c545d806de5aa112e5dc61418b42b9e9ef"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"fccf3485016efb6cc743d77286d05ce7eabc862b","unresolved":false,"context_lines":[{"line_number":336,"context_line":"            \u0027%(url)s%(query)s\u0027 % {"},{"line_number":337,"context_line":"                \u0027url\u0027: url,"},{"line_number":338,"context_line":"                \u0027query\u0027: query,"},{"line_number":339,"context_line":"            },"},{"line_number":340,"context_line":"            self.key)"},{"line_number":341,"context_line":""},{"line_number":342,"context_line":"    @filter_kwargs"}],"source_content_type":"text/x-python","patch_set":12,"id":"3a961159_4a416d0a","line":339,"updated":"2014-12-17 19:50:28.000000000","message":"suggestion: opportunity for refactor (in a follow on patch perhaps) as this is used in multiple places now. i.e.\n\ndef _build_url_and_query(...)","commit_id":"77db27c4e36ca0eb5c04e7fe1866971ca7fc6bb0"},{"author":{"_account_id":10697,"name":"Thiago Paiva Brito","email":"thiagop@lsd.ufcg.edu.br","username":"thiagop","inactive":true},"change_message_id":"03b18e062584fa996b4482121deda82b505620bf","unresolved":false,"context_lines":[{"line_number":336,"context_line":"            \u0027%(url)s%(query)s\u0027 % {"},{"line_number":337,"context_line":"                \u0027url\u0027: url,"},{"line_number":338,"context_line":"                \u0027query\u0027: query,"},{"line_number":339,"context_line":"            },"},{"line_number":340,"context_line":"            self.key)"},{"line_number":341,"context_line":""},{"line_number":342,"context_line":"    @filter_kwargs"}],"source_content_type":"text/x-python","patch_set":12,"id":"3a961159_ab1ad315","line":339,"in_reply_to":"3a961159_4a416d0a","updated":"2014-12-17 21:18:46.000000000","message":"Done","commit_id":"77db27c4e36ca0eb5c04e7fe1866971ca7fc6bb0"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"16ce55e8713c40d8354852bfa7aadd4cfd6ada2c","unresolved":false,"context_lines":[{"line_number":334,"context_line":""},{"line_number":335,"context_line":"    @filter_kwargs"},{"line_number":336,"context_line":"    def head(self, **kwargs):"},{"line_number":337,"context_line":"        return self._head(self.build_url(dict_args_in_out\u003dkwargs))"},{"line_number":338,"context_line":""},{"line_number":339,"context_line":"    def _build_query(self, params):"},{"line_number":340,"context_line":"        return \u0027?%s\u0027 % urllib.parse.urlencode(params) if params else \u0027\u0027"}],"source_content_type":"text/x-python","patch_set":14,"id":"3a961159_93d662f0","line":337,"updated":"2014-12-29 01:26:23.000000000","message":"unrelated, but seems like this should use _build_url_and_query too.","commit_id":"99f7e121ad632815d8307020d49f89b54b0ca4ad"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"3bad7b17638b898984b1f6c4da26529e04c75aea","unresolved":false,"context_lines":[{"line_number":334,"context_line":""},{"line_number":335,"context_line":"    @filter_kwargs"},{"line_number":336,"context_line":"    def head(self, **kwargs):"},{"line_number":337,"context_line":"        return self._head(self.build_url(dict_args_in_out\u003dkwargs))"},{"line_number":338,"context_line":""},{"line_number":339,"context_line":"    def _build_query(self, params):"},{"line_number":340,"context_line":"        return \u0027?%s\u0027 % urllib.parse.urlencode(params) if params else \u0027\u0027"}],"source_content_type":"text/x-python","patch_set":14,"id":"3a961159_e41ee273","line":337,"in_reply_to":"3a961159_93d662f0","updated":"2014-12-30 15:47:17.000000000","message":"don\u0027t think we have queries for HEAD at the moment.","commit_id":"99f7e121ad632815d8307020d49f89b54b0ca4ad"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"16ce55e8713c40d8354852bfa7aadd4cfd6ada2c","unresolved":false,"context_lines":[{"line_number":339,"context_line":"    def _build_query(self, params):"},{"line_number":340,"context_line":"        return \u0027?%s\u0027 % urllib.parse.urlencode(params) if params else \u0027\u0027"},{"line_number":341,"context_line":""},{"line_number":342,"context_line":"    def _build_url_and_query(self, params):"},{"line_number":343,"context_line":"        url \u003d self.build_url(dict_args_in_out\u003dparams)"},{"line_number":344,"context_line":"        query \u003d self._build_query(params)"},{"line_number":345,"context_line":"        return \u0027%(url)s%(query)s\u0027 % {\u0027url\u0027: url, \u0027query\u0027: query}"}],"source_content_type":"text/x-python","patch_set":14,"id":"3a961159_d3070a80","line":342,"updated":"2014-12-29 01:26:23.000000000","message":"The change to add this new method and have other functions use it is unrelated to just adding the new functionality and should be in a separate commit.","commit_id":"99f7e121ad632815d8307020d49f89b54b0ca4ad"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"b6de59dfdda4c8a769212368853aaf9a5696f307","unresolved":false,"context_lines":[{"line_number":329,"context_line":""},{"line_number":330,"context_line":"    @filter_kwargs"},{"line_number":331,"context_line":"    def get(self, **kwargs):"},{"line_number":332,"context_line":"        url_query \u003d self._build_url_and_query(kwargs)"},{"line_number":333,"context_line":"        return self._get(url_query, self.key)"},{"line_number":334,"context_line":""},{"line_number":335,"context_line":"    @filter_kwargs"}],"source_content_type":"text/x-python","patch_set":18,"id":"da86d52c_d6ec57ca","line":332,"updated":"2015-02-01 15:18:31.000000000","message":"use a named parameter here so that it\u0027s obvious to reviewers that kwargs is going to be modified. For example,\n\n url_query \u003d self._build_url_and_query(params_in_out\u003dkwargs)","commit_id":"54ec0b3c6480f7e790f8cf7e2b46ec8eb1084b9c"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"c0581324ed4e14a5cca839c3438972d22951d131","unresolved":false,"context_lines":[{"line_number":329,"context_line":""},{"line_number":330,"context_line":"    @filter_kwargs"},{"line_number":331,"context_line":"    def get(self, **kwargs):"},{"line_number":332,"context_line":"        url_query \u003d self._build_url_and_query(kwargs)"},{"line_number":333,"context_line":"        return self._get(url_query, self.key)"},{"line_number":334,"context_line":""},{"line_number":335,"context_line":"    @filter_kwargs"}],"source_content_type":"text/x-python","patch_set":18,"id":"da86d52c_62f90ac8","line":332,"in_reply_to":"da86d52c_d6ec57ca","updated":"2015-02-02 15:40:53.000000000","message":"Done","commit_id":"54ec0b3c6480f7e790f8cf7e2b46ec8eb1084b9c"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"b6de59dfdda4c8a769212368853aaf9a5696f307","unresolved":false,"context_lines":[{"line_number":339,"context_line":"    def _build_query(self, params):"},{"line_number":340,"context_line":"        return \u0027?%s\u0027 % urllib.parse.urlencode(params) if params else \u0027\u0027"},{"line_number":341,"context_line":""},{"line_number":342,"context_line":"    def _build_url_and_query(self, params):"},{"line_number":343,"context_line":"        url \u003d self.build_url(dict_args_in_out\u003dparams)"},{"line_number":344,"context_line":"        query \u003d self._build_query(params)"},{"line_number":345,"context_line":"        return \u0027%(url)s%(query)s\u0027 % {\u0027url\u0027: url, \u0027query\u0027: query}"}],"source_content_type":"text/x-python","patch_set":18,"id":"da86d52c_b6e7e3e3","line":342,"updated":"2015-02-01 15:18:31.000000000","message":"change name name of the parameter to params_in_out so that it\u0027s obvious to callers that params is going to be modified.","commit_id":"54ec0b3c6480f7e790f8cf7e2b46ec8eb1084b9c"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"c0581324ed4e14a5cca839c3438972d22951d131","unresolved":false,"context_lines":[{"line_number":339,"context_line":"    def _build_query(self, params):"},{"line_number":340,"context_line":"        return \u0027?%s\u0027 % urllib.parse.urlencode(params) if params else \u0027\u0027"},{"line_number":341,"context_line":""},{"line_number":342,"context_line":"    def _build_url_and_query(self, params):"},{"line_number":343,"context_line":"        url \u003d self.build_url(dict_args_in_out\u003dparams)"},{"line_number":344,"context_line":"        query \u003d self._build_query(params)"},{"line_number":345,"context_line":"        return \u0027%(url)s%(query)s\u0027 % {\u0027url\u0027: url, \u0027query\u0027: query}"}],"source_content_type":"text/x-python","patch_set":18,"id":"da86d52c_a20302b7","line":342,"in_reply_to":"da86d52c_b6e7e3e3","updated":"2015-02-02 15:40:53.000000000","message":"Done","commit_id":"54ec0b3c6480f7e790f8cf7e2b46ec8eb1084b9c"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"b6de59dfdda4c8a769212368853aaf9a5696f307","unresolved":false,"context_lines":[{"line_number":346,"context_line":""},{"line_number":347,"context_line":"    @filter_kwargs"},{"line_number":348,"context_line":"    def list(self, fallback_to_auth\u003dFalse, **kwargs):"},{"line_number":349,"context_line":"        url_query \u003d self._build_url_and_query(kwargs)"},{"line_number":350,"context_line":""},{"line_number":351,"context_line":"        try:"},{"line_number":352,"context_line":"            return self._list("}],"source_content_type":"text/x-python","patch_set":18,"id":"da86d52c_f6d07bf9","line":349,"updated":"2015-02-01 15:18:31.000000000","message":"similar comment here -- use a named parameter here so that it\u0027s obvious to reviewers that kwargs is going to be modified.","commit_id":"54ec0b3c6480f7e790f8cf7e2b46ec8eb1084b9c"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"c0581324ed4e14a5cca839c3438972d22951d131","unresolved":false,"context_lines":[{"line_number":346,"context_line":""},{"line_number":347,"context_line":"    @filter_kwargs"},{"line_number":348,"context_line":"    def list(self, fallback_to_auth\u003dFalse, **kwargs):"},{"line_number":349,"context_line":"        url_query \u003d self._build_url_and_query(kwargs)"},{"line_number":350,"context_line":""},{"line_number":351,"context_line":"        try:"},{"line_number":352,"context_line":"            return self._list("}],"source_content_type":"text/x-python","patch_set":18,"id":"da86d52c_c200f6ac","line":349,"in_reply_to":"da86d52c_f6d07bf9","updated":"2015-02-02 15:40:53.000000000","message":"Done","commit_id":"54ec0b3c6480f7e790f8cf7e2b46ec8eb1084b9c"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"b6de59dfdda4c8a769212368853aaf9a5696f307","unresolved":false,"context_lines":[{"line_number":385,"context_line":"    @filter_kwargs"},{"line_number":386,"context_line":"    def find(self, **kwargs):"},{"line_number":387,"context_line":"        \"\"\"Find a single item with attributes matching ``**kwargs``.\"\"\""},{"line_number":388,"context_line":"        url_query \u003d self._build_url_and_query(kwargs)"},{"line_number":389,"context_line":"        rl \u003d self._list(url_query, self.collection_key)"},{"line_number":390,"context_line":"        num \u003d len(rl)"},{"line_number":391,"context_line":""}],"source_content_type":"text/x-python","patch_set":18,"id":"da86d52c_16ceef5a","line":388,"updated":"2015-02-01 15:18:31.000000000","message":"same comment here.","commit_id":"54ec0b3c6480f7e790f8cf7e2b46ec8eb1084b9c"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"c0581324ed4e14a5cca839c3438972d22951d131","unresolved":false,"context_lines":[{"line_number":385,"context_line":"    @filter_kwargs"},{"line_number":386,"context_line":"    def find(self, **kwargs):"},{"line_number":387,"context_line":"        \"\"\"Find a single item with attributes matching ``**kwargs``.\"\"\""},{"line_number":388,"context_line":"        url_query \u003d self._build_url_and_query(kwargs)"},{"line_number":389,"context_line":"        rl \u003d self._list(url_query, self.collection_key)"},{"line_number":390,"context_line":"        num \u003d len(rl)"},{"line_number":391,"context_line":""}],"source_content_type":"text/x-python","patch_set":18,"id":"da86d52c_429fa652","line":388,"in_reply_to":"da86d52c_16ceef5a","updated":"2015-02-02 15:40:53.000000000","message":"Done","commit_id":"54ec0b3c6480f7e790f8cf7e2b46ec8eb1084b9c"}],"keystoneclient/tests/v3/test_projects.py":[{"author":{"_account_id":13478,"name":"Boris Bobrov","email":"b.bobrov@sap.com","username":"bbobrov"},"change_message_id":"b963851b4a28889522d0f79b24f75ae217474297","unresolved":false,"context_lines":[{"line_number":152,"context_line":"                                    parents_as_list\u003d\u0027SELECT * FROM `project`;\u0027)"},{"line_number":153,"context_line":"        self.assertIsInstance(returned, self.model)"},{"line_number":154,"context_line":"        for attr in ref:"},{"line_number":155,"context_line":"            self.assertEqual("},{"line_number":156,"context_line":"                getattr(returned, attr),"},{"line_number":157,"context_line":"                ref[attr],"},{"line_number":158,"context_line":"                \u0027Expected different %s\u0027 % attr)"}],"source_content_type":"text/x-python","patch_set":11,"id":"3a961159_4dbc676d","line":155,"updated":"2014-12-08 10:17:44.000000000","message":"Please, change the order of the arguments to (expected, actual). It would reduce the effort to understand what should be what. The same applies to assertEqual\u0027s above.","commit_id":"cb77353cad3d7340fbcc8868d0b45a19c7fd97db"},{"author":{"_account_id":10697,"name":"Thiago Paiva Brito","email":"thiagop@lsd.ufcg.edu.br","username":"thiagop","inactive":true},"change_message_id":"0cf6dc02df38df2cf1f3c5ac1f2ff8b20848c2ae","unresolved":false,"context_lines":[{"line_number":152,"context_line":"                                    parents_as_list\u003d\u0027SELECT * FROM `project`;\u0027)"},{"line_number":153,"context_line":"        self.assertIsInstance(returned, self.model)"},{"line_number":154,"context_line":"        for attr in ref:"},{"line_number":155,"context_line":"            self.assertEqual("},{"line_number":156,"context_line":"                getattr(returned, attr),"},{"line_number":157,"context_line":"                ref[attr],"},{"line_number":158,"context_line":"                \u0027Expected different %s\u0027 % attr)"}],"source_content_type":"text/x-python","patch_set":11,"id":"3a961159_5a01e903","line":155,"in_reply_to":"3a961159_4dbc676d","updated":"2014-12-11 18:38:11.000000000","message":"Done Boris. Thank you.","commit_id":"cb77353cad3d7340fbcc8868d0b45a19c7fd97db"},{"author":{"_account_id":9101,"name":"wanghong","email":"reviewwanghong@126.com","username":"wanghong"},"change_message_id":"033285673b27b4592691b231632cd7dc0d71a410","unresolved":false,"context_lines":[{"line_number":57,"context_line":""},{"line_number":58,"context_line":"        self.assertQueryStringIs(\u0027domain_id\u003d%s\u0027 % domain_id)"},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"    def test_create_with_parent_project(self, ref\u003dNone, req_ref\u003dNone):"},{"line_number":61,"context_line":"        ref \u003d ref or self.new_ref()"},{"line_number":62,"context_line":"        ref[\u0027parent_id\u0027] \u003d uuid.uuid4().hex"},{"line_number":63,"context_line":"        manager_ref \u003d ref.copy()"}],"source_content_type":"text/x-python","patch_set":14,"id":"3a961159_d650c6d6","line":60,"updated":"2014-12-30 02:01:40.000000000","message":"I think this test can be:\ndef test_create_with_parent_project()\n    ref \u003d self.new_ref()\n    ref[\u0027parent_id\u0027] \u003d uuid.uuid4().hex\n    super(ProjectTests, self).test_create(ref\u003dref)","commit_id":"99f7e121ad632815d8307020d49f89b54b0ca4ad"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"16ce55e8713c40d8354852bfa7aadd4cfd6ada2c","unresolved":false,"context_lines":[{"line_number":57,"context_line":""},{"line_number":58,"context_line":"        self.assertQueryStringIs(\u0027domain_id\u003d%s\u0027 % domain_id)"},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"    def test_create_with_parent_project(self, ref\u003dNone, req_ref\u003dNone):"},{"line_number":61,"context_line":"        ref \u003d ref or self.new_ref()"},{"line_number":62,"context_line":"        ref[\u0027parent_id\u0027] \u003d uuid.uuid4().hex"},{"line_number":63,"context_line":"        manager_ref \u003d ref.copy()"}],"source_content_type":"text/x-python","patch_set":14,"id":"3a961159_1302726f","line":60,"updated":"2014-12-29 01:26:23.000000000","message":"this method is never called with ref or req_ref, so remove these arguments.","commit_id":"99f7e121ad632815d8307020d49f89b54b0ca4ad"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"3bad7b17638b898984b1f6c4da26529e04c75aea","unresolved":false,"context_lines":[{"line_number":57,"context_line":""},{"line_number":58,"context_line":"        self.assertQueryStringIs(\u0027domain_id\u003d%s\u0027 % domain_id)"},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"    def test_create_with_parent_project(self, ref\u003dNone, req_ref\u003dNone):"},{"line_number":61,"context_line":"        ref \u003d ref or self.new_ref()"},{"line_number":62,"context_line":"        ref[\u0027parent_id\u0027] \u003d uuid.uuid4().hex"},{"line_number":63,"context_line":"        manager_ref \u003d ref.copy()"}],"source_content_type":"text/x-python","patch_set":14,"id":"3a961159_0405ae13","line":60,"in_reply_to":"3a961159_d650c6d6","updated":"2014-12-30 15:47:17.000000000","message":"Done","commit_id":"99f7e121ad632815d8307020d49f89b54b0ca4ad"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"16ce55e8713c40d8354852bfa7aadd4cfd6ada2c","unresolved":false,"context_lines":[{"line_number":81,"context_line":"                \u0027Expected different %s\u0027 % attr)"},{"line_number":82,"context_line":"        self.assertEntityRequestBodyIs(req_ref)"},{"line_number":83,"context_line":""},{"line_number":84,"context_line":"    def test_get_with_subtree(self, ref\u003dNone):"},{"line_number":85,"context_line":"        ref \u003d ref or self.new_ref()"},{"line_number":86,"context_line":"        ref[\u0027subtree_as_list\u0027] \u003d []"},{"line_number":87,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"3a961159_33f68e91","line":84,"updated":"2014-12-29 01:26:23.000000000","message":"this method is never called with ref, so remove the argument.","commit_id":"99f7e121ad632815d8307020d49f89b54b0ca4ad"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"3bad7b17638b898984b1f6c4da26529e04c75aea","unresolved":false,"context_lines":[{"line_number":81,"context_line":"                \u0027Expected different %s\u0027 % attr)"},{"line_number":82,"context_line":"        self.assertEntityRequestBodyIs(req_ref)"},{"line_number":83,"context_line":""},{"line_number":84,"context_line":"    def test_get_with_subtree(self, ref\u003dNone):"},{"line_number":85,"context_line":"        ref \u003d ref or self.new_ref()"},{"line_number":86,"context_line":"        ref[\u0027subtree_as_list\u0027] \u003d []"},{"line_number":87,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"3a961159_67011404","line":84,"in_reply_to":"3a961159_33f68e91","updated":"2014-12-30 15:47:17.000000000","message":"Done","commit_id":"99f7e121ad632815d8307020d49f89b54b0ca4ad"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"16ce55e8713c40d8354852bfa7aadd4cfd6ada2c","unresolved":false,"context_lines":[{"line_number":96,"context_line":"                \u0027Expected different %s\u0027 % attr)"},{"line_number":97,"context_line":"        self.assertQueryStringIs(\u0027subtree_as_list\u003dTrue\u0027)"},{"line_number":98,"context_line":""},{"line_number":99,"context_line":"    def test_get_with_parents(self, ref\u003dNone):"},{"line_number":100,"context_line":"        ref \u003d ref or self.new_ref()"},{"line_number":101,"context_line":"        ref[\u0027parents_as_list\u0027] \u003d []"},{"line_number":102,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"3a961159_53f31a9f","line":99,"updated":"2014-12-29 01:26:23.000000000","message":"this method is never called with ref, so remove the argument.","commit_id":"99f7e121ad632815d8307020d49f89b54b0ca4ad"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"3bad7b17638b898984b1f6c4da26529e04c75aea","unresolved":false,"context_lines":[{"line_number":96,"context_line":"                \u0027Expected different %s\u0027 % attr)"},{"line_number":97,"context_line":"        self.assertQueryStringIs(\u0027subtree_as_list\u003dTrue\u0027)"},{"line_number":98,"context_line":""},{"line_number":99,"context_line":"    def test_get_with_parents(self, ref\u003dNone):"},{"line_number":100,"context_line":"        ref \u003d ref or self.new_ref()"},{"line_number":101,"context_line":"        ref[\u0027parents_as_list\u0027] \u003d []"},{"line_number":102,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"3a961159_a70bfc22","line":99,"in_reply_to":"3a961159_53f31a9f","updated":"2014-12-30 15:47:17.000000000","message":"Done","commit_id":"99f7e121ad632815d8307020d49f89b54b0ca4ad"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"16ce55e8713c40d8354852bfa7aadd4cfd6ada2c","unresolved":false,"context_lines":[{"line_number":111,"context_line":"                \u0027Expected different %s\u0027 % attr)"},{"line_number":112,"context_line":"        self.assertQueryStringIs(\u0027parents_as_list\u003dTrue\u0027)"},{"line_number":113,"context_line":""},{"line_number":114,"context_line":"    def test_get_with_full_hierarchy(self, ref\u003dNone):"},{"line_number":115,"context_line":"        ref \u003d ref or self.new_ref()"},{"line_number":116,"context_line":"        ref[\u0027subtree_as_list\u0027] \u003d []"},{"line_number":117,"context_line":"        ref[\u0027parents_as_list\u0027] \u003d []"}],"source_content_type":"text/x-python","patch_set":14,"id":"3a961159_73f01692","line":114,"updated":"2014-12-29 01:26:23.000000000","message":"this method is never called with ref, so remove the argument.\n\nAlso, check the rest of these methods and if the argument isn\u0027t used then remove it.","commit_id":"99f7e121ad632815d8307020d49f89b54b0ca4ad"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"3bad7b17638b898984b1f6c4da26529e04c75aea","unresolved":false,"context_lines":[{"line_number":111,"context_line":"                \u0027Expected different %s\u0027 % attr)"},{"line_number":112,"context_line":"        self.assertQueryStringIs(\u0027parents_as_list\u003dTrue\u0027)"},{"line_number":113,"context_line":""},{"line_number":114,"context_line":"    def test_get_with_full_hierarchy(self, ref\u003dNone):"},{"line_number":115,"context_line":"        ref \u003d ref or self.new_ref()"},{"line_number":116,"context_line":"        ref[\u0027subtree_as_list\u0027] \u003d []"},{"line_number":117,"context_line":"        ref[\u0027parents_as_list\u0027] \u003d []"}],"source_content_type":"text/x-python","patch_set":14,"id":"3a961159_c711e854","line":114,"in_reply_to":"3a961159_73f01692","updated":"2014-12-30 15:47:17.000000000","message":"Done","commit_id":"99f7e121ad632815d8307020d49f89b54b0ca4ad"},{"author":{"_account_id":9101,"name":"wanghong","email":"reviewwanghong@126.com","username":"wanghong"},"change_message_id":"033285673b27b4592691b231632cd7dc0d71a410","unresolved":false,"context_lines":[{"line_number":134,"context_line":"        self.stub_entity(\u0027GET\u0027, id\u003dref[\u0027id\u0027], entity\u003dref)"},{"line_number":135,"context_line":""},{"line_number":136,"context_line":"        returned \u003d self.manager.get(ref[\u0027id\u0027],"},{"line_number":137,"context_line":"                                    subtree_as_list\u003d\u0027SELECT * FROM `project`;\u0027)"},{"line_number":138,"context_line":"        self.assertIsInstance(returned, self.model)"},{"line_number":139,"context_line":"        for attr in ref:"},{"line_number":140,"context_line":"            self.assertEqual("}],"source_content_type":"text/x-python","patch_set":14,"id":"3a961159_d65d2617","line":137,"updated":"2014-12-30 02:01:40.000000000","message":"So strange invalid parameter. I think a short string like \u0027fake\u0027 is enough.","commit_id":"99f7e121ad632815d8307020d49f89b54b0ca4ad"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"3bad7b17638b898984b1f6c4da26529e04c75aea","unresolved":false,"context_lines":[{"line_number":134,"context_line":"        self.stub_entity(\u0027GET\u0027, id\u003dref[\u0027id\u0027], entity\u003dref)"},{"line_number":135,"context_line":""},{"line_number":136,"context_line":"        returned \u003d self.manager.get(ref[\u0027id\u0027],"},{"line_number":137,"context_line":"                                    subtree_as_list\u003d\u0027SELECT * FROM `project`;\u0027)"},{"line_number":138,"context_line":"        self.assertIsInstance(returned, self.model)"},{"line_number":139,"context_line":"        for attr in ref:"},{"line_number":140,"context_line":"            self.assertEqual("}],"source_content_type":"text/x-python","patch_set":14,"id":"3a961159_677674a5","line":137,"in_reply_to":"3a961159_d65d2617","updated":"2014-12-30 15:47:17.000000000","message":"Although \"fake\" or any other string, number or whatever is valid, don\u0027t see a reason to change this.","commit_id":"99f7e121ad632815d8307020d49f89b54b0ca4ad"},{"author":{"_account_id":9101,"name":"wanghong","email":"reviewwanghong@126.com","username":"wanghong"},"change_message_id":"033285673b27b4592691b231632cd7dc0d71a410","unresolved":false,"context_lines":[{"line_number":149,"context_line":"        self.stub_entity(\u0027GET\u0027, id\u003dref[\u0027id\u0027], entity\u003dref)"},{"line_number":150,"context_line":""},{"line_number":151,"context_line":"        returned \u003d self.manager.get(ref[\u0027id\u0027],"},{"line_number":152,"context_line":"                                    parents_as_list\u003d\u0027SELECT * FROM `project`;\u0027)"},{"line_number":153,"context_line":"        self.assertIsInstance(returned, self.model)"},{"line_number":154,"context_line":"        for attr in ref:"},{"line_number":155,"context_line":"            self.assertEqual("}],"source_content_type":"text/x-python","patch_set":14,"id":"3a961159_f69942d1","line":152,"updated":"2014-12-30 02:01:40.000000000","message":"This too.","commit_id":"99f7e121ad632815d8307020d49f89b54b0ca4ad"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"3bad7b17638b898984b1f6c4da26529e04c75aea","unresolved":false,"context_lines":[{"line_number":149,"context_line":"        self.stub_entity(\u0027GET\u0027, id\u003dref[\u0027id\u0027], entity\u003dref)"},{"line_number":150,"context_line":""},{"line_number":151,"context_line":"        returned \u003d self.manager.get(ref[\u0027id\u0027],"},{"line_number":152,"context_line":"                                    parents_as_list\u003d\u0027SELECT * FROM `project`;\u0027)"},{"line_number":153,"context_line":"        self.assertIsInstance(returned, self.model)"},{"line_number":154,"context_line":"        for attr in ref:"},{"line_number":155,"context_line":"            self.assertEqual("}],"source_content_type":"text/x-python","patch_set":14,"id":"3a961159_c76648ee","line":152,"in_reply_to":"3a961159_f69942d1","updated":"2014-12-30 15:47:17.000000000","message":"same as above.","commit_id":"99f7e121ad632815d8307020d49f89b54b0ca4ad"},{"author":{"_account_id":9101,"name":"wanghong","email":"reviewwanghong@126.com","username":"wanghong"},"change_message_id":"033285673b27b4592691b231632cd7dc0d71a410","unresolved":false,"context_lines":[{"line_number":158,"context_line":"                \u0027Expected different %s\u0027 % attr)"},{"line_number":159,"context_line":"        self.assertQueryStringIs(\u0027\u0027)"},{"line_number":160,"context_line":""},{"line_number":161,"context_line":"    def test_update_with_parent_project(self, ref\u003dNone, req_ref\u003dNone):"},{"line_number":162,"context_line":"        ref \u003d ref or self.new_ref()"},{"line_number":163,"context_line":"        ref[\u0027parent_id\u0027] \u003d uuid.uuid4().hex"},{"line_number":164,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"3a961159_f64b025d","line":161,"updated":"2014-12-30 02:01:40.000000000","message":"I don\u0027t think we need this test in this patch. This patch is just for get only I think.","commit_id":"99f7e121ad632815d8307020d49f89b54b0ca4ad"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"3bad7b17638b898984b1f6c4da26529e04c75aea","unresolved":false,"context_lines":[{"line_number":158,"context_line":"                \u0027Expected different %s\u0027 % attr)"},{"line_number":159,"context_line":"        self.assertQueryStringIs(\u0027\u0027)"},{"line_number":160,"context_line":""},{"line_number":161,"context_line":"    def test_update_with_parent_project(self, ref\u003dNone, req_ref\u003dNone):"},{"line_number":162,"context_line":"        ref \u003d ref or self.new_ref()"},{"line_number":163,"context_line":"        ref[\u0027parent_id\u0027] \u003d uuid.uuid4().hex"},{"line_number":164,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"3a961159_a7221ca1","line":161,"in_reply_to":"3a961159_f64b025d","updated":"2014-12-30 15:47:17.000000000","message":"no, it is for all CRUD operations, we didn\u0027t change the content of the update() method because it doesn\u0027t change, but for the current implementation we are not allowed to update the parent_id field. Which should be tested anyway.","commit_id":"99f7e121ad632815d8307020d49f89b54b0ca4ad"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"301f595fa3ec365651d76c85fb20349de7346a1d","unresolved":false,"context_lines":[{"line_number":59,"context_line":""},{"line_number":60,"context_line":"    def test_create_with_parent_project(self):"},{"line_number":61,"context_line":"        ref \u003d self.new_ref()"},{"line_number":62,"context_line":"        ref[\u0027parent_id\u0027] \u003d uuid.uuid4().hex"},{"line_number":63,"context_line":"        super(ProjectTests, self).test_create(ref\u003dref)"},{"line_number":64,"context_line":""},{"line_number":65,"context_line":"    def test_get_with_subtree(self):"}],"source_content_type":"text/x-python","patch_set":15,"id":"3a961159_53305607","line":62,"updated":"2014-12-30 20:08:41.000000000","message":"The new parameter to project.create() is `parent` rather than `parent_id` so this isn\u0027t testing the new parameter.\n\nThere should be a test that shows that the `parent` parameter can be a Project object.","commit_id":"82d899f35e2afee876326bd2b7a34fe1c7bb9b3f"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"e96b07d555ab98288005ba2ab9984429ee1ae562","unresolved":false,"context_lines":[{"line_number":59,"context_line":""},{"line_number":60,"context_line":"    def test_create_with_parent_project(self):"},{"line_number":61,"context_line":"        ref \u003d self.new_ref()"},{"line_number":62,"context_line":"        ref[\u0027parent_id\u0027] \u003d uuid.uuid4().hex"},{"line_number":63,"context_line":"        super(ProjectTests, self).test_create(ref\u003dref)"},{"line_number":64,"context_line":""},{"line_number":65,"context_line":"    def test_get_with_subtree(self):"}],"source_content_type":"text/x-python","patch_set":15,"id":"3a961159_7fdfc93a","line":62,"in_reply_to":"3a961159_53305607","updated":"2014-12-31 16:04:50.000000000","message":"Done","commit_id":"82d899f35e2afee876326bd2b7a34fe1c7bb9b3f"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"301f595fa3ec365651d76c85fb20349de7346a1d","unresolved":false,"context_lines":[{"line_number":64,"context_line":""},{"line_number":65,"context_line":"    def test_get_with_subtree(self):"},{"line_number":66,"context_line":"        ref \u003d self.new_ref()"},{"line_number":67,"context_line":"        ref[\u0027subtree_as_list\u0027] \u003d []"},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"        self.stub_entity(\u0027GET\u0027, id\u003dref[\u0027id\u0027], entity\u003dref)"},{"line_number":70,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"3a961159_7e84395d","line":67,"updated":"2014-12-30 20:08:41.000000000","message":"it would be interesting to have a test that showed how the client handles a response that has a non-empty list and how an application would process it.","commit_id":"82d899f35e2afee876326bd2b7a34fe1c7bb9b3f"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"beba2a69767bd74da527d17090bf3a7a591dacbb","unresolved":false,"context_lines":[{"line_number":64,"context_line":""},{"line_number":65,"context_line":"    def test_get_with_subtree(self):"},{"line_number":66,"context_line":"        ref \u003d self.new_ref()"},{"line_number":67,"context_line":"        ref[\u0027subtree_as_list\u0027] \u003d []"},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"        self.stub_entity(\u0027GET\u0027, id\u003dref[\u0027id\u0027], entity\u003dref)"},{"line_number":70,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"1a930d6b_9e7c7722","line":67,"in_reply_to":"3a961159_1fb965ec","updated":"2015-01-22 18:54:46.000000000","message":"Are you ok with submitting those cases in a follow up patch?","commit_id":"82d899f35e2afee876326bd2b7a34fe1c7bb9b3f"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"e96b07d555ab98288005ba2ab9984429ee1ae562","unresolved":false,"context_lines":[{"line_number":64,"context_line":""},{"line_number":65,"context_line":"    def test_get_with_subtree(self):"},{"line_number":66,"context_line":"        ref \u003d self.new_ref()"},{"line_number":67,"context_line":"        ref[\u0027subtree_as_list\u0027] \u003d []"},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"        self.stub_entity(\u0027GET\u0027, id\u003dref[\u0027id\u0027], entity\u003dref)"},{"line_number":70,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"3a961159_1fb965ec","line":67,"in_reply_to":"3a961159_7e84395d","updated":"2014-12-31 16:04:50.000000000","message":"Done","commit_id":"82d899f35e2afee876326bd2b7a34fe1c7bb9b3f"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"301f595fa3ec365651d76c85fb20349de7346a1d","unresolved":false,"context_lines":[{"line_number":69,"context_line":"        self.stub_entity(\u0027GET\u0027, id\u003dref[\u0027id\u0027], entity\u003dref)"},{"line_number":70,"context_line":""},{"line_number":71,"context_line":"        returned \u003d self.manager.get(ref[\u0027id\u0027], subtree_as_list\u003dTrue)"},{"line_number":72,"context_line":"        self.assertIsInstance(returned, self.model)"},{"line_number":73,"context_line":"        for attr in ref:"},{"line_number":74,"context_line":"            self.assertEqual("},{"line_number":75,"context_line":"                ref[attr],"}],"source_content_type":"text/x-python","patch_set":15,"id":"3a961159_de38cdd6","line":72,"updated":"2014-12-30 20:08:41.000000000","message":"All the copy-pasted code like lines 72-77 is irrelevant to the test. All that this test needs to verify is that the request URL (especially the query string) is correct. So these should all be removed.","commit_id":"82d899f35e2afee876326bd2b7a34fe1c7bb9b3f"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"e96b07d555ab98288005ba2ab9984429ee1ae562","unresolved":false,"context_lines":[{"line_number":69,"context_line":"        self.stub_entity(\u0027GET\u0027, id\u003dref[\u0027id\u0027], entity\u003dref)"},{"line_number":70,"context_line":""},{"line_number":71,"context_line":"        returned \u003d self.manager.get(ref[\u0027id\u0027], subtree_as_list\u003dTrue)"},{"line_number":72,"context_line":"        self.assertIsInstance(returned, self.model)"},{"line_number":73,"context_line":"        for attr in ref:"},{"line_number":74,"context_line":"            self.assertEqual("},{"line_number":75,"context_line":"                ref[attr],"}],"source_content_type":"text/x-python","patch_set":15,"id":"3a961159_dfefdde7","line":72,"in_reply_to":"3a961159_de38cdd6","updated":"2014-12-31 16:04:50.000000000","message":"Done","commit_id":"82d899f35e2afee876326bd2b7a34fe1c7bb9b3f"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"301f595fa3ec365651d76c85fb20349de7346a1d","unresolved":false,"context_lines":[{"line_number":114,"context_line":"        self.stub_entity(\u0027GET\u0027, id\u003dref[\u0027id\u0027], entity\u003dref)"},{"line_number":115,"context_line":""},{"line_number":116,"context_line":"        returned \u003d self.manager.get(ref[\u0027id\u0027],"},{"line_number":117,"context_line":"                                    subtree_as_list\u003d\u0027SELECT * FROM `project`;\u0027)"},{"line_number":118,"context_line":"        self.assertIsInstance(returned, self.model)"},{"line_number":119,"context_line":"        for attr in ref:"},{"line_number":120,"context_line":"            self.assertEqual("}],"source_content_type":"text/x-python","patch_set":15,"id":"3a961159_fe3ae9c2","line":117,"updated":"2014-12-30 20:08:41.000000000","message":"I agree with the other reviewer that this value is confusing and should be changed to something less specific. A random value like uuid.uuid4().hex is the general convention used.","commit_id":"82d899f35e2afee876326bd2b7a34fe1c7bb9b3f"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"874c79913c47135a2563f4dcc3bca4c71287d0e6","unresolved":false,"context_lines":[{"line_number":114,"context_line":"        self.stub_entity(\u0027GET\u0027, id\u003dref[\u0027id\u0027], entity\u003dref)"},{"line_number":115,"context_line":""},{"line_number":116,"context_line":"        returned \u003d self.manager.get(ref[\u0027id\u0027],"},{"line_number":117,"context_line":"                                    subtree_as_list\u003d\u0027SELECT * FROM `project`;\u0027)"},{"line_number":118,"context_line":"        self.assertIsInstance(returned, self.model)"},{"line_number":119,"context_line":"        for attr in ref:"},{"line_number":120,"context_line":"            self.assertEqual("}],"source_content_type":"text/x-python","patch_set":15,"id":"3a961159_174f7a6b","line":117,"in_reply_to":"3a961159_3fd5411b","updated":"2015-01-13 20:19:19.000000000","message":"This test and the test below are not necessary, keystonoeclient would make a call with \"subtree_as_list\u003dfake\", for example, and the keystone server would be responsible to ignore not \"true\" values for it.","commit_id":"82d899f35e2afee876326bd2b7a34fe1c7bb9b3f"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"e96b07d555ab98288005ba2ab9984429ee1ae562","unresolved":false,"context_lines":[{"line_number":114,"context_line":"        self.stub_entity(\u0027GET\u0027, id\u003dref[\u0027id\u0027], entity\u003dref)"},{"line_number":115,"context_line":""},{"line_number":116,"context_line":"        returned \u003d self.manager.get(ref[\u0027id\u0027],"},{"line_number":117,"context_line":"                                    subtree_as_list\u003d\u0027SELECT * FROM `project`;\u0027)"},{"line_number":118,"context_line":"        self.assertIsInstance(returned, self.model)"},{"line_number":119,"context_line":"        for attr in ref:"},{"line_number":120,"context_line":"            self.assertEqual("}],"source_content_type":"text/x-python","patch_set":15,"id":"3a961159_3fd5411b","line":117,"in_reply_to":"3a961159_fe3ae9c2","updated":"2014-12-31 16:04:50.000000000","message":"Done","commit_id":"82d899f35e2afee876326bd2b7a34fe1c7bb9b3f"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"301f595fa3ec365651d76c85fb20349de7346a1d","unresolved":false,"context_lines":[{"line_number":141,"context_line":"        ref \u003d self.new_ref()"},{"line_number":142,"context_line":"        ref[\u0027parent_id\u0027] \u003d uuid.uuid4().hex"},{"line_number":143,"context_line":""},{"line_number":144,"context_line":"        self.stub_entity(\u0027PATCH\u0027, id\u003dref[\u0027id\u0027], entity\u003dref, status_code\u003d403)"},{"line_number":145,"context_line":"        req_ref \u003d ref.copy()"},{"line_number":146,"context_line":"        req_ref.pop(\u0027id\u0027)"},{"line_number":147,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"3a961159_de660dee","line":144,"updated":"2014-12-30 20:08:41.000000000","message":"Add a note that this is the expected behavior of the identity server. A different implementation might not fail the request.","commit_id":"82d899f35e2afee876326bd2b7a34fe1c7bb9b3f"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"e96b07d555ab98288005ba2ab9984429ee1ae562","unresolved":false,"context_lines":[{"line_number":141,"context_line":"        ref \u003d self.new_ref()"},{"line_number":142,"context_line":"        ref[\u0027parent_id\u0027] \u003d uuid.uuid4().hex"},{"line_number":143,"context_line":""},{"line_number":144,"context_line":"        self.stub_entity(\u0027PATCH\u0027, id\u003dref[\u0027id\u0027], entity\u003dref, status_code\u003d403)"},{"line_number":145,"context_line":"        req_ref \u003d ref.copy()"},{"line_number":146,"context_line":"        req_ref.pop(\u0027id\u0027)"},{"line_number":147,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"3a961159_5fdccd46","line":144,"in_reply_to":"3a961159_de660dee","updated":"2014-12-31 16:04:50.000000000","message":"Done","commit_id":"82d899f35e2afee876326bd2b7a34fe1c7bb9b3f"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"4f87461fd926531b3549c65687475c628e71f5e5","unresolved":false,"context_lines":[{"line_number":59,"context_line":""},{"line_number":60,"context_line":"    def test_create_with_parent_project(self):"},{"line_number":61,"context_line":"        ref \u003d self.new_ref()"},{"line_number":62,"context_line":"        ref[\u0027parent\u0027] \u003d uuid.uuid4().hex"},{"line_number":63,"context_line":"        super(ProjectTests, self).test_create(ref\u003dref)"},{"line_number":64,"context_line":""},{"line_number":65,"context_line":"    def test_get_with_subtree_as_list(self):"}],"source_content_type":"text/x-python","patch_set":16,"id":"1a930d6b_3e99c31f","line":62,"updated":"2015-01-22 19:07:08.000000000","message":"The field in the object returned by the server is parent_id, not parent. The parameter passed to the function is parent. This needs to be tested.","commit_id":"7696e69f1ecb8cb0ad7e93aeda689069016c3e9e"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"6b5eda870f4874c738d365b03f3f0f54cc97f1bf","unresolved":false,"context_lines":[{"line_number":59,"context_line":""},{"line_number":60,"context_line":"    def test_create_with_parent_project(self):"},{"line_number":61,"context_line":"        ref \u003d self.new_ref()"},{"line_number":62,"context_line":"        ref[\u0027parent\u0027] \u003d uuid.uuid4().hex"},{"line_number":63,"context_line":"        super(ProjectTests, self).test_create(ref\u003dref)"},{"line_number":64,"context_line":""},{"line_number":65,"context_line":"    def test_get_with_subtree_as_list(self):"}],"source_content_type":"text/x-python","patch_set":16,"id":"1a930d6b_7e426611","line":62,"in_reply_to":"1a930d6b_3e99c31f","updated":"2015-01-23 20:10:20.000000000","message":"Done","commit_id":"7696e69f1ecb8cb0ad7e93aeda689069016c3e9e"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"4f87461fd926531b3549c65687475c628e71f5e5","unresolved":false,"context_lines":[{"line_number":64,"context_line":""},{"line_number":65,"context_line":"    def test_get_with_subtree_as_list(self):"},{"line_number":66,"context_line":"        ref \u003d self.new_ref()"},{"line_number":67,"context_line":"        ref[\u0027subtree_as_list\u0027] \u003d []"},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"        self.stub_entity(\u0027GET\u0027, id\u003dref[\u0027id\u0027], entity\u003dref)"},{"line_number":70,"context_line":""}],"source_content_type":"text/x-python","patch_set":16,"id":"1a930d6b_fea57b47","line":67,"updated":"2015-01-22 19:07:08.000000000","message":"I mentioned \"it would be interesting to have a test that showed how the client handles a response that has a non-empty list and how an application would process it.\" and the request was to submit it in a follow-up patch -- the tests for the new functionality should all be in this patch.","commit_id":"7696e69f1ecb8cb0ad7e93aeda689069016c3e9e"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"6b5eda870f4874c738d365b03f3f0f54cc97f1bf","unresolved":false,"context_lines":[{"line_number":64,"context_line":""},{"line_number":65,"context_line":"    def test_get_with_subtree_as_list(self):"},{"line_number":66,"context_line":"        ref \u003d self.new_ref()"},{"line_number":67,"context_line":"        ref[\u0027subtree_as_list\u0027] \u003d []"},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"        self.stub_entity(\u0027GET\u0027, id\u003dref[\u0027id\u0027], entity\u003dref)"},{"line_number":70,"context_line":""}],"source_content_type":"text/x-python","patch_set":16,"id":"1a930d6b_5e3bea9b","line":67,"in_reply_to":"1a930d6b_fea57b47","updated":"2015-01-23 20:10:20.000000000","message":"fair enough","commit_id":"7696e69f1ecb8cb0ad7e93aeda689069016c3e9e"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"b6de59dfdda4c8a769212368853aaf9a5696f307","unresolved":false,"context_lines":[{"line_number":63,"context_line":""},{"line_number":64,"context_line":"        req_ref \u003d ref.copy()"},{"line_number":65,"context_line":"        req_ref.pop(\u0027id\u0027)"},{"line_number":66,"context_line":"        self.stub_entity(\u0027POST\u0027, entity\u003dreq_ref, status_code\u003d201)"},{"line_number":67,"context_line":""},{"line_number":68,"context_line":"        param_ref \u003d req_ref.copy()"},{"line_number":69,"context_line":"        param_ref[\u0027parent\u0027] \u003d param_ref.pop(\u0027parent_id\u0027)"}],"source_content_type":"text/x-python","patch_set":18,"id":"da86d52c_96173fa3","line":66,"updated":"2015-02-01 15:18:31.000000000","message":"The entity here is the entity that\u0027s expected to returned by the \"server\". An identity server is expected to return an entity with an id, but the entity passed here doesn\u0027t have an id (it was removed at line 65. Change the code so that the entity has an id. Probably by using ref rather than req_ref.","commit_id":"54ec0b3c6480f7e790f8cf7e2b46ec8eb1084b9c"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"c0581324ed4e14a5cca839c3438972d22951d131","unresolved":false,"context_lines":[{"line_number":63,"context_line":""},{"line_number":64,"context_line":"        req_ref \u003d ref.copy()"},{"line_number":65,"context_line":"        req_ref.pop(\u0027id\u0027)"},{"line_number":66,"context_line":"        self.stub_entity(\u0027POST\u0027, entity\u003dreq_ref, status_code\u003d201)"},{"line_number":67,"context_line":""},{"line_number":68,"context_line":"        param_ref \u003d req_ref.copy()"},{"line_number":69,"context_line":"        param_ref[\u0027parent\u0027] \u003d param_ref.pop(\u0027parent_id\u0027)"}],"source_content_type":"text/x-python","patch_set":18,"id":"da86d52c_826a7e18","line":66,"in_reply_to":"da86d52c_96173fa3","updated":"2015-02-02 15:40:53.000000000","message":"Done","commit_id":"54ec0b3c6480f7e790f8cf7e2b46ec8eb1084b9c"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"b6de59dfdda4c8a769212368853aaf9a5696f307","unresolved":false,"context_lines":[{"line_number":66,"context_line":"        self.stub_entity(\u0027POST\u0027, entity\u003dreq_ref, status_code\u003d201)"},{"line_number":67,"context_line":""},{"line_number":68,"context_line":"        param_ref \u003d req_ref.copy()"},{"line_number":69,"context_line":"        param_ref[\u0027parent\u0027] \u003d param_ref.pop(\u0027parent_id\u0027)"},{"line_number":70,"context_line":"        params \u003d utils.parameterize(param_ref)"},{"line_number":71,"context_line":""},{"line_number":72,"context_line":"        returned \u003d self.manager.create(**params)"}],"source_content_type":"text/x-python","patch_set":18,"id":"da86d52c_d63a9735","line":69,"updated":"2015-02-01 15:18:31.000000000","message":"these 2 lines are unnecessary since utils.parameterize renames all the fields... 68-70 can be\n\n params \u003d utils.parameterize(req_ref)","commit_id":"54ec0b3c6480f7e790f8cf7e2b46ec8eb1084b9c"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"c0581324ed4e14a5cca839c3438972d22951d131","unresolved":false,"context_lines":[{"line_number":66,"context_line":"        self.stub_entity(\u0027POST\u0027, entity\u003dreq_ref, status_code\u003d201)"},{"line_number":67,"context_line":""},{"line_number":68,"context_line":"        param_ref \u003d req_ref.copy()"},{"line_number":69,"context_line":"        param_ref[\u0027parent\u0027] \u003d param_ref.pop(\u0027parent_id\u0027)"},{"line_number":70,"context_line":"        params \u003d utils.parameterize(param_ref)"},{"line_number":71,"context_line":""},{"line_number":72,"context_line":"        returned \u003d self.manager.create(**params)"}],"source_content_type":"text/x-python","patch_set":18,"id":"da86d52c_a2778201","line":69,"in_reply_to":"da86d52c_d63a9735","updated":"2015-02-02 15:40:53.000000000","message":"Done","commit_id":"54ec0b3c6480f7e790f8cf7e2b46ec8eb1084b9c"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"b6de59dfdda4c8a769212368853aaf9a5696f307","unresolved":false,"context_lines":[{"line_number":83,"context_line":""},{"line_number":84,"context_line":"        :param hierarchy_size: the desired hierarchy size, default is 3."},{"line_number":85,"context_line":""},{"line_number":86,"context_line":"        :returns projects: a list of the projects in the created hierarchy."},{"line_number":87,"context_line":""},{"line_number":88,"context_line":"        \"\"\""},{"line_number":89,"context_line":""}],"source_content_type":"text/x-python","patch_set":18,"id":"da86d52c_b6e8c37d","line":86,"updated":"2015-02-01 15:18:31.000000000","message":"the \"returns\" directive doesn\u0027t take an argument. See http://sphinx-doc.org/domains.html#info-field-lists","commit_id":"54ec0b3c6480f7e790f8cf7e2b46ec8eb1084b9c"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"c0581324ed4e14a5cca839c3438972d22951d131","unresolved":false,"context_lines":[{"line_number":83,"context_line":""},{"line_number":84,"context_line":"        :param hierarchy_size: the desired hierarchy size, default is 3."},{"line_number":85,"context_line":""},{"line_number":86,"context_line":"        :returns projects: a list of the projects in the created hierarchy."},{"line_number":87,"context_line":""},{"line_number":88,"context_line":"        \"\"\""},{"line_number":89,"context_line":""}],"source_content_type":"text/x-python","patch_set":18,"id":"da86d52c_22e9d280","line":86,"in_reply_to":"da86d52c_b6e8c37d","updated":"2015-02-02 15:40:53.000000000","message":"Done","commit_id":"54ec0b3c6480f7e790f8cf7e2b46ec8eb1084b9c"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"b6de59dfdda4c8a769212368853aaf9a5696f307","unresolved":false,"context_lines":[{"line_number":110,"context_line":"        self.stub_entity(\u0027GET\u0027, id\u003dref[\u0027id\u0027], entity\u003dref)"},{"line_number":111,"context_line":""},{"line_number":112,"context_line":"        returned \u003d self.manager.get(ref[\u0027id\u0027], subtree_as_list\u003dTrue)"},{"line_number":113,"context_line":"        self.assertQueryStringIs(\u0027subtree_as_list\u003dTrue\u0027)"},{"line_number":114,"context_line":"        for i in range(1, len(projects)):"},{"line_number":115,"context_line":"            for attr in projects[i]:"},{"line_number":116,"context_line":"                child \u003d getattr(returned, \u0027subtree\u0027)[i - 1]"}],"source_content_type":"text/x-python","patch_set":18,"id":"da86d52c_16ffcf35","line":113,"updated":"2015-02-01 15:18:31.000000000","message":"According to the API spec, there\u0027s no value expected for the subtree_as_list. See http://specs.openstack.org/openstack/keystone-specs/api/v3/identity-api-v3.html#get-project , so this should be\n\n self.assertQueryStringIs(\u0027subtree_as_list\u0027)","commit_id":"54ec0b3c6480f7e790f8cf7e2b46ec8eb1084b9c"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"c0581324ed4e14a5cca839c3438972d22951d131","unresolved":false,"context_lines":[{"line_number":110,"context_line":"        self.stub_entity(\u0027GET\u0027, id\u003dref[\u0027id\u0027], entity\u003dref)"},{"line_number":111,"context_line":""},{"line_number":112,"context_line":"        returned \u003d self.manager.get(ref[\u0027id\u0027], subtree_as_list\u003dTrue)"},{"line_number":113,"context_line":"        self.assertQueryStringIs(\u0027subtree_as_list\u003dTrue\u0027)"},{"line_number":114,"context_line":"        for i in range(1, len(projects)):"},{"line_number":115,"context_line":"            for attr in projects[i]:"},{"line_number":116,"context_line":"                child \u003d getattr(returned, \u0027subtree\u0027)[i - 1]"}],"source_content_type":"text/x-python","patch_set":18,"id":"da86d52c_ed2b2be9","line":113,"in_reply_to":"da86d52c_16ffcf35","updated":"2015-02-02 15:40:53.000000000","message":"That\u0027s right, but in the role_assignments API, for the \"effective\" query parameter we have the same case:\n \n- API: https://github.com/openstack/keystone-specs/blob/master/api/v3/identity-api-v3.rst#list-effective-role-assignments\n- keystoneclient: https://github.com/openstack/python-keystoneclient/blob/master/keystoneclient/v3/role_assignments.py#L85\n\nAlso, in keystone, the True value is accepted: https://github.com/openstack/keystone/blob/master/keystone/assignment/controllers.py#L428\n\nBy the time the role_assignments was merged in keystoneclient, it was preferred to use \"urllib\" to build the parameters instead of build them manually (https://github.com/openstack/python-keystoneclient/blob/master/keystoneclient/base.py#L341). the lib receives only dictionaries so there is no other valid value to put as value of the query.","commit_id":"54ec0b3c6480f7e790f8cf7e2b46ec8eb1084b9c"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"b6de59dfdda4c8a769212368853aaf9a5696f307","unresolved":false,"context_lines":[{"line_number":130,"context_line":"        self.stub_entity(\u0027GET\u0027, id\u003dref[\u0027id\u0027], entity\u003dref)"},{"line_number":131,"context_line":""},{"line_number":132,"context_line":"        returned \u003d self.manager.get(ref[\u0027id\u0027], parents_as_list\u003dTrue)"},{"line_number":133,"context_line":"        self.assertQueryStringIs(\u0027parents_as_list\u003dTrue\u0027)"},{"line_number":134,"context_line":"        for i in range(0, len(projects) - 1):"},{"line_number":135,"context_line":"            for attr in projects[i]:"},{"line_number":136,"context_line":"                parent \u003d getattr(returned, \u0027parents\u0027)[i]"}],"source_content_type":"text/x-python","patch_set":18,"id":"da86d52c_36fcd33e","line":133,"updated":"2015-02-01 15:18:31.000000000","message":"similar comment here, there\u0027s no parameter expected for parents_as_list.","commit_id":"54ec0b3c6480f7e790f8cf7e2b46ec8eb1084b9c"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"c0581324ed4e14a5cca839c3438972d22951d131","unresolved":false,"context_lines":[{"line_number":130,"context_line":"        self.stub_entity(\u0027GET\u0027, id\u003dref[\u0027id\u0027], entity\u003dref)"},{"line_number":131,"context_line":""},{"line_number":132,"context_line":"        returned \u003d self.manager.get(ref[\u0027id\u0027], parents_as_list\u003dTrue)"},{"line_number":133,"context_line":"        self.assertQueryStringIs(\u0027parents_as_list\u003dTrue\u0027)"},{"line_number":134,"context_line":"        for i in range(0, len(projects) - 1):"},{"line_number":135,"context_line":"            for attr in projects[i]:"},{"line_number":136,"context_line":"                parent \u003d getattr(returned, \u0027parents\u0027)[i]"}],"source_content_type":"text/x-python","patch_set":18,"id":"da86d52c_ad4933d2","line":133,"in_reply_to":"da86d52c_36fcd33e","updated":"2015-02-02 15:40:53.000000000","message":"see the response above","commit_id":"54ec0b3c6480f7e790f8cf7e2b46ec8eb1084b9c"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"b6de59dfdda4c8a769212368853aaf9a5696f307","unresolved":false,"context_lines":[{"line_number":152,"context_line":"        returned \u003d self.manager.get(ref[\u0027id\u0027],"},{"line_number":153,"context_line":"                                    parents_as_list\u003dTrue,"},{"line_number":154,"context_line":"                                    subtree_as_list\u003dTrue)"},{"line_number":155,"context_line":"        self.assertQueryStringIs(\u0027subtree_as_list\u003dTrue\u0026parents_as_list\u003dTrue\u0027)"},{"line_number":156,"context_line":""},{"line_number":157,"context_line":"        for attr in projects[0]:"},{"line_number":158,"context_line":"            parent \u003d getattr(returned, \u0027parents_as_list\u0027)[0]"}],"source_content_type":"text/x-python","patch_set":18,"id":"da86d52c_56f9474c","line":155,"updated":"2015-02-01 15:18:31.000000000","message":"similar comment here, there\u0027s no parameter expected for subtree_as_list or parents_as_list.","commit_id":"54ec0b3c6480f7e790f8cf7e2b46ec8eb1084b9c"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"c0581324ed4e14a5cca839c3438972d22951d131","unresolved":false,"context_lines":[{"line_number":152,"context_line":"        returned \u003d self.manager.get(ref[\u0027id\u0027],"},{"line_number":153,"context_line":"                                    parents_as_list\u003dTrue,"},{"line_number":154,"context_line":"                                    subtree_as_list\u003dTrue)"},{"line_number":155,"context_line":"        self.assertQueryStringIs(\u0027subtree_as_list\u003dTrue\u0026parents_as_list\u003dTrue\u0027)"},{"line_number":156,"context_line":""},{"line_number":157,"context_line":"        for attr in projects[0]:"},{"line_number":158,"context_line":"            parent \u003d getattr(returned, \u0027parents_as_list\u0027)[0]"}],"source_content_type":"text/x-python","patch_set":18,"id":"da86d52c_2d0d4391","line":155,"in_reply_to":"da86d52c_56f9474c","updated":"2015-02-02 15:40:53.000000000","message":"see the response above","commit_id":"54ec0b3c6480f7e790f8cf7e2b46ec8eb1084b9c"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"26e52d35d4258603aaec3f965980e6eda59fb4c8","unresolved":false,"context_lines":[{"line_number":60,"context_line":"    def test_create_with_parent_project(self):"},{"line_number":61,"context_line":"        ref \u003d self.new_ref()"},{"line_number":62,"context_line":"        ref[\u0027parent_id\u0027] \u003d uuid.uuid4().hex"},{"line_number":63,"context_line":"        super(ProjectTests, self).test_create(ref\u003dref)"},{"line_number":64,"context_line":""},{"line_number":65,"context_line":"    def _create_projects_hierarchy(self, hierarchy_size\u003d3):"},{"line_number":66,"context_line":"        \"\"\"Creates a project hierarchy with specified size."}],"source_content_type":"text/x-python","patch_set":20,"id":"da86d52c_658498d4","line":63,"updated":"2015-02-03 02:01:28.000000000","message":"There should also be a test where a Project object is passed as the parent parameter.","commit_id":"a7069e99d92a84b6b283506ed29e92094404aeab"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"36ce7257ff05860e4cbac4040ed3d53067bd35f9","unresolved":false,"context_lines":[{"line_number":60,"context_line":"    def test_create_with_parent_project(self):"},{"line_number":61,"context_line":"        ref \u003d self.new_ref()"},{"line_number":62,"context_line":"        ref[\u0027parent_id\u0027] \u003d uuid.uuid4().hex"},{"line_number":63,"context_line":"        super(ProjectTests, self).test_create(ref\u003dref)"},{"line_number":64,"context_line":""},{"line_number":65,"context_line":"    def _create_projects_hierarchy(self, hierarchy_size\u003d3):"},{"line_number":66,"context_line":"        \"\"\"Creates a project hierarchy with specified size."}],"source_content_type":"text/x-python","patch_set":20,"id":"da86d52c_a525b0c3","line":63,"in_reply_to":"da86d52c_658498d4","updated":"2015-02-03 02:13:16.000000000","message":"A test without reusing the super class test?","commit_id":"a7069e99d92a84b6b283506ed29e92094404aeab"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"26e52d35d4258603aaec3f965980e6eda59fb4c8","unresolved":false,"context_lines":[{"line_number":94,"context_line":"        self.stub_entity(\u0027GET\u0027, id\u003dref[\u0027id\u0027], entity\u003dref)"},{"line_number":95,"context_line":""},{"line_number":96,"context_line":"        returned \u003d self.manager.get(ref[\u0027id\u0027], subtree_as_list\u003dTrue)"},{"line_number":97,"context_line":"        self.assertQueryStringIs(\u0027subtree_as_list\u003dTrue\u0027)"},{"line_number":98,"context_line":"        for i in range(1, len(projects)):"},{"line_number":99,"context_line":"            for attr in projects[i]:"},{"line_number":100,"context_line":"                child \u003d getattr(returned, \u0027subtree_as_list\u0027)[i - 1]"}],"source_content_type":"text/x-python","patch_set":20,"id":"da86d52c_e5ade889","line":97,"updated":"2015-02-03 02:01:28.000000000","message":"According to the API spec, there\u0027s no value expected for the subtree_as_list. See http://specs.openstack.org/openstack/keystone-specs/api/v3/identity-api-v3.html#get-project , so this should be\n\n self.assertQueryStringIs(\u0027subtree_as_list\u0027)\n\nWe need to code to the spec, not how keystone happens to work.\n\nThe response to the previous comment shows that there\u0027s an existing bug. Let\u0027s not make another one.","commit_id":"a7069e99d92a84b6b283506ed29e92094404aeab"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"36ce7257ff05860e4cbac4040ed3d53067bd35f9","unresolved":false,"context_lines":[{"line_number":94,"context_line":"        self.stub_entity(\u0027GET\u0027, id\u003dref[\u0027id\u0027], entity\u003dref)"},{"line_number":95,"context_line":""},{"line_number":96,"context_line":"        returned \u003d self.manager.get(ref[\u0027id\u0027], subtree_as_list\u003dTrue)"},{"line_number":97,"context_line":"        self.assertQueryStringIs(\u0027subtree_as_list\u003dTrue\u0027)"},{"line_number":98,"context_line":"        for i in range(1, len(projects)):"},{"line_number":99,"context_line":"            for attr in projects[i]:"},{"line_number":100,"context_line":"                child \u003d getattr(returned, \u0027subtree_as_list\u0027)[i - 1]"}],"source_content_type":"text/x-python","patch_set":20,"id":"da86d52c_c507041c","line":97,"in_reply_to":"da86d52c_e5ade889","updated":"2015-02-03 02:13:16.000000000","message":"Sorry, but don\u0027t see this as a bug. If you want the query string to be exactly what is being shown in the API spec, we won\u0027t reuse the _list() method from the CrudManager base class.","commit_id":"a7069e99d92a84b6b283506ed29e92094404aeab"},{"author":{"_account_id":7191,"name":"Jamie Lennox","email":"jamielennox@gmail.com","username":"jamielennox"},"change_message_id":"c28b59fb8635c184c887134d024f910097fac5a8","unresolved":false,"context_lines":[{"line_number":69,"context_line":""},{"line_number":70,"context_line":"        child_ref \u003d ref.copy()"},{"line_number":71,"context_line":"        child_ref.pop(\u0027parent_id\u0027)"},{"line_number":72,"context_line":"        child_ref[\u0027parent\u0027] \u003d parent"},{"line_number":73,"context_line":""},{"line_number":74,"context_line":"        # test_create() pops the \u0027id\u0027 of the mocked response"},{"line_number":75,"context_line":"        ref.pop(\u0027id\u0027)"}],"source_content_type":"text/x-python","patch_set":25,"id":"da86d52c_3dac5035","line":72,"updated":"2015-02-03 19:35:43.000000000","message":"nit: this reads a little weird, why not just use:\n\nparent_ref \u003d self.new_ref()\nchild_ref \u003d self.new_ref() \n\nrather than worry about when to pop the \u0027id\u0027. It\u0027s not like the real usage will typically have the same names and descriptions between parent and child","commit_id":"7f26869d63dbf726b0c0bb7dec485e13d4859647"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"afd9b0c4d470535c03b34c8854bd8d7772a78384","unresolved":false,"context_lines":[{"line_number":69,"context_line":""},{"line_number":70,"context_line":"        child_ref \u003d ref.copy()"},{"line_number":71,"context_line":"        child_ref.pop(\u0027parent_id\u0027)"},{"line_number":72,"context_line":"        child_ref[\u0027parent\u0027] \u003d parent"},{"line_number":73,"context_line":""},{"line_number":74,"context_line":"        # test_create() pops the \u0027id\u0027 of the mocked response"},{"line_number":75,"context_line":"        ref.pop(\u0027id\u0027)"}],"source_content_type":"text/x-python","patch_set":25,"id":"da86d52c_b3beb1d2","line":72,"in_reply_to":"da86d52c_3dac5035","updated":"2015-02-03 19:51:01.000000000","message":"Done","commit_id":"7f26869d63dbf726b0c0bb7dec485e13d4859647"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"45a22043da3b258495297d3cb3feab72aa29070d","unresolved":false,"context_lines":[{"line_number":69,"context_line":""},{"line_number":70,"context_line":"        child_ref \u003d ref.copy()"},{"line_number":71,"context_line":"        child_ref.pop(\u0027parent_id\u0027)"},{"line_number":72,"context_line":"        child_ref[\u0027parent\u0027] \u003d parent"},{"line_number":73,"context_line":""},{"line_number":74,"context_line":"        # test_create() pops the \u0027id\u0027 of the mocked response"},{"line_number":75,"context_line":"        ref.pop(\u0027id\u0027)"}],"source_content_type":"text/x-python","patch_set":25,"id":"da86d52c_93052d7c","line":72,"in_reply_to":"da86d52c_b3beb1d2","updated":"2015-02-03 19:54:41.000000000","message":"for the child ref we need the \"parent\" field to be an object, not an ID (we want to test the create() method receiving both - just the ID and the Project resource object). It was requested by bknudson in previous patchsets.","commit_id":"7f26869d63dbf726b0c0bb7dec485e13d4859647"},{"author":{"_account_id":9101,"name":"wanghong","email":"reviewwanghong@126.com","username":"wanghong"},"change_message_id":"3dc593b5e4cd8710c00b2fb2de69ff483ec46c11","unresolved":false,"context_lines":[{"line_number":60,"context_line":"    def test_create_with_parent_id(self):"},{"line_number":61,"context_line":"        parent_ref \u003d self.new_ref()"},{"line_number":62,"context_line":"        parent_ref[\u0027parent_id\u0027] \u003d uuid.uuid4().hex"},{"line_number":63,"context_line":"        parent \u003d super(ProjectTests, self).test_create(ref\u003dparent_ref)"},{"line_number":64,"context_line":"        setattr(parent, \u0027id\u0027, parent_ref[\u0027id\u0027])"},{"line_number":65,"context_line":""},{"line_number":66,"context_line":"        # Create another project under \u0027parent\u0027 in the hierarchy"}],"source_content_type":"text/x-python","patch_set":27,"id":"da86d52c_b6cd7fb9","line":63,"updated":"2015-02-05 07:35:45.000000000","message":"How about using this method to create a project instance?\nhttps://github.com/openstack/python-keystoneclient/blob/master/keystoneclient/tests/v3/test_endpoint_policy.py#L62","commit_id":"8eab8faace4f619aa1b0cf1e1aac67195c15466c"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"6ae7b9a1632a68b78550518cf8018dd55d41346c","unresolved":false,"context_lines":[{"line_number":60,"context_line":"    def test_create_with_parent_id(self):"},{"line_number":61,"context_line":"        parent_ref \u003d self.new_ref()"},{"line_number":62,"context_line":"        parent_ref[\u0027parent_id\u0027] \u003d uuid.uuid4().hex"},{"line_number":63,"context_line":"        parent \u003d super(ProjectTests, self).test_create(ref\u003dparent_ref)"},{"line_number":64,"context_line":"        setattr(parent, \u0027id\u0027, parent_ref[\u0027id\u0027])"},{"line_number":65,"context_line":""},{"line_number":66,"context_line":"        # Create another project under \u0027parent\u0027 in the hierarchy"}],"source_content_type":"text/x-python","patch_set":27,"id":"da86d52c_9dcee12c","line":63,"updated":"2015-02-05 01:48:06.000000000","message":"change this to\n\n parent \u003d self.test_create(ref\u003dparent_ref)","commit_id":"8eab8faace4f619aa1b0cf1e1aac67195c15466c"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"d1e838abe32356e24188cb1de3912c5a52a8fa18","unresolved":false,"context_lines":[{"line_number":60,"context_line":"    def test_create_with_parent_id(self):"},{"line_number":61,"context_line":"        parent_ref \u003d self.new_ref()"},{"line_number":62,"context_line":"        parent_ref[\u0027parent_id\u0027] \u003d uuid.uuid4().hex"},{"line_number":63,"context_line":"        parent \u003d super(ProjectTests, self).test_create(ref\u003dparent_ref)"},{"line_number":64,"context_line":"        setattr(parent, \u0027id\u0027, parent_ref[\u0027id\u0027])"},{"line_number":65,"context_line":""},{"line_number":66,"context_line":"        # Create another project under \u0027parent\u0027 in the hierarchy"}],"source_content_type":"text/x-python","patch_set":27,"id":"da86d52c_16f56256","line":63,"in_reply_to":"da86d52c_9dcee12c","updated":"2015-02-05 15:43:04.000000000","message":"Done","commit_id":"8eab8faace4f619aa1b0cf1e1aac67195c15466c"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"6ae7b9a1632a68b78550518cf8018dd55d41346c","unresolved":false,"context_lines":[{"line_number":61,"context_line":"        parent_ref \u003d self.new_ref()"},{"line_number":62,"context_line":"        parent_ref[\u0027parent_id\u0027] \u003d uuid.uuid4().hex"},{"line_number":63,"context_line":"        parent \u003d super(ProjectTests, self).test_create(ref\u003dparent_ref)"},{"line_number":64,"context_line":"        setattr(parent, \u0027id\u0027, parent_ref[\u0027id\u0027])"},{"line_number":65,"context_line":""},{"line_number":66,"context_line":"        # Create another project under \u0027parent\u0027 in the hierarchy"},{"line_number":67,"context_line":"        ref \u003d self.new_ref()"}],"source_content_type":"text/x-python","patch_set":27,"id":"da86d52c_dd8699da","line":64,"updated":"2015-02-05 01:48:06.000000000","message":"change this to\n\n parent.id \u003d parent_ref[\u0027id\u0027]","commit_id":"8eab8faace4f619aa1b0cf1e1aac67195c15466c"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"d1e838abe32356e24188cb1de3912c5a52a8fa18","unresolved":false,"context_lines":[{"line_number":61,"context_line":"        parent_ref \u003d self.new_ref()"},{"line_number":62,"context_line":"        parent_ref[\u0027parent_id\u0027] \u003d uuid.uuid4().hex"},{"line_number":63,"context_line":"        parent \u003d super(ProjectTests, self).test_create(ref\u003dparent_ref)"},{"line_number":64,"context_line":"        setattr(parent, \u0027id\u0027, parent_ref[\u0027id\u0027])"},{"line_number":65,"context_line":""},{"line_number":66,"context_line":"        # Create another project under \u0027parent\u0027 in the hierarchy"},{"line_number":67,"context_line":"        ref \u003d self.new_ref()"}],"source_content_type":"text/x-python","patch_set":27,"id":"da86d52c_96d952f5","line":64,"in_reply_to":"da86d52c_dd8699da","updated":"2015-02-05 15:43:04.000000000","message":"Done","commit_id":"8eab8faace4f619aa1b0cf1e1aac67195c15466c"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"6ae7b9a1632a68b78550518cf8018dd55d41346c","unresolved":false,"context_lines":[{"line_number":65,"context_line":""},{"line_number":66,"context_line":"        # Create another project under \u0027parent\u0027 in the hierarchy"},{"line_number":67,"context_line":"        ref \u003d self.new_ref()"},{"line_number":68,"context_line":"        ref[\u0027parent_id\u0027] \u003d getattr(parent, \u0027id\u0027)"},{"line_number":69,"context_line":""},{"line_number":70,"context_line":"        child_ref \u003d ref.copy()"},{"line_number":71,"context_line":"        child_ref.pop(\u0027parent_id\u0027)"}],"source_content_type":"text/x-python","patch_set":27,"id":"da86d52c_3de335a5","line":68,"updated":"2015-02-05 01:48:06.000000000","message":"change this to\n\n ref[\u0027parent_id\u0027] \u003d parent.id","commit_id":"8eab8faace4f619aa1b0cf1e1aac67195c15466c"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"d1e838abe32356e24188cb1de3912c5a52a8fa18","unresolved":false,"context_lines":[{"line_number":65,"context_line":""},{"line_number":66,"context_line":"        # Create another project under \u0027parent\u0027 in the hierarchy"},{"line_number":67,"context_line":"        ref \u003d self.new_ref()"},{"line_number":68,"context_line":"        ref[\u0027parent_id\u0027] \u003d getattr(parent, \u0027id\u0027)"},{"line_number":69,"context_line":""},{"line_number":70,"context_line":"        child_ref \u003d ref.copy()"},{"line_number":71,"context_line":"        child_ref.pop(\u0027parent_id\u0027)"}],"source_content_type":"text/x-python","patch_set":27,"id":"da86d52c_76de9ede","line":68,"in_reply_to":"da86d52c_3de335a5","updated":"2015-02-05 15:43:04.000000000","message":"Done","commit_id":"8eab8faace4f619aa1b0cf1e1aac67195c15466c"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"6ae7b9a1632a68b78550518cf8018dd55d41346c","unresolved":false,"context_lines":[{"line_number":68,"context_line":"        ref[\u0027parent_id\u0027] \u003d getattr(parent, \u0027id\u0027)"},{"line_number":69,"context_line":""},{"line_number":70,"context_line":"        child_ref \u003d ref.copy()"},{"line_number":71,"context_line":"        child_ref.pop(\u0027parent_id\u0027)"},{"line_number":72,"context_line":"        child_ref[\u0027parent\u0027] \u003d parent"},{"line_number":73,"context_line":""},{"line_number":74,"context_line":"        # test_create() pops the \u0027id\u0027 of the mocked response"}],"source_content_type":"text/x-python","patch_set":27,"id":"da86d52c_9d9c2111","line":71,"updated":"2015-02-05 01:48:06.000000000","message":"change this to\n\n del child_ref[\u0027parent_id\u0027]","commit_id":"8eab8faace4f619aa1b0cf1e1aac67195c15466c"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"d1e838abe32356e24188cb1de3912c5a52a8fa18","unresolved":false,"context_lines":[{"line_number":68,"context_line":"        ref[\u0027parent_id\u0027] \u003d getattr(parent, \u0027id\u0027)"},{"line_number":69,"context_line":""},{"line_number":70,"context_line":"        child_ref \u003d ref.copy()"},{"line_number":71,"context_line":"        child_ref.pop(\u0027parent_id\u0027)"},{"line_number":72,"context_line":"        child_ref[\u0027parent\u0027] \u003d parent"},{"line_number":73,"context_line":""},{"line_number":74,"context_line":"        # test_create() pops the \u0027id\u0027 of the mocked response"}],"source_content_type":"text/x-python","patch_set":27,"id":"da86d52c_56d43abc","line":71,"in_reply_to":"da86d52c_9d9c2111","updated":"2015-02-05 15:43:04.000000000","message":"Done","commit_id":"8eab8faace4f619aa1b0cf1e1aac67195c15466c"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"6ae7b9a1632a68b78550518cf8018dd55d41346c","unresolved":false,"context_lines":[{"line_number":72,"context_line":"        child_ref[\u0027parent\u0027] \u003d parent"},{"line_number":73,"context_line":""},{"line_number":74,"context_line":"        # test_create() pops the \u0027id\u0027 of the mocked response"},{"line_number":75,"context_line":"        ref.pop(\u0027id\u0027)"},{"line_number":76,"context_line":""},{"line_number":77,"context_line":"        # Resource objects may peform lazy-loading. The create() method of"},{"line_number":78,"context_line":"        # ProjectManager will try to access the \u0027uuid\u0027 attribute of the parent"}],"source_content_type":"text/x-python","patch_set":27,"id":"da86d52c_7d976dec","line":75,"updated":"2015-02-05 01:48:06.000000000","message":"change this to\n\n del ref[\u0027id\u0027]","commit_id":"8eab8faace4f619aa1b0cf1e1aac67195c15466c"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"d1e838abe32356e24188cb1de3912c5a52a8fa18","unresolved":false,"context_lines":[{"line_number":72,"context_line":"        child_ref[\u0027parent\u0027] \u003d parent"},{"line_number":73,"context_line":""},{"line_number":74,"context_line":"        # test_create() pops the \u0027id\u0027 of the mocked response"},{"line_number":75,"context_line":"        ref.pop(\u0027id\u0027)"},{"line_number":76,"context_line":""},{"line_number":77,"context_line":"        # Resource objects may peform lazy-loading. The create() method of"},{"line_number":78,"context_line":"        # ProjectManager will try to access the \u0027uuid\u0027 attribute of the parent"}],"source_content_type":"text/x-python","patch_set":27,"id":"da86d52c_36d186cd","line":75,"in_reply_to":"da86d52c_7d976dec","updated":"2015-02-05 15:43:04.000000000","message":"Done","commit_id":"8eab8faace4f619aa1b0cf1e1aac67195c15466c"},{"author":{"_account_id":9101,"name":"wanghong","email":"reviewwanghong@126.com","username":"wanghong"},"change_message_id":"3dc593b5e4cd8710c00b2fb2de69ff483ec46c11","unresolved":false,"context_lines":[{"line_number":77,"context_line":"        # Resource objects may peform lazy-loading. The create() method of"},{"line_number":78,"context_line":"        # ProjectManager will try to access the \u0027uuid\u0027 attribute of the parent"},{"line_number":79,"context_line":"        # object, which will trigger a call to fetch the Resource attributes."},{"line_number":80,"context_line":"        self.stub_entity(\u0027GET\u0027, id\u003dparent_ref[\u0027id\u0027], entity\u003dparent_ref)"},{"line_number":81,"context_line":"        parent \u003d super(ProjectTests, self).test_create(ref\u003dchild_ref,"},{"line_number":82,"context_line":"                                                       req_ref\u003dref)"},{"line_number":83,"context_line":""}],"source_content_type":"text/x-python","patch_set":27,"id":"da86d52c_368b4f69","line":80,"updated":"2015-02-05 07:35:45.000000000","message":"I don\u0027t think we need this. Could you point out in which file we send a GET request to server?","commit_id":"8eab8faace4f619aa1b0cf1e1aac67195c15466c"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"d1e838abe32356e24188cb1de3912c5a52a8fa18","unresolved":false,"context_lines":[{"line_number":77,"context_line":"        # Resource objects may peform lazy-loading. The create() method of"},{"line_number":78,"context_line":"        # ProjectManager will try to access the \u0027uuid\u0027 attribute of the parent"},{"line_number":79,"context_line":"        # object, which will trigger a call to fetch the Resource attributes."},{"line_number":80,"context_line":"        self.stub_entity(\u0027GET\u0027, id\u003dparent_ref[\u0027id\u0027], entity\u003dparent_ref)"},{"line_number":81,"context_line":"        parent \u003d super(ProjectTests, self).test_create(ref\u003dchild_ref,"},{"line_number":82,"context_line":"                                                       req_ref\u003dref)"},{"line_number":83,"context_line":""}],"source_content_type":"text/x-python","patch_set":27,"id":"da86d52c_f6ca8e19","line":80,"in_reply_to":"da86d52c_368b4f69","updated":"2015-02-05 15:43:04.000000000","message":"we need, check https://github.com/openstack/python-keystoneclient/blob/master/keystoneclient/openstack/common/apiclient/base.py#L477","commit_id":"8eab8faace4f619aa1b0cf1e1aac67195c15466c"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"6ae7b9a1632a68b78550518cf8018dd55d41346c","unresolved":false,"context_lines":[{"line_number":78,"context_line":"        # ProjectManager will try to access the \u0027uuid\u0027 attribute of the parent"},{"line_number":79,"context_line":"        # object, which will trigger a call to fetch the Resource attributes."},{"line_number":80,"context_line":"        self.stub_entity(\u0027GET\u0027, id\u003dparent_ref[\u0027id\u0027], entity\u003dparent_ref)"},{"line_number":81,"context_line":"        parent \u003d super(ProjectTests, self).test_create(ref\u003dchild_ref,"},{"line_number":82,"context_line":"                                                       req_ref\u003dref)"},{"line_number":83,"context_line":""},{"line_number":84,"context_line":"    def _create_projects_hierarchy(self, hierarchy_size\u003d3):"}],"source_content_type":"text/x-python","patch_set":27,"id":"da86d52c_ddebf975","line":81,"updated":"2015-02-05 01:48:06.000000000","message":"\"parent\" isn\u0027t used, so no need to save it.\n\nChange this to:\n\n self.test_create(ref\u003dchild_ref, req_ref\u003dref)","commit_id":"8eab8faace4f619aa1b0cf1e1aac67195c15466c"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"d1e838abe32356e24188cb1de3912c5a52a8fa18","unresolved":false,"context_lines":[{"line_number":78,"context_line":"        # ProjectManager will try to access the \u0027uuid\u0027 attribute of the parent"},{"line_number":79,"context_line":"        # object, which will trigger a call to fetch the Resource attributes."},{"line_number":80,"context_line":"        self.stub_entity(\u0027GET\u0027, id\u003dparent_ref[\u0027id\u0027], entity\u003dparent_ref)"},{"line_number":81,"context_line":"        parent \u003d super(ProjectTests, self).test_create(ref\u003dchild_ref,"},{"line_number":82,"context_line":"                                                       req_ref\u003dref)"},{"line_number":83,"context_line":""},{"line_number":84,"context_line":"    def _create_projects_hierarchy(self, hierarchy_size\u003d3):"}],"source_content_type":"text/x-python","patch_set":27,"id":"da86d52c_16ce422e","line":81,"in_reply_to":"da86d52c_ddebf975","updated":"2015-02-05 15:43:04.000000000","message":"Done","commit_id":"8eab8faace4f619aa1b0cf1e1aac67195c15466c"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"c194934c940223d22392ee0f8df7d2ee98dee967","unresolved":false,"context_lines":[{"line_number":27,"context_line":""},{"line_number":28,"context_line":"    def new_ref(self, **kwargs):"},{"line_number":29,"context_line":"        kwargs \u003d super(ProjectTests, self).new_ref(**kwargs)"},{"line_number":30,"context_line":"        return self._new_project_ref(kwargs)"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"    def _new_project_ref(self, ref\u003dNone):"},{"line_number":33,"context_line":"        ref \u003d ref or {}"}],"source_content_type":"text/x-python","patch_set":29,"id":"da86d52c_d15738c8","line":30,"updated":"2015-02-06 00:39:34.000000000","message":"suggest change kwargs to ref\u003dkwargs","commit_id":"43dfc5cf66919527cf5ac3d5d6a0d938d56713fe"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"6bc64dcf2cf070490da498e6e58fbb6e0853ae4b","unresolved":false,"context_lines":[{"line_number":27,"context_line":""},{"line_number":28,"context_line":"    def new_ref(self, **kwargs):"},{"line_number":29,"context_line":"        kwargs \u003d super(ProjectTests, self).new_ref(**kwargs)"},{"line_number":30,"context_line":"        return self._new_project_ref(kwargs)"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"    def _new_project_ref(self, ref\u003dNone):"},{"line_number":33,"context_line":"        ref \u003d ref or {}"}],"source_content_type":"text/x-python","patch_set":29,"id":"da86d52c_b7a1d4f9","line":30,"in_reply_to":"da86d52c_d15738c8","updated":"2015-02-06 01:38:02.000000000","message":"Done","commit_id":"43dfc5cf66919527cf5ac3d5d6a0d938d56713fe"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"c194934c940223d22392ee0f8df7d2ee98dee967","unresolved":false,"context_lines":[{"line_number":65,"context_line":"        parent_ref \u003d self.new_ref()"},{"line_number":66,"context_line":"        parent_ref[\u0027parent_id\u0027] \u003d uuid.uuid4().hex"},{"line_number":67,"context_line":"        parent \u003d self.test_create(ref\u003dparent_ref)"},{"line_number":68,"context_line":"        parent.id \u003d parent_ref[\u0027id\u0027]"},{"line_number":69,"context_line":""},{"line_number":70,"context_line":"        # Create another project under \u0027parent\u0027 in the hierarchy"},{"line_number":71,"context_line":"        ref \u003d self.new_ref()"}],"source_content_type":"text/x-python","patch_set":29,"id":"da86d52c_910860db","line":68,"updated":"2015-02-06 00:39:34.000000000","message":"why doesn\u0027t the parent have an id already? the server should have returned a project with the id set.\n\nI think we broke test_create with https://review.openstack.org/#/c/148499/","commit_id":"43dfc5cf66919527cf5ac3d5d6a0d938d56713fe"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"91a743528ff8cc2168224cc8b486cae988e50297","unresolved":false,"context_lines":[{"line_number":109,"context_line":"        self.stub_entity(\u0027POST\u0027, entity\u003dref, status_code\u003d201)"},{"line_number":110,"context_line":""},{"line_number":111,"context_line":"        # Should ignore the \u0027parent_id\u0027 argument since we are also passing"},{"line_number":112,"context_line":"        # \u0027parent\u0027"},{"line_number":113,"context_line":"        returned \u003d self.manager.create(name\u003dref[\u0027name\u0027],"},{"line_number":114,"context_line":"                                       domain\u003dref[\u0027domain_id\u0027],"},{"line_number":115,"context_line":"                                       parent\u003dref[\u0027parent_id\u0027],"}],"source_content_type":"text/x-python","patch_set":30,"id":"da86d52c_152373bd","line":112,"updated":"2015-02-06 07:57:14.000000000","message":"I don\u0027t quite understand how this is being tested...","commit_id":"8da68e3ded4aa7208f5bc55cf4f438e4d0e910b1"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"1d907b23815c6b64e6c33f04ae33f2fcf20205ff","unresolved":false,"context_lines":[{"line_number":109,"context_line":"        self.stub_entity(\u0027POST\u0027, entity\u003dref, status_code\u003d201)"},{"line_number":110,"context_line":""},{"line_number":111,"context_line":"        # Should ignore the \u0027parent_id\u0027 argument since we are also passing"},{"line_number":112,"context_line":"        # \u0027parent\u0027"},{"line_number":113,"context_line":"        returned \u003d self.manager.create(name\u003dref[\u0027name\u0027],"},{"line_number":114,"context_line":"                                       domain\u003dref[\u0027domain_id\u0027],"},{"line_number":115,"context_line":"                                       parent\u003dref[\u0027parent_id\u0027],"}],"source_content_type":"text/x-python","patch_set":30,"id":"da86d52c_3005e513","line":112,"in_reply_to":"da86d52c_152373bd","updated":"2015-02-06 08:47:49.000000000","message":"OK, given we ARE called assertEntityRequestBody (see comment below), then I get it!","commit_id":"8da68e3ded4aa7208f5bc55cf4f438e4d0e910b1"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"91a743528ff8cc2168224cc8b486cae988e50297","unresolved":false,"context_lines":[{"line_number":114,"context_line":"                                       domain\u003dref[\u0027domain_id\u0027],"},{"line_number":115,"context_line":"                                       parent\u003dref[\u0027parent_id\u0027],"},{"line_number":116,"context_line":"                                       parent_id\u003duuid.uuid4().hex)"},{"line_number":117,"context_line":""},{"line_number":118,"context_line":"        self.assertIsInstance(returned, self.model)"},{"line_number":119,"context_line":"        for attr in ref:"},{"line_number":120,"context_line":"            self.assertEqual("}],"source_content_type":"text/x-python","patch_set":30,"id":"da86d52c_f5797fc8","line":117,"updated":"2015-02-06 07:57:14.000000000","message":"how do we know that these params actually make it into the body of the POST?  Shouldn\u0027t we call self.assertRequestBodyIs to check?","commit_id":"8da68e3ded4aa7208f5bc55cf4f438e4d0e910b1"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"1d907b23815c6b64e6c33f04ae33f2fcf20205ff","unresolved":false,"context_lines":[{"line_number":114,"context_line":"                                       domain\u003dref[\u0027domain_id\u0027],"},{"line_number":115,"context_line":"                                       parent\u003dref[\u0027parent_id\u0027],"},{"line_number":116,"context_line":"                                       parent_id\u003duuid.uuid4().hex)"},{"line_number":117,"context_line":""},{"line_number":118,"context_line":"        self.assertIsInstance(returned, self.model)"},{"line_number":119,"context_line":"        for attr in ref:"},{"line_number":120,"context_line":"            self.assertEqual("}],"source_content_type":"text/x-python","patch_set":30,"id":"da86d52c_90505133","line":117,"in_reply_to":"da86d52c_50b3394c","updated":"2015-02-06 08:47:49.000000000","message":"oops, so it is :-)","commit_id":"8da68e3ded4aa7208f5bc55cf4f438e4d0e910b1"},{"author":{"_account_id":9101,"name":"wanghong","email":"reviewwanghong@126.com","username":"wanghong"},"change_message_id":"5a31fed02892d182d01bccf2c62cb6ebac25f9ab","unresolved":false,"context_lines":[{"line_number":114,"context_line":"                                       domain\u003dref[\u0027domain_id\u0027],"},{"line_number":115,"context_line":"                                       parent\u003dref[\u0027parent_id\u0027],"},{"line_number":116,"context_line":"                                       parent_id\u003duuid.uuid4().hex)"},{"line_number":117,"context_line":""},{"line_number":118,"context_line":"        self.assertIsInstance(returned, self.model)"},{"line_number":119,"context_line":"        for attr in ref:"},{"line_number":120,"context_line":"            self.assertEqual("}],"source_content_type":"text/x-python","patch_set":30,"id":"da86d52c_50b3394c","line":117,"in_reply_to":"da86d52c_f5797fc8","updated":"2015-02-06 08:09:10.000000000","message":"It is called in line 124.","commit_id":"8da68e3ded4aa7208f5bc55cf4f438e4d0e910b1"}],"keystoneclient/v3/projects.py":[{"author":{"_account_id":10046,"name":"Henrique Truta","email":"henrique@lsd.ufcg.edu.br","username":"henriquetruta"},"change_message_id":"c802bcb25efe8d374b93d4def8b766102ba43c91","unresolved":false,"context_lines":[{"line_number":53,"context_line":"    key \u003d \u0027project\u0027"},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"    @utils.positional(2, enforcement\u003dutils.positional.WARN)"},{"line_number":56,"context_line":"    def create(self, name, domain, parent_project\u003dNone,"},{"line_number":57,"context_line":"               description\u003dNone, enabled\u003dTrue, **kwargs):"},{"line_number":58,"context_line":"        return super(ProjectManager, self).create("},{"line_number":59,"context_line":"            domain_id\u003dbase.getid(domain),"}],"source_content_type":"text/x-python","patch_set":2,"id":"1abeadc6_d5f6f4f8","line":56,"updated":"2014-08-26 14:18:16.000000000","message":"I would rather have this as the last parameter.","commit_id":"d970923df6dce8616a2b8860502c72468205e3d0"},{"author":{"_account_id":10697,"name":"Thiago Paiva Brito","email":"thiagop@lsd.ufcg.edu.br","username":"thiagop","inactive":true},"change_message_id":"cbeee2c5bf226fc74a4c0939b45e031171b0360d","unresolved":false,"context_lines":[{"line_number":53,"context_line":"    key \u003d \u0027project\u0027"},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"    @utils.positional(2, enforcement\u003dutils.positional.WARN)"},{"line_number":56,"context_line":"    def create(self, name, domain, parent_project\u003dNone,"},{"line_number":57,"context_line":"               description\u003dNone, enabled\u003dTrue, **kwargs):"},{"line_number":58,"context_line":"        return super(ProjectManager, self).create("},{"line_number":59,"context_line":"            domain_id\u003dbase.getid(domain),"}],"source_content_type":"text/x-python","patch_set":2,"id":"1abeadc6_b59fb802","line":56,"in_reply_to":"1abeadc6_d5f6f4f8","updated":"2014-08-26 14:28:42.000000000","message":"Makes sense. Will do.","commit_id":"d970923df6dce8616a2b8860502c72468205e3d0"},{"author":{"_account_id":10046,"name":"Henrique Truta","email":"henrique@lsd.ufcg.edu.br","username":"henriquetruta"},"change_message_id":"c802bcb25efe8d374b93d4def8b766102ba43c91","unresolved":false,"context_lines":[{"line_number":93,"context_line":"        query_params \u003d {}"},{"line_number":94,"context_line":"        if subtree is True:"},{"line_number":95,"context_line":"            query_params[\u0027subtree\u0027] \u003d subtree"},{"line_number":96,"context_line":"        if parents is True:"},{"line_number":97,"context_line":"            query_params[\u0027parents\u0027] \u003d parents"},{"line_number":98,"context_line":"        return super(ProjectManager, self).get("},{"line_number":99,"context_line":"            project_id\u003dbase.getid(project),"}],"source_content_type":"text/x-python","patch_set":2,"id":"1abeadc6_759b60c9","line":96,"updated":"2014-08-26 14:18:16.000000000","message":"You should just use \"if subtree\" and \"if parents\"","commit_id":"d970923df6dce8616a2b8860502c72468205e3d0"},{"author":{"_account_id":10697,"name":"Thiago Paiva Brito","email":"thiagop@lsd.ufcg.edu.br","username":"thiagop","inactive":true},"change_message_id":"cbeee2c5bf226fc74a4c0939b45e031171b0360d","unresolved":false,"context_lines":[{"line_number":93,"context_line":"        query_params \u003d {}"},{"line_number":94,"context_line":"        if subtree is True:"},{"line_number":95,"context_line":"            query_params[\u0027subtree\u0027] \u003d subtree"},{"line_number":96,"context_line":"        if parents is True:"},{"line_number":97,"context_line":"            query_params[\u0027parents\u0027] \u003d parents"},{"line_number":98,"context_line":"        return super(ProjectManager, self).get("},{"line_number":99,"context_line":"            project_id\u003dbase.getid(project),"}],"source_content_type":"text/x-python","patch_set":2,"id":"1abeadc6_d5eb5476","line":96,"in_reply_to":"1abeadc6_759b60c9","updated":"2014-08-26 14:28:42.000000000","message":"I don\u0027t think it\u0027s a good idea to accept any value passed in the parameter without checking it. Anything from 1 to \u0027something\u0027 or \u0027UPDATE projects SET id\u003dnull\u0027 could be passed in the subtree or parents, validated as \"True\" and passed to Keystone through a search parameter on GET. I prefer to validate the data I receive than passing it to Keystone without knowing the implications.","commit_id":"d970923df6dce8616a2b8860502c72468205e3d0"},{"author":{"_account_id":7191,"name":"Jamie Lennox","email":"jamielennox@gmail.com","username":"jamielennox"},"change_message_id":"b3a44026e2ae30d068c1ce242aad70fc4628d144","unresolved":false,"context_lines":[{"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":"from keystoneclient import base"},{"line_number":18,"context_line":"from keystoneclient import utils"},{"line_number":19,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"fa98f980_7bd5c11a","side":"PARENT","line":16,"updated":"2014-09-04 05:26:33.000000000","message":"revert whitespace change","commit_id":"8adce9619c6dd736b3c51033d6b4f49b0bf125fb"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"931cc99f2a30cd9d562b2a90b03af28e84005dbc","unresolved":false,"context_lines":[{"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":"from keystoneclient import base"},{"line_number":18,"context_line":"from keystoneclient import utils"},{"line_number":19,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"fa98f980_63c8f674","side":"PARENT","line":16,"in_reply_to":"fa98f980_7bd5c11a","updated":"2014-09-10 18:27:25.000000000","message":"Done","commit_id":"8adce9619c6dd736b3c51033d6b4f49b0bf125fb"},{"author":{"_account_id":7191,"name":"Jamie Lennox","email":"jamielennox@gmail.com","username":"jamielennox"},"change_message_id":"b3a44026e2ae30d068c1ce242aad70fc4628d144","unresolved":false,"context_lines":[{"line_number":57,"context_line":"               enabled\u003dTrue, parent_project\u003dNone, **kwargs):"},{"line_number":58,"context_line":"        return super(ProjectManager, self).create("},{"line_number":59,"context_line":"            domain_id\u003dbase.getid(domain),"},{"line_number":60,"context_line":"            parent_project_id\u003dbase.getid(parent_project),"},{"line_number":61,"context_line":"            name\u003dname,"},{"line_number":62,"context_line":"            description\u003ddescription,"},{"line_number":63,"context_line":"            enabled\u003denabled,"}],"source_content_type":"text/x-python","patch_set":3,"id":"fa98f980_9bda654a","line":60,"updated":"2014-09-04 05:26:33.000000000","message":"now called just parent_id i think","commit_id":"25ffbec665ce87aac763da611e6c30502a43db48"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"931cc99f2a30cd9d562b2a90b03af28e84005dbc","unresolved":false,"context_lines":[{"line_number":57,"context_line":"               enabled\u003dTrue, parent_project\u003dNone, **kwargs):"},{"line_number":58,"context_line":"        return super(ProjectManager, self).create("},{"line_number":59,"context_line":"            domain_id\u003dbase.getid(domain),"},{"line_number":60,"context_line":"            parent_project_id\u003dbase.getid(parent_project),"},{"line_number":61,"context_line":"            name\u003dname,"},{"line_number":62,"context_line":"            description\u003ddescription,"},{"line_number":63,"context_line":"            enabled\u003denabled,"}],"source_content_type":"text/x-python","patch_set":3,"id":"fa98f980_23ceee83","line":60,"in_reply_to":"fa98f980_9bda654a","updated":"2014-09-10 18:27:25.000000000","message":"Done","commit_id":"25ffbec665ce87aac763da611e6c30502a43db48"},{"author":{"_account_id":7191,"name":"Jamie Lennox","email":"jamielennox@gmail.com","username":"jamielennox"},"change_message_id":"b3a44026e2ae30d068c1ce242aad70fc4628d144","unresolved":false,"context_lines":[{"line_number":79,"context_line":"            domain_id\u003dbase.getid(domain),"},{"line_number":80,"context_line":"            **kwargs)"},{"line_number":81,"context_line":""},{"line_number":82,"context_line":"    @utils.positional(enforcement\u003dutils.positional.WARN)"},{"line_number":83,"context_line":"    def get(self, project, subtree\u003dFalse, parents\u003dFalse):"},{"line_number":84,"context_line":"        \"\"\"Get a project."},{"line_number":85,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"fa98f980_fb21b14d","line":82,"updated":"2014-09-04 05:26:33.000000000","message":"drop the WARN, this is fine to be an error.","commit_id":"25ffbec665ce87aac763da611e6c30502a43db48"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"931cc99f2a30cd9d562b2a90b03af28e84005dbc","unresolved":false,"context_lines":[{"line_number":79,"context_line":"            domain_id\u003dbase.getid(domain),"},{"line_number":80,"context_line":"            **kwargs)"},{"line_number":81,"context_line":""},{"line_number":82,"context_line":"    @utils.positional(enforcement\u003dutils.positional.WARN)"},{"line_number":83,"context_line":"    def get(self, project, subtree\u003dFalse, parents\u003dFalse):"},{"line_number":84,"context_line":"        \"\"\"Get a project."},{"line_number":85,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"fa98f980_43c93278","line":82,"in_reply_to":"fa98f980_fb21b14d","updated":"2014-09-10 18:27:25.000000000","message":"Done","commit_id":"25ffbec665ce87aac763da611e6c30502a43db48"},{"author":{"_account_id":13478,"name":"Boris Bobrov","email":"b.bobrov@sap.com","username":"bbobrov"},"change_message_id":"cfa2f46a568d28e91976a6b57c30d598a98f36d2","unresolved":false,"context_lines":[{"line_number":94,"context_line":"        query_params \u003d {}"},{"line_number":95,"context_line":""},{"line_number":96,"context_line":"        # NOTE(rodrigods): explicit check if the paramter is True to avoid"},{"line_number":97,"context_line":"        # the check to pass if other value is passed."},{"line_number":98,"context_line":"        if subtree_as_list is True:"},{"line_number":99,"context_line":"            query_params[\u0027subtree_as_list\u0027] \u003d subtree_as_list"},{"line_number":100,"context_line":"        if parents_as_list is True:"}],"source_content_type":"text/x-python","patch_set":9,"id":"5a890539_70c03c50","line":97,"updated":"2014-11-18 12:00:05.000000000","message":"Who can pass other value? Maybe an exception should be raised if nothing but bool is required?","commit_id":"521ca9c545d806de5aa112e5dc61418b42b9e9ef"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"8186900f07934f310c33833c521f8354be9ea4be","unresolved":false,"context_lines":[{"line_number":94,"context_line":"        query_params \u003d {}"},{"line_number":95,"context_line":""},{"line_number":96,"context_line":"        # NOTE(rodrigods): explicit check if the paramter is True to avoid"},{"line_number":97,"context_line":"        # the check to pass if other value is passed."},{"line_number":98,"context_line":"        if subtree_as_list is True:"},{"line_number":99,"context_line":"            query_params[\u0027subtree_as_list\u0027] \u003d subtree_as_list"},{"line_number":100,"context_line":"        if parents_as_list is True:"}],"source_content_type":"text/x-python","patch_set":9,"id":"5a890539_ff02fe6d","line":97,"in_reply_to":"5a890539_70c03c50","updated":"2014-11-19 18:29:05.000000000","message":"following the patern in other calls, the queries that are not valid are just ignored. Will improve the comment, though.","commit_id":"521ca9c545d806de5aa112e5dc61418b42b9e9ef"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"fccf3485016efb6cc743d77286d05ce7eabc862b","unresolved":false,"context_lines":[{"line_number":53,"context_line":"    collection_key \u003d \u0027projects\u0027"},{"line_number":54,"context_line":"    key \u003d \u0027project\u0027"},{"line_number":55,"context_line":""},{"line_number":56,"context_line":"    @utils.positional(2, enforcement\u003dutils.positional.WARN)"},{"line_number":57,"context_line":"    def create(self, name, domain, description\u003dNone,"},{"line_number":58,"context_line":"               enabled\u003dTrue, parent\u003dNone, **kwargs):"},{"line_number":59,"context_line":"        return super(ProjectManager, self).create("}],"source_content_type":"text/x-python","patch_set":12,"id":"3a961159_2a6181a8","line":56,"updated":"2014-12-17 19:50:28.000000000","message":"would this generate an unnecessary warning?","commit_id":"77db27c4e36ca0eb5c04e7fe1866971ca7fc6bb0"},{"author":{"_account_id":10697,"name":"Thiago Paiva Brito","email":"thiagop@lsd.ufcg.edu.br","username":"thiagop","inactive":true},"change_message_id":"03b18e062584fa996b4482121deda82b505620bf","unresolved":false,"context_lines":[{"line_number":53,"context_line":"    collection_key \u003d \u0027projects\u0027"},{"line_number":54,"context_line":"    key \u003d \u0027project\u0027"},{"line_number":55,"context_line":""},{"line_number":56,"context_line":"    @utils.positional(2, enforcement\u003dutils.positional.WARN)"},{"line_number":57,"context_line":"    def create(self, name, domain, description\u003dNone,"},{"line_number":58,"context_line":"               enabled\u003dTrue, parent\u003dNone, **kwargs):"},{"line_number":59,"context_line":"        return super(ProjectManager, self).create("}],"source_content_type":"text/x-python","patch_set":12,"id":"3a961159_eb177b43","line":56,"in_reply_to":"3a961159_2a6181a8","updated":"2014-12-17 21:18:46.000000000","message":"I was thinking about passing the \"domain\" parameter as a positional argument, but now that I take a second look, maybe it\u0027s good idea to force passing it as a kw argument. Rolling back...","commit_id":"77db27c4e36ca0eb5c04e7fe1866971ca7fc6bb0"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"fccf3485016efb6cc743d77286d05ce7eabc862b","unresolved":false,"context_lines":[{"line_number":89,"context_line":"        :param subtree_as_list: If True, retrieve projects below this"},{"line_number":90,"context_line":"                                project in the hierarchy."},{"line_number":91,"context_line":"        :param parents_as_list: If True, retrieve projects above this"},{"line_number":92,"context_line":"                                project in the hierarchy."},{"line_number":93,"context_line":"        \"\"\""},{"line_number":94,"context_line":"        query_params \u003d {}"},{"line_number":95,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"3a961159_ff8d79d4","line":92,"updated":"2014-12-17 19:50:28.000000000","message":"may also want to mention that if either subtree_as_list or parents_as_list are True, caller will be getting a list back","commit_id":"77db27c4e36ca0eb5c04e7fe1866971ca7fc6bb0"},{"author":{"_account_id":10697,"name":"Thiago Paiva Brito","email":"thiagop@lsd.ufcg.edu.br","username":"thiagop","inactive":true},"change_message_id":"03b18e062584fa996b4482121deda82b505620bf","unresolved":false,"context_lines":[{"line_number":89,"context_line":"        :param subtree_as_list: If True, retrieve projects below this"},{"line_number":90,"context_line":"                                project in the hierarchy."},{"line_number":91,"context_line":"        :param parents_as_list: If True, retrieve projects above this"},{"line_number":92,"context_line":"                                project in the hierarchy."},{"line_number":93,"context_line":"        \"\"\""},{"line_number":94,"context_line":"        query_params \u003d {}"},{"line_number":95,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"3a961159_0b2687ba","line":92,"in_reply_to":"3a961159_ff8d79d4","updated":"2014-12-17 21:18:46.000000000","message":"Done","commit_id":"77db27c4e36ca0eb5c04e7fe1866971ca7fc6bb0"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"16ce55e8713c40d8354852bfa7aadd4cfd6ada2c","unresolved":false,"context_lines":[{"line_number":81,"context_line":"            fallback_to_auth\u003dTrue,"},{"line_number":82,"context_line":"            **kwargs)"},{"line_number":83,"context_line":""},{"line_number":84,"context_line":"    def get(self, project, subtree_as_list\u003dFalse, parents_as_list\u003dFalse):"},{"line_number":85,"context_line":"        \"\"\"Get a project."},{"line_number":86,"context_line":""},{"line_number":87,"context_line":"        :param project: Project to retrieve. Can be a Project"}],"source_content_type":"text/x-python","patch_set":14,"id":"3a961159_33c84e56","line":84,"updated":"2014-12-29 01:26:23.000000000","message":"This method should be using @utils.positional now that it\u0027s got optional parameters.","commit_id":"99f7e121ad632815d8307020d49f89b54b0ca4ad"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"3bad7b17638b898984b1f6c4da26529e04c75aea","unresolved":false,"context_lines":[{"line_number":81,"context_line":"            fallback_to_auth\u003dTrue,"},{"line_number":82,"context_line":"            **kwargs)"},{"line_number":83,"context_line":""},{"line_number":84,"context_line":"    def get(self, project, subtree_as_list\u003dFalse, parents_as_list\u003dFalse):"},{"line_number":85,"context_line":"        \"\"\"Get a project."},{"line_number":86,"context_line":""},{"line_number":87,"context_line":"        :param project: Project to retrieve. Can be a Project"}],"source_content_type":"text/x-python","patch_set":14,"id":"3a961159_078f7076","line":84,"in_reply_to":"3a961159_33c84e56","updated":"2014-12-30 15:47:17.000000000","message":"Done","commit_id":"99f7e121ad632815d8307020d49f89b54b0ca4ad"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"16ce55e8713c40d8354852bfa7aadd4cfd6ada2c","unresolved":false,"context_lines":[{"line_number":84,"context_line":"    def get(self, project, subtree_as_list\u003dFalse, parents_as_list\u003dFalse):"},{"line_number":85,"context_line":"        \"\"\"Get a project."},{"line_number":86,"context_line":""},{"line_number":87,"context_line":"        :param project: Project to retrieve. Can be a Project"},{"line_number":88,"context_line":"                        object or the project_id."},{"line_number":89,"context_line":"        :param subtree_as_list: If True, retrieve projects below this"},{"line_number":90,"context_line":"                                project in the hierarchy as a flat list"}],"source_content_type":"text/x-python","patch_set":14,"id":"3a961159_53c5da3b","line":87,"updated":"2014-12-29 01:26:23.000000000","message":"Project should be a reference to the class so that it\u0027s easy for users to click on the link.","commit_id":"99f7e121ad632815d8307020d49f89b54b0ca4ad"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"16ce55e8713c40d8354852bfa7aadd4cfd6ada2c","unresolved":false,"context_lines":[{"line_number":96,"context_line":"        query_params \u003d {}"},{"line_number":97,"context_line":""},{"line_number":98,"context_line":"        # NOTE(rodrigods): explicit check if the parameter is True to avoid"},{"line_number":99,"context_line":"        # the condition to pass if any other argument is passed."},{"line_number":100,"context_line":"        if subtree_as_list is True:"},{"line_number":101,"context_line":"            query_params[\u0027subtree_as_list\u0027] \u003d subtree_as_list"},{"line_number":102,"context_line":"        if parents_as_list is True:"}],"source_content_type":"text/x-python","patch_set":14,"id":"3a961159_d3b9cacc","line":99,"updated":"2014-12-29 01:26:23.000000000","message":"I don\u0027t see any need to prevent this. It\u0027s python, that\u0027s how it works.","commit_id":"99f7e121ad632815d8307020d49f89b54b0ca4ad"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"3bad7b17638b898984b1f6c4da26529e04c75aea","unresolved":false,"context_lines":[{"line_number":96,"context_line":"        query_params \u003d {}"},{"line_number":97,"context_line":""},{"line_number":98,"context_line":"        # NOTE(rodrigods): explicit check if the parameter is True to avoid"},{"line_number":99,"context_line":"        # the condition to pass if any other argument is passed."},{"line_number":100,"context_line":"        if subtree_as_list is True:"},{"line_number":101,"context_line":"            query_params[\u0027subtree_as_list\u0027] \u003d subtree_as_list"},{"line_number":102,"context_line":"        if parents_as_list is True:"}],"source_content_type":"text/x-python","patch_set":14,"id":"3a961159_877b607a","line":99,"in_reply_to":"3a961159_d3b9cacc","updated":"2014-12-30 15:47:17.000000000","message":"we want to allow only booleans here. If the user passes a non-empty string or list, a simple \"if subtree_as_list:\" check would pass. Which we are trying to make clear in the docstring.","commit_id":"99f7e121ad632815d8307020d49f89b54b0ca4ad"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"301f595fa3ec365651d76c85fb20349de7346a1d","unresolved":false,"context_lines":[{"line_number":55,"context_line":""},{"line_number":56,"context_line":"    @utils.positional(1, enforcement\u003dutils.positional.WARN)"},{"line_number":57,"context_line":"    def create(self, name, domain, description\u003dNone,"},{"line_number":58,"context_line":"               enabled\u003dTrue, parent\u003dNone, **kwargs):"},{"line_number":59,"context_line":"        return super(ProjectManager, self).create("},{"line_number":60,"context_line":"            domain_id\u003dbase.getid(domain),"},{"line_number":61,"context_line":"            parent_id\u003dbase.getid(parent),"}],"source_content_type":"text/x-python","patch_set":15,"id":"3a961159_7e019903","line":58,"updated":"2014-12-30 20:08:41.000000000","message":"This method needs a docstring to explain what parent is.","commit_id":"82d899f35e2afee876326bd2b7a34fe1c7bb9b3f"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"e96b07d555ab98288005ba2ab9984429ee1ae562","unresolved":false,"context_lines":[{"line_number":55,"context_line":""},{"line_number":56,"context_line":"    @utils.positional(1, enforcement\u003dutils.positional.WARN)"},{"line_number":57,"context_line":"    def create(self, name, domain, description\u003dNone,"},{"line_number":58,"context_line":"               enabled\u003dTrue, parent\u003dNone, **kwargs):"},{"line_number":59,"context_line":"        return super(ProjectManager, self).create("},{"line_number":60,"context_line":"            domain_id\u003dbase.getid(domain),"},{"line_number":61,"context_line":"            parent_id\u003dbase.getid(parent),"}],"source_content_type":"text/x-python","patch_set":15,"id":"3a961159_9fcc758c","line":58,"in_reply_to":"3a961159_7e019903","updated":"2014-12-31 16:04:50.000000000","message":"Done","commit_id":"82d899f35e2afee876326bd2b7a34fe1c7bb9b3f"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"301f595fa3ec365651d76c85fb20349de7346a1d","unresolved":false,"context_lines":[{"line_number":81,"context_line":"            fallback_to_auth\u003dTrue,"},{"line_number":82,"context_line":"            **kwargs)"},{"line_number":83,"context_line":""},{"line_number":84,"context_line":"    @utils.positional(enforcement\u003dutils.positional.WARN)"},{"line_number":85,"context_line":"    def get(self, project, subtree_as_list\u003dFalse, parents_as_list\u003dFalse):"},{"line_number":86,"context_line":"        \"\"\"Get a project."},{"line_number":87,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"3a961159_53177654","line":84,"updated":"2014-12-30 20:08:41.000000000","message":"This shouldn\u0027t be using WARN since the named parameters are new rather than existing. It should be an error instead.","commit_id":"82d899f35e2afee876326bd2b7a34fe1c7bb9b3f"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"e96b07d555ab98288005ba2ab9984429ee1ae562","unresolved":false,"context_lines":[{"line_number":81,"context_line":"            fallback_to_auth\u003dTrue,"},{"line_number":82,"context_line":"            **kwargs)"},{"line_number":83,"context_line":""},{"line_number":84,"context_line":"    @utils.positional(enforcement\u003dutils.positional.WARN)"},{"line_number":85,"context_line":"    def get(self, project, subtree_as_list\u003dFalse, parents_as_list\u003dFalse):"},{"line_number":86,"context_line":"        \"\"\"Get a project."},{"line_number":87,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"3a961159_7fb6e9fa","line":84,"in_reply_to":"3a961159_53177654","updated":"2014-12-31 16:04:50.000000000","message":"Done","commit_id":"82d899f35e2afee876326bd2b7a34fe1c7bb9b3f"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"301f595fa3ec365651d76c85fb20349de7346a1d","unresolved":false,"context_lines":[{"line_number":99,"context_line":""},{"line_number":100,"context_line":"        # NOTE(rodrigods): explicit check if the parameter is True to avoid"},{"line_number":101,"context_line":"        # the condition to pass if any other type of argument is provided"},{"line_number":102,"context_line":"        # (like strings, numbers or lists)."},{"line_number":103,"context_line":"        if subtree_as_list is True:"},{"line_number":104,"context_line":"            query_params[\u0027subtree_as_list\u0027] \u003d subtree_as_list"},{"line_number":105,"context_line":"        if parents_as_list is True:"}],"source_content_type":"text/x-python","patch_set":15,"id":"3a961159_73c9d224","line":102,"updated":"2014-12-30 20:08:41.000000000","message":"\"we want to allow only booleans here. If the user passes a non-empty string or list, a simple \"if subtree_as_list:\" check would pass. Which we are trying to make clear in the docstring.\"\n\nI don\u0027t see any reason to allow only Booleans. If somebody was really concerned about strong typing then they should be using a programming language that does strong typing.\n\nIt\u0027s not useful to have something in comments when it\u0027s already in the docstring... the comments don\u0027t wind up in the generated documentation. The docstring isn\u0027t clear since it doesn\u0027t say that if the parameter isn\u0027t a boolean then it\u0027s ignored.\n\nIt\u0027s inconsistent with how the rest of the API is implemented, inconsistent with the programming language, and requires a comment where none should be required.","commit_id":"82d899f35e2afee876326bd2b7a34fe1c7bb9b3f"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"e96b07d555ab98288005ba2ab9984429ee1ae562","unresolved":false,"context_lines":[{"line_number":99,"context_line":""},{"line_number":100,"context_line":"        # NOTE(rodrigods): explicit check if the parameter is True to avoid"},{"line_number":101,"context_line":"        # the condition to pass if any other type of argument is provided"},{"line_number":102,"context_line":"        # (like strings, numbers or lists)."},{"line_number":103,"context_line":"        if subtree_as_list is True:"},{"line_number":104,"context_line":"            query_params[\u0027subtree_as_list\u0027] \u003d subtree_as_list"},{"line_number":105,"context_line":"        if parents_as_list is True:"}],"source_content_type":"text/x-python","patch_set":15,"id":"3a961159_dfab5d73","line":102,"in_reply_to":"3a961159_73c9d224","updated":"2014-12-31 16:04:50.000000000","message":"Don\u0027t think it is inconsistent with the programming language, the fact Python has not strong typing doesn\u0027t invalidate the restriction of values in an argument, this is just a workaround for cases we want a bit more of control in what is passed for the other layers in the application.\n\nAgree with the other points and will update the code / remove the comment.","commit_id":"82d899f35e2afee876326bd2b7a34fe1c7bb9b3f"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"4f87461fd926531b3549c65687475c628e71f5e5","unresolved":false,"context_lines":[{"line_number":61,"context_line":"        :param name: project name."},{"line_number":62,"context_line":"        :param domain: domain of the project. A"},{"line_number":63,"context_line":"                       :py:class:`keystoneclient.v3.domains.Domain`"},{"line_number":64,"context_line":"                       object or the domain_id."},{"line_number":65,"context_line":"        :param description: the project description. (optional)"},{"line_number":66,"context_line":"        :param boolean enabled: if the project is enabled by default."},{"line_number":67,"context_line":"                                (optional)"}],"source_content_type":"text/x-python","patch_set":16,"id":"1a930d6b_1e4b2788","line":64,"updated":"2015-01-22 19:07:08.000000000","message":"The type of the parameter should be in :type domain:","commit_id":"7696e69f1ecb8cb0ad7e93aeda689069016c3e9e"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"6b5eda870f4874c738d365b03f3f0f54cc97f1bf","unresolved":false,"context_lines":[{"line_number":61,"context_line":"        :param name: project name."},{"line_number":62,"context_line":"        :param domain: domain of the project. A"},{"line_number":63,"context_line":"                       :py:class:`keystoneclient.v3.domains.Domain`"},{"line_number":64,"context_line":"                       object or the domain_id."},{"line_number":65,"context_line":"        :param description: the project description. (optional)"},{"line_number":66,"context_line":"        :param boolean enabled: if the project is enabled by default."},{"line_number":67,"context_line":"                                (optional)"}],"source_content_type":"text/x-python","patch_set":16,"id":"1a930d6b_2a097ddd","line":64,"in_reply_to":"1a930d6b_1e4b2788","updated":"2015-01-23 20:10:20.000000000","message":"will remove the type information since we can\u0027t provide two types for the same argument.","commit_id":"7696e69f1ecb8cb0ad7e93aeda689069016c3e9e"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"4f87461fd926531b3549c65687475c628e71f5e5","unresolved":false,"context_lines":[{"line_number":63,"context_line":"                       :py:class:`keystoneclient.v3.domains.Domain`"},{"line_number":64,"context_line":"                       object or the domain_id."},{"line_number":65,"context_line":"        :param description: the project description. (optional)"},{"line_number":66,"context_line":"        :param boolean enabled: if the project is enabled by default."},{"line_number":67,"context_line":"                                (optional)"},{"line_number":68,"context_line":"        :param parent: the project parent in the project\u0027s hierarchy. A"},{"line_number":69,"context_line":"                       :py:class:`keystoneclient.v3.projects.Project` or the"}],"source_content_type":"text/x-python","patch_set":16,"id":"1a930d6b_7e48ab87","line":66,"updated":"2015-01-22 19:07:08.000000000","message":"remove \"by default\"","commit_id":"7696e69f1ecb8cb0ad7e93aeda689069016c3e9e"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"6b5eda870f4874c738d365b03f3f0f54cc97f1bf","unresolved":false,"context_lines":[{"line_number":63,"context_line":"                       :py:class:`keystoneclient.v3.domains.Domain`"},{"line_number":64,"context_line":"                       object or the domain_id."},{"line_number":65,"context_line":"        :param description: the project description. (optional)"},{"line_number":66,"context_line":"        :param boolean enabled: if the project is enabled by default."},{"line_number":67,"context_line":"                                (optional)"},{"line_number":68,"context_line":"        :param parent: the project parent in the project\u0027s hierarchy. A"},{"line_number":69,"context_line":"                       :py:class:`keystoneclient.v3.projects.Project` or the"}],"source_content_type":"text/x-python","patch_set":16,"id":"1a930d6b_6a13850d","line":66,"in_reply_to":"1a930d6b_7e48ab87","updated":"2015-01-23 20:10:20.000000000","message":"Done","commit_id":"7696e69f1ecb8cb0ad7e93aeda689069016c3e9e"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"4f87461fd926531b3549c65687475c628e71f5e5","unresolved":false,"context_lines":[{"line_number":66,"context_line":"        :param boolean enabled: if the project is enabled by default."},{"line_number":67,"context_line":"                                (optional)"},{"line_number":68,"context_line":"        :param parent: the project parent in the project\u0027s hierarchy. A"},{"line_number":69,"context_line":"                       :py:class:`keystoneclient.v3.projects.Project` or the"},{"line_number":70,"context_line":"                       project_id from the parent project. (optional)"},{"line_number":71,"context_line":"        \"\"\""},{"line_number":72,"context_line":"        return super(ProjectManager, self).create("}],"source_content_type":"text/x-python","patch_set":16,"id":"1a930d6b_fe53bb36","line":69,"updated":"2015-01-22 19:07:08.000000000","message":"The type of the parameter should be in :type domain:","commit_id":"7696e69f1ecb8cb0ad7e93aeda689069016c3e9e"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"6b5eda870f4874c738d365b03f3f0f54cc97f1bf","unresolved":false,"context_lines":[{"line_number":66,"context_line":"        :param boolean enabled: if the project is enabled by default."},{"line_number":67,"context_line":"                                (optional)"},{"line_number":68,"context_line":"        :param parent: the project parent in the project\u0027s hierarchy. A"},{"line_number":69,"context_line":"                       :py:class:`keystoneclient.v3.projects.Project` or the"},{"line_number":70,"context_line":"                       project_id from the parent project. (optional)"},{"line_number":71,"context_line":"        \"\"\""},{"line_number":72,"context_line":"        return super(ProjectManager, self).create("}],"source_content_type":"text/x-python","patch_set":16,"id":"1a930d6b_aaf48dcf","line":69,"in_reply_to":"1a930d6b_fe53bb36","updated":"2015-01-23 20:10:20.000000000","message":"same as above.","commit_id":"7696e69f1ecb8cb0ad7e93aeda689069016c3e9e"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"b6de59dfdda4c8a769212368853aaf9a5696f307","unresolved":false,"context_lines":[{"line_number":24,"context_line":"    Attributes:"},{"line_number":25,"context_line":"        * id: a uuid that identifies the project"},{"line_number":26,"context_line":"        * name: project name"},{"line_number":27,"context_line":"        * description: project description"},{"line_number":28,"context_line":"        * enabled: boolean to indicate if project is enabled"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"    \"\"\""}],"source_content_type":"text/x-python","patch_set":18,"id":"da86d52c_76600b36","line":27,"updated":"2015-02-01 15:18:31.000000000","message":"Shouldn\u0027t the attributes for Project be updated with the new parent (or is it parent_id?) field?","commit_id":"54ec0b3c6480f7e790f8cf7e2b46ec8eb1084b9c"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"c0581324ed4e14a5cca839c3438972d22951d131","unresolved":false,"context_lines":[{"line_number":24,"context_line":"    Attributes:"},{"line_number":25,"context_line":"        * id: a uuid that identifies the project"},{"line_number":26,"context_line":"        * name: project name"},{"line_number":27,"context_line":"        * description: project description"},{"line_number":28,"context_line":"        * enabled: boolean to indicate if project is enabled"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"    \"\"\""}],"source_content_type":"text/x-python","patch_set":18,"id":"da86d52c_2d5b8388","line":27,"in_reply_to":"da86d52c_76600b36","updated":"2015-02-02 15:40:53.000000000","message":"++","commit_id":"54ec0b3c6480f7e790f8cf7e2b46ec8eb1084b9c"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"b6de59dfdda4c8a769212368853aaf9a5696f307","unresolved":false,"context_lines":[{"line_number":59,"context_line":"        \"\"\"Create a project."},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"        :param name: project name."},{"line_number":62,"context_line":"        :param domain: the project domain."},{"line_number":63,"context_line":"        :param description: the project description. (optional)"},{"line_number":64,"context_line":"        :param boolean enabled: if the project is enabled. (optional)"},{"line_number":65,"context_line":"        :param parent: the project parent in the project\u0027s hierarchy."}],"source_content_type":"text/x-python","patch_set":18,"id":"da86d52c_36c4d33f","line":62,"updated":"2015-02-01 15:18:31.000000000","message":"We need to document the type allowed for the parameters so that developers can use the API.","commit_id":"54ec0b3c6480f7e790f8cf7e2b46ec8eb1084b9c"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"c0581324ed4e14a5cca839c3438972d22951d131","unresolved":false,"context_lines":[{"line_number":59,"context_line":"        \"\"\"Create a project."},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"        :param name: project name."},{"line_number":62,"context_line":"        :param domain: the project domain."},{"line_number":63,"context_line":"        :param description: the project description. (optional)"},{"line_number":64,"context_line":"        :param boolean enabled: if the project is enabled. (optional)"},{"line_number":65,"context_line":"        :param parent: the project parent in the project\u0027s hierarchy."}],"source_content_type":"text/x-python","patch_set":18,"id":"da86d52c_a84921d2","line":62,"in_reply_to":"da86d52c_36c4d33f","updated":"2015-02-02 15:40:53.000000000","message":"Done","commit_id":"54ec0b3c6480f7e790f8cf7e2b46ec8eb1084b9c"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"b6de59dfdda4c8a769212368853aaf9a5696f307","unresolved":false,"context_lines":[{"line_number":63,"context_line":"        :param description: the project description. (optional)"},{"line_number":64,"context_line":"        :param boolean enabled: if the project is enabled. (optional)"},{"line_number":65,"context_line":"        :param parent: the project parent in the project\u0027s hierarchy."},{"line_number":66,"context_line":"                       (optional)"},{"line_number":67,"context_line":""},{"line_number":68,"context_line":"        \"\"\""},{"line_number":69,"context_line":"        return super(ProjectManager, self).create("}],"source_content_type":"text/x-python","patch_set":18,"id":"da86d52c_76c72b13","line":66,"updated":"2015-02-01 15:18:31.000000000","message":"You can have multiple types in the :type \u003cparameter\u003e: value:\n\n :type parent: :class:`.Project` or str","commit_id":"54ec0b3c6480f7e790f8cf7e2b46ec8eb1084b9c"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"c0581324ed4e14a5cca839c3438972d22951d131","unresolved":false,"context_lines":[{"line_number":63,"context_line":"        :param description: the project description. (optional)"},{"line_number":64,"context_line":"        :param boolean enabled: if the project is enabled. (optional)"},{"line_number":65,"context_line":"        :param parent: the project parent in the project\u0027s hierarchy."},{"line_number":66,"context_line":"                       (optional)"},{"line_number":67,"context_line":""},{"line_number":68,"context_line":"        \"\"\""},{"line_number":69,"context_line":"        return super(ProjectManager, self).create("}],"source_content_type":"text/x-python","patch_set":18,"id":"da86d52c_c8c5755c","line":66,"in_reply_to":"da86d52c_76c72b13","updated":"2015-02-02 15:40:53.000000000","message":"Done","commit_id":"54ec0b3c6480f7e790f8cf7e2b46ec8eb1084b9c"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"b6de59dfdda4c8a769212368853aaf9a5696f307","unresolved":false,"context_lines":[{"line_number":91,"context_line":"            fallback_to_auth\u003dTrue,"},{"line_number":92,"context_line":"            **kwargs)"},{"line_number":93,"context_line":""},{"line_number":94,"context_line":"    @utils.positional(enforcement\u003dutils.positional.WARN)"},{"line_number":95,"context_line":"    def get(self, project, subtree_as_list\u003dFalse, parents_as_list\u003dFalse):"},{"line_number":96,"context_line":"        \"\"\"Get a project."},{"line_number":97,"context_line":""}],"source_content_type":"text/x-python","patch_set":18,"id":"da86d52c_76dd6b14","line":94,"updated":"2015-02-01 15:18:31.000000000","message":"This shouldn\u0027t be using WARN since the named parameters are new rather than existing. It should be an error instead. -- Note that I made this same comment in patch set 15 but somehow it\u0027s reverted back.","commit_id":"54ec0b3c6480f7e790f8cf7e2b46ec8eb1084b9c"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"c0581324ed4e14a5cca839c3438972d22951d131","unresolved":false,"context_lines":[{"line_number":91,"context_line":"            fallback_to_auth\u003dTrue,"},{"line_number":92,"context_line":"            **kwargs)"},{"line_number":93,"context_line":""},{"line_number":94,"context_line":"    @utils.positional(enforcement\u003dutils.positional.WARN)"},{"line_number":95,"context_line":"    def get(self, project, subtree_as_list\u003dFalse, parents_as_list\u003dFalse):"},{"line_number":96,"context_line":"        \"\"\"Get a project."},{"line_number":97,"context_line":""}],"source_content_type":"text/x-python","patch_set":18,"id":"da86d52c_c873b54b","line":94,"in_reply_to":"da86d52c_76dd6b14","updated":"2015-02-02 15:40:53.000000000","message":"Done","commit_id":"54ec0b3c6480f7e790f8cf7e2b46ec8eb1084b9c"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"b6de59dfdda4c8a769212368853aaf9a5696f307","unresolved":false,"context_lines":[{"line_number":95,"context_line":"    def get(self, project, subtree_as_list\u003dFalse, parents_as_list\u003dFalse):"},{"line_number":96,"context_line":"        \"\"\"Get a project."},{"line_number":97,"context_line":""},{"line_number":98,"context_line":"        :param project: project to be retrieved."},{"line_number":99,"context_line":"        :param boolean subtree_as_list: retrieve projects below this project"},{"line_number":100,"context_line":"                                        in the hierarchy as a flat list."},{"line_number":101,"context_line":"                                        (optional)"}],"source_content_type":"text/x-python","patch_set":18,"id":"da86d52c_d688d7e9","line":98,"updated":"2015-02-01 15:18:31.000000000","message":"The type for this should be specified so that developers know what to use.\n\n :type parent: :class:`.Project` or str","commit_id":"54ec0b3c6480f7e790f8cf7e2b46ec8eb1084b9c"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"c0581324ed4e14a5cca839c3438972d22951d131","unresolved":false,"context_lines":[{"line_number":95,"context_line":"    def get(self, project, subtree_as_list\u003dFalse, parents_as_list\u003dFalse):"},{"line_number":96,"context_line":"        \"\"\"Get a project."},{"line_number":97,"context_line":""},{"line_number":98,"context_line":"        :param project: project to be retrieved."},{"line_number":99,"context_line":"        :param boolean subtree_as_list: retrieve projects below this project"},{"line_number":100,"context_line":"                                        in the hierarchy as a flat list."},{"line_number":101,"context_line":"                                        (optional)"}],"source_content_type":"text/x-python","patch_set":18,"id":"da86d52c_88a0dd91","line":98,"in_reply_to":"da86d52c_d688d7e9","updated":"2015-02-02 15:40:53.000000000","message":"Done","commit_id":"54ec0b3c6480f7e790f8cf7e2b46ec8eb1084b9c"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"b6de59dfdda4c8a769212368853aaf9a5696f307","unresolved":false,"context_lines":[{"line_number":106,"context_line":"        query_params \u003d {}"},{"line_number":107,"context_line":""},{"line_number":108,"context_line":"        if subtree_as_list:"},{"line_number":109,"context_line":"            query_params[\u0027subtree_as_list\u0027] \u003d subtree_as_list"},{"line_number":110,"context_line":"        if parents_as_list:"},{"line_number":111,"context_line":"            query_params[\u0027parents_as_list\u0027] \u003d parents_as_list"},{"line_number":112,"context_line":"        return super(ProjectManager, self).get("}],"source_content_type":"text/x-python","patch_set":18,"id":"da86d52c_969adf12","line":109,"updated":"2015-02-01 15:18:31.000000000","message":"According to the API spec, there\u0027s no argument expected for subtree_as_list. See http://specs.openstack.org/openstack/keystone-specs/api/v3/identity-api-v3.html#get-project","commit_id":"54ec0b3c6480f7e790f8cf7e2b46ec8eb1084b9c"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"c0581324ed4e14a5cca839c3438972d22951d131","unresolved":false,"context_lines":[{"line_number":106,"context_line":"        query_params \u003d {}"},{"line_number":107,"context_line":""},{"line_number":108,"context_line":"        if subtree_as_list:"},{"line_number":109,"context_line":"            query_params[\u0027subtree_as_list\u0027] \u003d subtree_as_list"},{"line_number":110,"context_line":"        if parents_as_list:"},{"line_number":111,"context_line":"            query_params[\u0027parents_as_list\u0027] \u003d parents_as_list"},{"line_number":112,"context_line":"        return super(ProjectManager, self).get("}],"source_content_type":"text/x-python","patch_set":18,"id":"da86d52c_a8dbe119","line":109,"in_reply_to":"da86d52c_969adf12","updated":"2015-02-02 15:40:53.000000000","message":"see comment in test_projects","commit_id":"54ec0b3c6480f7e790f8cf7e2b46ec8eb1084b9c"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"b6de59dfdda4c8a769212368853aaf9a5696f307","unresolved":false,"context_lines":[{"line_number":108,"context_line":"        if subtree_as_list:"},{"line_number":109,"context_line":"            query_params[\u0027subtree_as_list\u0027] \u003d subtree_as_list"},{"line_number":110,"context_line":"        if parents_as_list:"},{"line_number":111,"context_line":"            query_params[\u0027parents_as_list\u0027] \u003d parents_as_list"},{"line_number":112,"context_line":"        return super(ProjectManager, self).get("},{"line_number":113,"context_line":"            project_id\u003dbase.getid(project),"},{"line_number":114,"context_line":"            **query_params)"}],"source_content_type":"text/x-python","patch_set":18,"id":"da86d52c_b69fe302","line":111,"updated":"2015-02-01 15:18:31.000000000","message":"According to the API spec, there\u0027s no argument expected for parents_as_list.","commit_id":"54ec0b3c6480f7e790f8cf7e2b46ec8eb1084b9c"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"c0581324ed4e14a5cca839c3438972d22951d131","unresolved":false,"context_lines":[{"line_number":108,"context_line":"        if subtree_as_list:"},{"line_number":109,"context_line":"            query_params[\u0027subtree_as_list\u0027] \u003d subtree_as_list"},{"line_number":110,"context_line":"        if parents_as_list:"},{"line_number":111,"context_line":"            query_params[\u0027parents_as_list\u0027] \u003d parents_as_list"},{"line_number":112,"context_line":"        return super(ProjectManager, self).get("},{"line_number":113,"context_line":"            project_id\u003dbase.getid(project),"},{"line_number":114,"context_line":"            **query_params)"}],"source_content_type":"text/x-python","patch_set":18,"id":"da86d52c_68f8097d","line":111,"in_reply_to":"da86d52c_b69fe302","updated":"2015-02-02 15:40:53.000000000","message":"see comment in test_projects","commit_id":"54ec0b3c6480f7e790f8cf7e2b46ec8eb1084b9c"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"26e52d35d4258603aaec3f965980e6eda59fb4c8","unresolved":false,"context_lines":[{"line_number":26,"context_line":"        * name: project name"},{"line_number":27,"context_line":"        * description: project description"},{"line_number":28,"context_line":"        * enabled: boolean to indicate if project is enabled"},{"line_number":29,"context_line":"        * parent_id: a uuid representing this project\u0027s parent in hierarchy"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"    \"\"\""},{"line_number":32,"context_line":"    @utils.positional(enforcement\u003dutils.positional.WARN)"}],"source_content_type":"text/x-python","patch_set":20,"id":"da86d52c_45ba34c1","line":29,"updated":"2015-02-03 02:01:28.000000000","message":"why parent_id and not parent? Add a comment.","commit_id":"a7069e99d92a84b6b283506ed29e92094404aeab"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"36ce7257ff05860e4cbac4040ed3d53067bd35f9","unresolved":false,"context_lines":[{"line_number":26,"context_line":"        * name: project name"},{"line_number":27,"context_line":"        * description: project description"},{"line_number":28,"context_line":"        * enabled: boolean to indicate if project is enabled"},{"line_number":29,"context_line":"        * parent_id: a uuid representing this project\u0027s parent in hierarchy"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"    \"\"\""},{"line_number":32,"context_line":"    @utils.positional(enforcement\u003dutils.positional.WARN)"}],"source_content_type":"text/x-python","patch_set":20,"id":"da86d52c_e81dbd67","line":29,"in_reply_to":"da86d52c_45ba34c1","updated":"2015-02-03 02:13:16.000000000","message":"why? doesn\u0027t the object returned by the API contain the parent_id?","commit_id":"a7069e99d92a84b6b283506ed29e92094404aeab"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"26e52d35d4258603aaec3f965980e6eda59fb4c8","unresolved":false,"context_lines":[{"line_number":69,"context_line":"        \"\"\""},{"line_number":70,"context_line":"        return super(ProjectManager, self).create("},{"line_number":71,"context_line":"            domain_id\u003dbase.getid(domain),"},{"line_number":72,"context_line":"            parent_id\u003dbase.getid(parent),"},{"line_number":73,"context_line":"            name\u003dname,"},{"line_number":74,"context_line":"            description\u003ddescription,"},{"line_number":75,"context_line":"            enabled\u003denabled,"}],"source_content_type":"text/x-python","patch_set":20,"id":"da86d52c_c54f04bd","line":72,"updated":"2015-02-03 02:01:28.000000000","message":"what happens to applications that were passing in parent_id to create() before?","commit_id":"a7069e99d92a84b6b283506ed29e92094404aeab"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"36ce7257ff05860e4cbac4040ed3d53067bd35f9","unresolved":false,"context_lines":[{"line_number":69,"context_line":"        \"\"\""},{"line_number":70,"context_line":"        return super(ProjectManager, self).create("},{"line_number":71,"context_line":"            domain_id\u003dbase.getid(domain),"},{"line_number":72,"context_line":"            parent_id\u003dbase.getid(parent),"},{"line_number":73,"context_line":"            name\u003dname,"},{"line_number":74,"context_line":"            description\u003ddescription,"},{"line_number":75,"context_line":"            enabled\u003denabled,"}],"source_content_type":"text/x-python","patch_set":20,"id":"da86d52c_2827d5b7","line":72,"in_reply_to":"da86d52c_c54f04bd","updated":"2015-02-03 02:13:16.000000000","message":"not sure if I follow","commit_id":"a7069e99d92a84b6b283506ed29e92094404aeab"},{"author":{"_account_id":7191,"name":"Jamie Lennox","email":"jamielennox@gmail.com","username":"jamielennox"},"change_message_id":"c28b59fb8635c184c887134d024f910097fac5a8","unresolved":false,"context_lines":[{"line_number":26,"context_line":"        * name: project name"},{"line_number":27,"context_line":"        * description: project description"},{"line_number":28,"context_line":"        * enabled: boolean to indicate if project is enabled"},{"line_number":29,"context_line":"        * parent_id: a uuid representing this project\u0027s parent in hierarchy"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"    \"\"\""},{"line_number":32,"context_line":"    @utils.positional(enforcement\u003dutils.positional.WARN)"}],"source_content_type":"text/x-python","patch_set":25,"id":"da86d52c_5d7824f2","line":29,"updated":"2015-02-03 19:35:43.000000000","message":"what attributes here will the include_parent and include subtree add?","commit_id":"7f26869d63dbf726b0c0bb7dec485e13d4859647"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"afd9b0c4d470535c03b34c8854bd8d7772a78384","unresolved":false,"context_lines":[{"line_number":26,"context_line":"        * name: project name"},{"line_number":27,"context_line":"        * description: project description"},{"line_number":28,"context_line":"        * enabled: boolean to indicate if project is enabled"},{"line_number":29,"context_line":"        * parent_id: a uuid representing this project\u0027s parent in hierarchy"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"    \"\"\""},{"line_number":32,"context_line":"    @utils.positional(enforcement\u003dutils.positional.WARN)"}],"source_content_type":"text/x-python","patch_set":25,"id":"da86d52c_b3d79122","line":29,"in_reply_to":"da86d52c_5d7824f2","updated":"2015-02-03 19:51:01.000000000","message":"will add them (subtree and parents), both are only returned when are explicitly requested, how can we state this in the docstring?","commit_id":"7f26869d63dbf726b0c0bb7dec485e13d4859647"},{"author":{"_account_id":7191,"name":"Jamie Lennox","email":"jamielennox@gmail.com","username":"jamielennox"},"change_message_id":"c28b59fb8635c184c887134d024f910097fac5a8","unresolved":false,"context_lines":[{"line_number":93,"context_line":"            fallback_to_auth\u003dTrue,"},{"line_number":94,"context_line":"            **kwargs)"},{"line_number":95,"context_line":""},{"line_number":96,"context_line":"    @utils.positional(enforcement\u003dutils.positional.EXCEPT)"},{"line_number":97,"context_line":"    def get(self, project, subtree_as_list\u003dFalse, parents_as_list\u003dFalse):"},{"line_number":98,"context_line":"        \"\"\"Get a project."},{"line_number":99,"context_line":""}],"source_content_type":"text/x-python","patch_set":25,"id":"da86d52c_1dcf8c80","line":96,"updated":"2015-02-03 19:35:43.000000000","message":"Except is the default, don\u0027t worry about it","commit_id":"7f26869d63dbf726b0c0bb7dec485e13d4859647"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"afd9b0c4d470535c03b34c8854bd8d7772a78384","unresolved":false,"context_lines":[{"line_number":93,"context_line":"            fallback_to_auth\u003dTrue,"},{"line_number":94,"context_line":"            **kwargs)"},{"line_number":95,"context_line":""},{"line_number":96,"context_line":"    @utils.positional(enforcement\u003dutils.positional.EXCEPT)"},{"line_number":97,"context_line":"    def get(self, project, subtree_as_list\u003dFalse, parents_as_list\u003dFalse):"},{"line_number":98,"context_line":"        \"\"\"Get a project."},{"line_number":99,"context_line":""}],"source_content_type":"text/x-python","patch_set":25,"id":"da86d52c_d3dec53e","line":96,"in_reply_to":"da86d52c_1dcf8c80","updated":"2015-02-03 19:51:01.000000000","message":"Done","commit_id":"7f26869d63dbf726b0c0bb7dec485e13d4859647"},{"author":{"_account_id":7191,"name":"Jamie Lennox","email":"jamielennox@gmail.com","username":"jamielennox"},"change_message_id":"c28b59fb8635c184c887134d024f910097fac5a8","unresolved":false,"context_lines":[{"line_number":115,"context_line":"            if query:"},{"line_number":116,"context_line":"                query +\u003d \u0027\u0026parents_as_list\u0027"},{"line_number":117,"context_line":"            else:"},{"line_number":118,"context_line":"                query \u003d \u0027?parents_as_list\u0027"},{"line_number":119,"context_line":""},{"line_number":120,"context_line":"        dict_args \u003d {\u0027project_id\u0027: base.getid(project)}"},{"line_number":121,"context_line":"        url \u003d self.build_url(dict_args_in_out\u003ddict_args) + query"}],"source_content_type":"text/x-python","patch_set":25,"id":"da86d52c_fd39d841","line":118,"updated":"2015-02-03 19:35:43.000000000","message":"have a look at urllib.urlencode for this. (you\u0027ll need to use the six version for py2/3)","commit_id":"7f26869d63dbf726b0c0bb7dec485e13d4859647"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"afd9b0c4d470535c03b34c8854bd8d7772a78384","unresolved":false,"context_lines":[{"line_number":115,"context_line":"            if query:"},{"line_number":116,"context_line":"                query +\u003d \u0027\u0026parents_as_list\u0027"},{"line_number":117,"context_line":"            else:"},{"line_number":118,"context_line":"                query \u003d \u0027?parents_as_list\u0027"},{"line_number":119,"context_line":""},{"line_number":120,"context_line":"        dict_args \u003d {\u0027project_id\u0027: base.getid(project)}"},{"line_number":121,"context_line":"        url \u003d self.build_url(dict_args_in_out\u003ddict_args) + query"}],"source_content_type":"text/x-python","patch_set":25,"id":"da86d52c_53f2d5d2","line":118,"in_reply_to":"da86d52c_fd39d841","updated":"2015-02-03 19:51:01.000000000","message":"urrlib doesn\u0027t deal well with key only query params :(","commit_id":"7f26869d63dbf726b0c0bb7dec485e13d4859647"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"6ae7b9a1632a68b78550518cf8018dd55d41346c","unresolved":false,"context_lines":[{"line_number":65,"context_line":""},{"line_number":66,"context_line":"        :param str name: project name."},{"line_number":67,"context_line":"        :param domain: the project domain."},{"line_number":68,"context_line":"        :type parent: :py:class:`keystoneclient.v3.domains.Domain` or str"},{"line_number":69,"context_line":"        :param str description: the project description. (optional)"},{"line_number":70,"context_line":"        :param boolean enabled: if the project is enabled. (optional)"},{"line_number":71,"context_line":"        :param parent: the project\u0027s parent in the hierarchy. (optional)"}],"source_content_type":"text/x-python","patch_set":27,"id":"da86d52c_9d6a61ec","line":68,"updated":"2015-02-05 01:48:06.000000000","message":"change \"parent\" to \"domain\"","commit_id":"8eab8faace4f619aa1b0cf1e1aac67195c15466c"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"d1e838abe32356e24188cb1de3912c5a52a8fa18","unresolved":false,"context_lines":[{"line_number":65,"context_line":""},{"line_number":66,"context_line":"        :param str name: project name."},{"line_number":67,"context_line":"        :param domain: the project domain."},{"line_number":68,"context_line":"        :type parent: :py:class:`keystoneclient.v3.domains.Domain` or str"},{"line_number":69,"context_line":"        :param str description: the project description. (optional)"},{"line_number":70,"context_line":"        :param boolean enabled: if the project is enabled. (optional)"},{"line_number":71,"context_line":"        :param parent: the project\u0027s parent in the hierarchy. (optional)"}],"source_content_type":"text/x-python","patch_set":27,"id":"da86d52c_590c6694","line":68,"in_reply_to":"da86d52c_9d6a61ec","updated":"2015-02-05 15:43:04.000000000","message":"Done","commit_id":"8eab8faace4f619aa1b0cf1e1aac67195c15466c"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"6ae7b9a1632a68b78550518cf8018dd55d41346c","unresolved":false,"context_lines":[{"line_number":74,"context_line":""},{"line_number":75,"context_line":"        return super(ProjectManager, self).create("},{"line_number":76,"context_line":"            domain_id\u003dbase.getid(domain),"},{"line_number":77,"context_line":"            parent_id\u003dbase.getid(parent),"},{"line_number":78,"context_line":"            name\u003dname,"},{"line_number":79,"context_line":"            description\u003ddescription,"},{"line_number":80,"context_line":"            enabled\u003denabled,"}],"source_content_type":"text/x-python","patch_set":27,"id":"da86d52c_bd0ac576","line":77,"updated":"2015-02-05 01:48:06.000000000","message":"what happens to applications that were passing in parent_id to create() before?\n\nFor example, if an application was doing: \n\n client.projects.create(\u0027project1.1\u0027, \u0027domain1\u0027, parent_id\u003d\u0027project1\u0027)\n\nI assume that this would now fail with a duplicate parameter error, when it used to work fine. The API needs to be backwards compatible.\n\nA test should be added that shows that client.projects.create(\u0027project1.1\u0027, \u0027domain1\u0027, parent_id\u003d\u0027project1\u0027) works.","commit_id":"8eab8faace4f619aa1b0cf1e1aac67195c15466c"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"d1e838abe32356e24188cb1de3912c5a52a8fa18","unresolved":false,"context_lines":[{"line_number":74,"context_line":""},{"line_number":75,"context_line":"        return super(ProjectManager, self).create("},{"line_number":76,"context_line":"            domain_id\u003dbase.getid(domain),"},{"line_number":77,"context_line":"            parent_id\u003dbase.getid(parent),"},{"line_number":78,"context_line":"            name\u003dname,"},{"line_number":79,"context_line":"            description\u003ddescription,"},{"line_number":80,"context_line":"            enabled\u003denabled,"}],"source_content_type":"text/x-python","patch_set":27,"id":"da86d52c_99297ee8","line":77,"in_reply_to":"da86d52c_bd0ac576","updated":"2015-02-05 15:43:04.000000000","message":"Done","commit_id":"8eab8faace4f619aa1b0cf1e1aac67195c15466c"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"6ae7b9a1632a68b78550518cf8018dd55d41346c","unresolved":false,"context_lines":[{"line_number":97,"context_line":"            fallback_to_auth\u003dTrue,"},{"line_number":98,"context_line":"            **kwargs)"},{"line_number":99,"context_line":""},{"line_number":100,"context_line":"    def get(self, project, subtree_as_list\u003dFalse, parents_as_list\u003dFalse):"},{"line_number":101,"context_line":"        \"\"\"Get a project."},{"line_number":102,"context_line":""},{"line_number":103,"context_line":"        :param project: project to be retrieved."}],"source_content_type":"text/x-python","patch_set":27,"id":"da86d52c_1d259108","line":100,"updated":"2015-02-05 01:48:06.000000000","message":"what happened to @utils.positional(enforcement\u003dutils.positional.EXCEPT) ?","commit_id":"8eab8faace4f619aa1b0cf1e1aac67195c15466c"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"d1e838abe32356e24188cb1de3912c5a52a8fa18","unresolved":false,"context_lines":[{"line_number":97,"context_line":"            fallback_to_auth\u003dTrue,"},{"line_number":98,"context_line":"            **kwargs)"},{"line_number":99,"context_line":""},{"line_number":100,"context_line":"    def get(self, project, subtree_as_list\u003dFalse, parents_as_list\u003dFalse):"},{"line_number":101,"context_line":"        \"\"\"Get a project."},{"line_number":102,"context_line":""},{"line_number":103,"context_line":"        :param project: project to be retrieved."}],"source_content_type":"text/x-python","patch_set":27,"id":"da86d52c_388ee379","line":100,"in_reply_to":"da86d52c_1d259108","updated":"2015-02-05 15:43:04.000000000","message":"thought the decorator is not necessary in the EXCEPT case...","commit_id":"8eab8faace4f619aa1b0cf1e1aac67195c15466c"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"8e65de77856e45d866973d17e1cb1e044386c5fb","unresolved":false,"context_lines":[{"line_number":97,"context_line":"            fallback_to_auth\u003dTrue,"},{"line_number":98,"context_line":"            **kwargs)"},{"line_number":99,"context_line":""},{"line_number":100,"context_line":"    def get(self, project, subtree_as_list\u003dFalse, parents_as_list\u003dFalse):"},{"line_number":101,"context_line":"        \"\"\"Get a project."},{"line_number":102,"context_line":""},{"line_number":103,"context_line":"        :param project: project to be retrieved."}],"source_content_type":"text/x-python","patch_set":27,"id":"da86d52c_b277389f","line":100,"in_reply_to":"da86d52c_388ee379","updated":"2015-02-05 15:51:05.000000000","message":"it\u0027s the enforcement argument that\u0027s optional when EXCEPT. The default is enforcement\u003dEXCEPT, see http://git.openstack.org/cgit/openstack/python-keystoneclient/tree/keystoneclient/utils.py#n277","commit_id":"8eab8faace4f619aa1b0cf1e1aac67195c15466c"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"6ae7b9a1632a68b78550518cf8018dd55d41346c","unresolved":false,"context_lines":[{"line_number":118,"context_line":""},{"line_number":119,"context_line":"        dict_args \u003d {\u0027project_id\u0027: base.getid(project)}"},{"line_number":120,"context_line":"        url \u003d self.build_url(dict_args_in_out\u003ddict_args) + query"},{"line_number":121,"context_line":"        return super(ProjectManager, self)._get(url, self.key)"},{"line_number":122,"context_line":""},{"line_number":123,"context_line":"    @utils.positional(enforcement\u003dutils.positional.WARN)"},{"line_number":124,"context_line":"    def update(self, project, name\u003dNone, domain\u003dNone, description\u003dNone,"}],"source_content_type":"text/x-python","patch_set":27,"id":"da86d52c_5d01c904","line":121,"updated":"2015-02-05 01:48:06.000000000","message":"this can be\n\n return self._get(url, self.key)","commit_id":"8eab8faace4f619aa1b0cf1e1aac67195c15466c"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"d1e838abe32356e24188cb1de3912c5a52a8fa18","unresolved":false,"context_lines":[{"line_number":118,"context_line":""},{"line_number":119,"context_line":"        dict_args \u003d {\u0027project_id\u0027: base.getid(project)}"},{"line_number":120,"context_line":"        url \u003d self.build_url(dict_args_in_out\u003ddict_args) + query"},{"line_number":121,"context_line":"        return super(ProjectManager, self)._get(url, self.key)"},{"line_number":122,"context_line":""},{"line_number":123,"context_line":"    @utils.positional(enforcement\u003dutils.positional.WARN)"},{"line_number":124,"context_line":"    def update(self, project, name\u003dNone, domain\u003dNone, description\u003dNone,"}],"source_content_type":"text/x-python","patch_set":27,"id":"da86d52c_7605be44","line":121,"in_reply_to":"da86d52c_5d01c904","updated":"2015-02-05 15:43:04.000000000","message":"Done","commit_id":"8eab8faace4f619aa1b0cf1e1aac67195c15466c"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"c194934c940223d22392ee0f8df7d2ee98dee967","unresolved":false,"context_lines":[{"line_number":82,"context_line":"        if \u0027parent_id\u0027 in kwargs:"},{"line_number":83,"context_line":"            if not parent:"},{"line_number":84,"context_line":"                parent_id \u003d base.getid(kwargs[\u0027parent_id\u0027])"},{"line_number":85,"context_line":"            del kwargs[\u0027parent_id\u0027]"},{"line_number":86,"context_line":""},{"line_number":87,"context_line":"        return super(ProjectManager, self).create("},{"line_number":88,"context_line":"            domain_id\u003dbase.getid(domain),"}],"source_content_type":"text/x-python","patch_set":29,"id":"da86d52c_d1401809","line":85,"updated":"2015-02-06 00:39:34.000000000","message":"all this could be replaced with\n\n kwargs.setdefault(\u0027parent_id\u0027, base.getid(parent))","commit_id":"43dfc5cf66919527cf5ac3d5d6a0d938d56713fe"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"6bc64dcf2cf070490da498e6e58fbb6e0853ae4b","unresolved":false,"context_lines":[{"line_number":82,"context_line":"        if \u0027parent_id\u0027 in kwargs:"},{"line_number":83,"context_line":"            if not parent:"},{"line_number":84,"context_line":"                parent_id \u003d base.getid(kwargs[\u0027parent_id\u0027])"},{"line_number":85,"context_line":"            del kwargs[\u0027parent_id\u0027]"},{"line_number":86,"context_line":""},{"line_number":87,"context_line":"        return super(ProjectManager, self).create("},{"line_number":88,"context_line":"            domain_id\u003dbase.getid(domain),"}],"source_content_type":"text/x-python","patch_set":29,"id":"da86d52c_775cbc19","line":85,"in_reply_to":"da86d52c_d1401809","updated":"2015-02-06 01:38:02.000000000","message":"if we do like that, the preferred will be kwargs, changed to:\n\n  if parent:\n    kwargs[\u0027parent_id\u0027] \u003d base.getid(parent)\n\nthanks for the suggestion!","commit_id":"43dfc5cf66919527cf5ac3d5d6a0d938d56713fe"},{"author":{"_account_id":9101,"name":"wanghong","email":"reviewwanghong@126.com","username":"wanghong"},"change_message_id":"a38d69665221b1def7291a8b3271f81eaa0600be","unresolved":false,"context_lines":[{"line_number":77,"context_line":"        # should not fail. If both \u0027parent\u0027 and \u0027parent_id\u0027 are provided,"},{"line_number":78,"context_line":"        # \u0027parent\u0027 will be preferred."},{"line_number":79,"context_line":"        if parent:"},{"line_number":80,"context_line":"            kwargs[\u0027parent_id\u0027] \u003d base.getid(parent)"},{"line_number":81,"context_line":""},{"line_number":82,"context_line":"        return super(ProjectManager, self).create("},{"line_number":83,"context_line":"            domain_id\u003dbase.getid(domain),"}],"source_content_type":"text/x-python","patch_set":30,"id":"da86d52c_b750f432","line":80,"updated":"2015-02-06 02:19:07.000000000","message":"nice!","commit_id":"8da68e3ded4aa7208f5bc55cf4f438e4d0e910b1"}]}
