)]}'
{"glanceclient/v2/images.py":[{"author":{"_account_id":12000,"name":"Ian Cordasco","email":"sigmavirus24@gmail.com","username":"sigmavirus24"},"change_message_id":"48374f88250c93385a6dac52b9716581867c502f","unresolved":false,"context_lines":[{"line_number":100,"context_line":""},{"line_number":101,"context_line":"        if \u0027sort\u0027 in kwargs:"},{"line_number":102,"context_line":"            if \u0027sort_key\u0027 in kwargs or \u0027sort_dir\u0027 in kwargs:"},{"line_number":103,"context_line":"                raise exc.HTTPBadRequest(\"Old and new sorting syntax \""},{"line_number":104,"context_line":"                                         \"cannot be combined\")"},{"line_number":105,"context_line":"            url +\u003d kwargs[\u0027sort\u0027]"},{"line_number":106,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":1,"id":"1a930d6b_e4c19ce5","line":103,"updated":"2015-01-21 18:49:15.000000000","message":"Should we be raising this directly? It seems like if we\u0027re not actually receiving a 400 then we probably should be raising a different exception. Or, we should allow this through and let the API response do the talking for us.","commit_id":"25f83c18bfc158fce172d38f881b9ed721770505"},{"author":{"_account_id":11391,"name":"Mikhail Fedosin","email":"mfedosin@redhat.com","username":"fedosinme"},"change_message_id":"bedbbe1b72f9f811e977a98c25d0e0c67944cc7e","unresolved":false,"context_lines":[{"line_number":100,"context_line":""},{"line_number":101,"context_line":"        if \u0027sort\u0027 in kwargs:"},{"line_number":102,"context_line":"            if \u0027sort_key\u0027 in kwargs or \u0027sort_dir\u0027 in kwargs:"},{"line_number":103,"context_line":"                raise exc.HTTPBadRequest(\"Old and new sorting syntax \""},{"line_number":104,"context_line":"                                         \"cannot be combined\")"},{"line_number":105,"context_line":"            url +\u003d kwargs[\u0027sort\u0027]"},{"line_number":106,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":1,"id":"1a930d6b_bd45c718","line":103,"in_reply_to":"1a930d6b_e4c19ce5","updated":"2015-01-22 14:59:19.000000000","message":"A little bit lower in the code on the line 228 it\u0027s alright. I was guided by this example.\nhttps://github.com/openstack/python-glanceclient/blob/master/glanceclient/v2/images.py#L202","commit_id":"25f83c18bfc158fce172d38f881b9ed721770505"},{"author":{"_account_id":12000,"name":"Ian Cordasco","email":"sigmavirus24@gmail.com","username":"sigmavirus24"},"change_message_id":"48374f88250c93385a6dac52b9716581867c502f","unresolved":false,"context_lines":[{"line_number":114,"context_line":""},{"line_number":115,"context_line":"            if len(sort_key) !\u003d len(sort_dir) and len(sort_dir) \u003e 1:"},{"line_number":116,"context_line":"                raise exc.HTTPBadRequest(\"Sorting keys number doesn\u0027t match\""},{"line_number":117,"context_line":"                                         \" with a number of sorting dirs\")"},{"line_number":118,"context_line":""},{"line_number":119,"context_line":"            for key in sort_key:"},{"line_number":120,"context_line":"                url \u003d \u0027%s\u0026sort_key\u003d%s\u0027 % (url, key)"}],"source_content_type":"text/x-python","patch_set":1,"id":"1a930d6b_04b78887","line":117,"updated":"2015-01-21 18:49:15.000000000","message":"Same concern here.","commit_id":"25f83c18bfc158fce172d38f881b9ed721770505"},{"author":{"_account_id":11748,"name":"Chris St. Pierre","email":"cstpierr@cisco.com","username":"stpierre"},"change_message_id":"b8c141c999c99c2a24b74b7584e9d34543ad2651","unresolved":false,"context_lines":[{"line_number":122,"context_line":"            if \u0027sort_key\u0027 in kwargs or \u0027sort_dir\u0027 in kwargs:"},{"line_number":123,"context_line":"                raise exc.HTTPBadRequest(\"Old and new sorting syntax \""},{"line_number":124,"context_line":"                                         \"cannot be combined\")"},{"line_number":125,"context_line":"            url +\u003d kwargs[\u0027sort\u0027]"},{"line_number":126,"context_line":""},{"line_number":127,"context_line":"        sort_key \u003d kwargs.get(\u0027sort_key\u0027, [])"},{"line_number":128,"context_line":"        if isinstance(sort_key, six.string_types):"}],"source_content_type":"text/x-python","patch_set":11,"id":"9a80dd14_0c722e7c","line":125,"updated":"2015-03-11 20:19:11.000000000","message":"This just appends the sort directives, which results in a bogus URL, e.g.:\n\n    /v2/images?limit\u003d20name:desc,size:asc\n\nTo follow the pattern set by sort_key and sort_dir below, this should be:\n\n    url \u003d \u0027%s\u0026sort\u003d%s\u0027 % (url, kwargs[\u0027sort\u0027])","commit_id":"786c3b7485b8230326af3c416af2b1dfd9b81404"},{"author":{"_account_id":11391,"name":"Mikhail Fedosin","email":"mfedosin@redhat.com","username":"fedosinme"},"change_message_id":"d0c69960763c5ed37d676007e321137709b69344","unresolved":false,"context_lines":[{"line_number":122,"context_line":"            if \u0027sort_key\u0027 in kwargs or \u0027sort_dir\u0027 in kwargs:"},{"line_number":123,"context_line":"                raise exc.HTTPBadRequest(\"Old and new sorting syntax \""},{"line_number":124,"context_line":"                                         \"cannot be combined\")"},{"line_number":125,"context_line":"            url +\u003d kwargs[\u0027sort\u0027]"},{"line_number":126,"context_line":""},{"line_number":127,"context_line":"        sort_key \u003d kwargs.get(\u0027sort_key\u0027, [])"},{"line_number":128,"context_line":"        if isinstance(sort_key, six.string_types):"}],"source_content_type":"text/x-python","patch_set":11,"id":"9a80dd14_43ce95b5","line":125,"in_reply_to":"9a80dd14_0c722e7c","updated":"2015-03-12 13:09:25.000000000","message":"Done. My bad :( Have no idea how I did that... Mb I was drunk","commit_id":"786c3b7485b8230326af3c416af2b1dfd9b81404"},{"author":{"_account_id":11748,"name":"Chris St. Pierre","email":"cstpierr@cisco.com","username":"stpierre"},"change_message_id":"b8c141c999c99c2a24b74b7584e9d34543ad2651","unresolved":false,"context_lines":[{"line_number":136,"context_line":"            url \u003d \u0027%s\u0026sort_key\u003d%s\u0027 % (url, key)"},{"line_number":137,"context_line":""},{"line_number":138,"context_line":"        for dir in sort_dir:"},{"line_number":139,"context_line":"            url \u003d \u0027%s\u0026sort_dir\u003d%s\u0027 % (url, dir)"},{"line_number":140,"context_line":""},{"line_number":141,"context_line":"        for image in paginate(url, page_size, limit):"},{"line_number":142,"context_line":"            yield image"}],"source_content_type":"text/x-python","patch_set":11,"id":"9a80dd14_6e3722b1","line":139,"updated":"2015-03-11 20:19:11.000000000","message":"All of this handling for old-style sort params can be moved into an else: clause from line 121 (\"if \u0027sort\u0027 in kwargs:\") above. There\u0027s no point to doing all of this if we know that we\u0027re using new-style sort params.","commit_id":"786c3b7485b8230326af3c416af2b1dfd9b81404"},{"author":{"_account_id":11391,"name":"Mikhail Fedosin","email":"mfedosin@redhat.com","username":"fedosinme"},"change_message_id":"d0c69960763c5ed37d676007e321137709b69344","unresolved":false,"context_lines":[{"line_number":136,"context_line":"            url \u003d \u0027%s\u0026sort_key\u003d%s\u0027 % (url, key)"},{"line_number":137,"context_line":""},{"line_number":138,"context_line":"        for dir in sort_dir:"},{"line_number":139,"context_line":"            url \u003d \u0027%s\u0026sort_dir\u003d%s\u0027 % (url, dir)"},{"line_number":140,"context_line":""},{"line_number":141,"context_line":"        for image in paginate(url, page_size, limit):"},{"line_number":142,"context_line":"            yield image"}],"source_content_type":"text/x-python","patch_set":11,"id":"9a80dd14_e34a2982","line":139,"in_reply_to":"9a80dd14_6e3722b1","updated":"2015-03-12 13:09:25.000000000","message":"Done","commit_id":"786c3b7485b8230326af3c416af2b1dfd9b81404"},{"author":{"_account_id":10559,"name":"Steven Kaufer","email":"kaufer@us.ibm.com","username":"kaufer"},"change_message_id":"e68dcbc2358ae927b9b2d86ec807bc8384408d2f","unresolved":false,"context_lines":[{"line_number":119,"context_line":"            url \u003d \u0027%s\u0026%s\u0027 % (url, parse.urlencode(param))"},{"line_number":120,"context_line":""},{"line_number":121,"context_line":"        if \u0027sort\u0027 in kwargs:"},{"line_number":122,"context_line":"            if \u0027sort_key\u0027 in kwargs or \u0027sort_dir\u0027 in kwargs:"},{"line_number":123,"context_line":"                raise exc.HTTPBadRequest(\"Old and new sorting syntax \""},{"line_number":124,"context_line":"                                         \"cannot be combined\")"},{"line_number":125,"context_line":"            url \u003d \u0027%s\u0026sort\u003d%s\u0027 % (url, kwargs[\u0027sort\u0027])"}],"source_content_type":"text/x-python","patch_set":14,"id":"9a80dd14_b0f8357d","line":122,"updated":"2015-03-13 14:20:34.000000000","message":"Is there a UT for this exception?","commit_id":"6cd83b6dc684604f8e4b691ca6c7a23939be7689"},{"author":{"_account_id":11391,"name":"Mikhail Fedosin","email":"mfedosin@redhat.com","username":"fedosinme"},"change_message_id":"e3e5b5c013ec1862687d44c75fda2d9fd767d30a","unresolved":false,"context_lines":[{"line_number":119,"context_line":"            url \u003d \u0027%s\u0026%s\u0027 % (url, parse.urlencode(param))"},{"line_number":120,"context_line":""},{"line_number":121,"context_line":"        if \u0027sort\u0027 in kwargs:"},{"line_number":122,"context_line":"            if \u0027sort_key\u0027 in kwargs or \u0027sort_dir\u0027 in kwargs:"},{"line_number":123,"context_line":"                raise exc.HTTPBadRequest(\"Old and new sorting syntax \""},{"line_number":124,"context_line":"                                         \"cannot be combined\")"},{"line_number":125,"context_line":"            url \u003d \u0027%s\u0026sort\u003d%s\u0027 % (url, kwargs[\u0027sort\u0027])"}],"source_content_type":"text/x-python","patch_set":14,"id":"9a80dd14_1accb388","line":122,"in_reply_to":"9a80dd14_b0f8357d","updated":"2015-03-13 17:40:35.000000000","message":"No, I added it with the latest ps.","commit_id":"6cd83b6dc684604f8e4b691ca6c7a23939be7689"},{"author":{"_account_id":10559,"name":"Steven Kaufer","email":"kaufer@us.ibm.com","username":"kaufer"},"change_message_id":"e68dcbc2358ae927b9b2d86ec807bc8384408d2f","unresolved":false,"context_lines":[{"line_number":128,"context_line":"            if isinstance(sort_key, six.string_types):"},{"line_number":129,"context_line":"                sort_key \u003d [sort_key]"},{"line_number":130,"context_line":""},{"line_number":131,"context_line":"            if len(sort_key) !\u003d len(sort_dir) and len(sort_dir) \u003e 1:"},{"line_number":132,"context_line":"                raise exc.HTTPBadRequest(\"Sorting keys number doesn\u0027t match\""},{"line_number":133,"context_line":"                                         \" with a number of sorting dirs\")"},{"line_number":134,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"9a80dd14_500a998a","line":131,"updated":"2015-03-13 14:20:34.000000000","message":"Is there UT for this exception?","commit_id":"6cd83b6dc684604f8e4b691ca6c7a23939be7689"},{"author":{"_account_id":11391,"name":"Mikhail Fedosin","email":"mfedosin@redhat.com","username":"fedosinme"},"change_message_id":"e3e5b5c013ec1862687d44c75fda2d9fd767d30a","unresolved":false,"context_lines":[{"line_number":128,"context_line":"            if isinstance(sort_key, six.string_types):"},{"line_number":129,"context_line":"                sort_key \u003d [sort_key]"},{"line_number":130,"context_line":""},{"line_number":131,"context_line":"            if len(sort_key) !\u003d len(sort_dir) and len(sort_dir) \u003e 1:"},{"line_number":132,"context_line":"                raise exc.HTTPBadRequest(\"Sorting keys number doesn\u0027t match\""},{"line_number":133,"context_line":"                                         \" with a number of sorting dirs\")"},{"line_number":134,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"9a80dd14_bab1e702","line":131,"in_reply_to":"9a80dd14_500a998a","updated":"2015-03-13 17:40:35.000000000","message":"Yes, sir. It\u0027s called test_list_images_sort_dirs_fewer_than_keys in tests.v2.test_images","commit_id":"6cd83b6dc684604f8e4b691ca6c7a23939be7689"},{"author":{"_account_id":10559,"name":"Steven Kaufer","email":"kaufer@us.ibm.com","username":"kaufer"},"change_message_id":"64401516003255a1432b6b5a02250c4ae289da48","unresolved":false,"context_lines":[{"line_number":48,"context_line":"        return value"},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"    @staticmethod"},{"line_number":51,"context_line":"    def validate_sort_param(sortarg):"},{"line_number":52,"context_line":"        for sort_param in sortarg.strip().split(\u0027,\u0027):"},{"line_number":53,"context_line":"            key, _sep, dir \u003d sort_param.partition(\u0027:\u0027)"},{"line_number":54,"context_line":"            if dir and dir not in SORT_DIR_VALUES:"}],"source_content_type":"text/x-python","patch_set":16,"id":"9a80dd14_38a7baa8","line":51,"updated":"2015-03-13 19:48:26.000000000","message":"Can you add doc for this function?","commit_id":"ae4ea60e0dcf5751c63b4b652f20bf9772aa2bef"},{"author":{"_account_id":11391,"name":"Mikhail Fedosin","email":"mfedosin@redhat.com","username":"fedosinme"},"change_message_id":"9b9a40044839d34ca1f3ef4a4dda6302fa99d717","unresolved":false,"context_lines":[{"line_number":48,"context_line":"        return value"},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"    @staticmethod"},{"line_number":51,"context_line":"    def validate_sort_param(sortarg):"},{"line_number":52,"context_line":"        for sort_param in sortarg.strip().split(\u0027,\u0027):"},{"line_number":53,"context_line":"            key, _sep, dir \u003d sort_param.partition(\u0027:\u0027)"},{"line_number":54,"context_line":"            if dir and dir not in SORT_DIR_VALUES:"}],"source_content_type":"text/x-python","patch_set":16,"id":"9a80dd14_bd6e0efe","line":51,"in_reply_to":"9a80dd14_38a7baa8","updated":"2015-03-16 12:31:33.000000000","message":"Yes, sure! And also I think it should be a private method.","commit_id":"ae4ea60e0dcf5751c63b4b652f20bf9772aa2bef"},{"author":{"_account_id":11391,"name":"Mikhail Fedosin","email":"mfedosin@redhat.com","username":"fedosinme"},"change_message_id":"9b9a40044839d34ca1f3ef4a4dda6302fa99d717","unresolved":false,"context_lines":[{"line_number":62,"context_line":"                       \u0027 It must be one of the following: %(available)s.\u0027"},{"line_number":63,"context_line":"                       ) % {\u0027sort_key\u0027: key,"},{"line_number":64,"context_line":"                            \u0027available\u0027: \u0027, \u0027.join(SORT_KEY_VALUES)}"},{"line_number":65,"context_line":"                utils.exit(msg)"},{"line_number":66,"context_line":"        return sortarg"},{"line_number":67,"context_line":""},{"line_number":68,"context_line":"    def list(self, **kwargs):"}],"source_content_type":"text/x-python","patch_set":16,"id":"9a80dd14_a9333060","line":65,"updated":"2015-03-16 12:31:33.000000000","message":"btw, since we moved this method here here must be an exception, not an \u0027exit\u0027","commit_id":"ae4ea60e0dcf5751c63b4b652f20bf9772aa2bef"},{"author":{"_account_id":10559,"name":"Steven Kaufer","email":"kaufer@us.ibm.com","username":"kaufer"},"change_message_id":"64401516003255a1432b6b5a02250c4ae289da48","unresolved":false,"context_lines":[{"line_number":63,"context_line":"                       ) % {\u0027sort_key\u0027: key,"},{"line_number":64,"context_line":"                            \u0027available\u0027: \u0027, \u0027.join(SORT_KEY_VALUES)}"},{"line_number":65,"context_line":"                utils.exit(msg)"},{"line_number":66,"context_line":"        return sortarg"},{"line_number":67,"context_line":""},{"line_number":68,"context_line":"    def list(self, **kwargs):"},{"line_number":69,"context_line":"        \"\"\"Retrieve a listing of Image objects"}],"source_content_type":"text/x-python","patch_set":16,"id":"9a80dd14_f8a0c291","line":66,"updated":"2015-03-13 19:48:26.000000000","message":"Is there a reason that this function returns something? I would assume that a \"validate\" function either raises an exception or not.","commit_id":"ae4ea60e0dcf5751c63b4b652f20bf9772aa2bef"},{"author":{"_account_id":11391,"name":"Mikhail Fedosin","email":"mfedosin@redhat.com","username":"fedosinme"},"change_message_id":"9b9a40044839d34ca1f3ef4a4dda6302fa99d717","unresolved":false,"context_lines":[{"line_number":63,"context_line":"                       ) % {\u0027sort_key\u0027: key,"},{"line_number":64,"context_line":"                            \u0027available\u0027: \u0027, \u0027.join(SORT_KEY_VALUES)}"},{"line_number":65,"context_line":"                utils.exit(msg)"},{"line_number":66,"context_line":"        return sortarg"},{"line_number":67,"context_line":""},{"line_number":68,"context_line":"    def list(self, **kwargs):"},{"line_number":69,"context_line":"        \"\"\"Retrieve a listing of Image objects"}],"source_content_type":"text/x-python","patch_set":16,"id":"9a80dd14_ddb10290","line":66,"in_reply_to":"9a80dd14_f8a0c291","updated":"2015-03-16 12:31:33.000000000","message":"I use this practice from the server: https://github.com/openstack/glance/blob/master/glance/api/v2/images.py#L540 Lines 540-575\n\nNot to interfere with these things, let it return a value.","commit_id":"ae4ea60e0dcf5751c63b4b652f20bf9772aa2bef"},{"author":{"_account_id":10559,"name":"Steven Kaufer","email":"kaufer@us.ibm.com","username":"kaufer"},"change_message_id":"64401516003255a1432b6b5a02250c4ae289da48","unresolved":false,"context_lines":[{"line_number":140,"context_line":""},{"line_number":141,"context_line":"        if \u0027sort\u0027 in kwargs:"},{"line_number":142,"context_line":"            if \u0027sort_key\u0027 in kwargs or \u0027sort_dir\u0027 in kwargs:"},{"line_number":143,"context_line":"                raise exc.HTTPBadRequest(\"Old and new sorting syntax \""},{"line_number":144,"context_line":"                                         \"cannot be combined\")"},{"line_number":145,"context_line":"            url \u003d \u0027%s\u0026sort\u003d%s\u0027 % (url, self.validate_sort_param("},{"line_number":146,"context_line":"                kwargs[\u0027sort\u0027]))"}],"source_content_type":"text/x-python","patch_set":16,"id":"9a80dd14_98fb467a","line":143,"updated":"2015-03-13 19:48:26.000000000","message":"Sorry, I missed this message last time.\n\nCould you be more descriptive?  Something like \"The \u0027sort\u0027 argument is not supported with \u0027sort_key\u0027 or \u0027sort_dir\u0027\".\n\nUnless we doc what \"old\" and \"new\" is (which I cannot find), the user will not have the context to understand this message.","commit_id":"ae4ea60e0dcf5751c63b4b652f20bf9772aa2bef"},{"author":{"_account_id":11391,"name":"Mikhail Fedosin","email":"mfedosin@redhat.com","username":"fedosinme"},"change_message_id":"9b9a40044839d34ca1f3ef4a4dda6302fa99d717","unresolved":false,"context_lines":[{"line_number":140,"context_line":""},{"line_number":141,"context_line":"        if \u0027sort\u0027 in kwargs:"},{"line_number":142,"context_line":"            if \u0027sort_key\u0027 in kwargs or \u0027sort_dir\u0027 in kwargs:"},{"line_number":143,"context_line":"                raise exc.HTTPBadRequest(\"Old and new sorting syntax \""},{"line_number":144,"context_line":"                                         \"cannot be combined\")"},{"line_number":145,"context_line":"            url \u003d \u0027%s\u0026sort\u003d%s\u0027 % (url, self.validate_sort_param("},{"line_number":146,"context_line":"                kwargs[\u0027sort\u0027]))"}],"source_content_type":"text/x-python","patch_set":16,"id":"9a80dd14_c9b144e1","line":143,"in_reply_to":"9a80dd14_98fb467a","updated":"2015-03-16 12:31:33.000000000","message":"Done","commit_id":"ae4ea60e0dcf5751c63b4b652f20bf9772aa2bef"},{"author":{"_account_id":10559,"name":"Steven Kaufer","email":"kaufer@us.ibm.com","username":"kaufer"},"change_message_id":"64401516003255a1432b6b5a02250c4ae289da48","unresolved":false,"context_lines":[{"line_number":146,"context_line":"                kwargs[\u0027sort\u0027]))"},{"line_number":147,"context_line":"        else:"},{"line_number":148,"context_line":"            sort_dir \u003d self._wrap(kwargs.get(\u0027sort_dir\u0027, []))"},{"line_number":149,"context_line":""},{"line_number":150,"context_line":"            sort_key \u003d self._wrap(kwargs.get(\u0027sort_key\u0027, []))"},{"line_number":151,"context_line":""},{"line_number":152,"context_line":"            if len(sort_key) !\u003d len(sort_dir) and len(sort_dir) \u003e 1:"}],"source_content_type":"text/x-python","patch_set":16,"id":"9a80dd14_f8f52283","line":149,"updated":"2015-03-13 19:48:26.000000000","message":"nit: Unnecessary space","commit_id":"ae4ea60e0dcf5751c63b4b652f20bf9772aa2bef"},{"author":{"_account_id":11391,"name":"Mikhail Fedosin","email":"mfedosin@redhat.com","username":"fedosinme"},"change_message_id":"9b9a40044839d34ca1f3ef4a4dda6302fa99d717","unresolved":false,"context_lines":[{"line_number":146,"context_line":"                kwargs[\u0027sort\u0027]))"},{"line_number":147,"context_line":"        else:"},{"line_number":148,"context_line":"            sort_dir \u003d self._wrap(kwargs.get(\u0027sort_dir\u0027, []))"},{"line_number":149,"context_line":""},{"line_number":150,"context_line":"            sort_key \u003d self._wrap(kwargs.get(\u0027sort_key\u0027, []))"},{"line_number":151,"context_line":""},{"line_number":152,"context_line":"            if len(sort_key) !\u003d len(sort_dir) and len(sort_dir) \u003e 1:"}],"source_content_type":"text/x-python","patch_set":16,"id":"9a80dd14_98523811","line":149,"in_reply_to":"9a80dd14_f8f52283","updated":"2015-03-16 12:31:33.000000000","message":"Done","commit_id":"ae4ea60e0dcf5751c63b4b652f20bf9772aa2bef"},{"author":{"_account_id":10559,"name":"Steven Kaufer","email":"kaufer@us.ibm.com","username":"kaufer"},"change_message_id":"64401516003255a1432b6b5a02250c4ae289da48","unresolved":false,"context_lines":[{"line_number":150,"context_line":"            sort_key \u003d self._wrap(kwargs.get(\u0027sort_key\u0027, []))"},{"line_number":151,"context_line":""},{"line_number":152,"context_line":"            if len(sort_key) !\u003d len(sort_dir) and len(sort_dir) \u003e 1:"},{"line_number":153,"context_line":"                raise exc.HTTPBadRequest(\"Sorting keys number doesn\u0027t match\""},{"line_number":154,"context_line":"                                         \" with a number of sorting dirs\")"},{"line_number":155,"context_line":""},{"line_number":156,"context_line":"            for key in sort_key:"}],"source_content_type":"text/x-python","patch_set":16,"id":"9a80dd14_9857c659","line":153,"updated":"2015-03-13 19:48:26.000000000","message":"Sorry, missed this message as well.\n\nSo this message seems odd to me because someone could:\n- Invoke this with a 1 dir and 3 multiple keys (which would pass)\n- Add a 2nd dir only (thus 2 dirs and 3 keys) and it would fail because the number of dirs does not match the number of keys.\n\nHowever, from to the message text, the first attempt (dir size of 1 and key size of 3) have also failed.\n\nCan you adjust the message text to address this?","commit_id":"ae4ea60e0dcf5751c63b4b652f20bf9772aa2bef"},{"author":{"_account_id":11391,"name":"Mikhail Fedosin","email":"mfedosin@redhat.com","username":"fedosinme"},"change_message_id":"9b9a40044839d34ca1f3ef4a4dda6302fa99d717","unresolved":false,"context_lines":[{"line_number":150,"context_line":"            sort_key \u003d self._wrap(kwargs.get(\u0027sort_key\u0027, []))"},{"line_number":151,"context_line":""},{"line_number":152,"context_line":"            if len(sort_key) !\u003d len(sort_dir) and len(sort_dir) \u003e 1:"},{"line_number":153,"context_line":"                raise exc.HTTPBadRequest(\"Sorting keys number doesn\u0027t match\""},{"line_number":154,"context_line":"                                         \" with a number of sorting dirs\")"},{"line_number":155,"context_line":""},{"line_number":156,"context_line":"            for key in sort_key:"}],"source_content_type":"text/x-python","patch_set":16,"id":"9a80dd14_331b2f74","line":153,"in_reply_to":"9a80dd14_9857c659","updated":"2015-03-16 12:31:33.000000000","message":"Done","commit_id":"ae4ea60e0dcf5751c63b4b652f20bf9772aa2bef"},{"author":{"_account_id":10559,"name":"Steven Kaufer","email":"kaufer@us.ibm.com","username":"kaufer"},"change_message_id":"fbf9e730c7446604033ee12016714d81acecfff0","unresolved":false,"context_lines":[{"line_number":61,"context_line":"                       \u0027 It must be one of the following: %(available)s.\u0027"},{"line_number":62,"context_line":"                       ) % {\u0027sort_dir\u0027: dir,"},{"line_number":63,"context_line":"                            \u0027available\u0027: \u0027, \u0027.join(SORT_DIR_VALUES)}"},{"line_number":64,"context_line":"                raise exc.HTTPBadRequest(msg)"},{"line_number":65,"context_line":"            if key not in SORT_KEY_VALUES:"},{"line_number":66,"context_line":"                msg \u003d (\u0027Invalid sort key: %(sort_key)s.\u0027"},{"line_number":67,"context_line":"                       \u0027 It must be one of the following: %(available)s.\u0027"}],"source_content_type":"text/x-python","patch_set":17,"id":"9a80dd14_610a2cd3","line":64,"updated":"2015-03-16 14:02:02.000000000","message":"I see that you changed this to raise an exception in the last iteration.\n\nCan you add UT to cover these 2 exceptions? Ideally UT would have failed when utils.exit was invoked instead of having an exception raised.","commit_id":"64863a2c9b42ead4c6cb0572e740efcdba3178c0"},{"author":{"_account_id":11391,"name":"Mikhail Fedosin","email":"mfedosin@redhat.com","username":"fedosinme"},"change_message_id":"aeac118d081025cfd9c36aba81b98712289c772b","unresolved":false,"context_lines":[{"line_number":61,"context_line":"                       \u0027 It must be one of the following: %(available)s.\u0027"},{"line_number":62,"context_line":"                       ) % {\u0027sort_dir\u0027: dir,"},{"line_number":63,"context_line":"                            \u0027available\u0027: \u0027, \u0027.join(SORT_DIR_VALUES)}"},{"line_number":64,"context_line":"                raise exc.HTTPBadRequest(msg)"},{"line_number":65,"context_line":"            if key not in SORT_KEY_VALUES:"},{"line_number":66,"context_line":"                msg \u003d (\u0027Invalid sort key: %(sort_key)s.\u0027"},{"line_number":67,"context_line":"                       \u0027 It must be one of the following: %(available)s.\u0027"}],"source_content_type":"text/x-python","patch_set":17,"id":"9a80dd14_e069ad8c","line":64,"in_reply_to":"9a80dd14_610a2cd3","updated":"2015-03-16 16:33:10.000000000","message":"Done","commit_id":"64863a2c9b42ead4c6cb0572e740efcdba3178c0"},{"author":{"_account_id":10559,"name":"Steven Kaufer","email":"kaufer@us.ibm.com","username":"kaufer"},"change_message_id":"fbf9e730c7446604033ee12016714d81acecfff0","unresolved":false,"context_lines":[{"line_number":146,"context_line":"        if \u0027sort\u0027 in kwargs:"},{"line_number":147,"context_line":"            if \u0027sort_key\u0027 in kwargs or \u0027sort_dir\u0027 in kwargs:"},{"line_number":148,"context_line":"                raise exc.HTTPBadRequest(\"The \u0027sort\u0027 argument is not supported\""},{"line_number":149,"context_line":"                                         \" with \u0027sort_key\u0027 or \u0027sort_dir\u0027\")"},{"line_number":150,"context_line":"            url \u003d \u0027%s\u0026sort\u003d%s\u0027 % (url,"},{"line_number":151,"context_line":"                                  self._validate_sort_param("},{"line_number":152,"context_line":"                                      kwargs[\u0027sort\u0027]))"}],"source_content_type":"text/x-python","patch_set":17,"id":"9a80dd14_21c1144e","line":149,"updated":"2015-03-16 14:02:02.000000000","message":"I believe that you want a trailing period.","commit_id":"64863a2c9b42ead4c6cb0572e740efcdba3178c0"},{"author":{"_account_id":11391,"name":"Mikhail Fedosin","email":"mfedosin@redhat.com","username":"fedosinme"},"change_message_id":"aeac118d081025cfd9c36aba81b98712289c772b","unresolved":false,"context_lines":[{"line_number":146,"context_line":"        if \u0027sort\u0027 in kwargs:"},{"line_number":147,"context_line":"            if \u0027sort_key\u0027 in kwargs or \u0027sort_dir\u0027 in kwargs:"},{"line_number":148,"context_line":"                raise exc.HTTPBadRequest(\"The \u0027sort\u0027 argument is not supported\""},{"line_number":149,"context_line":"                                         \" with \u0027sort_key\u0027 or \u0027sort_dir\u0027\")"},{"line_number":150,"context_line":"            url \u003d \u0027%s\u0026sort\u003d%s\u0027 % (url,"},{"line_number":151,"context_line":"                                  self._validate_sort_param("},{"line_number":152,"context_line":"                                      kwargs[\u0027sort\u0027]))"}],"source_content_type":"text/x-python","patch_set":17,"id":"9a80dd14_406359b0","line":149,"in_reply_to":"9a80dd14_21c1144e","updated":"2015-03-16 16:33:10.000000000","message":"Done","commit_id":"64863a2c9b42ead4c6cb0572e740efcdba3178c0"},{"author":{"_account_id":10559,"name":"Steven Kaufer","email":"kaufer@us.ibm.com","username":"kaufer"},"change_message_id":"fbf9e730c7446604033ee12016714d81acecfff0","unresolved":false,"context_lines":[{"line_number":160,"context_line":"                    \"provide only one default sort \""},{"line_number":161,"context_line":"                    \"direction for each key or make sure \""},{"line_number":162,"context_line":"                    \"that sorting keys number matches with a \""},{"line_number":163,"context_line":"                    \"number of sorting directions.\")"},{"line_number":164,"context_line":"            for key in sort_key:"},{"line_number":165,"context_line":"                url \u003d \u0027%s\u0026sort_key\u003d%s\u0027 % (url, key)"},{"line_number":166,"context_line":""}],"source_content_type":"text/x-python","patch_set":17,"id":"9a80dd14_c196784b","line":163,"updated":"2015-03-16 14:02:02.000000000","message":"alt: Either provide a single sort direction or an equal number of sort keys and sort directions.","commit_id":"64863a2c9b42ead4c6cb0572e740efcdba3178c0"},{"author":{"_account_id":11391,"name":"Mikhail Fedosin","email":"mfedosin@redhat.com","username":"fedosinme"},"change_message_id":"aeac118d081025cfd9c36aba81b98712289c772b","unresolved":false,"context_lines":[{"line_number":160,"context_line":"                    \"provide only one default sort \""},{"line_number":161,"context_line":"                    \"direction for each key or make sure \""},{"line_number":162,"context_line":"                    \"that sorting keys number matches with a \""},{"line_number":163,"context_line":"                    \"number of sorting directions.\")"},{"line_number":164,"context_line":"            for key in sort_key:"},{"line_number":165,"context_line":"                url \u003d \u0027%s\u0026sort_key\u003d%s\u0027 % (url, key)"},{"line_number":166,"context_line":""}],"source_content_type":"text/x-python","patch_set":17,"id":"9a80dd14_8059d1fe","line":163,"in_reply_to":"9a80dd14_c196784b","updated":"2015-03-16 16:33:10.000000000","message":"Done","commit_id":"64863a2c9b42ead4c6cb0572e740efcdba3178c0"}],"glanceclient/v2/shell.py":[{"author":{"_account_id":12000,"name":"Ian Cordasco","email":"sigmavirus24@gmail.com","username":"sigmavirus24"},"change_message_id":"48374f88250c93385a6dac52b9716581867c502f","unresolved":false,"context_lines":[{"line_number":114,"context_line":"           choices\u003dglanceclient.v2.images.SORT_DIR_VALUES,"},{"line_number":115,"context_line":"           help\u003d\u0027Sort image list in specified directions.\u0027)"},{"line_number":116,"context_line":"@utils.arg(\u0027--sort\u0027, metavar\u003d\u0027\u003cSORT\u003e\u0027,"},{"line_number":117,"context_line":"           choices\u003dglanceclient.v2.images.SORT_DIR_VALUES,"},{"line_number":118,"context_line":"           help\u003d\u0027Sort image list in specified keys and directions.\u0027)"},{"line_number":119,"context_line":"def do_image_list(gc, args):"},{"line_number":120,"context_line":"    \"\"\"List images you can access.\"\"\""}],"source_content_type":"text/x-python","patch_set":1,"id":"1a930d6b_04130867","line":117,"updated":"2015-01-21 18:49:15.000000000","message":"This seems off. People are going to be doing\n\n    glance list-images --sort\u003dcreated_at:asc\n\nNot\n\n    glance list-images --sort\u003dasc\n\nYou probably want\n\n    i \u003d itertools.product(glanceclient.v2.images.SORT_KEY_VALUES,\n                          glanceclient.v2.images.SORT_DIR_VALUES)\n    choices \u003d [\u0027:\u0027.join(item) for item in i]","commit_id":"25f83c18bfc158fce172d38f881b9ed721770505"},{"author":{"_account_id":11391,"name":"Mikhail Fedosin","email":"mfedosin@redhat.com","username":"fedosinme"},"change_message_id":"bedbbe1b72f9f811e977a98c25d0e0c67944cc7e","unresolved":false,"context_lines":[{"line_number":114,"context_line":"           choices\u003dglanceclient.v2.images.SORT_DIR_VALUES,"},{"line_number":115,"context_line":"           help\u003d\u0027Sort image list in specified directions.\u0027)"},{"line_number":116,"context_line":"@utils.arg(\u0027--sort\u0027, metavar\u003d\u0027\u003cSORT\u003e\u0027,"},{"line_number":117,"context_line":"           choices\u003dglanceclient.v2.images.SORT_DIR_VALUES,"},{"line_number":118,"context_line":"           help\u003d\u0027Sort image list in specified keys and directions.\u0027)"},{"line_number":119,"context_line":"def do_image_list(gc, args):"},{"line_number":120,"context_line":"    \"\"\"List images you can access.\"\"\""}],"source_content_type":"text/x-python","patch_set":1,"id":"1a930d6b_9d83ab03","line":117,"in_reply_to":"1a930d6b_04130867","updated":"2015-01-22 14:59:19.000000000","message":"Sorry, my bad, the line has been copypasted from the argument above. It should not be here.","commit_id":"25f83c18bfc158fce172d38f881b9ed721770505"},{"author":{"_account_id":12000,"name":"Ian Cordasco","email":"sigmavirus24@gmail.com","username":"sigmavirus24"},"change_message_id":"48374f88250c93385a6dac52b9716581867c502f","unresolved":false,"context_lines":[{"line_number":132,"context_line":"    if args.page_size is not None:"},{"line_number":133,"context_line":"        kwargs[\u0027page_size\u0027] \u003d args.page_size"},{"line_number":134,"context_line":""},{"line_number":135,"context_line":"    if hasattr(args, \u0027sort\u0027):"},{"line_number":136,"context_line":"        if args.sort_key or args.sort_dir:"},{"line_number":137,"context_line":"            utils.exit(\"Old and new sorting syntax cannot be combined\")"},{"line_number":138,"context_line":"        kwargs[\u0027sort\u0027] \u003d args.sort"}],"source_content_type":"text/x-python","patch_set":1,"id":"1a930d6b_982678b9","line":135,"updated":"2015-01-21 18:49:15.000000000","message":"I\u0027m not sure how I feel about having this logic repeated in so many places. \u003d/","commit_id":"25f83c18bfc158fce172d38f881b9ed721770505"},{"author":{"_account_id":11391,"name":"Mikhail Fedosin","email":"mfedosin@redhat.com","username":"fedosinme"},"change_message_id":"bedbbe1b72f9f811e977a98c25d0e0c67944cc7e","unresolved":false,"context_lines":[{"line_number":132,"context_line":"    if args.page_size is not None:"},{"line_number":133,"context_line":"        kwargs[\u0027page_size\u0027] \u003d args.page_size"},{"line_number":134,"context_line":""},{"line_number":135,"context_line":"    if hasattr(args, \u0027sort\u0027):"},{"line_number":136,"context_line":"        if args.sort_key or args.sort_dir:"},{"line_number":137,"context_line":"            utils.exit(\"Old and new sorting syntax cannot be combined\")"},{"line_number":138,"context_line":"        kwargs[\u0027sort\u0027] \u003d args.sort"}],"source_content_type":"text/x-python","patch_set":1,"id":"1a930d6b_7dba7fc1","line":135,"in_reply_to":"1a930d6b_982678b9","updated":"2015-01-22 14:59:19.000000000","message":"I agree with you, this code is duplicated and should be removed.","commit_id":"25f83c18bfc158fce172d38f881b9ed721770505"},{"author":{"_account_id":10559,"name":"Steven Kaufer","email":"kaufer@us.ibm.com","username":"kaufer"},"change_message_id":"e68dcbc2358ae927b9b2d86ec807bc8384408d2f","unresolved":false,"context_lines":[{"line_number":132,"context_line":"@utils.arg(\u0027--sort-dir\u0027, default\u003d[], action\u003d\u0027append\u0027,"},{"line_number":133,"context_line":"           choices\u003dglanceclient.v2.images.SORT_DIR_VALUES,"},{"line_number":134,"context_line":"           help\u003d\u0027Sort image list in specified directions.\u0027)"},{"line_number":135,"context_line":"@utils.arg(\u0027--sort\u0027, metavar\u003d\u0027\u003cSORT\u003e\u0027, default\u003dNone, type\u003dstr,"},{"line_number":136,"context_line":"           help\u003d\u0027Sort image list in specified keys and directions.\u0027)"},{"line_number":137,"context_line":"def do_image_list(gc, args):"},{"line_number":138,"context_line":"    \"\"\"List images you can access.\"\"\""}],"source_content_type":"text/x-python","patch_set":14,"id":"9a80dd14_508e192f","line":135,"updated":"2015-03-13 14:20:34.000000000","message":"Would it be possible to make the help text more consistent with nova and cinder (that also implement this syntax):\n\nhttps://github.com/openstack/python-novaclient/blob/master/novaclient/v2/shell.py#L1316\n\nhttps://github.com/openstack/python-cinderclient/blob/master/cinderclient/v2/shell.py#L191","commit_id":"6cd83b6dc684604f8e4b691ca6c7a23939be7689"},{"author":{"_account_id":11391,"name":"Mikhail Fedosin","email":"mfedosin@redhat.com","username":"fedosinme"},"change_message_id":"e3e5b5c013ec1862687d44c75fda2d9fd767d30a","unresolved":false,"context_lines":[{"line_number":132,"context_line":"@utils.arg(\u0027--sort-dir\u0027, default\u003d[], action\u003d\u0027append\u0027,"},{"line_number":133,"context_line":"           choices\u003dglanceclient.v2.images.SORT_DIR_VALUES,"},{"line_number":134,"context_line":"           help\u003d\u0027Sort image list in specified directions.\u0027)"},{"line_number":135,"context_line":"@utils.arg(\u0027--sort\u0027, metavar\u003d\u0027\u003cSORT\u003e\u0027, default\u003dNone, type\u003dstr,"},{"line_number":136,"context_line":"           help\u003d\u0027Sort image list in specified keys and directions.\u0027)"},{"line_number":137,"context_line":"def do_image_list(gc, args):"},{"line_number":138,"context_line":"    \"\"\"List images you can access.\"\"\""}],"source_content_type":"text/x-python","patch_set":14,"id":"9a80dd14_3948a95b","line":135,"in_reply_to":"9a80dd14_508e192f","updated":"2015-03-13 17:40:35.000000000","message":"Done","commit_id":"6cd83b6dc684604f8e4b691ca6c7a23939be7689"},{"author":{"_account_id":10559,"name":"Steven Kaufer","email":"kaufer@us.ibm.com","username":"kaufer"},"change_message_id":"5f1e1304a047d3efb4573d7ff4d1caeb5c14778d","unresolved":false,"context_lines":[{"line_number":167,"context_line":"    utils.print_list(images, columns)"},{"line_number":168,"context_line":""},{"line_number":169,"context_line":""},{"line_number":170,"context_line":"def validate_sort_param(sort):"},{"line_number":171,"context_line":"    for sort_param in sort.strip().split(\u0027,\u0027):"},{"line_number":172,"context_line":"        key, _sep, dir \u003d sort_param.partition(\u0027:\u0027)"},{"line_number":173,"context_line":"        if dir and dir not in images.SORT_DIR_VALUES:"}],"source_content_type":"text/x-python","patch_set":15,"id":"9a80dd14_3100bdaa","line":170,"updated":"2015-03-13 18:07:05.000000000","message":"Did you consider moving the validation into the image.py module instead?  That way anyone else the API directly (instead of just the shell) would benefit?","commit_id":"8e5a1fa0458fde0d72749b4adf7b963450541da4"},{"author":{"_account_id":11391,"name":"Mikhail Fedosin","email":"mfedosin@redhat.com","username":"fedosinme"},"change_message_id":"7f4c6f3baaa380feb440694306a954bfbdb73e98","unresolved":false,"context_lines":[{"line_number":167,"context_line":"    utils.print_list(images, columns)"},{"line_number":168,"context_line":""},{"line_number":169,"context_line":""},{"line_number":170,"context_line":"def validate_sort_param(sort):"},{"line_number":171,"context_line":"    for sort_param in sort.strip().split(\u0027,\u0027):"},{"line_number":172,"context_line":"        key, _sep, dir \u003d sort_param.partition(\u0027:\u0027)"},{"line_number":173,"context_line":"        if dir and dir not in images.SORT_DIR_VALUES:"}],"source_content_type":"text/x-python","patch_set":15,"id":"9a80dd14_c2f5d1ed","line":170,"in_reply_to":"9a80dd14_3100bdaa","updated":"2015-03-13 18:50:19.000000000","message":"Done","commit_id":"8e5a1fa0458fde0d72749b4adf7b963450541da4"},{"author":{"_account_id":10559,"name":"Steven Kaufer","email":"kaufer@us.ibm.com","username":"kaufer"},"change_message_id":"5f1e1304a047d3efb4573d7ff4d1caeb5c14778d","unresolved":false,"context_lines":[{"line_number":171,"context_line":"    for sort_param in sort.strip().split(\u0027,\u0027):"},{"line_number":172,"context_line":"        key, _sep, dir \u003d sort_param.partition(\u0027:\u0027)"},{"line_number":173,"context_line":"        if dir and dir not in images.SORT_DIR_VALUES:"},{"line_number":174,"context_line":"            msg \u003d \u0027Invalid sort direction: %s\u0027 % dir"},{"line_number":175,"context_line":"            utils.exit(msg)"},{"line_number":176,"context_line":"        if key not in images.SORT_KEY_VALUES:"},{"line_number":177,"context_line":"            msg \u003d \u0027Invalid sort key: %(sort_key)s. It must be one of the\u0027 \\"}],"source_content_type":"text/x-python","patch_set":15,"id":"9a80dd14_f1546555","line":174,"updated":"2015-03-13 18:07:05.000000000","message":"Can you make this message consistent with the one below?  Specifically, including the valid values in the message.","commit_id":"8e5a1fa0458fde0d72749b4adf7b963450541da4"},{"author":{"_account_id":11391,"name":"Mikhail Fedosin","email":"mfedosin@redhat.com","username":"fedosinme"},"change_message_id":"7f4c6f3baaa380feb440694306a954bfbdb73e98","unresolved":false,"context_lines":[{"line_number":171,"context_line":"    for sort_param in sort.strip().split(\u0027,\u0027):"},{"line_number":172,"context_line":"        key, _sep, dir \u003d sort_param.partition(\u0027:\u0027)"},{"line_number":173,"context_line":"        if dir and dir not in images.SORT_DIR_VALUES:"},{"line_number":174,"context_line":"            msg \u003d \u0027Invalid sort direction: %s\u0027 % dir"},{"line_number":175,"context_line":"            utils.exit(msg)"},{"line_number":176,"context_line":"        if key not in images.SORT_KEY_VALUES:"},{"line_number":177,"context_line":"            msg \u003d \u0027Invalid sort key: %(sort_key)s. It must be one of the\u0027 \\"}],"source_content_type":"text/x-python","patch_set":15,"id":"9a80dd14_e2dd7571","line":174,"in_reply_to":"9a80dd14_f1546555","updated":"2015-03-13 18:50:19.000000000","message":"Done","commit_id":"8e5a1fa0458fde0d72749b4adf7b963450541da4"},{"author":{"_account_id":10559,"name":"Steven Kaufer","email":"kaufer@us.ibm.com","username":"kaufer"},"change_message_id":"5f1e1304a047d3efb4573d7ff4d1caeb5c14778d","unresolved":false,"context_lines":[{"line_number":174,"context_line":"            msg \u003d \u0027Invalid sort direction: %s\u0027 % dir"},{"line_number":175,"context_line":"            utils.exit(msg)"},{"line_number":176,"context_line":"        if key not in images.SORT_KEY_VALUES:"},{"line_number":177,"context_line":"            msg \u003d \u0027Invalid sort key: %(sort_key)s. It must be one of the\u0027 \\"},{"line_number":178,"context_line":"                  \u0027 following: %(available)s.\u0027 % \\"},{"line_number":179,"context_line":"                  {\u0027sort_key\u0027: key,"},{"line_number":180,"context_line":"                   \u0027available\u0027: \u0027, \u0027.join(images.SORT_KEY_VALUES)}"}],"source_content_type":"text/x-python","patch_set":15,"id":"9a80dd14_91a7a9bc","line":177,"updated":"2015-03-13 18:07:05.000000000","message":"Usually \\ are discouraged, can you use () to form this string?\n\nSomething like:\n\n    msg \u003d ((\u0027Invalid sort key: %(sort_key)s. It must be one of the\u0027\n            \u0027 following: %(available)s.\u0027) %\n            {\u0027sort_key\u0027: key,\n             \u0027available\u0027: \u0027, \u0027.join(images.SORT_KEY_VALUES)})","commit_id":"8e5a1fa0458fde0d72749b4adf7b963450541da4"},{"author":{"_account_id":11391,"name":"Mikhail Fedosin","email":"mfedosin@redhat.com","username":"fedosinme"},"change_message_id":"7f4c6f3baaa380feb440694306a954bfbdb73e98","unresolved":false,"context_lines":[{"line_number":174,"context_line":"            msg \u003d \u0027Invalid sort direction: %s\u0027 % dir"},{"line_number":175,"context_line":"            utils.exit(msg)"},{"line_number":176,"context_line":"        if key not in images.SORT_KEY_VALUES:"},{"line_number":177,"context_line":"            msg \u003d \u0027Invalid sort key: %(sort_key)s. It must be one of the\u0027 \\"},{"line_number":178,"context_line":"                  \u0027 following: %(available)s.\u0027 % \\"},{"line_number":179,"context_line":"                  {\u0027sort_key\u0027: key,"},{"line_number":180,"context_line":"                   \u0027available\u0027: \u0027, \u0027.join(images.SORT_KEY_VALUES)}"}],"source_content_type":"text/x-python","patch_set":15,"id":"9a80dd14_22e4ed3a","line":177,"in_reply_to":"9a80dd14_91a7a9bc","updated":"2015-03-13 18:50:19.000000000","message":"Done","commit_id":"8e5a1fa0458fde0d72749b4adf7b963450541da4"}]}
