)]}'
{"novaclient/utils.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"114deb07fdf177604071279dbd4aaa8be77932de","unresolved":false,"context_lines":[{"line_number":452,"context_line":"        times.append((\u0027 \u0027.join(args), start, end))"},{"line_number":453,"context_line":""},{"line_number":454,"context_line":""},{"line_number":455,"context_line":"def prepare_query_string(params):"},{"line_number":456,"context_line":"    \"\"\"Convert dict params to query string\"\"\""},{"line_number":457,"context_line":"    # Transform the dict to a sequence of two-element tuples in fixed"},{"line_number":458,"context_line":"    # order, then the encoded string will be consistent in Python 2\u00263."}],"source_content_type":"text/x-python","patch_set":4,"id":"1f485f77_f64be527","line":455,"updated":"2017-11-16 15:21:33.000000000","message":"If params is not None but empty {}, we should just return \u0027\u0027 otherwise we can end up with a URL that has a trailing ? in get_url_with_filter.","commit_id":"ae360593c89349e66ad2991e3afb17b5842e99c9"},{"author":{"_account_id":20722,"name":"Yikun Jiang","email":"yikunkero@gmail.com","username":"yikunkero"},"change_message_id":"61a3940a1da26979e3d525e40d7d3f04e5299cff","unresolved":false,"context_lines":[{"line_number":452,"context_line":"        times.append((\u0027 \u0027.join(args), start, end))"},{"line_number":453,"context_line":""},{"line_number":454,"context_line":""},{"line_number":455,"context_line":"def prepare_query_string(params):"},{"line_number":456,"context_line":"    \"\"\"Convert dict params to query string\"\"\""},{"line_number":457,"context_line":"    # Transform the dict to a sequence of two-element tuples in fixed"},{"line_number":458,"context_line":"    # order, then the encoded string will be consistent in Python 2\u00263."}],"source_content_type":"text/x-python","patch_set":4,"id":"ff82abbf_c44d2773","line":455,"in_reply_to":"1f485f77_f64be527","updated":"2017-11-22 08:29:09.000000000","message":"Sorry, I think the unit test already covers this case. See https://review.openstack.org/#/c/515640/4/novaclient/tests/unit/test_utils.py 454L\n\n\u003e  \u0027?%s\u0027 % parse.urlencode(params) if params else \u0027\u0027.\n\nSo, if the params arg is empty(such as None, {}), will return \u0027\u0027.\n\nAnd it seems we should add the case that params is None, we can get \u0027\u0027 back.","commit_id":"ae360593c89349e66ad2991e3afb17b5842e99c9"}],"novaclient/v2/keypairs.py":[{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"1533a37425797f5218a56e643f96cfda23de2396","unresolved":false,"context_lines":[{"line_number":170,"context_line":"        :param user_id: Id of key-pairs owner (Admin only)."},{"line_number":171,"context_line":"        \"\"\""},{"line_number":172,"context_line":"        params \u003d {}"},{"line_number":173,"context_line":"        if user_id:"},{"line_number":174,"context_line":"            params[\u0027user_id\u0027] \u003d user_id"},{"line_number":175,"context_line":"        return self._list(\u0027/%s\u0027 % self.keypair_prefix, \u0027keypairs\u0027,"},{"line_number":176,"context_line":"                          filters\u003dparams)"},{"line_number":177,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"3f4b6375_209cafbe","line":174,"range":{"start_line":173,"start_character":0,"end_line":174,"end_character":39},"updated":"2017-11-02 13:10:05.000000000","message":"I imagine the function will (or should) handle None values like so:\n\n   url?param\u003d\n\ni.e. no value. However, this would be a change in behavior so let\u0027s keep this as you\u0027ve done it","commit_id":"ae360593c89349e66ad2991e3afb17b5842e99c9"},{"author":{"_account_id":20722,"name":"Yikun Jiang","email":"yikunkero@gmail.com","username":"yikunkero"},"change_message_id":"89cc4a46cb7a2f2189748f5789a64a610352f314","unresolved":false,"context_lines":[{"line_number":170,"context_line":"        :param user_id: Id of key-pairs owner (Admin only)."},{"line_number":171,"context_line":"        \"\"\""},{"line_number":172,"context_line":"        params \u003d {}"},{"line_number":173,"context_line":"        if user_id:"},{"line_number":174,"context_line":"            params[\u0027user_id\u0027] \u003d user_id"},{"line_number":175,"context_line":"        return self._list(\u0027/%s\u0027 % self.keypair_prefix, \u0027keypairs\u0027,"},{"line_number":176,"context_line":"                          filters\u003dparams)"},{"line_number":177,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"ff82abbf_e465cb46","line":174,"range":{"start_line":173,"start_character":0,"end_line":174,"end_character":39},"in_reply_to":"3f4b6375_209cafbe","updated":"2017-11-22 08:41:01.000000000","message":"Thanks for review, so, currently if we pass `{\u0027param\u0027: None}`, will return: \n\nurl?param\u003dNone","commit_id":"ae360593c89349e66ad2991e3afb17b5842e99c9"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"3538cd34f289a14226db8e0a0150f4a95df3de95","unresolved":false,"context_lines":[{"line_number":170,"context_line":"        :param user_id: Id of key-pairs owner (Admin only)."},{"line_number":171,"context_line":"        \"\"\""},{"line_number":172,"context_line":"        params \u003d {}"},{"line_number":173,"context_line":"        if user_id:"},{"line_number":174,"context_line":"            params[\u0027user_id\u0027] \u003d user_id"},{"line_number":175,"context_line":"        return self._list(\u0027/%s\u0027 % self.keypair_prefix, \u0027keypairs\u0027,"},{"line_number":176,"context_line":"                          filters\u003dparams)"},{"line_number":177,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"ff82abbf_2bb61bfc","line":174,"range":{"start_line":173,"start_character":0,"end_line":174,"end_character":39},"in_reply_to":"ff82abbf_e465cb46","updated":"2017-11-22 13:56:32.000000000","message":"Oh, well then. This is clearly the correct thing to do so","commit_id":"ae360593c89349e66ad2991e3afb17b5842e99c9"}],"novaclient/v2/server_groups.py":[{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"7108c09e9a055a1ced664ec79cc2e0bfe70ee850","unresolved":false,"context_lines":[{"line_number":62,"context_line":"        if offset:"},{"line_number":63,"context_line":"            qparams[\u0027offset\u0027] \u003d int(offset)"},{"line_number":64,"context_line":"        query_string \u003d utils.prepare_query_string(qparams)"},{"line_number":65,"context_line":"        return self._list(\u0027/os-server-groups%s\u0027 % query_string,"},{"line_number":66,"context_line":"                          \u0027server_groups\u0027)"},{"line_number":67,"context_line":""},{"line_number":68,"context_line":"    def get(self, id):"}],"source_content_type":"text/x-python","patch_set":2,"id":"3f4b6375_4f82d001","line":65,"range":{"start_line":65,"start_character":20,"end_line":65,"end_character":25},"updated":"2017-10-27 10:47:10.000000000","message":"An alternative approach is to modify this to take a \u0027filtes\u0027 parameter, and then you can just pass in \u0027qparams\u0027 directly?","commit_id":"f06ba026311bd36bd32a43b86a6b6d7a4fa2592e"},{"author":{"_account_id":20722,"name":"Yikun Jiang","email":"yikunkero@gmail.com","username":"yikunkero"},"change_message_id":"22d4c7c854acd567e10a8a310391d95e6171aadf","unresolved":false,"context_lines":[{"line_number":62,"context_line":"        if offset:"},{"line_number":63,"context_line":"            qparams[\u0027offset\u0027] \u003d int(offset)"},{"line_number":64,"context_line":"        query_string \u003d utils.prepare_query_string(qparams)"},{"line_number":65,"context_line":"        return self._list(\u0027/os-server-groups%s\u0027 % query_string,"},{"line_number":66,"context_line":"                          \u0027server_groups\u0027)"},{"line_number":67,"context_line":""},{"line_number":68,"context_line":"    def get(self, id):"}],"source_content_type":"text/x-python","patch_set":2,"id":"3f4b6375_b5997f7a","line":65,"range":{"start_line":65,"start_character":20,"end_line":65,"end_character":25},"in_reply_to":"3f4b6375_4f82d001","updated":"2017-10-28 03:52:31.000000000","message":"Yeah, it seems a better approach. Thanks for review","commit_id":"f06ba026311bd36bd32a43b86a6b6d7a4fa2592e"}],"novaclient/v2/servers.py":[{"author":{"_account_id":20722,"name":"Yikun Jiang","email":"yikunkero@gmail.com","username":"yikunkero"},"change_message_id":"a80a9fc762d982996551766c25797fd88d231df9","unresolved":false,"context_lines":[{"line_number":876,"context_line":"                if sort_dirs:"},{"line_number":877,"context_line":"                    items.extend((\u0027sort_dir\u0027, sort_dir)"},{"line_number":878,"context_line":"                                 for sort_dir in sort_dirs)"},{"line_number":879,"context_line":"                query_string \u003d utils.prepare_query_string(qparams)"},{"line_number":880,"context_line":"            else:"},{"line_number":881,"context_line":"                query_string \u003d \"\""},{"line_number":882,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"3f4b6375_fc525866","line":879,"range":{"start_line":879,"start_character":16,"end_line":879,"end_character":66},"updated":"2017-10-27 10:14:05.000000000","message":"Oops, should we change prepare_query_string(params_dict) to prepare_query_string(params_dict.item())?\nlike:\n\ndef prepare_query_string(params_items):\n    params \u003d sorted(params_items, key\u003dlambda x: x[0])\n    return \u0027?%s\u0027 % parse.urlencode(params) if params else \u0027\u0027\n\nIt\u0027s actually very wired. So, I think we could just stay it, and in PS2, this change has been restored.","commit_id":"c7ce78eb7dbe5f98a4841af369bf1d35e10c93d6"}]}
