)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":10559,"name":"Steven Kaufer","email":"kaufer@us.ibm.com","username":"kaufer"},"change_message_id":"16b21359e4c9a2fae379159c52776b09362b3c8e","unresolved":false,"context_lines":[{"line_number":13,"context_line":"par with the string type."},{"line_number":14,"context_line":"python-glanceclient support will be added in separate commit"},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"DocImpact"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"Change-Id: Ib43b53abfba7cb5789d916a014376cf38fc5245b"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":3,"id":"1a930d6b_58cb07a5","line":16,"updated":"2015-01-22 18:03:44.000000000","message":"Please also add the APIImpact flag.","commit_id":"c8e7c8cf929ade492f85d111e3129d4adb49097b"}],"glance/api/v2/images.py":[{"author":{"_account_id":12000,"name":"Ian Cordasco","email":"sigmavirus24@gmail.com","username":"sigmavirus24"},"change_message_id":"7b070658d96c17134f73780cebd017955a8c6193","unresolved":false,"context_lines":[{"line_number":625,"context_line":"            query_params[\u0027sort_key\u0027] \u003d [\u0027created_at\u0027]"},{"line_number":626,"context_line":""},{"line_number":627,"context_line":"        # NOTE(mfedosin): we have 3 options here:"},{"line_number":628,"context_line":"        # 1. sort_dir wasn\u0027t pass: we use default one - \u0027desc\u0027."},{"line_number":629,"context_line":"        # 2. Only one sort_dir was passed: use it for every sort_key"},{"line_number":630,"context_line":"        # in the list."},{"line_number":631,"context_line":"        # 3. Multiple sort_dirs was passed: consistently apply each one to"}],"source_content_type":"text/x-python","patch_set":1,"id":"3a961159_0c4f9e6b","line":628,"updated":"2015-01-20 18:16:23.000000000","message":"Nit: \"wasn\u0027t passed\"","commit_id":"abdfe3366d767e3c62e3cfe80b5c9382951512ef"},{"author":{"_account_id":12000,"name":"Ian Cordasco","email":"sigmavirus24@gmail.com","username":"sigmavirus24"},"change_message_id":"813bc2f295bb41b9b5679f22dcdaeec4a4760d25","unresolved":false,"context_lines":[{"line_number":625,"context_line":"            query_params[\u0027sort_key\u0027] \u003d [\u0027created_at\u0027]"},{"line_number":626,"context_line":""},{"line_number":627,"context_line":"        # NOTE(mfedosin): we have 3 options here:"},{"line_number":628,"context_line":"        # 1. sort_dir wasn\u0027t pass: we use default one - \u0027desc\u0027."},{"line_number":629,"context_line":"        # 2. Only one sort_dir was passed: use it for every sort_key"},{"line_number":630,"context_line":"        # in the list."},{"line_number":631,"context_line":"        # 3. Multiple sort_dirs was passed: consistently apply each one to"}],"source_content_type":"text/x-python","patch_set":1,"id":"1a930d6b_184a8d80","line":628,"in_reply_to":"1a930d6b_69e4b23b","updated":"2015-01-21 17:02:39.000000000","message":"You\u0027re welcome!  (I typo\u0027d welcome and considered leaving it for humor, but wasn\u0027t sure if it\u0027d be appreciated.)","commit_id":"abdfe3366d767e3c62e3cfe80b5c9382951512ef"},{"author":{"_account_id":11391,"name":"Mikhail Fedosin","email":"mfedosin@redhat.com","username":"fedosinme"},"change_message_id":"8294ecfe63e0f16e50dc2a3a40edc4cc4566b9af","unresolved":false,"context_lines":[{"line_number":625,"context_line":"            query_params[\u0027sort_key\u0027] \u003d [\u0027created_at\u0027]"},{"line_number":626,"context_line":""},{"line_number":627,"context_line":"        # NOTE(mfedosin): we have 3 options here:"},{"line_number":628,"context_line":"        # 1. sort_dir wasn\u0027t pass: we use default one - \u0027desc\u0027."},{"line_number":629,"context_line":"        # 2. Only one sort_dir was passed: use it for every sort_key"},{"line_number":630,"context_line":"        # in the list."},{"line_number":631,"context_line":"        # 3. Multiple sort_dirs was passed: consistently apply each one to"}],"source_content_type":"text/x-python","patch_set":1,"id":"1a930d6b_69e4b23b","line":628,"in_reply_to":"3a961159_0c4f9e6b","updated":"2015-01-21 13:24:03.000000000","message":"\"English, mf, do you speak it?\" :D\n\nThank, man!","commit_id":"abdfe3366d767e3c62e3cfe80b5c9382951512ef"},{"author":{"_account_id":12000,"name":"Ian Cordasco","email":"sigmavirus24@gmail.com","username":"sigmavirus24"},"change_message_id":"7b070658d96c17134f73780cebd017955a8c6193","unresolved":false,"context_lines":[{"line_number":628,"context_line":"        # 1. sort_dir wasn\u0027t pass: we use default one - \u0027desc\u0027."},{"line_number":629,"context_line":"        # 2. Only one sort_dir was passed: use it for every sort_key"},{"line_number":630,"context_line":"        # in the list."},{"line_number":631,"context_line":"        # 3. Multiple sort_dirs was passed: consistently apply each one to"},{"line_number":632,"context_line":"        # the corresponding sort_key."},{"line_number":633,"context_line":"        # If number of sort_dirs and sort_keys doesn\u0027t match then raise an"},{"line_number":634,"context_line":"        # exception."}],"source_content_type":"text/x-python","patch_set":1,"id":"3a961159_ec7092a9","line":631,"updated":"2015-01-20 18:16:23.000000000","message":"Nit: \"were passed\"","commit_id":"abdfe3366d767e3c62e3cfe80b5c9382951512ef"},{"author":{"_account_id":11391,"name":"Mikhail Fedosin","email":"mfedosin@redhat.com","username":"fedosinme"},"change_message_id":"8294ecfe63e0f16e50dc2a3a40edc4cc4566b9af","unresolved":false,"context_lines":[{"line_number":628,"context_line":"        # 1. sort_dir wasn\u0027t pass: we use default one - \u0027desc\u0027."},{"line_number":629,"context_line":"        # 2. Only one sort_dir was passed: use it for every sort_key"},{"line_number":630,"context_line":"        # in the list."},{"line_number":631,"context_line":"        # 3. Multiple sort_dirs was passed: consistently apply each one to"},{"line_number":632,"context_line":"        # the corresponding sort_key."},{"line_number":633,"context_line":"        # If number of sort_dirs and sort_keys doesn\u0027t match then raise an"},{"line_number":634,"context_line":"        # exception."}],"source_content_type":"text/x-python","patch_set":1,"id":"1a930d6b_a9d5ba44","line":631,"in_reply_to":"3a961159_ec7092a9","updated":"2015-01-21 13:24:03.000000000","message":"thanks again!","commit_id":"abdfe3366d767e3c62e3cfe80b5c9382951512ef"},{"author":{"_account_id":12000,"name":"Ian Cordasco","email":"sigmavirus24@gmail.com","username":"sigmavirus24"},"change_message_id":"7b070658d96c17134f73780cebd017955a8c6193","unresolved":false,"context_lines":[{"line_number":633,"context_line":"        # If number of sort_dirs and sort_keys doesn\u0027t match then raise an"},{"line_number":634,"context_line":"        # exception."},{"line_number":635,"context_line":"        if sort_dirs:"},{"line_number":636,"context_line":"            if len(sort_dirs) \u003d\u003d 1:"},{"line_number":637,"context_line":"                query_params[\u0027sort_dir\u0027] \u003d sort_dirs[0]"},{"line_number":638,"context_line":"            else:"},{"line_number":639,"context_line":"                if len(sort_dirs) !\u003d len(sort_keys):"}],"source_content_type":"text/x-python","patch_set":1,"id":"3a961159_cc4e7638","line":636,"updated":"2015-01-20 18:16:23.000000000","message":"So I can imagine an attacker sending multiple requests with the maximum allowed URI length and sending lots of valid sort_dirs and sort_keys in an attempt to DoS the service. We should calculate the length of sort_dirs once because for large enough lists, I don\u0027t think it\u0027s trivial (but I could be mistaken). For example:\n\n    dir_len \u003d len(sort_dirs)\n    if dir_len \u003d\u003d 1:\n        # ...\n    else:\n        if dir_len !\u003d len(sort_keys):\n            # ...\n        # ...\n\nI\u0027m probably being way too paranoid though. So we should double check this before making the code more complex.","commit_id":"abdfe3366d767e3c62e3cfe80b5c9382951512ef"},{"author":{"_account_id":11391,"name":"Mikhail Fedosin","email":"mfedosin@redhat.com","username":"fedosinme"},"change_message_id":"8294ecfe63e0f16e50dc2a3a40edc4cc4566b9af","unresolved":false,"context_lines":[{"line_number":633,"context_line":"        # If number of sort_dirs and sort_keys doesn\u0027t match then raise an"},{"line_number":634,"context_line":"        # exception."},{"line_number":635,"context_line":"        if sort_dirs:"},{"line_number":636,"context_line":"            if len(sort_dirs) \u003d\u003d 1:"},{"line_number":637,"context_line":"                query_params[\u0027sort_dir\u0027] \u003d sort_dirs[0]"},{"line_number":638,"context_line":"            else:"},{"line_number":639,"context_line":"                if len(sort_dirs) !\u003d len(sort_keys):"}],"source_content_type":"text/x-python","patch_set":1,"id":"1a930d6b_c941260d","line":636,"in_reply_to":"3a961159_cc4e7638","updated":"2015-01-21 13:24:03.000000000","message":"Done","commit_id":"abdfe3366d767e3c62e3cfe80b5c9382951512ef"},{"author":{"_account_id":11748,"name":"Chris St. Pierre","email":"cstpierr@cisco.com","username":"stpierre"},"change_message_id":"7156000fe4b3ec1150a6e9046a9782486c6fbcce","unresolved":false,"context_lines":[{"line_number":635,"context_line":"        if sort_dirs:"},{"line_number":636,"context_line":"            dir_len \u003d len(sort_dirs)"},{"line_number":637,"context_line":"            if dir_len \u003d\u003d 1:"},{"line_number":638,"context_line":"                query_params[\u0027sort_dir\u0027] \u003d sort_dirs[0]"},{"line_number":639,"context_line":"            else:"},{"line_number":640,"context_line":"                if dir_len !\u003d len(sort_keys):"},{"line_number":641,"context_line":"                    msg \u003d _(\u0027Number of sort dirs does not match the number \u0027"}],"source_content_type":"text/x-python","patch_set":6,"id":"9a80dd14_e46c1839","line":638,"updated":"2015-03-11 18:45:57.000000000","message":"The DB API converts this right back into a list of length 1, so this is a (slight) pessimization in the case of len(sort_keys) \u003d\u003d 1. This could be better written as:\n\n    dir_len \u003d len(sort_dirs)\n    key_len \u003d len(sort_keys)\n    if dir_len \u003d\u003d 1 and key_len !\u003d 1:\n        ...","commit_id":"e322b198f54afe31765120c8daf0ba16344fce58"},{"author":{"_account_id":11391,"name":"Mikhail Fedosin","email":"mfedosin@redhat.com","username":"fedosinme"},"change_message_id":"1e5599852cd6e66d26bf1cd76175fc012d90a6f3","unresolved":false,"context_lines":[{"line_number":635,"context_line":"        if sort_dirs:"},{"line_number":636,"context_line":"            dir_len \u003d len(sort_dirs)"},{"line_number":637,"context_line":"            if dir_len \u003d\u003d 1:"},{"line_number":638,"context_line":"                query_params[\u0027sort_dir\u0027] \u003d sort_dirs[0]"},{"line_number":639,"context_line":"            else:"},{"line_number":640,"context_line":"                if dir_len !\u003d len(sort_keys):"},{"line_number":641,"context_line":"                    msg \u003d _(\u0027Number of sort dirs does not match the number \u0027"}],"source_content_type":"text/x-python","patch_set":6,"id":"9a80dd14_ca953ae5","line":638,"in_reply_to":"9a80dd14_e46c1839","updated":"2015-03-12 12:03:35.000000000","message":"Done","commit_id":"e322b198f54afe31765120c8daf0ba16344fce58"}],"glance/common/exception.py":[{"author":{"_account_id":11748,"name":"Chris St. Pierre","email":"cstpierr@cisco.com","username":"stpierre"},"change_message_id":"7156000fe4b3ec1150a6e9046a9782486c6fbcce","unresolved":false,"context_lines":[{"line_number":165,"context_line":""},{"line_number":166,"context_line":""},{"line_number":167,"context_line":"class InvalidSortDir(Invalid):"},{"line_number":168,"context_line":"    message \u003d _(\"Sort dir supplied was not valid.\")"},{"line_number":169,"context_line":""},{"line_number":170,"context_line":""},{"line_number":171,"context_line":"class InvalidPropertyProtectionConfiguration(Invalid):"}],"source_content_type":"text/x-python","patch_set":6,"id":"9a80dd14_a48220fe","line":168,"updated":"2015-03-11 18:45:57.000000000","message":"With a view towards new-style sort params, where the sort direction is not explicitly called \u0027sort_dir\u0027, it\u0027d be nice to spell out \"Sort direction\" here to clarify the message.","commit_id":"e322b198f54afe31765120c8daf0ba16344fce58"},{"author":{"_account_id":11391,"name":"Mikhail Fedosin","email":"mfedosin@redhat.com","username":"fedosinme"},"change_message_id":"1e5599852cd6e66d26bf1cd76175fc012d90a6f3","unresolved":false,"context_lines":[{"line_number":165,"context_line":""},{"line_number":166,"context_line":""},{"line_number":167,"context_line":"class InvalidSortDir(Invalid):"},{"line_number":168,"context_line":"    message \u003d _(\"Sort dir supplied was not valid.\")"},{"line_number":169,"context_line":""},{"line_number":170,"context_line":""},{"line_number":171,"context_line":"class InvalidPropertyProtectionConfiguration(Invalid):"}],"source_content_type":"text/x-python","patch_set":6,"id":"9a80dd14_3893b0fb","line":168,"in_reply_to":"9a80dd14_a48220fe","updated":"2015-03-12 12:03:35.000000000","message":"Done","commit_id":"e322b198f54afe31765120c8daf0ba16344fce58"}],"glance/db/simple/api.py":[{"author":{"_account_id":12000,"name":"Ian Cordasco","email":"sigmavirus24@gmail.com","username":"sigmavirus24"},"change_message_id":"7b070658d96c17134f73780cebd017955a8c6193","unresolved":false,"context_lines":[{"line_number":364,"context_line":"        images.sort(key\u003dsort_func, reverse\u003dreverse)"},{"line_number":365,"context_line":""},{"line_number":366,"context_line":"    else:"},{"line_number":367,"context_line":"        sort_func \u003d lambda x: (x[key] if x[key] is not None else \u0027\u0027,"},{"line_number":368,"context_line":"                               x[\u0027created_at\u0027], x[\u0027id\u0027])"},{"line_number":369,"context_line":""},{"line_number":370,"context_line":"        for key, dir in reversed(zip(sort_key, sort_dir)):"}],"source_content_type":"text/x-python","patch_set":1,"id":"3a961159_2cfb7a7c","line":367,"updated":"2015-01-20 18:16:23.000000000","message":"I really don\u0027t like a ternary in the first position of a tuple. We have a sort_func defined above, why not:\n\n\n    def sort_func(element):\n        fst \u003d \u0027\u0027\n        if element[key] is not None:\n            fst \u003d element[key]\n        return (fst, x[\u0027created_at\u0027], x[\u0027id\u0027])\n\nAnd if you don\u0027t want to rely on nonlocal state, you can even do:\n\n    def sort_by(key):\n        def sort_func(element):\n            fst \u003d \u0027\u0027\n            if element[key] is not None:\n                fst \u003d element[key]\n            return (fst, x[\u0027created_at\u0027], x[\u0027id\u0027])\n        return sort_func\n\n    images.sort(key\u003dsort_by(key), reverse\u003dreverse)\n\nAlternatively, \n\n    sort_func \u003d lambda x: (x[key] or \u0027\u0027, x[\u0027created_at\u0027], x[\u0027id\u0027])\n\nBut I really don\u0027t like relying on `key` to be defined inside the loop.","commit_id":"abdfe3366d767e3c62e3cfe80b5c9382951512ef"},{"author":{"_account_id":12000,"name":"Ian Cordasco","email":"sigmavirus24@gmail.com","username":"sigmavirus24"},"change_message_id":"813bc2f295bb41b9b5679f22dcdaeec4a4760d25","unresolved":false,"context_lines":[{"line_number":364,"context_line":"        images.sort(key\u003dsort_func, reverse\u003dreverse)"},{"line_number":365,"context_line":""},{"line_number":366,"context_line":"    else:"},{"line_number":367,"context_line":"        sort_func \u003d lambda x: (x[key] if x[key] is not None else \u0027\u0027,"},{"line_number":368,"context_line":"                               x[\u0027created_at\u0027], x[\u0027id\u0027])"},{"line_number":369,"context_line":""},{"line_number":370,"context_line":"        for key, dir in reversed(zip(sort_key, sort_dir)):"}],"source_content_type":"text/x-python","patch_set":1,"id":"1a930d6b_b8189985","line":367,"in_reply_to":"1a930d6b_6969128b","updated":"2015-01-21 17:02:39.000000000","message":"Awesome!","commit_id":"abdfe3366d767e3c62e3cfe80b5c9382951512ef"},{"author":{"_account_id":11391,"name":"Mikhail Fedosin","email":"mfedosin@redhat.com","username":"fedosinme"},"change_message_id":"8294ecfe63e0f16e50dc2a3a40edc4cc4566b9af","unresolved":false,"context_lines":[{"line_number":364,"context_line":"        images.sort(key\u003dsort_func, reverse\u003dreverse)"},{"line_number":365,"context_line":""},{"line_number":366,"context_line":"    else:"},{"line_number":367,"context_line":"        sort_func \u003d lambda x: (x[key] if x[key] is not None else \u0027\u0027,"},{"line_number":368,"context_line":"                               x[\u0027created_at\u0027], x[\u0027id\u0027])"},{"line_number":369,"context_line":""},{"line_number":370,"context_line":"        for key, dir in reversed(zip(sort_key, sort_dir)):"}],"source_content_type":"text/x-python","patch_set":1,"id":"1a930d6b_6969128b","line":367,"in_reply_to":"3a961159_2cfb7a7c","updated":"2015-01-21 13:24:03.000000000","message":"Looks good, but I\u0027ve found out a better (and surprisingly correct) way to write this logic without lambdas and functions.","commit_id":"abdfe3366d767e3c62e3cfe80b5c9382951512ef"},{"author":{"_account_id":12000,"name":"Ian Cordasco","email":"sigmavirus24@gmail.com","username":"sigmavirus24"},"change_message_id":"59cbc3e6b3f8777ca1acf023828f9d764ce543f4","unresolved":false,"context_lines":[{"line_number":362,"context_line":""},{"line_number":363,"context_line":"    for key, dir in reversed(zip(sort_key, sort_dir)):"},{"line_number":364,"context_line":"        reverse \u003d dir \u003d\u003d \u0027desc\u0027"},{"line_number":365,"context_line":"        images.sort(key\u003ditemgetter(key), reverse\u003dreverse)"},{"line_number":366,"context_line":""},{"line_number":367,"context_line":"    return images"},{"line_number":368,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"1a930d6b_c3265aba","line":365,"updated":"2015-01-21 17:02:59.000000000","message":"This is awesome!","commit_id":"c8e7c8cf929ade492f85d111e3129d4adb49097b"},{"author":{"_account_id":11748,"name":"Chris St. Pierre","email":"cstpierr@cisco.com","username":"stpierre"},"change_message_id":"7156000fe4b3ec1150a6e9046a9782486c6fbcce","unresolved":false,"context_lines":[{"line_number":353,"context_line":"            raise exception.InvalidSortKey()"},{"line_number":354,"context_line":""},{"line_number":355,"context_line":"    for dir in sort_dir:"},{"line_number":356,"context_line":"        if dir not in [\u0027asc\u0027, \u0027desc\u0027]:"},{"line_number":357,"context_line":"            raise exception.InvalidSortDir()"},{"line_number":358,"context_line":""},{"line_number":359,"context_line":"    if len(sort_key) !\u003d len(sort_dir):"}],"source_content_type":"text/x-python","patch_set":6,"id":"9a80dd14_24fc703e","line":356,"updated":"2015-03-11 18:45:57.000000000","message":"Python golf:\n\n    if any(dir for dir in sort_dir if dir not in [\u0027asc\u0027, \u0027desc\u0027]):","commit_id":"e322b198f54afe31765120c8daf0ba16344fce58"},{"author":{"_account_id":11391,"name":"Mikhail Fedosin","email":"mfedosin@redhat.com","username":"fedosinme"},"change_message_id":"1e5599852cd6e66d26bf1cd76175fc012d90a6f3","unresolved":false,"context_lines":[{"line_number":353,"context_line":"            raise exception.InvalidSortKey()"},{"line_number":354,"context_line":""},{"line_number":355,"context_line":"    for dir in sort_dir:"},{"line_number":356,"context_line":"        if dir not in [\u0027asc\u0027, \u0027desc\u0027]:"},{"line_number":357,"context_line":"            raise exception.InvalidSortDir()"},{"line_number":358,"context_line":""},{"line_number":359,"context_line":"    if len(sort_key) !\u003d len(sort_dir):"}],"source_content_type":"text/x-python","patch_set":6,"id":"9a80dd14_784a8884","line":356,"in_reply_to":"9a80dd14_24fc703e","updated":"2015-03-12 12:03:35.000000000","message":"Done :)","commit_id":"e322b198f54afe31765120c8daf0ba16344fce58"},{"author":{"_account_id":8158,"name":"Hemanth Makkapati","email":"makstacker+osgerrit@gmail.com","username":"hemanth.makkapati"},"change_message_id":"a65be08fcaa8d1b3e66ed0880fdf836b40a54145","unresolved":false,"context_lines":[{"line_number":340,"context_line":""},{"line_number":341,"context_line":""},{"line_number":342,"context_line":"def _sort_images(images, sort_key, sort_dir):"},{"line_number":343,"context_line":"    sort_key \u003d [\u0027created_at\u0027] if not sort_key else sort_key"},{"line_number":344,"context_line":""},{"line_number":345,"context_line":"    default_sort_dir \u003d \u0027desc\u0027"},{"line_number":346,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"9a80dd14_8bc24d51","line":343,"updated":"2015-03-12 21:33:51.000000000","message":"Minor comment: Since we add both \u0027created_at\u0027 and \u0027id\u0027 anyway if they are not a part of sort keys(look few lines below), why not initialize with [\u0027created_at\u0027, \u0027id\u0027] instead of [\u0027created_at\u0027].\n\nJust a minor comment, not a big deal at all.","commit_id":"fac0cb2f07f43e6845818f3aa6cac59e2881a1eb"}],"glance/db/sqlalchemy/api.py":[{"author":{"_account_id":11748,"name":"Chris St. Pierre","email":"cstpierr@cisco.com","username":"stpierre"},"change_message_id":"7156000fe4b3ec1150a6e9046a9782486c6fbcce","unresolved":false,"context_lines":[{"line_number":598,"context_line":"        if key not in sort_key:"},{"line_number":599,"context_line":"            sort_key.append(key)"},{"line_number":600,"context_line":"            if \u0027sort_dirs\u0027 in sort_dir_param:"},{"line_number":601,"context_line":"                sort_dir_param[\u0027sort_dirs\u0027] +\u003d [\u0027desc\u0027]"},{"line_number":602,"context_line":""},{"line_number":603,"context_line":"    query \u003d _paginate_query(query, models.Image, limit,"},{"line_number":604,"context_line":"                            sort_key,"}],"source_content_type":"text/x-python","patch_set":6,"id":"9a80dd14_d80c543e","line":601,"updated":"2015-03-11 18:45:57.000000000","message":"You mention the default sort direction (\u0027desc\u0027) several times across various modules. In the new-style sort patch you move that out into a private class variable, but it might be nice to have it in a global module-level variable somewhere for deduplication\u0027s sake.","commit_id":"e322b198f54afe31765120c8daf0ba16344fce58"},{"author":{"_account_id":11391,"name":"Mikhail Fedosin","email":"mfedosin@redhat.com","username":"fedosinme"},"change_message_id":"1e5599852cd6e66d26bf1cd76175fc012d90a6f3","unresolved":false,"context_lines":[{"line_number":598,"context_line":"        if key not in sort_key:"},{"line_number":599,"context_line":"            sort_key.append(key)"},{"line_number":600,"context_line":"            if \u0027sort_dirs\u0027 in sort_dir_param:"},{"line_number":601,"context_line":"                sort_dir_param[\u0027sort_dirs\u0027] +\u003d [\u0027desc\u0027]"},{"line_number":602,"context_line":""},{"line_number":603,"context_line":"    query \u003d _paginate_query(query, models.Image, limit,"},{"line_number":604,"context_line":"                            sort_key,"}],"source_content_type":"text/x-python","patch_set":6,"id":"9a80dd14_2a489686","line":601,"in_reply_to":"9a80dd14_d80c543e","updated":"2015-03-12 12:03:35.000000000","message":"Good suggestion, but I have no good idea how to implement it correctly. I started this work with default_sort_dir var, but now it\u0027s hardcoded to \u0027desc\u0027.\nLater I\u0027m going to think how to do it.","commit_id":"e322b198f54afe31765120c8daf0ba16344fce58"},{"author":{"_account_id":8158,"name":"Hemanth Makkapati","email":"makstacker+osgerrit@gmail.com","username":"hemanth.makkapati"},"change_message_id":"a65be08fcaa8d1b3e66ed0880fdf836b40a54145","unresolved":false,"context_lines":[{"line_number":550,"context_line":"                       relevant tag entries. This could improve upper-layer"},{"line_number":551,"context_line":"                       query performance, to prevent using separated calls"},{"line_number":552,"context_line":"    \"\"\""},{"line_number":553,"context_line":"    sort_key \u003d [\u0027created_at\u0027] if not sort_key else sort_key"},{"line_number":554,"context_line":""},{"line_number":555,"context_line":"    default_sort_dir \u003d \u0027desc\u0027"},{"line_number":556,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"9a80dd14_eb9ca910","line":553,"updated":"2015-03-12 21:33:51.000000000","message":"Same","commit_id":"fac0cb2f07f43e6845818f3aa6cac59e2881a1eb"}],"glance/tests/unit/v2/test_images_resource.py":[{"author":{"_account_id":11748,"name":"Chris St. Pierre","email":"cstpierr@cisco.com","username":"stpierre"},"change_message_id":"7156000fe4b3ec1150a6e9046a9782486c6fbcce","unresolved":false,"context_lines":[{"line_number":2600,"context_line":"        request \u003d unit_test_utils.get_fake_request(req_string)"},{"line_number":2601,"context_line":"        self.assertRaises(webob.exc.HTTPBadRequest,"},{"line_number":2602,"context_line":"                          self.deserializer.index, request)"},{"line_number":2603,"context_line":""},{"line_number":2604,"context_line":"    def test_index_sort_private_key(self):"},{"line_number":2605,"context_line":"        request \u003d unit_test_utils.get_fake_request(\u0027/images?sort_key\u003dmin_ram\u0027)"},{"line_number":2606,"context_line":"        self.assertRaises(webob.exc.HTTPBadRequest,"}],"source_content_type":"text/x-python","patch_set":6,"id":"9a80dd14_98ec9c2b","line":2603,"updated":"2015-03-11 18:45:57.000000000","message":"We should also have a test with fewer sort_dirs than sort_keys, e.g.:\n\n    req_string \u003d \u0027/images?sort_key\u003dname\u0026sort_dir\u003dasc\u0026sort_key\u003did\u0026sort_dir\u003dasc\u0026sort_key\u003dcreated_at\u0027","commit_id":"e322b198f54afe31765120c8daf0ba16344fce58"},{"author":{"_account_id":11391,"name":"Mikhail Fedosin","email":"mfedosin@redhat.com","username":"fedosinme"},"change_message_id":"1e5599852cd6e66d26bf1cd76175fc012d90a6f3","unresolved":false,"context_lines":[{"line_number":2600,"context_line":"        request \u003d unit_test_utils.get_fake_request(req_string)"},{"line_number":2601,"context_line":"        self.assertRaises(webob.exc.HTTPBadRequest,"},{"line_number":2602,"context_line":"                          self.deserializer.index, request)"},{"line_number":2603,"context_line":""},{"line_number":2604,"context_line":"    def test_index_sort_private_key(self):"},{"line_number":2605,"context_line":"        request \u003d unit_test_utils.get_fake_request(\u0027/images?sort_key\u003dmin_ram\u0027)"},{"line_number":2606,"context_line":"        self.assertRaises(webob.exc.HTTPBadRequest,"}],"source_content_type":"text/x-python","patch_set":6,"id":"9a80dd14_db7fee64","line":2603,"in_reply_to":"9a80dd14_98ec9c2b","updated":"2015-03-12 12:03:35.000000000","message":"Done","commit_id":"e322b198f54afe31765120c8daf0ba16344fce58"}],"glance/tests/unit/v2/test_registry_api.py":[{"author":{"_account_id":11748,"name":"Chris St. Pierre","email":"cstpierr@cisco.com","username":"stpierre"},"change_message_id":"7156000fe4b3ec1150a6e9046a9782486c6fbcce","unresolved":false,"context_lines":[{"line_number":1316,"context_line":"        self.assertEqual(UUID2, images[1][\u0027id\u0027])"},{"line_number":1317,"context_line":"        self.assertEqual(UUID1, images[2][\u0027id\u0027])"},{"line_number":1318,"context_line":"        self.assertEqual(UUID3, images[3][\u0027id\u0027])"},{"line_number":1319,"context_line":"        self.assertEqual(UUID5, images[4][\u0027id\u0027])"},{"line_number":1320,"context_line":""},{"line_number":1321,"context_line":"        cmd \u003d [{"},{"line_number":1322,"context_line":"            \u0027command\u0027: \u0027image_get_all\u0027,"}],"source_content_type":"text/x-python","patch_set":6,"id":"9a80dd14_785e08eb","line":1319,"updated":"2015-03-11 18:45:57.000000000","message":"Why not:\n\n    self.assertEqual([UUID4, UUID2, UUID1, UUID3, UUID5],\n                     [i[\u0027id\u0027] for i in images])","commit_id":"e322b198f54afe31765120c8daf0ba16344fce58"},{"author":{"_account_id":11391,"name":"Mikhail Fedosin","email":"mfedosin@redhat.com","username":"fedosinme"},"change_message_id":"1e5599852cd6e66d26bf1cd76175fc012d90a6f3","unresolved":false,"context_lines":[{"line_number":1316,"context_line":"        self.assertEqual(UUID2, images[1][\u0027id\u0027])"},{"line_number":1317,"context_line":"        self.assertEqual(UUID1, images[2][\u0027id\u0027])"},{"line_number":1318,"context_line":"        self.assertEqual(UUID3, images[3][\u0027id\u0027])"},{"line_number":1319,"context_line":"        self.assertEqual(UUID5, images[4][\u0027id\u0027])"},{"line_number":1320,"context_line":""},{"line_number":1321,"context_line":"        cmd \u003d [{"},{"line_number":1322,"context_line":"            \u0027command\u0027: \u0027image_get_all\u0027,"}],"source_content_type":"text/x-python","patch_set":6,"id":"9a80dd14_d1b7cff3","line":1319,"in_reply_to":"9a80dd14_785e08eb","updated":"2015-03-12 12:03:35.000000000","message":"Yes, first I wanted to write as you proposed, but then I decided to unify my tests with the others.\n\nI think we can leave it now as it is and later start a big refactoring program for all these tests.","commit_id":"e322b198f54afe31765120c8daf0ba16344fce58"}],"glance/tests/unit/v2/test_registry_client.py":[{"author":{"_account_id":11748,"name":"Chris St. Pierre","email":"cstpierr@cisco.com","username":"stpierre"},"change_message_id":"7156000fe4b3ec1150a6e9046a9782486c6fbcce","unresolved":false,"context_lines":[{"line_number":327,"context_line":"        db_api.image_create(self.context, extra_fixture)"},{"line_number":328,"context_line":""},{"line_number":329,"context_line":"        UUID5 \u003d _gen_uuid()"},{"line_number":330,"context_line":"        extra_fixture \u003d self.get_fixture(id\u003dUUID5, name\u003d\u0027asdf\u0027,"},{"line_number":331,"context_line":"                                         size\u003d20)"},{"line_number":332,"context_line":""},{"line_number":333,"context_line":"        db_api.image_create(self.context, extra_fixture)"}],"source_content_type":"text/x-python","patch_set":6,"id":"9a80dd14_58fea4af","line":330,"updated":"2015-03-11 18:45:57.000000000","message":"It\u0027d be nice to throw some unicode in here just to make sure nothing blows up.","commit_id":"e322b198f54afe31765120c8daf0ba16344fce58"},{"author":{"_account_id":11391,"name":"Mikhail Fedosin","email":"mfedosin@redhat.com","username":"fedosinme"},"change_message_id":"1e5599852cd6e66d26bf1cd76175fc012d90a6f3","unresolved":false,"context_lines":[{"line_number":327,"context_line":"        db_api.image_create(self.context, extra_fixture)"},{"line_number":328,"context_line":""},{"line_number":329,"context_line":"        UUID5 \u003d _gen_uuid()"},{"line_number":330,"context_line":"        extra_fixture \u003d self.get_fixture(id\u003dUUID5, name\u003d\u0027asdf\u0027,"},{"line_number":331,"context_line":"                                         size\u003d20)"},{"line_number":332,"context_line":""},{"line_number":333,"context_line":"        db_api.image_create(self.context, extra_fixture)"}],"source_content_type":"text/x-python","patch_set":6,"id":"9a80dd14_b135fb47","line":330,"in_reply_to":"9a80dd14_58fea4af","updated":"2015-03-12 12:03:35.000000000","message":"Done","commit_id":"e322b198f54afe31765120c8daf0ba16344fce58"}]}
