)]}'
{"ironicclient/common/base.py":[{"author":{"_account_id":14760,"name":"John L. Villalovos","email":"openstack.org@sodarock.com","username":"jlvillal"},"change_message_id":"3bf1c540c813ec5b8da52cdbb70c2d36bbd38ab9","unresolved":false,"context_lines":[{"line_number":100,"context_line":""},{"line_number":101,"context_line":"        path \u003d \"%s/vendor_passthru/%s\" % (resource_identifier, method)"},{"line_number":102,"context_line":"        if http_method in (\u0027POST\u0027, \u0027PUT\u0027, \u0027PATCH\u0027):"},{"line_number":103,"context_line":"            return self.update(path, args, http_method\u003dhttp_method)"},{"line_number":104,"context_line":"        elif http_method \u003d\u003d \u0027DELETE\u0027:"},{"line_number":105,"context_line":"            return self.delete(path)"},{"line_number":106,"context_line":"        elif http_method \u003d\u003d \u0027GET\u0027:"}],"source_content_type":"text/x-python","patch_set":3,"id":"7a740942_567fd314","line":103,"updated":"2015-12-07 19:01:48.000000000","message":"Sounds like need a test case that will catch this issue :)","commit_id":"d9d0b1551193447610ceb80f219215e5a1b7f818"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"ed29ba4aefc8efe5e8111336630b5073125f1531","unresolved":false,"context_lines":[{"line_number":100,"context_line":""},{"line_number":101,"context_line":"        path \u003d \"%s/vendor_passthru/%s\" % (resource_identifier, method)"},{"line_number":102,"context_line":"        if http_method in (\u0027POST\u0027, \u0027PUT\u0027, \u0027PATCH\u0027):"},{"line_number":103,"context_line":"            return self.update(path, args, http_method\u003dhttp_method)"},{"line_number":104,"context_line":"        elif http_method \u003d\u003d \u0027DELETE\u0027:"},{"line_number":105,"context_line":"            return self.delete(path)"},{"line_number":106,"context_line":"        elif http_method \u003d\u003d \u0027GET\u0027:"}],"source_content_type":"text/x-python","patch_set":3,"id":"7a740942_01734616","line":103,"updated":"2015-12-07 18:43:38.000000000","message":"There is no http_method argument in update.","commit_id":"d9d0b1551193447610ceb80f219215e5a1b7f818"},{"author":{"_account_id":14923,"name":"Sinval Vieira Mendes Neto","email":"sinvalneto01@gmail.com","username":"sinvalvieira"},"change_message_id":"5ba17473c368138d6ca400650caffe79d955413a","unresolved":false,"context_lines":[{"line_number":100,"context_line":""},{"line_number":101,"context_line":"        path \u003d \"%s/vendor_passthru/%s\" % (resource_identifier, method)"},{"line_number":102,"context_line":"        if http_method in (\u0027POST\u0027, \u0027PUT\u0027, \u0027PATCH\u0027):"},{"line_number":103,"context_line":"            return self.update(path, args, http_method\u003dhttp_method)"},{"line_number":104,"context_line":"        elif http_method \u003d\u003d \u0027DELETE\u0027:"},{"line_number":105,"context_line":"            return self.delete(path)"},{"line_number":106,"context_line":"        elif http_method \u003d\u003d \u0027GET\u0027:"}],"source_content_type":"text/x-python","patch_set":3,"id":"7a740942_0e6c92cc","line":103,"in_reply_to":"7a740942_567fd314","updated":"2015-12-08 18:26:12.000000000","message":"Actually, it will call the child\u0027s update signature (which has the http_method parameter), but, I do agree that we need more test case for this code, I\u0027ll send a follow up patch to address the lack of testing and refactoring for vendor_passthu, for now I\u0027ll leave this method inside the childs. Thank you guys.","commit_id":"d9d0b1551193447610ceb80f219215e5a1b7f818"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"0cbfa383cdfabcee5606e2d485ee278d5abb5fc6","unresolved":false,"context_lines":[{"line_number":46,"context_line":"    def __init__(self, api):"},{"line_number":47,"context_line":"        self.api \u003d api"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"    def _path(self, id\u003dNone):"},{"line_number":50,"context_line":"        \"\"\"Returns a request path for a given resource identifier."},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"        :param id: Identifier of the resource to generate the request path."}],"source_content_type":"text/x-python","patch_set":4,"id":"7a740942_a87af274","line":49,"updated":"2015-12-09 09:44:51.000000000","message":"id is a built-in function in python, could you please rename your variable?","commit_id":"282412eab072cb58cbdef97a26a4c32a340d9a7c"},{"author":{"_account_id":14923,"name":"Sinval Vieira Mendes Neto","email":"sinvalneto01@gmail.com","username":"sinvalvieira"},"change_message_id":"7932cb7919a69fb9ffb45c8f6ef995d9afa45699","unresolved":false,"context_lines":[{"line_number":46,"context_line":"    def __init__(self, api):"},{"line_number":47,"context_line":"        self.api \u003d api"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"    def _path(self, id\u003dNone):"},{"line_number":50,"context_line":"        \"\"\"Returns a request path for a given resource identifier."},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"        :param id: Identifier of the resource to generate the request path."}],"source_content_type":"text/x-python","patch_set":4,"id":"7a740942_26104a4e","line":49,"in_reply_to":"7a740942_a87af274","updated":"2015-12-09 22:32:00.000000000","message":"Done","commit_id":"282412eab072cb58cbdef97a26a4c32a340d9a7c"}],"ironicclient/v1/chassis.py":[{"author":{"_account_id":14760,"name":"John L. Villalovos","email":"openstack.org@sodarock.com","username":"jlvillal"},"change_message_id":"8b57283395f32ff456f80c7be0df768b88815539","unresolved":false,"context_lines":[{"line_number":160,"context_line":"            return self._list_pagination(self._path(path), \"nodes\","},{"line_number":161,"context_line":"                                         limit\u003dlimit)"},{"line_number":162,"context_line":""},{"line_number":163,"context_line":"    def get(self, chassis_id, fields\u003dNone):"},{"line_number":164,"context_line":"        return super(ChassisManager, self).get(resource_id\u003dchassis_id,"},{"line_number":165,"context_line":"                                               fields\u003dfields)"},{"line_number":166,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"7a740942_d08c6037","line":163,"updated":"2015-12-06 04:06:16.000000000","message":"Another thought...\n\n def get(self, resource_id\u003dNone, fields\u003dNone, chassis_id\u003dNone):\n   if resource_id is None and chassis_id is None:\n    raise TypeError(\"Must use one of ...\")\n  if resource_id is not None and chassis_id is not None:\n   raise TypeError(\"Only one of ... can be used\")\n if resource_id is None:\n      resource_id \u003d chassis_id\n return super....\n\nNot sure if either of these two ideas is better than what is in the patch now.","commit_id":"d9d0b1551193447610ceb80f219215e5a1b7f818"},{"author":{"_account_id":14760,"name":"John L. Villalovos","email":"openstack.org@sodarock.com","username":"jlvillal"},"change_message_id":"6fc66731cccc67d54d30155c801e44bccfacc114","unresolved":false,"context_lines":[{"line_number":160,"context_line":"            return self._list_pagination(self._path(path), \"nodes\","},{"line_number":161,"context_line":"                                         limit\u003dlimit)"},{"line_number":162,"context_line":""},{"line_number":163,"context_line":"    def get(self, chassis_id, fields\u003dNone):"},{"line_number":164,"context_line":"        return super(ChassisManager, self).get(resource_id\u003dchassis_id,"},{"line_number":165,"context_line":"                                               fields\u003dfields)"},{"line_number":166,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"7a740942_ad005d02","line":163,"updated":"2015-12-05 21:28:24.000000000","message":"I was thinking that maybe an api_change decorator could be written. To allow using the old signature and the new signature.\n\n @api_change(chassis_id\u003d\"resource_id\")\n def get(self, resource_id, fields\u003dNone):\n   return super(ChassisManager, self).get(resource_id\u003dresource_id, fields\u003dfields)\n\nI think this could be done fairly easily using the \u0027wrapt\u0027 library.\n\n def api_change(**keyargs):\n   @wrapt.decorator\n   def wrapper(wrapped, instance, *args, **kwargs):\n     for key, value in keyargs:\n       if key in kwargs:\n          kwargs[value] \u003d kwargs[key]\n          del kwargs[key]\n      return wrapped(*args, **kwargs)\n   return wrapper\n\nBut this is likely over-kill. But would be interested in other opinions :)","commit_id":"d9d0b1551193447610ceb80f219215e5a1b7f818"},{"author":{"_account_id":14923,"name":"Sinval Vieira Mendes Neto","email":"sinvalneto01@gmail.com","username":"sinvalvieira"},"change_message_id":"5ba17473c368138d6ca400650caffe79d955413a","unresolved":false,"context_lines":[{"line_number":160,"context_line":"            return self._list_pagination(self._path(path), \"nodes\","},{"line_number":161,"context_line":"                                         limit\u003dlimit)"},{"line_number":162,"context_line":""},{"line_number":163,"context_line":"    def get(self, chassis_id, fields\u003dNone):"},{"line_number":164,"context_line":"        return super(ChassisManager, self).get(resource_id\u003dchassis_id,"},{"line_number":165,"context_line":"                                               fields\u003dfields)"},{"line_number":166,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"7a740942_8e50820c","line":163,"in_reply_to":"7a740942_d08c6037","updated":"2015-12-08 18:26:12.000000000","message":"Thank you for such nice ideas for approaching this, I agree with the decorator, it seems more clean and reusable. But, at least for now, let\u0027s keep this change as simple as possible, I think that Dmitry agreed with experimenting, so I\u0027ll send another patch to handle the lack of testing and refactoring for vendor_passthru method and I\u0027m also planning to provide the decorator solution there. Let me know if you really want to have the decorator on this patch.","commit_id":"d9d0b1551193447610ceb80f219215e5a1b7f818"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"ed29ba4aefc8efe5e8111336630b5073125f1531","unresolved":false,"context_lines":[{"line_number":167,"context_line":"    def delete(self, chassis_id):"},{"line_number":168,"context_line":"        return super(ChassisManager, self).delete(resource_id\u003dchassis_id)"},{"line_number":169,"context_line":""},{"line_number":170,"context_line":"    def update(self, chassis_id, patch):"},{"line_number":171,"context_line":"        return super(ChassisManager, self).update(resource_id\u003dchassis_id,"},{"line_number":172,"context_line":"                                                  patch\u003dpatch)"}],"source_content_type":"text/x-python","patch_set":3,"id":"7a740942_a1c91228","line":170,"updated":"2015-12-07 18:43:38.000000000","message":"The signature should be compliant with the one in base class.","commit_id":"d9d0b1551193447610ceb80f219215e5a1b7f818"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"6b9b61ab1b585af85c093bd4117e70152b3431d8","unresolved":false,"context_lines":[{"line_number":167,"context_line":"    def delete(self, chassis_id):"},{"line_number":168,"context_line":"        return super(ChassisManager, self).delete(resource_id\u003dchassis_id)"},{"line_number":169,"context_line":""},{"line_number":170,"context_line":"    def update(self, chassis_id, patch):"},{"line_number":171,"context_line":"        return super(ChassisManager, self).update(resource_id\u003dchassis_id,"},{"line_number":172,"context_line":"                                                  patch\u003dpatch)"}],"source_content_type":"text/x-python","patch_set":3,"id":"7a740942_b638773e","line":170,"in_reply_to":"7a740942_16f06bc8","updated":"2015-12-07 19:06:34.000000000","message":"oops, you\u0027re right, forgot about this issue. But this is not a good thing, suggestion - maybe add _update method in base class instead? The same could be done for others that have a signature that differs from base class.","commit_id":"d9d0b1551193447610ceb80f219215e5a1b7f818"},{"author":{"_account_id":14760,"name":"John L. Villalovos","email":"openstack.org@sodarock.com","username":"jlvillal"},"change_message_id":"ea9a7ed26b75854242633e217219aca1b1bf55a8","unresolved":false,"context_lines":[{"line_number":167,"context_line":"    def delete(self, chassis_id):"},{"line_number":168,"context_line":"        return super(ChassisManager, self).delete(resource_id\u003dchassis_id)"},{"line_number":169,"context_line":""},{"line_number":170,"context_line":"    def update(self, chassis_id, patch):"},{"line_number":171,"context_line":"        return super(ChassisManager, self).update(resource_id\u003dchassis_id,"},{"line_number":172,"context_line":"                                                  patch\u003dpatch)"}],"source_content_type":"text/x-python","patch_set":3,"id":"7a740942_16f06bc8","line":170,"in_reply_to":"7a740942_a1c91228","updated":"2015-12-07 18:59:55.000000000","message":"The signature must stay the same to maintain API compatibility","commit_id":"d9d0b1551193447610ceb80f219215e5a1b7f818"}],"ironicclient/v1/driver.py":[{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"ed29ba4aefc8efe5e8111336630b5073125f1531","unresolved":false,"context_lines":[{"line_number":35,"context_line":"        path \u003d \"%s/vendor_passthru/methods\" % driver_name"},{"line_number":36,"context_line":"        return self.get(path).to_dict()"},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"    def get(self, driver_name):"},{"line_number":39,"context_line":"        return super(DriverManager, self).get(resource_id\u003ddriver_name)"},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"    def update(self, driver_name, patch, http_method\u003d\u0027PATCH\u0027):"}],"source_content_type":"text/x-python","patch_set":3,"id":"7a740942_c1f53e57","line":38,"updated":"2015-12-07 18:43:38.000000000","message":"ditto signature is differerent","commit_id":"d9d0b1551193447610ceb80f219215e5a1b7f818"},{"author":{"_account_id":14760,"name":"John L. Villalovos","email":"openstack.org@sodarock.com","username":"jlvillal"},"change_message_id":"ea9a7ed26b75854242633e217219aca1b1bf55a8","unresolved":false,"context_lines":[{"line_number":35,"context_line":"        path \u003d \"%s/vendor_passthru/methods\" % driver_name"},{"line_number":36,"context_line":"        return self.get(path).to_dict()"},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"    def get(self, driver_name):"},{"line_number":39,"context_line":"        return super(DriverManager, self).get(resource_id\u003ddriver_name)"},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"    def update(self, driver_name, patch, http_method\u003d\u0027PATCH\u0027):"}],"source_content_type":"text/x-python","patch_set":3,"id":"7a740942_d6bc23de","line":38,"in_reply_to":"7a740942_c1f53e57","updated":"2015-12-07 18:59:55.000000000","message":"The signature must stay the same as before to maintain API compatibility","commit_id":"d9d0b1551193447610ceb80f219215e5a1b7f818"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"0cbfa383cdfabcee5606e2d485ee278d5abb5fc6","unresolved":false,"context_lines":[{"line_number":65,"context_line":"            args \u003d {}"},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"        if http_method is None:"},{"line_number":68,"context_line":"            http_method \u003d \u0027POST\u0027"},{"line_number":69,"context_line":""},{"line_number":70,"context_line":"        http_method \u003d http_method.upper()"},{"line_number":71,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"7a740942_28192222","side":"PARENT","line":68,"updated":"2015-12-09 09:44:51.000000000","message":"While I agree with this change, it is potentially breaking. Before it a user could issue vendor_passthru(driver_name, method, http_method\u003dNone). Not sure if it\u0027s worth bothering about though..","commit_id":"ada67331a934ec18647b529cf3b2b8d9d16cf01e"},{"author":{"_account_id":14923,"name":"Sinval Vieira Mendes Neto","email":"sinvalneto01@gmail.com","username":"sinvalvieira"},"change_message_id":"7932cb7919a69fb9ffb45c8f6ef995d9afa45699","unresolved":false,"context_lines":[{"line_number":65,"context_line":"            args \u003d {}"},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"        if http_method is None:"},{"line_number":68,"context_line":"            http_method \u003d \u0027POST\u0027"},{"line_number":69,"context_line":""},{"line_number":70,"context_line":"        http_method \u003d http_method.upper()"},{"line_number":71,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"7a740942_a69f5ab3","side":"PARENT","line":68,"in_reply_to":"7a740942_28192222","updated":"2015-12-09 22:32:00.000000000","message":"I\u0027m not sure why an user would issue http_method\u003dNone, but you comment makes sense, I\u0027ll checkout it","commit_id":"ada67331a934ec18647b529cf3b2b8d9d16cf01e"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"0cbfa383cdfabcee5606e2d485ee278d5abb5fc6","unresolved":false,"context_lines":[{"line_number":41,"context_line":"        return self._delete(resource_id\u003ddriver_name)"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"    def properties(self, driver_name):"},{"line_number":44,"context_line":"        return self.get(\u0027%s/properties\u0027 % driver_name).to_dict()"},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"    def vendor_passthru(self, driver_name, method, args\u003dNone,"},{"line_number":47,"context_line":"                        http_method\u003d\u0027POST\u0027):"}],"source_content_type":"text/x-python","patch_set":4,"id":"7a740942_28bda201","line":44,"updated":"2015-12-09 09:44:51.000000000","message":"it does not matter now, but in theory it should be _get instead of get, as get expects driver_name.","commit_id":"282412eab072cb58cbdef97a26a4c32a340d9a7c"},{"author":{"_account_id":14923,"name":"Sinval Vieira Mendes Neto","email":"sinvalneto01@gmail.com","username":"sinvalvieira"},"change_message_id":"7932cb7919a69fb9ffb45c8f6ef995d9afa45699","unresolved":false,"context_lines":[{"line_number":41,"context_line":"        return self._delete(resource_id\u003ddriver_name)"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"    def properties(self, driver_name):"},{"line_number":44,"context_line":"        return self.get(\u0027%s/properties\u0027 % driver_name).to_dict()"},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"    def vendor_passthru(self, driver_name, method, args\u003dNone,"},{"line_number":47,"context_line":"                        http_method\u003d\u0027POST\u0027):"}],"source_content_type":"text/x-python","patch_set":4,"id":"7a740942_e6ffa2a8","line":44,"in_reply_to":"7a740942_28bda201","updated":"2015-12-09 22:32:00.000000000","message":"Makes sense, Done.","commit_id":"282412eab072cb58cbdef97a26a4c32a340d9a7c"}],"ironicclient/v1/node.py":[{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"0cbfa383cdfabcee5606e2d485ee278d5abb5fc6","unresolved":false,"context_lines":[{"line_number":225,"context_line":"            args \u003d {}"},{"line_number":226,"context_line":""},{"line_number":227,"context_line":"        if http_method is None:"},{"line_number":228,"context_line":"            http_method \u003d \u0027POST\u0027"},{"line_number":229,"context_line":""},{"line_number":230,"context_line":"        http_method \u003d http_method.upper()"},{"line_number":231,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"7a740942_883db62c","side":"PARENT","line":228,"updated":"2015-12-09 09:44:51.000000000","message":"ditto","commit_id":"ada67331a934ec18647b529cf3b2b8d9d16cf01e"},{"author":{"_account_id":14923,"name":"Sinval Vieira Mendes Neto","email":"sinvalneto01@gmail.com","username":"sinvalvieira"},"change_message_id":"7932cb7919a69fb9ffb45c8f6ef995d9afa45699","unresolved":false,"context_lines":[{"line_number":225,"context_line":"            args \u003d {}"},{"line_number":226,"context_line":""},{"line_number":227,"context_line":"        if http_method is None:"},{"line_number":228,"context_line":"            http_method \u003d \u0027POST\u0027"},{"line_number":229,"context_line":""},{"line_number":230,"context_line":"        http_method \u003d http_method.upper()"},{"line_number":231,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"7a740942_46dc7646","side":"PARENT","line":228,"in_reply_to":"7a740942_883db62c","updated":"2015-12-09 22:32:00.000000000","message":"Done","commit_id":"ada67331a934ec18647b529cf3b2b8d9d16cf01e"}],"ironicclient/v1/port.py":[{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"ed29ba4aefc8efe5e8111336630b5073125f1531","unresolved":false,"context_lines":[{"line_number":109,"context_line":"    def delete(self, port_id):"},{"line_number":110,"context_line":"        return super(PortManager, self).delete(resource_id\u003dport_id)"},{"line_number":111,"context_line":""},{"line_number":112,"context_line":"    def update(self, port_id, patch):"},{"line_number":113,"context_line":"        return super(PortManager, self).update(resource_id\u003dport_id,"},{"line_number":114,"context_line":"                                               patch\u003dpatch)"}],"source_content_type":"text/x-python","patch_set":3,"id":"7a740942_a197d2ea","line":112,"updated":"2015-12-07 18:43:38.000000000","message":"ditto","commit_id":"d9d0b1551193447610ceb80f219215e5a1b7f818"},{"author":{"_account_id":14760,"name":"John L. Villalovos","email":"openstack.org@sodarock.com","username":"jlvillal"},"change_message_id":"ea9a7ed26b75854242633e217219aca1b1bf55a8","unresolved":false,"context_lines":[{"line_number":109,"context_line":"    def delete(self, port_id):"},{"line_number":110,"context_line":"        return super(PortManager, self).delete(resource_id\u003dport_id)"},{"line_number":111,"context_line":""},{"line_number":112,"context_line":"    def update(self, port_id, patch):"},{"line_number":113,"context_line":"        return super(PortManager, self).update(resource_id\u003dport_id,"},{"line_number":114,"context_line":"                                               patch\u003dpatch)"}],"source_content_type":"text/x-python","patch_set":3,"id":"7a740942_f6c11f55","line":112,"in_reply_to":"7a740942_a197d2ea","updated":"2015-12-07 18:59:55.000000000","message":"The signature must stay the same as before to maintain API compatibility","commit_id":"d9d0b1551193447610ceb80f219215e5a1b7f818"}]}
