)]}'
{"neutronclient/common/utils.py":[{"author":{"_account_id":17776,"name":"Reedip","email":"reedip.banerjee@gmail.com","username":"Reedip"},"change_message_id":"d86420ed602c03a94113440bac0fa8e416a40f75","unresolved":false,"context_lines":[{"line_number":129,"context_line":"                    \"Valid key(s) are \u0027%(valid_keys)s\u0027.\")"},{"line_number":130,"context_line":"            raise argparse.ArgumentTypeError("},{"line_number":131,"context_line":"                msg % {\u0027invalid_keys\u0027: \u0027, \u0027.join(invalid_keys),"},{"line_number":132,"context_line":"                       \u0027valid_keys\u0027: \u0027, \u0027.join(valid_keys)})"},{"line_number":133,"context_line":"    if required_keys:"},{"line_number":134,"context_line":"        not_found_keys \u003d [k for k in required_keys if k not in result]"},{"line_number":135,"context_line":"        if not_found_keys:"}],"source_content_type":"text/x-python","patch_set":2,"id":"7a740942_97a647ac","line":132,"updated":"2015-12-09 01:27:57.000000000","message":"Question: Do we need to show the list of valid keys ?\n\n\nOne Reason in support of this query: \nIn the below message for required keys, only the ones which are missing are specified.\nSimilarly, we can show only the list of invalid keys to the user.\nWe do not need to show the list of valid keys, IMO","commit_id":"f7db664ecf7e774eda5e03d057470efad2d57767"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"4bc641036f3a5def21643771811f1044e90236e8","unresolved":false,"context_lines":[{"line_number":129,"context_line":"                    \"Valid key(s) are \u0027%(valid_keys)s\u0027.\")"},{"line_number":130,"context_line":"            raise argparse.ArgumentTypeError("},{"line_number":131,"context_line":"                msg % {\u0027invalid_keys\u0027: \u0027, \u0027.join(invalid_keys),"},{"line_number":132,"context_line":"                       \u0027valid_keys\u0027: \u0027, \u0027.join(valid_keys)})"},{"line_number":133,"context_line":"    if required_keys:"},{"line_number":134,"context_line":"        not_found_keys \u003d [k for k in required_keys if k not in result]"},{"line_number":135,"context_line":"        if not_found_keys:"}],"source_content_type":"text/x-python","patch_set":2,"id":"7a740942_d7a6040e","line":132,"in_reply_to":"7a740942_97a647ac","updated":"2015-12-09 07:09:27.000000000","message":"I think the important thing is to let a user know what are correct keys.\n\n- in case of valid_keys, if we display only invalid keys only, a user need to check what are correct option names, so I think displaying valid keys is a good idea.\n\n- in case of required keys, not_found_keys shown are valid option name, so a user can know what option should be specified.\n\nThis is the basic policy.","commit_id":"f7db664ecf7e774eda5e03d057470efad2d57767"},{"author":{"_account_id":17776,"name":"Reedip","email":"reedip.banerjee@gmail.com","username":"Reedip"},"change_message_id":"d86420ed602c03a94113440bac0fa8e416a40f75","unresolved":false,"context_lines":[{"line_number":133,"context_line":"    if required_keys:"},{"line_number":134,"context_line":"        not_found_keys \u003d [k for k in required_keys if k not in result]"},{"line_number":135,"context_line":"        if not_found_keys:"},{"line_number":136,"context_line":"            msg \u003d _(\"Required key(s) \u0027%s\u0027 are not specified.\")"},{"line_number":137,"context_line":"            raise argparse.ArgumentTypeError(msg % \u0027, \u0027.join(not_found_keys))"},{"line_number":138,"context_line":"    return result"},{"line_number":139,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"7a740942_379bd319","line":136,"updated":"2015-12-09 01:27:57.000000000","message":"Can we avoid \u0027are\u0027 ?\nReworded as : Required key(s) \u0027%s\u0027 not specified.  \n\nWould prevent insubstantial grammatical concerns.","commit_id":"f7db664ecf7e774eda5e03d057470efad2d57767"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"4bc641036f3a5def21643771811f1044e90236e8","unresolved":false,"context_lines":[{"line_number":133,"context_line":"    if required_keys:"},{"line_number":134,"context_line":"        not_found_keys \u003d [k for k in required_keys if k not in result]"},{"line_number":135,"context_line":"        if not_found_keys:"},{"line_number":136,"context_line":"            msg \u003d _(\"Required key(s) \u0027%s\u0027 are not specified.\")"},{"line_number":137,"context_line":"            raise argparse.ArgumentTypeError(msg % \u0027, \u0027.join(not_found_keys))"},{"line_number":138,"context_line":"    return result"},{"line_number":139,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"7a740942_f7eb0011","line":136,"in_reply_to":"7a740942_379bd319","updated":"2015-12-09 07:09:27.000000000","message":"Sounds a good compromise.","commit_id":"f7db664ecf7e774eda5e03d057470efad2d57767"},{"author":{"_account_id":8124,"name":"cbrandily","email":"zzelle@gmail.com","username":"cbrandily"},"change_message_id":"7e5bf80dea15fdcc3340cc9ee3cff1944a0e5c89","unresolved":false,"context_lines":[{"line_number":109,"context_line":"    return strbool.lower() \u003d\u003d \u0027true\u0027"},{"line_number":110,"context_line":""},{"line_number":111,"context_line":""},{"line_number":112,"context_line":"def str2dict(strdict, valid_keys\u003dNone, required_keys\u003dNone):"},{"line_number":113,"context_line":"    \"\"\"Convert key1\u003dvalue1,key2\u003dvalue2,... string into dictionary."},{"line_number":114,"context_line":""},{"line_number":115,"context_line":"    :param strdict: string in the form of key1\u003dvalue1,key2\u003dvalue2"}],"source_content_type":"text/x-python","patch_set":7,"id":"9a68dd71_39a98424","line":112,"range":{"start_line":112,"start_character":22,"end_line":112,"end_character":32},"updated":"2016-01-26 00:45:47.000000000","message":"for readibility reason, it seems better to replace valid_keys by optional_keys because:\n\n valid_keys\u003d set(required_keys) | set(optional_keys)\n\nIt avoids to specify required keys twice.\n\nThoughts?","commit_id":"cf44809245ce3e4fa0c663efd8595d5cce31bb85"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"3e884094aa909eabfac56a953f9eece6bcb9dd89","unresolved":false,"context_lines":[{"line_number":109,"context_line":"    return strbool.lower() \u003d\u003d \u0027true\u0027"},{"line_number":110,"context_line":""},{"line_number":111,"context_line":""},{"line_number":112,"context_line":"def str2dict(strdict, valid_keys\u003dNone, required_keys\u003dNone):"},{"line_number":113,"context_line":"    \"\"\"Convert key1\u003dvalue1,key2\u003dvalue2,... string into dictionary."},{"line_number":114,"context_line":""},{"line_number":115,"context_line":"    :param strdict: string in the form of key1\u003dvalue1,key2\u003dvalue2"}],"source_content_type":"text/x-python","patch_set":7,"id":"bae84128_e62a087e","line":112,"range":{"start_line":112,"start_character":22,"end_line":112,"end_character":32},"in_reply_to":"3a57f1b5_8a7c16b6","updated":"2016-02-19 14:20:10.000000000","message":"Done","commit_id":"cf44809245ce3e4fa0c663efd8595d5cce31bb85"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"fb299e85d81a2efa63ac2b5284d5a7b3f8e76dd1","unresolved":false,"context_lines":[{"line_number":109,"context_line":"    return strbool.lower() \u003d\u003d \u0027true\u0027"},{"line_number":110,"context_line":""},{"line_number":111,"context_line":""},{"line_number":112,"context_line":"def str2dict(strdict, valid_keys\u003dNone, required_keys\u003dNone):"},{"line_number":113,"context_line":"    \"\"\"Convert key1\u003dvalue1,key2\u003dvalue2,... string into dictionary."},{"line_number":114,"context_line":""},{"line_number":115,"context_line":"    :param strdict: string in the form of key1\u003dvalue1,key2\u003dvalue2"}],"source_content_type":"text/x-python","patch_set":7,"id":"3a57f1b5_8a7c16b6","line":112,"range":{"start_line":112,"start_character":22,"end_line":112,"end_character":32},"in_reply_to":"9a68dd71_39a98424","updated":"2016-02-12 16:21:28.000000000","message":"The suggestion makes sense much.\nI will update the patch. Thanks!","commit_id":"cf44809245ce3e4fa0c663efd8595d5cce31bb85"},{"author":{"_account_id":8410,"name":"Richard Theis","email":"rtheis@us.ibm.com","username":"rtheis"},"change_message_id":"24e8db0a978bb62677a955030b9f3a3be77803a2","unresolved":false,"context_lines":[{"line_number":120,"context_line":"    :param optional_keys: list of optional keys."},{"line_number":121,"context_line":"                       This parameter is used for valid key check."},{"line_number":122,"context_line":"                       When at least one of required_keys and optional_keys,"},{"line_number":123,"context_line":"                       a key must be a memberf of either of required_keys or"},{"line_number":124,"context_line":"                       optional_keys. Otherwise, ArgumentTypeError will be"},{"line_number":125,"context_line":"                       raised. When both required_keys and optional_keys are"},{"line_number":126,"context_line":"                       unspecified, no valid key check will be done."}],"source_content_type":"text/x-python","patch_set":8,"id":"bae84128_d725d0ab","line":123,"updated":"2016-02-20 02:14:40.000000000","message":"nit...type \"memberf\"","commit_id":"3fd47737a0267070a7ba85049c0c145f6f5f77cf"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"63a033c611b5d903e7c1f3c7fa3585b3f8bc9fe9","unresolved":false,"context_lines":[{"line_number":120,"context_line":"    :param optional_keys: list of optional keys."},{"line_number":121,"context_line":"                       This parameter is used for valid key check."},{"line_number":122,"context_line":"                       When at least one of required_keys and optional_keys,"},{"line_number":123,"context_line":"                       a key must be a memberf of either of required_keys or"},{"line_number":124,"context_line":"                       optional_keys. Otherwise, ArgumentTypeError will be"},{"line_number":125,"context_line":"                       raised. When both required_keys and optional_keys are"},{"line_number":126,"context_line":"                       unspecified, no valid key check will be done."}],"source_content_type":"text/x-python","patch_set":8,"id":"bae84128_aef9c082","line":123,"in_reply_to":"bae84128_d725d0ab","updated":"2016-02-21 11:33:59.000000000","message":"Thanks!","commit_id":"3fd47737a0267070a7ba85049c0c145f6f5f77cf"},{"author":{"_account_id":6524,"name":"Henry Gessau","email":"HenryG@gessau.net","username":"gessau"},"change_message_id":"0e831cb1a686a659af8a671764a5edc305ec821b","unresolved":false,"context_lines":[{"line_number":135,"context_line":"            result[key] \u003d value"},{"line_number":136,"context_line":"    valid_keys \u003d set(required_keys or []) | set(optional_keys or [])"},{"line_number":137,"context_line":"    if valid_keys:"},{"line_number":138,"context_line":"        invalid_keys \u003d [k for k in result if k not in valid_keys]"},{"line_number":139,"context_line":"        if invalid_keys:"},{"line_number":140,"context_line":"            msg \u003d _(\"Invalid key(s) \u0027%(invalid_keys)s\u0027 specified. \""},{"line_number":141,"context_line":"                    \"Valid key(s): \u0027%(valid_keys)s\u0027.\")"}],"source_content_type":"text/x-python","patch_set":9,"id":"9aed3d3a_27676726","line":138,"updated":"2016-02-28 17:23:29.000000000","message":"Nit: You could continue using set logic here:\n\n  invalid_keys \u003d set(result) - valid_keys","commit_id":"ed17ae60bd5fbcfffb94e91f270191f0b4d92970"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"23d4dcdb9f952cb46f2b690e8ac2fd6f0805ce82","unresolved":false,"context_lines":[{"line_number":135,"context_line":"            result[key] \u003d value"},{"line_number":136,"context_line":"    valid_keys \u003d set(required_keys or []) | set(optional_keys or [])"},{"line_number":137,"context_line":"    if valid_keys:"},{"line_number":138,"context_line":"        invalid_keys \u003d [k for k in result if k not in valid_keys]"},{"line_number":139,"context_line":"        if invalid_keys:"},{"line_number":140,"context_line":"            msg \u003d _(\"Invalid key(s) \u0027%(invalid_keys)s\u0027 specified. \""},{"line_number":141,"context_line":"                    \"Valid key(s): \u0027%(valid_keys)s\u0027.\")"}],"source_content_type":"text/x-python","patch_set":9,"id":"9aed3d3a_de2290a2","line":138,"in_reply_to":"9aed3d3a_27676726","updated":"2016-02-29 18:05:09.000000000","message":"+1  It also could simplify the if statements. For example, you wouldn\u0027t need L137 or L145.  That improves readability a bit.","commit_id":"ed17ae60bd5fbcfffb94e91f270191f0b4d92970"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"a93b186fd5635c5ccf30beffec5f141c2072c40b","unresolved":false,"context_lines":[{"line_number":135,"context_line":"            result[key] \u003d value"},{"line_number":136,"context_line":"    valid_keys \u003d set(required_keys or []) | set(optional_keys or [])"},{"line_number":137,"context_line":"    if valid_keys:"},{"line_number":138,"context_line":"        invalid_keys \u003d [k for k in result if k not in valid_keys]"},{"line_number":139,"context_line":"        if invalid_keys:"},{"line_number":140,"context_line":"            msg \u003d _(\"Invalid key(s) \u0027%(invalid_keys)s\u0027 specified. \""},{"line_number":141,"context_line":"                    \"Valid key(s): \u0027%(valid_keys)s\u0027.\")"}],"source_content_type":"text/x-python","patch_set":9,"id":"9aed3d3a_31ce732e","line":138,"in_reply_to":"9aed3d3a_27676726","updated":"2016-02-29 11:11:05.000000000","message":"Thanks. I will update it if I have a chance to update it.","commit_id":"ed17ae60bd5fbcfffb94e91f270191f0b4d92970"}],"neutronclient/neutron/v2_0/router.py":[{"author":{"_account_id":17776,"name":"Reedip","email":"reedip.banerjee@gmail.com","username":"Reedip"},"change_message_id":"d86420ed602c03a94113440bac0fa8e416a40f75","unresolved":false,"context_lines":[{"line_number":224,"context_line":"            \u0027--disable-snat\u0027, action\u003d\u0027store_true\u0027,"},{"line_number":225,"context_line":"            help\u003d_(\u0027Disable source NAT on the router gateway.\u0027))"},{"line_number":226,"context_line":"        parser.add_argument("},{"line_number":227,"context_line":"            \u0027--fixed-ip\u0027, metavar\u003d\u0027subnet_id\u003dSUBNET,ip_address\u003dIP_ADDR\u0027,"},{"line_number":228,"context_line":"            action\u003d\u0027append\u0027,"},{"line_number":229,"context_line":"            type\u003dutils.str2dict_type(valid_keys\u003d[\u0027subnet_id\u0027, \u0027ip_address\u0027]),"},{"line_number":230,"context_line":"            help\u003d_(\u0027Desired IP and/or subnet on external network: \u0027"}],"source_content_type":"text/x-python","patch_set":2,"id":"7a740942_f7ff8b63","line":227,"updated":"2015-12-09 01:27:57.000000000","message":"Unrelated to this patch, but good to have","commit_id":"f7db664ecf7e774eda5e03d057470efad2d57767"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"4bc641036f3a5def21643771811f1044e90236e8","unresolved":false,"context_lines":[{"line_number":224,"context_line":"            \u0027--disable-snat\u0027, action\u003d\u0027store_true\u0027,"},{"line_number":225,"context_line":"            help\u003d_(\u0027Disable source NAT on the router gateway.\u0027))"},{"line_number":226,"context_line":"        parser.add_argument("},{"line_number":227,"context_line":"            \u0027--fixed-ip\u0027, metavar\u003d\u0027subnet_id\u003dSUBNET,ip_address\u003dIP_ADDR\u0027,"},{"line_number":228,"context_line":"            action\u003d\u0027append\u0027,"},{"line_number":229,"context_line":"            type\u003dutils.str2dict_type(valid_keys\u003d[\u0027subnet_id\u0027, \u0027ip_address\u0027]),"},{"line_number":230,"context_line":"            help\u003d_(\u0027Desired IP and/or subnet on external network: \u0027"}],"source_content_type":"text/x-python","patch_set":2,"id":"7a740942_0e66b929","line":227,"in_reply_to":"7a740942_f7ff8b63","updated":"2015-12-09 07:09:27.000000000","message":"Adding metavar is partially related to this patch (though it is not a requirement) because this patch touches a dict option and I believe it is good to add metavar as a part of this patch.","commit_id":"f7db664ecf7e774eda5e03d057470efad2d57767"},{"author":{"_account_id":8410,"name":"Richard Theis","email":"rtheis@us.ibm.com","username":"rtheis"},"change_message_id":"5db80acb71eb050158f04c01dacb5c5bc1447817","unresolved":false,"context_lines":[{"line_number":115,"context_line":"        routes_group.add_argument("},{"line_number":116,"context_line":"            \u0027--route\u0027, metavar\u003d\u0027destination\u003dCIDR,nexthop\u003dIP_ADDR\u0027,"},{"line_number":117,"context_line":"            action\u003d\u0027append\u0027, dest\u003d\u0027routes\u0027,"},{"line_number":118,"context_line":"            type\u003dutils.str2dict_type(required_keys\u003d[\u0027destination\u0027, \u0027nexthop\u0027]),"},{"line_number":119,"context_line":"            help\u003d_(\u0027Route to associate with the router.\u0027"},{"line_number":120,"context_line":"                   \u0027 You can repeat this option.\u0027))"},{"line_number":121,"context_line":"        routes_group.add_argument("}],"source_content_type":"text/x-python","patch_set":6,"id":"da6ed579_fad070cb","line":118,"updated":"2016-01-18 14:19:56.000000000","message":"Should valid_keys also be used here?","commit_id":"e153ef8fdaad126b9cdbfc3314b48ead2fa4a85d"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"bfd303d438147f8dbd1926efb4f3c253d9db6760","unresolved":false,"context_lines":[{"line_number":115,"context_line":"        routes_group.add_argument("},{"line_number":116,"context_line":"            \u0027--route\u0027, metavar\u003d\u0027destination\u003dCIDR,nexthop\u003dIP_ADDR\u0027,"},{"line_number":117,"context_line":"            action\u003d\u0027append\u0027, dest\u003d\u0027routes\u0027,"},{"line_number":118,"context_line":"            type\u003dutils.str2dict_type(required_keys\u003d[\u0027destination\u0027, \u0027nexthop\u0027]),"},{"line_number":119,"context_line":"            help\u003d_(\u0027Route to associate with the router.\u0027"},{"line_number":120,"context_line":"                   \u0027 You can repeat this option.\u0027))"},{"line_number":121,"context_line":"        routes_group.add_argument("}],"source_content_type":"text/x-python","patch_set":6,"id":"ba63e191_1aec90c6","line":118,"in_reply_to":"da6ed579_fad070cb","updated":"2016-01-19 04:38:24.000000000","message":"Good point. valid_keys is required to avoid unknown keys.","commit_id":"e153ef8fdaad126b9cdbfc3314b48ead2fa4a85d"}],"neutronclient/neutron/v2_0/subnet.py":[{"author":{"_account_id":8410,"name":"Richard Theis","email":"rtheis@us.ibm.com","username":"rtheis"},"change_message_id":"5db80acb71eb050158f04c01dacb5c5bc1447817","unresolved":false,"context_lines":[{"line_number":63,"context_line":"    parser.add_argument("},{"line_number":64,"context_line":"        \u0027--allocation-pool\u0027, metavar\u003d\u0027start\u003dIP_ADDR,end\u003dIP_ADDR\u0027,"},{"line_number":65,"context_line":"        action\u003d\u0027append\u0027, dest\u003d\u0027allocation_pools\u0027,"},{"line_number":66,"context_line":"        type\u003dutils.str2dict_type(required_keys\u003d[\u0027start\u0027, \u0027end\u0027]),"},{"line_number":67,"context_line":"        help\u003d_(\u0027Allocation pool IP addresses for this subnet \u0027"},{"line_number":68,"context_line":"               \u0027(This option can be repeated).\u0027))"},{"line_number":69,"context_line":"    parser.add_argument("}],"source_content_type":"text/x-python","patch_set":6,"id":"da6ed579_9af7f458","line":66,"updated":"2016-01-18 14:19:56.000000000","message":"Should valid_keys also be used for the changes in this part?","commit_id":"e153ef8fdaad126b9cdbfc3314b48ead2fa4a85d"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"bfd303d438147f8dbd1926efb4f3c253d9db6760","unresolved":false,"context_lines":[{"line_number":63,"context_line":"    parser.add_argument("},{"line_number":64,"context_line":"        \u0027--allocation-pool\u0027, metavar\u003d\u0027start\u003dIP_ADDR,end\u003dIP_ADDR\u0027,"},{"line_number":65,"context_line":"        action\u003d\u0027append\u0027, dest\u003d\u0027allocation_pools\u0027,"},{"line_number":66,"context_line":"        type\u003dutils.str2dict_type(required_keys\u003d[\u0027start\u0027, \u0027end\u0027]),"},{"line_number":67,"context_line":"        help\u003d_(\u0027Allocation pool IP addresses for this subnet \u0027"},{"line_number":68,"context_line":"               \u0027(This option can be repeated).\u0027))"},{"line_number":69,"context_line":"    parser.add_argument("}],"source_content_type":"text/x-python","patch_set":6,"id":"ba63e191_7aaa6c1b","line":66,"in_reply_to":"da6ed579_9af7f458","updated":"2016-01-19 04:38:24.000000000","message":"Done","commit_id":"e153ef8fdaad126b9cdbfc3314b48ead2fa4a85d"}],"neutronclient/tests/unit/test_cli20_port.py":[{"author":{"_account_id":17776,"name":"Reedip","email":"reedip.banerjee@gmail.com","username":"Reedip"},"change_message_id":"d86420ed602c03a94113440bac0fa8e416a40f75","unresolved":false,"context_lines":[{"line_number":578,"context_line":"        resource \u003d \u0027port\u0027"},{"line_number":579,"context_line":"        cmd \u003d port.UpdatePort(test_cli20.MyApp(sys.stdout), None)"},{"line_number":580,"context_line":"        myid \u003d \u0027myid\u0027"},{"line_number":581,"context_line":"        subnet_id \u003d \u0027subnet_id\u0027"},{"line_number":582,"context_line":"        ip_addr \u003d \u0027123.123.123.123\u0027"},{"line_number":583,"context_line":"        args \u003d [myid,"},{"line_number":584,"context_line":"                \u0027--fixed-ip\u0027,"}],"source_content_type":"text/x-python","patch_set":2,"id":"7a740942_77439baf","line":581,"updated":"2015-12-09 01:27:57.000000000","message":"Do not think this is related to this fix","commit_id":"f7db664ecf7e774eda5e03d057470efad2d57767"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"4bc641036f3a5def21643771811f1044e90236e8","unresolved":false,"context_lines":[{"line_number":578,"context_line":"        resource \u003d \u0027port\u0027"},{"line_number":579,"context_line":"        cmd \u003d port.UpdatePort(test_cli20.MyApp(sys.stdout), None)"},{"line_number":580,"context_line":"        myid \u003d \u0027myid\u0027"},{"line_number":581,"context_line":"        subnet_id \u003d \u0027subnet_id\u0027"},{"line_number":582,"context_line":"        ip_addr \u003d \u0027123.123.123.123\u0027"},{"line_number":583,"context_line":"        args \u003d [myid,"},{"line_number":584,"context_line":"                \u0027--fixed-ip\u0027,"}],"source_content_type":"text/x-python","patch_set":2,"id":"7a740942_7145e040","line":581,"in_reply_to":"7a740942_77439baf","updated":"2015-12-09 07:09:27.000000000","message":"why? _add_updatable_args() is called in UpdatePort and it checks the valid keys now. \u0027net_id\u0027 is a invalid key so I need to change it to \u0027subnet_id\u0027. Am I missing something?","commit_id":"f7db664ecf7e774eda5e03d057470efad2d57767"}],"neutronclient/tests/unit/test_utils.py":[{"author":{"_account_id":17776,"name":"Reedip","email":"reedip.banerjee@gmail.com","username":"Reedip"},"change_message_id":"d86420ed602c03a94113440bac0fa8e416a40f75","unresolved":false,"context_lines":[{"line_number":76,"context_line":"        e \u003d self.assertRaises(argparse.ArgumentTypeError,"},{"line_number":77,"context_line":"                              utils.str2dict, \u0027key1\u003dvalue1\u0027,"},{"line_number":78,"context_line":"                              required_keys\u003d[\u0027key1\u0027, \u0027key2\u0027])"},{"line_number":79,"context_line":"        self.assertEqual(\"Required key(s) \u0027key2\u0027 are not specified.\", str(e))"},{"line_number":80,"context_line":""},{"line_number":81,"context_line":"    def test_get_dict_item_properties(self):"},{"line_number":82,"context_line":"        item \u003d {\u0027name\u0027: \u0027test_name\u0027, \u0027id\u0027: \u0027test_id\u0027}"}],"source_content_type":"text/x-python","patch_set":2,"id":"7a740942_b7526365","line":79,"updated":"2015-12-09 01:27:57.000000000","message":"Can we reword the Error as  \" Required key(s) \u0027%s\u0027 not specified \"\nWould like to avoid the is/are grammatical constraints","commit_id":"f7db664ecf7e774eda5e03d057470efad2d57767"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"4bc641036f3a5def21643771811f1044e90236e8","unresolved":false,"context_lines":[{"line_number":76,"context_line":"        e \u003d self.assertRaises(argparse.ArgumentTypeError,"},{"line_number":77,"context_line":"                              utils.str2dict, \u0027key1\u003dvalue1\u0027,"},{"line_number":78,"context_line":"                              required_keys\u003d[\u0027key1\u0027, \u0027key2\u0027])"},{"line_number":79,"context_line":"        self.assertEqual(\"Required key(s) \u0027key2\u0027 are not specified.\", str(e))"},{"line_number":80,"context_line":""},{"line_number":81,"context_line":"    def test_get_dict_item_properties(self):"},{"line_number":82,"context_line":"        item \u003d {\u0027name\u0027: \u0027test_name\u0027, \u0027id\u0027: \u0027test_id\u0027}"}],"source_content_type":"text/x-python","patch_set":2,"id":"7a740942_d7f4c4f1","line":79,"in_reply_to":"7a740942_b7526365","updated":"2015-12-09 07:09:27.000000000","message":"Sounds a good compromise.","commit_id":"f7db664ecf7e774eda5e03d057470efad2d57767"}],"neutronclient/tests/unit/vpn/test_cli20_ikepolicy.py":[{"author":{"_account_id":17776,"name":"Reedip","email":"reedip.banerjee@gmail.com","username":"Reedip"},"change_message_id":"d86420ed602c03a94113440bac0fa8e416a40f75","unresolved":false,"context_lines":[{"line_number":138,"context_line":"        if not expected_exc:"},{"line_number":139,"context_line":"            expected_exc \u003d exceptions.CommandError"},{"line_number":140,"context_line":"        self.assertRaises("},{"line_number":141,"context_line":"            expected_exc,"},{"line_number":142,"context_line":"            self._test_create_resource,"},{"line_number":143,"context_line":"            resource, cmd, name, my_id, args,"},{"line_number":144,"context_line":"            position_names, position_values)"}],"source_content_type":"text/x-python","patch_set":2,"id":"7a740942_574d3fc2","line":141,"updated":"2015-12-09 01:27:57.000000000","message":"Is it related to this patch?","commit_id":"f7db664ecf7e774eda5e03d057470efad2d57767"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"4bc641036f3a5def21643771811f1044e90236e8","unresolved":false,"context_lines":[{"line_number":138,"context_line":"        if not expected_exc:"},{"line_number":139,"context_line":"            expected_exc \u003d exceptions.CommandError"},{"line_number":140,"context_line":"        self.assertRaises("},{"line_number":141,"context_line":"            expected_exc,"},{"line_number":142,"context_line":"            self._test_create_resource,"},{"line_number":143,"context_line":"            resource, cmd, name, my_id, args,"},{"line_number":144,"context_line":"            position_names, position_values)"}],"source_content_type":"text/x-python","patch_set":2,"id":"7a740942_b11ee809","line":141,"in_reply_to":"7a740942_574d3fc2","updated":"2015-12-09 07:09:27.000000000","message":"The previous logic catches a general exception and it is not a good practice. I try to catch more specific exception. When parse_args detects a type error, it returns SystemExit, and  test_create_ikepolicy_with_invalid_lifetime_value expects CommandError.\n\nWhen some exception is expexted, such test should use assertRaises instead of try/except.\n\nShould I keep the previous logic?","commit_id":"f7db664ecf7e774eda5e03d057470efad2d57767"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"9e153a8def5e722a767023f7260c63245338b04a","unresolved":false,"context_lines":[{"line_number":138,"context_line":"        if not expected_exc:"},{"line_number":139,"context_line":"            expected_exc \u003d exceptions.CommandError"},{"line_number":140,"context_line":"        self.assertRaises("},{"line_number":141,"context_line":"            expected_exc,"},{"line_number":142,"context_line":"            self._test_create_resource,"},{"line_number":143,"context_line":"            resource, cmd, name, my_id, args,"},{"line_number":144,"context_line":"            position_names, position_values)"}],"source_content_type":"text/x-python","patch_set":2,"id":"7a740942_375428c8","line":141,"in_reply_to":"7a740942_b11ee809","updated":"2015-12-09 07:10:37.000000000","message":"In addition, SystemExit cannot be caught by Exception.","commit_id":"f7db664ecf7e774eda5e03d057470efad2d57767"}],"neutronclient/tests/unit/vpn/test_cli20_ipsec_site_connection.py":[{"author":{"_account_id":17776,"name":"Reedip","email":"reedip.banerjee@gmail.com","username":"Reedip"},"change_message_id":"d86420ed602c03a94113440bac0fa8e416a40f75","unresolved":false,"context_lines":[{"line_number":217,"context_line":"                           ikepolicy_id, ipsecpolicy_id]"},{"line_number":218,"context_line":"        if not expected_exc:"},{"line_number":219,"context_line":"            expected_exc \u003d exceptions.CommandError"},{"line_number":220,"context_line":"        self.assertRaises(expected_exc,"},{"line_number":221,"context_line":"                          self._test_create_resource,"},{"line_number":222,"context_line":"                          resource, cmd, None, my_id, args,"},{"line_number":223,"context_line":"                          position_names, position_values)"}],"source_content_type":"text/x-python","patch_set":2,"id":"7a740942_37cd1331","line":220,"updated":"2015-12-09 01:27:57.000000000","message":"Not related to this patch","commit_id":"f7db664ecf7e774eda5e03d057470efad2d57767"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"4bc641036f3a5def21643771811f1044e90236e8","unresolved":false,"context_lines":[{"line_number":217,"context_line":"                           ikepolicy_id, ipsecpolicy_id]"},{"line_number":218,"context_line":"        if not expected_exc:"},{"line_number":219,"context_line":"            expected_exc \u003d exceptions.CommandError"},{"line_number":220,"context_line":"        self.assertRaises(expected_exc,"},{"line_number":221,"context_line":"                          self._test_create_resource,"},{"line_number":222,"context_line":"                          resource, cmd, None, my_id, args,"},{"line_number":223,"context_line":"                          position_names, position_values)"}],"source_content_type":"text/x-python","patch_set":2,"id":"7a740942_71eba0dc","line":220,"in_reply_to":"7a740942_37cd1331","updated":"2015-12-09 07:09:27.000000000","message":"Why? How can I catch SystemExit? Are you suggesting to copy the whole test and change only an exception type?","commit_id":"f7db664ecf7e774eda5e03d057470efad2d57767"}]}
