)]}'
{"dragonflow/cli/df_db.py":[{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"5a8c0a458cc5f71dd2864a3514841fda8f683743","unresolved":false,"context_lines":[{"line_number":59,"context_line":"        keys \u003d []"},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"    l \u003d 0"},{"line_number":62,"context_line":"    for key in keys:"},{"line_number":63,"context_line":"        keys[l] \u003d {\u0027key\u0027: key}"},{"line_number":64,"context_line":"        l +\u003d 1"},{"line_number":65,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"9a629dbe_d88ed726","line":62,"updated":"2016-11-07 16:07:05.000000000","message":"I think you can use enumerate here.","commit_id":"5b22ab89d84701b4edc59596b265948faa13b8ef"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"5a8c0a458cc5f71dd2864a3514841fda8f683743","unresolved":false,"context_lines":[{"line_number":64,"context_line":"        l +\u003d 1"},{"line_number":65,"context_line":""},{"line_number":66,"context_line":"    labels, formatters \u003d \\"},{"line_number":67,"context_line":"        cli_utils._get_list_table_columns_and_formatters([\u0027key\u0027], keys)"},{"line_number":68,"context_line":"    labels[0] \u003d \u0027Keys for table\u0027"},{"line_number":69,"context_line":"    cli_utils.print_list(keys, [\u0027key\u0027], formatters\u003dformatters,"},{"line_number":70,"context_line":"                         field_labels\u003dlabels)"}],"source_content_type":"text/x-python","patch_set":2,"id":"9a629dbe_98ad3f8b","line":67,"range":{"start_line":67,"start_character":18,"end_line":67,"end_character":19},"updated":"2016-11-07 16:07:05.000000000","message":"Please make this method public.","commit_id":"5b22ab89d84701b4edc59596b265948faa13b8ef"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"5a8c0a458cc5f71dd2864a3514841fda8f683743","unresolved":false,"context_lines":[{"line_number":77,"context_line":"        print(\u0027Table not found: \u0027 + table)"},{"line_number":78,"context_line":"        return"},{"line_number":79,"context_line":""},{"line_number":80,"context_line":"    values \u003d []"},{"line_number":81,"context_line":"    for key in keys:"},{"line_number":82,"context_line":"        value \u003d db_driver.get_key(table, key)"},{"line_number":83,"context_line":"        values.append(jsonutils.loads(value))"},{"line_number":84,"context_line":""},{"line_number":85,"context_line":"    if isinstance(values[0], dict):"},{"line_number":86,"context_line":"        columns \u003d values[0].keys()"}],"source_content_type":"text/x-python","patch_set":2,"id":"9a629dbe_98db7f1b","line":83,"range":{"start_line":80,"start_character":0,"end_line":83,"end_character":45},"updated":"2016-11-07 16:07:05.000000000","message":"This might be more elegant as list comprehension, but not a must.","commit_id":"5b22ab89d84701b4edc59596b265948faa13b8ef"},{"author":{"_account_id":9044,"name":"Will","email":"wangjian.ika@bytedance.com","username":"Will"},"change_message_id":"83de888b1f0d6581e57f1b0b4c565cd0af1012ed","unresolved":false,"context_lines":[{"line_number":50,"context_line":""},{"line_number":51,"context_line":"    for count, key in enumerate(keys):"},{"line_number":52,"context_line":"        keys[count] \u003d {\u0027key\u0027: key}"},{"line_number":53,"context_line":"        count +\u003d 1"},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"    labels, formatters \u003d \\"},{"line_number":56,"context_line":"        cli_utils.get_list_table_columns_and_formatters([\u0027key\u0027], keys)"}],"source_content_type":"text/x-python","patch_set":4,"id":"9a629dbe_14b5857d","line":53,"range":{"start_line":53,"start_character":8,"end_line":53,"end_character":18},"updated":"2016-11-14 07:33:31.000000000","message":"why ? count will increase by 1 in each loop, won\u0027t it?","commit_id":"c55a42f35d5907782e65a43b58e98a4f53b9df4e"},{"author":{"_account_id":11159,"name":"Hong Hui Xiao","email":"honghui_xiao@yeah.net","username":"HongHuiXiao"},"change_message_id":"d84983c652ac539b12106f736c4e791c44f63a6f","unresolved":false,"context_lines":[{"line_number":53,"context_line":""},{"line_number":54,"context_line":"    labels, formatters \u003d \\"},{"line_number":55,"context_line":"        cli_utils.get_list_table_columns_and_formatters([\u0027key\u0027], keys)"},{"line_number":56,"context_line":"    labels[0] \u003d \u0027Keys for table\u0027"},{"line_number":57,"context_line":"    cli_utils.print_list(keys, [\u0027key\u0027], formatters\u003dformatters,"},{"line_number":58,"context_line":"                         field_labels\u003dlabels)"},{"line_number":59,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"7a77a97e_e601ce07","line":56,"updated":"2016-11-17 01:22:55.000000000","message":"I revert my vote as I found some issue here. If the table doesn\u0027t have any keys. The following exception can be observed.\n\n$ python dragonflow/cli/df_db.py ls qospolicy\nTraceback (most recent call last):\n  File \"dragonflow/cli/df_db.py\", line 274, in \u003cmodule\u003e\n    main()\n  File \"dragonflow/cli/df_db.py\", line 270, in main\n    args.handle(db_driver, args)\n  File \"dragonflow/cli/df_db.py\", line 159, in handle\n    print_table(db_driver, table)\n  File \"dragonflow/cli/df_db.py\", line 56, in print_table\n    labels[0] \u003d \u0027Keys for table\u0027\nIndexError: list assignment index out of range","commit_id":"3936d4132d6b14080702027232f4a068f43c93c5"},{"author":{"_account_id":11159,"name":"Hong Hui Xiao","email":"honghui_xiao@yeah.net","username":"HongHuiXiao"},"change_message_id":"d84983c652ac539b12106f736c4e791c44f63a6f","unresolved":false,"context_lines":[{"line_number":91,"context_line":"        print(\u0027Key not found: \u0027 + table)"},{"line_number":92,"context_line":"        return"},{"line_number":93,"context_line":""},{"line_number":94,"context_line":"    cli_utils.print_dict(jsonutils.loads(value))"},{"line_number":95,"context_line":""},{"line_number":96,"context_line":""},{"line_number":97,"context_line":"def bind_port_to_localhost(db_driver, port_id):"}],"source_content_type":"text/x-python","patch_set":6,"id":"7a77a97e_e918c177","line":94,"range":{"start_line":94,"start_character":0,"end_line":94,"end_character":48},"updated":"2016-11-17 01:22:55.000000000","message":"And if the value is not a dict(portstats), it will report error here.","commit_id":"3936d4132d6b14080702027232f4a068f43c93c5"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"f7b1bf46a5ba3c8f9b48b1c0627d0c4f4a887db2","unresolved":false,"context_lines":[{"line_number":32,"context_line":"def print_tables():"},{"line_number":33,"context_line":"    tables \u003d []"},{"line_number":34,"context_line":"    columns \u003d [\u0027table\u0027]"},{"line_number":35,"context_line":"    for table in db_tables:"},{"line_number":36,"context_line":"        tables.append({\u0027table\u0027: table})"},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"    labels, formatters \u003d \\"},{"line_number":39,"context_line":"        cli_utils.get_list_table_columns_and_formatters(columns, tables)"}],"source_content_type":"text/x-python","patch_set":8,"id":"5a74a57a_71a6fcae","line":36,"range":{"start_line":35,"start_character":0,"end_line":36,"end_character":39},"updated":"2016-11-29 04:24:43.000000000","message":"nit: Why not use dict/list comprehension?","commit_id":"a5d39ff061690ca6a5bfad203101f65ef5c2ccda"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"f7b1bf46a5ba3c8f9b48b1c0627d0c4f4a887db2","unresolved":false,"context_lines":[{"line_number":48,"context_line":"    except df_exceptions.DBKeyNotFound:"},{"line_number":49,"context_line":"        keys \u003d []"},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"    if not keys:"},{"line_number":52,"context_line":"        print(\u0027Table not found: \u0027 + table)"},{"line_number":53,"context_line":"        return"},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"    for count, key in enumerate(keys):"},{"line_number":56,"context_line":"        keys[count] \u003d {\u0027key\u0027: key}"}],"source_content_type":"text/x-python","patch_set":8,"id":"5a74a57a_f1df6c0a","line":53,"range":{"start_line":51,"start_character":0,"end_line":53,"end_character":14},"updated":"2016-11-29 04:24:43.000000000","message":"I don\u0027t think this is right. A table is not found only if it not in the global list of tables.\n\nIt\u0027s possible for tables to be empty, and I think that it\u0027s possible for tables to be created lazily (i.e. be created only when the first record is created.)\n\nOn the other hand, I see this is an inconsistency in this function. Maybe we\u0027ll just unify the behaviour in another patch.","commit_id":"a5d39ff061690ca6a5bfad203101f65ef5c2ccda"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"f7b1bf46a5ba3c8f9b48b1c0627d0c4f4a887db2","unresolved":false,"context_lines":[{"line_number":78,"context_line":"                             field_labels\u003dlabels)"},{"line_number":79,"context_line":"    elif isinstance(values[0], int):"},{"line_number":80,"context_line":"        l \u003d 0"},{"line_number":81,"context_line":"        for value in values:"},{"line_number":82,"context_line":"            values[l] \u003d {table: value}"},{"line_number":83,"context_line":"            l +\u003d 1"},{"line_number":84,"context_line":"        columns \u003d [table]"}],"source_content_type":"text/x-python","patch_set":8,"id":"5a74a57a_51002066","line":81,"range":{"start_line":81,"start_character":0,"end_line":81,"end_character":28},"updated":"2016-11-29 04:24:43.000000000","message":"nit: You can use enumerate here as well.","commit_id":"a5d39ff061690ca6a5bfad203101f65ef5c2ccda"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"f7b1bf46a5ba3c8f9b48b1c0627d0c4f4a887db2","unresolved":false,"context_lines":[{"line_number":100,"context_line":"    # therefore using print dict for dictionary type otherwise"},{"line_number":101,"context_line":"    # using old approach for print."},{"line_number":102,"context_line":"    if isinstance(value, dict):"},{"line_number":103,"context_line":"        cli_utils.print_dict(jsonutils.loads(value))"},{"line_number":104,"context_line":"    else:"},{"line_number":105,"context_line":"        print(value)"},{"line_number":106,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"5a74a57a_111868d2","line":103,"range":{"start_line":103,"start_character":0,"end_line":103,"end_character":52},"updated":"2016-11-29 04:24:43.000000000","message":"Is jsonutils.loads called twice on value here?","commit_id":"a5d39ff061690ca6a5bfad203101f65ef5c2ccda"},{"author":{"_account_id":11159,"name":"Hong Hui Xiao","email":"honghui_xiao@yeah.net","username":"HongHuiXiao"},"change_message_id":"e2bfae89262749afb87acc3afd019fb3efb5bd56","unresolved":false,"context_lines":[{"line_number":100,"context_line":"    # therefore using print dict for dictionary type otherwise"},{"line_number":101,"context_line":"    # using old approach for print."},{"line_number":102,"context_line":"    if isinstance(value, dict):"},{"line_number":103,"context_line":"        cli_utils.print_dict(jsonutils.loads(value))"},{"line_number":104,"context_line":"    else:"},{"line_number":105,"context_line":"        print(value)"},{"line_number":106,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"5a74a57a_05ec9e28","line":103,"range":{"start_line":103,"start_character":0,"end_line":103,"end_character":52},"in_reply_to":"5a74a57a_111868d2","updated":"2016-11-29 07:11:48.000000000","message":"Same question...","commit_id":"a5d39ff061690ca6a5bfad203101f65ef5c2ccda"}],"dragonflow/cli/utils.py":[{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"5a8c0a458cc5f71dd2864a3514841fda8f683743","unresolved":false,"context_lines":[{"line_number":40,"context_line":"             formatters is a dictionary specifies how to display the value"},{"line_number":41,"context_line":"             of the field."},{"line_number":42,"context_line":"             They can be [], {}."},{"line_number":43,"context_line":"    :raise: magnumclient.common.apiclient.exceptions.CommandError."},{"line_number":44,"context_line":"    \"\"\""},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"    if objs and isinstance(objs, list):"}],"source_content_type":"text/x-python","patch_set":2,"id":"9a629dbe_78ff8b34","line":43,"range":{"start_line":43,"start_character":0,"end_line":43,"end_character":66},"updated":"2016-11-07 16:07:05.000000000","message":"Typo: Should be :raise: dragonflow.exceptions.CommandError ?","commit_id":"5b22ab89d84701b4edc59596b265948faa13b8ef"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"5a8c0a458cc5f71dd2864a3514841fda8f683743","unresolved":false,"context_lines":[{"line_number":87,"context_line":"            return str(k_or_v)"},{"line_number":88,"context_line":"        else:"},{"line_number":89,"context_line":"            return k_or_v"},{"line_number":90,"context_line":"    return dict((to_str(k), to_str(v)) for k, v in dictionary.items())"},{"line_number":91,"context_line":""},{"line_number":92,"context_line":""},{"line_number":93,"context_line":"def _format_field_name(attr):"}],"source_content_type":"text/x-python","patch_set":2,"id":"9a629dbe_e3fe9004","line":90,"range":{"start_line":90,"start_character":51,"end_line":90,"end_character":69},"updated":"2016-11-07 16:07:05.000000000","message":"Consider using six.iteritems(dictionary)","commit_id":"5b22ab89d84701b4edc59596b265948faa13b8ef"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"5a8c0a458cc5f71dd2864a3514841fda8f683743","unresolved":false,"context_lines":[{"line_number":136,"context_line":"    \"\"\""},{"line_number":137,"context_line":"    pt \u003d prettytable.PrettyTable([dict_property, \u0027Value\u0027])"},{"line_number":138,"context_line":"    pt.align \u003d \u0027l\u0027"},{"line_number":139,"context_line":"    for k, v in dct.items():"},{"line_number":140,"context_line":"        # convert dict to str to check length"},{"line_number":141,"context_line":"        if isinstance(v, dict):"},{"line_number":142,"context_line":"            v \u003d six.text_type(keys_and_vals_to_strs(v))"}],"source_content_type":"text/x-python","patch_set":2,"id":"9a629dbe_43cf3cb0","line":139,"updated":"2016-11-07 16:07:05.000000000","message":"same here re: six.iteritems","commit_id":"5b22ab89d84701b4edc59596b265948faa13b8ef"},{"author":{"_account_id":11159,"name":"Hong Hui Xiao","email":"honghui_xiao@yeah.net","username":"HongHuiXiao"},"change_message_id":"40c0ae84ed22300ab5f7d9fadc709bbd159ab80d","unresolved":false,"context_lines":[{"line_number":15,"context_line":"import six"},{"line_number":16,"context_line":"import textwrap"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"import exceptions"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"def get_list_table_columns_and_formatters(fields, objs, exclude_fields\u003d(),"}],"source_content_type":"text/x-python","patch_set":3,"id":"9a629dbe_7dd59441","line":18,"range":{"start_line":18,"start_character":7,"end_line":18,"end_character":17},"updated":"2016-11-08 11:50:16.000000000","message":"from dragonflow.common import exceptions ?","commit_id":"0e01f5ac56e64a4e53f4f23457112715262e160a"},{"author":{"_account_id":11159,"name":"Hong Hui Xiao","email":"honghui_xiao@yeah.net","username":"HongHuiXiao"},"change_message_id":"40c0ae84ed22300ab5f7d9fadc709bbd159ab80d","unresolved":false,"context_lines":[{"line_number":68,"context_line":"            exclude_fields.add(field)"},{"line_number":69,"context_line":""},{"line_number":70,"context_line":"        if non_existent_fields:"},{"line_number":71,"context_line":"            raise exceptions.CommandError("},{"line_number":72,"context_line":"                _(\"Non-existent fields are specified: %s\") %"},{"line_number":73,"context_line":"                non_existent_fields"},{"line_number":74,"context_line":"            )"},{"line_number":75,"context_line":"    return columns, formatters"},{"line_number":76,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"9a629dbe_fde4440e","line":73,"range":{"start_line":71,"start_character":0,"end_line":73,"end_character":35},"updated":"2016-11-08 11:50:16.000000000","message":"since we are switching to use argparser, consider to use parser.exit()\n\nhttps://review.openstack.org/#/c/367922/4/dragonflow/cli/df_db.py@131","commit_id":"0e01f5ac56e64a4e53f4f23457112715262e160a"},{"author":{"_account_id":11159,"name":"Hong Hui Xiao","email":"honghui_xiao@yeah.net","username":"HongHuiXiao"},"change_message_id":"2d4c838dce4350c6add610ff5f70b3594eec9678","unresolved":false,"context_lines":[{"line_number":68,"context_line":"            exclude_fields.add(field)"},{"line_number":69,"context_line":""},{"line_number":70,"context_line":"        if non_existent_fields:"},{"line_number":71,"context_line":"            raise exceptions.CommandError("},{"line_number":72,"context_line":"                _(\"Non-existent fields are specified: %s\") %"},{"line_number":73,"context_line":"                non_existent_fields"},{"line_number":74,"context_line":"            )"},{"line_number":75,"context_line":"    return columns, formatters"},{"line_number":76,"context_line":""},{"line_number":77,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"9a629dbe_860b1d2b","line":74,"range":{"start_line":71,"start_character":11,"end_line":74,"end_character":13},"updated":"2016-11-14 13:22:38.000000000","message":"If you don\u0027t want to use parser.exit(), use the exception this way:\n\nraise exceptions.CommandError(\n                non_existent_fields\u003dnon_existent_fields)","commit_id":"d71f8e656d8a201773a0f50a9320261118bfcf87"},{"author":{"_account_id":11159,"name":"Hong Hui Xiao","email":"honghui_xiao@yeah.net","username":"HongHuiXiao"},"change_message_id":"d84983c652ac539b12106f736c4e791c44f63a6f","unresolved":false,"context_lines":[{"line_number":126,"context_line":"    return name, formatter"},{"line_number":127,"context_line":""},{"line_number":128,"context_line":""},{"line_number":129,"context_line":"def print_dict(dct, dict_property\u003d\"Property\", wrap\u003d0):"},{"line_number":130,"context_line":"    \"\"\"Print a `dict` as a table of two columns."},{"line_number":131,"context_line":""},{"line_number":132,"context_line":"    :param dct: `dict` to print"}],"source_content_type":"text/x-python","patch_set":6,"id":"7a77a97e_6923d1a7","line":129,"range":{"start_line":129,"start_character":15,"end_line":129,"end_character":18},"updated":"2016-11-17 01:22:55.000000000","message":"dict?","commit_id":"3936d4132d6b14080702027232f4a068f43c93c5"}]}
