)]}'
{"doc/source/command-objects/image.rst":[{"author":{"_account_id":1941,"name":"Lin Hua Cheng","email":"os.lcheng@gmail.com","username":"lin-hua-cheng"},"change_message_id":"333b9d07cc21dbc78c023de69fb0a2ce6a9dca73","unresolved":false,"context_lines":[{"line_number":167,"context_line":""},{"line_number":168,"context_line":".. option:: --sort \u003ckey\u003e[:\u003cdirection\u003e]"},{"line_number":169,"context_line":""},{"line_number":170,"context_line":"    Sort output by selected keys and directions(asc or desc) (default: asc),"},{"line_number":171,"context_line":"    multiple keys and directions can be specified separated by comma"},{"line_number":172,"context_line":""},{"line_number":173,"context_line":"image save"}],"source_content_type":"text/x-rst","patch_set":4,"id":"da86d52c_bbec6cbc","line":170,"updated":"2015-02-05 19:13:51.000000000","message":"Make the  doc and help used in CLI consistent","commit_id":"60ac7edb52fac2e40779877a8193020096cdd4f9"}],"openstackclient/common/utils.py":[{"author":{"_account_id":970,"name":"Dean Troyer","email":"dtroyer@gmail.com","username":"dtroyer"},"change_message_id":"24ca61d4d9ee57d487ed0fd59546e65e963a613d","unresolved":false,"context_lines":[{"line_number":133,"context_line":"        raise exceptions.CommandError(msg)"},{"line_number":134,"context_line":""},{"line_number":135,"context_line":""},{"line_number":136,"context_line":"def sort_items(items, sort_str):"},{"line_number":137,"context_line":"    sort_keys \u003d sort_str.strip().split(\u0027,\u0027)"},{"line_number":138,"context_line":"    msg \u003d \"Specify sort direction by asc or desc\""},{"line_number":139,"context_line":"    for sort_key in reversed(sort_keys):"}],"source_content_type":"text/x-python","patch_set":1,"id":"1a930d6b_8920f1f8","line":136,"updated":"2015-01-21 18:55:24.000000000","message":"This should have a docstring that includes the fact that the sort order is ascending by default.  Also, document the format of sort_str.\n\nAlso, put this function in alpha order in utils.py\n\nAlso, also, add a short-cut check for sort_str \u003d\u003d None or \u0027\u0027 so we can insert this into the usual list command return sequence.","commit_id":"fc98ce9dda4cf644ffd91da8f6a6d3c1b3b78e9d"},{"author":{"_account_id":970,"name":"Dean Troyer","email":"dtroyer@gmail.com","username":"dtroyer"},"change_message_id":"24ca61d4d9ee57d487ed0fd59546e65e963a613d","unresolved":false,"context_lines":[{"line_number":144,"context_line":"                raise exceptions.CommandError(msg)"},{"line_number":145,"context_line":"            if direction \u003d\u003d \u0027desc\u0027:"},{"line_number":146,"context_line":"                reverse \u003d True"},{"line_number":147,"context_line":"        items \u003d sorted(items,"},{"line_number":148,"context_line":"                       key\u003dlambda item: get_field(item, sort_key),"},{"line_number":149,"context_line":"                       reverse\u003dreverse)"},{"line_number":150,"context_line":"    return items"}],"source_content_type":"text/x-python","patch_set":1,"id":"1a930d6b_78e46c3b","line":147,"updated":"2015-01-21 18:55:24.000000000","message":"I think using items.sort() here would be a bit more efficient as it is in-place and doesn\u0027t cost additional memory for each sort key","commit_id":"fc98ce9dda4cf644ffd91da8f6a6d3c1b3b78e9d"},{"author":{"_account_id":1941,"name":"Lin Hua Cheng","email":"os.lcheng@gmail.com","username":"lin-hua-cheng"},"change_message_id":"333b9d07cc21dbc78c023de69fb0a2ce6a9dca73","unresolved":false,"context_lines":[{"line_number":196,"context_line":"    # items may be a generator object, transform it to a list"},{"line_number":197,"context_line":"    items \u003d list(items)"},{"line_number":198,"context_line":"    sort_keys \u003d sort_str.strip().split(\u0027,\u0027)"},{"line_number":199,"context_line":"    msg \u003d \"Specify sort direction by asc or desc\""},{"line_number":200,"context_line":"    for sort_key in reversed(sort_keys):"},{"line_number":201,"context_line":"        reverse \u003d False"},{"line_number":202,"context_line":"        if \u0027:\u0027 in sort_key:"}],"source_content_type":"text/x-python","patch_set":4,"id":"da86d52c_8eb8442b","line":199,"updated":"2015-02-05 19:13:51.000000000","message":"move construction of msg before the exception is raised.   There is no need to instantiate this every time, it would be used if there is an exception.","commit_id":"60ac7edb52fac2e40779877a8193020096cdd4f9"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"1bd51fee7576a6c0b70635080913e753698f7c56","unresolved":false,"context_lines":[{"line_number":201,"context_line":"        if \u0027:\u0027 in sort_key:"},{"line_number":202,"context_line":"            sort_key, direction \u003d sort_key.split(\u0027:\u0027, 1)"},{"line_number":203,"context_line":"            if direction not in [\u0027asc\u0027, \u0027desc\u0027]:"},{"line_number":204,"context_line":"                msg \u003d \"Specify sort direction by asc or desc\""},{"line_number":205,"context_line":"                raise exceptions.CommandError(msg)"},{"line_number":206,"context_line":"            if direction \u003d\u003d \u0027desc\u0027:"},{"line_number":207,"context_line":"                reverse \u003d True"}],"source_content_type":"text/x-python","patch_set":5,"id":"da86d52c_cb3afc33","line":204,"updated":"2015-02-06 22:29:55.000000000","message":"shouldn\u0027t this error never happen if \u0027asc\u0027 is the default? also, I\u0027m not seeing any defaulting behaviour in this code?","commit_id":"42cff388349186b70559650237d2667da1cb903f"},{"author":{"_account_id":970,"name":"Dean Troyer","email":"dtroyer@gmail.com","username":"dtroyer"},"change_message_id":"646d32255446cdd9c137cb5f723c43c7e977f7c9","unresolved":false,"context_lines":[{"line_number":201,"context_line":"        if \u0027:\u0027 in sort_key:"},{"line_number":202,"context_line":"            sort_key, direction \u003d sort_key.split(\u0027:\u0027, 1)"},{"line_number":203,"context_line":"            if direction not in [\u0027asc\u0027, \u0027desc\u0027]:"},{"line_number":204,"context_line":"                msg \u003d \"Specify sort direction by asc or desc\""},{"line_number":205,"context_line":"                raise exceptions.CommandError(msg)"},{"line_number":206,"context_line":"            if direction \u003d\u003d \u0027desc\u0027:"},{"line_number":207,"context_line":"                reverse \u003d True"}],"source_content_type":"text/x-python","patch_set":5,"id":"da86d52c_064a4255","line":204,"in_reply_to":"da86d52c_57814e4c","updated":"2015-02-07 14:52:49.000000000","message":"This is a parsing error for the --sort argument.  It might be useful to include direction (the variable contents) in the error message to help the user know which part of the argument is troublesome.","commit_id":"42cff388349186b70559650237d2667da1cb903f"},{"author":{"_account_id":12076,"name":"Zhiyuan Cai","email":"luckyvega.g@gmail.com","username":"zhiyuan_cai"},"change_message_id":"ecd4983a8e20eacef6e2fe6254b03b037290b92c","unresolved":false,"context_lines":[{"line_number":201,"context_line":"        if \u0027:\u0027 in sort_key:"},{"line_number":202,"context_line":"            sort_key, direction \u003d sort_key.split(\u0027:\u0027, 1)"},{"line_number":203,"context_line":"            if direction not in [\u0027asc\u0027, \u0027desc\u0027]:"},{"line_number":204,"context_line":"                msg \u003d \"Specify sort direction by asc or desc\""},{"line_number":205,"context_line":"                raise exceptions.CommandError(msg)"},{"line_number":206,"context_line":"            if direction \u003d\u003d \u0027desc\u0027:"},{"line_number":207,"context_line":"                reverse \u003d True"}],"source_content_type":"text/x-python","patch_set":5,"id":"da86d52c_57814e4c","line":204,"in_reply_to":"da86d52c_cb3afc33","updated":"2015-02-07 02:07:32.000000000","message":"If user passes something like \"key:bad_dir\" and \"key:\" then this error is triggered. Or we just igone this error?\n\n\"reverse\" is set to False at the beginning so if user passes a sort string without \":\" like \"key\" then items will be sorted ascendingly by default. If user passes \"key:desc\" then \"reverse\" will be set to True.","commit_id":"42cff388349186b70559650237d2667da1cb903f"}],"openstackclient/image/v1/image.py":[{"author":{"_account_id":1941,"name":"Lin Hua Cheng","email":"os.lcheng@gmail.com","username":"lin-hua-cheng"},"change_message_id":"333b9d07cc21dbc78c023de69fb0a2ce6a9dca73","unresolved":false,"context_lines":[{"line_number":417,"context_line":"                attr\u003dattr,"},{"line_number":418,"context_line":"                value\u003dvalue,"},{"line_number":419,"context_line":"                property_field\u003d\u0027properties\u0027,"},{"line_number":420,"context_line":"            )"},{"line_number":421,"context_line":"        return ("},{"line_number":422,"context_line":"            column_headers,"},{"line_number":423,"context_line":"            (utils.get_dict_properties("}],"source_content_type":"text/x-python","patch_set":4,"id":"da86d52c_7b003434","line":420,"updated":"2015-02-05 19:13:51.000000000","message":"Filtering should probably be done first before sorting","commit_id":"60ac7edb52fac2e40779877a8193020096cdd4f9"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"fea3cf1f4ae5fe9625fb829068fd555e50a7b957","unresolved":false,"context_lines":[{"line_number":417,"context_line":"                property_field\u003d\u0027properties\u0027,"},{"line_number":418,"context_line":"            )"},{"line_number":419,"context_line":""},{"line_number":420,"context_line":"        data \u003d utils.sort_items(data, parsed_args.sort)"},{"line_number":421,"context_line":""},{"line_number":422,"context_line":"        return ("},{"line_number":423,"context_line":"            column_headers,"}],"source_content_type":"text/x-python","patch_set":5,"id":"da86d52c_5abb3375","line":420,"updated":"2015-02-07 06:01:48.000000000","message":"check if --sort is passed in before sorting? seems unnecessary so sort if it\u0027s not specified.","commit_id":"42cff388349186b70559650237d2667da1cb903f"},{"author":{"_account_id":970,"name":"Dean Troyer","email":"dtroyer@gmail.com","username":"dtroyer"},"change_message_id":"646d32255446cdd9c137cb5f723c43c7e977f7c9","unresolved":false,"context_lines":[{"line_number":417,"context_line":"                property_field\u003d\u0027properties\u0027,"},{"line_number":418,"context_line":"            )"},{"line_number":419,"context_line":""},{"line_number":420,"context_line":"        data \u003d utils.sort_items(data, parsed_args.sort)"},{"line_number":421,"context_line":""},{"line_number":422,"context_line":"        return ("},{"line_number":423,"context_line":"            column_headers,"}],"source_content_type":"text/x-python","patch_set":5,"id":"da86d52c_e6636edb","line":420,"in_reply_to":"da86d52c_00acea34","updated":"2015-02-07 14:52:49.000000000","message":"My thinking was having the short-circuit check in the function allows the call to be nested here, even though it is not in this case.","commit_id":"42cff388349186b70559650237d2667da1cb903f"},{"author":{"_account_id":12076,"name":"Zhiyuan Cai","email":"luckyvega.g@gmail.com","username":"zhiyuan_cai"},"change_message_id":"eabeced40a92c9fe0538c544ff085fb908cd5c2a","unresolved":false,"context_lines":[{"line_number":417,"context_line":"                property_field\u003d\u0027properties\u0027,"},{"line_number":418,"context_line":"            )"},{"line_number":419,"context_line":""},{"line_number":420,"context_line":"        data \u003d utils.sort_items(data, parsed_args.sort)"},{"line_number":421,"context_line":""},{"line_number":422,"context_line":"        return ("},{"line_number":423,"context_line":"            column_headers,"}],"source_content_type":"text/x-python","patch_set":5,"id":"da86d52c_00acea34","line":420,"in_reply_to":"da86d52c_5abb3375","updated":"2015-02-07 10:05:52.000000000","message":"In patch set 1 Dean suggested to add the check in sort_items so I removed the check here. Or I add the check in both places?","commit_id":"42cff388349186b70559650237d2667da1cb903f"}],"openstackclient/image/v2/image.py":[{"author":{"_account_id":1941,"name":"Lin Hua Cheng","email":"os.lcheng@gmail.com","username":"lin-hua-cheng"},"change_message_id":"333b9d07cc21dbc78c023de69fb0a2ce6a9dca73","unresolved":false,"context_lines":[{"line_number":158,"context_line":"            column_headers \u003d columns"},{"line_number":159,"context_line":""},{"line_number":160,"context_line":"        data \u003d image_client.api.image_list(**kwargs)"},{"line_number":161,"context_line":"        data \u003d utils.sort_items(data, parsed_args.sort)"},{"line_number":162,"context_line":""},{"line_number":163,"context_line":"        if parsed_args.property:"},{"line_number":164,"context_line":"            # NOTE(dtroyer): coerce to a list to subscript it in py3"}],"source_content_type":"text/x-python","patch_set":4,"id":"da86d52c_3ba23c4b","line":161,"updated":"2015-02-05 19:13:51.000000000","message":"sorting should probably be done after filtering","commit_id":"60ac7edb52fac2e40779877a8193020096cdd4f9"}],"openstackclient/tests/common/test_utils.py":[{"author":{"_account_id":9101,"name":"wanghong","email":"reviewwanghong@126.com","username":"wanghong"},"change_message_id":"e2270e96c401ab8b17302570ad6b685e8620834d","unresolved":false,"context_lines":[{"line_number":66,"context_line":"        items \u003d [item1, item2, item3, item4]"},{"line_number":67,"context_line":"        sort_str \u003d \u0027a:desc,b:desc\u0027"},{"line_number":68,"context_line":"        expect_items \u003d [item3, item4, item2, item1]"},{"line_number":69,"context_line":"        self.assertEqual(expect_items, utils.sort_items(items, sort_str))"},{"line_number":70,"context_line":""},{"line_number":71,"context_line":""},{"line_number":72,"context_line":"class NoUniqueMatch(Exception):"}],"source_content_type":"text/x-python","patch_set":2,"id":"1a930d6b_dffda6b2","line":69,"updated":"2015-01-27 02:33:18.000000000","message":"I think we should add more tests for the following conditions: \n\n1. item is object\n\n2. asc default\n\n3. non existent attribute","commit_id":"35f9763a259e70678e40257cd9d17331031bc5e3"},{"author":{"_account_id":1941,"name":"Lin Hua Cheng","email":"os.lcheng@gmail.com","username":"lin-hua-cheng"},"change_message_id":"333b9d07cc21dbc78c023de69fb0a2ce6a9dca73","unresolved":false,"context_lines":[{"line_number":98,"context_line":"        self.assertRaises(exceptions.CommandError,"},{"line_number":99,"context_line":"                          utils.sort_items,"},{"line_number":100,"context_line":"                          items, sort_str)"},{"line_number":101,"context_line":""},{"line_number":102,"context_line":""},{"line_number":103,"context_line":"class NoUniqueMatch(Exception):"},{"line_number":104,"context_line":"    pass"}],"source_content_type":"text/x-python","patch_set":4,"id":"da86d52c_7b23d4bc","line":101,"updated":"2015-02-05 19:13:51.000000000","message":"how about test for:\n* \" a,b:desc\" - sort where some key does not have direction  \n* \"b,a\" -  the property key is in a different order\n* \"a\" - just one key\n* \"\" or None","commit_id":"60ac7edb52fac2e40779877a8193020096cdd4f9"}],"openstackclient/tests/image/v1/test_image.py":[{"author":{"_account_id":9101,"name":"wanghong","email":"reviewwanghong@126.com","username":"wanghong"},"change_message_id":"e2270e96c401ab8b17302570ad6b685e8620834d","unresolved":false,"context_lines":[{"line_number":444,"context_line":""},{"line_number":445,"context_line":"        collist \u003d (\u0027ID\u0027, \u0027Name\u0027)"},{"line_number":446,"context_line":""},{"line_number":447,"context_line":"        self.assertEqual(columns, collist)"},{"line_number":448,"context_line":"        datalist \u003d (("},{"line_number":449,"context_line":"            image_fakes.image_id,"},{"line_number":450,"context_line":"            image_fakes.image_name"}],"source_content_type":"text/x-python","patch_set":2,"id":"1a930d6b_bfe61a42","line":447,"updated":"2015-01-27 02:33:18.000000000","message":"This should be self.assertEqual(collist, columns)","commit_id":"35f9763a259e70678e40257cd9d17331031bc5e3"}],"openstackclient/tests/image/v2/test_image.py":[{"author":{"_account_id":9101,"name":"wanghong","email":"reviewwanghong@126.com","username":"wanghong"},"change_message_id":"e2270e96c401ab8b17302570ad6b685e8620834d","unresolved":false,"context_lines":[{"line_number":208,"context_line":""},{"line_number":209,"context_line":"        collist \u003d (\u0027ID\u0027, \u0027Name\u0027)"},{"line_number":210,"context_line":""},{"line_number":211,"context_line":"        self.assertEqual(columns, collist)"},{"line_number":212,"context_line":"        datalist \u003d (("},{"line_number":213,"context_line":"            image_fakes.image_id,"},{"line_number":214,"context_line":"            image_fakes.image_name"}],"source_content_type":"text/x-python","patch_set":2,"id":"1a930d6b_1f3e4e8c","line":211,"updated":"2015-01-27 02:33:18.000000000","message":"This should be self.assertEqual(collist, columns)","commit_id":"35f9763a259e70678e40257cd9d17331031bc5e3"}]}
