)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":2813,"name":"Mehdi Abaakouk","email":"sileht@sileht.net","username":"sileht"},"change_message_id":"a7b2b291e2a581440124e0eb138e1c82a4fb4c09","unresolved":false,"context_lines":[{"line_number":18,"context_line":"optimization."},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"Additionaly this patch fixes the bug when a client\u0027s version_cap is"},{"line_number":21,"context_line":"set, but target.version is unset."},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"Change-Id: I608c828123b196099933d16801f8ce7d9dd3a079"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"1a122d0e_550371b8","line":21,"updated":"2016-04-22 13:11:36.000000000","message":"Please don\u0027t mix bug fixes and refactoring, this is unbackportable.\n\nA bug fix need a bug reference","commit_id":"6904ef91b9bc127d64d45470e8ed64239be90e5d"},{"author":{"_account_id":20864,"name":"Gevorg Davoian","email":"gdavoian@gmail.com","username":"gdavoian"},"change_message_id":"eedfe6d5db7266674b4e1e44748a99fb76de6811","unresolved":false,"context_lines":[{"line_number":18,"context_line":"optimization."},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"Additionaly this patch fixes the bug when a client\u0027s version_cap is"},{"line_number":21,"context_line":"set, but target.version is unset."},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"Change-Id: I608c828123b196099933d16801f8ce7d9dd3a079"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"1a122d0e_c4186778","line":21,"in_reply_to":"1a122d0e_550371b8","updated":"2016-04-22 17:35:13.000000000","message":"I have reverted for now changes related to fixing this bug and will report and fix it later.","commit_id":"6904ef91b9bc127d64d45470e8ed64239be90e5d"}],"oslo_messaging/rpc/client.py":[{"author":{"_account_id":2813,"name":"Mehdi Abaakouk","email":"sileht@sileht.net","username":"sileht"},"change_message_id":"f795e31c27afde1c54d6f02dd3b0211919c2a604","unresolved":false,"context_lines":[{"line_number":298,"context_line":""},{"line_number":299,"context_line":"        self.transport \u003d transport"},{"line_number":300,"context_line":"        self.target \u003d target"},{"line_number":301,"context_line":"        self.timeout \u003d timeout"},{"line_number":302,"context_line":"        self.retry \u003d retry"},{"line_number":303,"context_line":"        self.version_cap \u003d version_cap"},{"line_number":304,"context_line":"        self.serializer \u003d serializer or msg_serializer.NoOpSerializer()"}],"source_content_type":"text/x-python","patch_set":1,"id":"1a122d0e_66cd5386","side":"PARENT","line":301,"updated":"2016-04-21 15:36:44.000000000","message":"Removing all this self.XXX breaks the public API.","commit_id":"5b94b4b7a976b16ad7645b525220fff818607c7b"},{"author":{"_account_id":2813,"name":"Mehdi Abaakouk","email":"sileht@sileht.net","username":"sileht"},"change_message_id":"0aecdbd58eee444bcc3c5ac9ecbacd29c8e35674","unresolved":false,"context_lines":[{"line_number":298,"context_line":""},{"line_number":299,"context_line":"        self.transport \u003d transport"},{"line_number":300,"context_line":"        self.target \u003d target"},{"line_number":301,"context_line":"        self.timeout \u003d timeout"},{"line_number":302,"context_line":"        self.retry \u003d retry"},{"line_number":303,"context_line":"        self.version_cap \u003d version_cap"},{"line_number":304,"context_line":"        self.serializer \u003d serializer or msg_serializer.NoOpSerializer()"}],"source_content_type":"text/x-python","patch_set":1,"id":"1a122d0e_72068821","side":"PARENT","line":301,"in_reply_to":"1a122d0e_2a2ade7e","updated":"2016-04-22 11:24:28.000000000","message":"This is still broken, I still cannot retrieve the timeout (or any other public attributes with:\n\n   client \u003d RPClient()\n   print(client.timeout)","commit_id":"5b94b4b7a976b16ad7645b525220fff818607c7b"},{"author":{"_account_id":20864,"name":"Gevorg Davoian","email":"gdavoian@gmail.com","username":"gdavoian"},"change_message_id":"d335aa8f64ed74c47f8438a97748dc305673ab24","unresolved":false,"context_lines":[{"line_number":298,"context_line":""},{"line_number":299,"context_line":"        self.transport \u003d transport"},{"line_number":300,"context_line":"        self.target \u003d target"},{"line_number":301,"context_line":"        self.timeout \u003d timeout"},{"line_number":302,"context_line":"        self.retry \u003d retry"},{"line_number":303,"context_line":"        self.version_cap \u003d version_cap"},{"line_number":304,"context_line":"        self.serializer \u003d serializer or msg_serializer.NoOpSerializer()"}],"source_content_type":"text/x-python","patch_set":1,"id":"1a122d0e_2a2ade7e","side":"PARENT","line":301,"in_reply_to":"1a122d0e_66cd5386","updated":"2016-04-22 09:16:38.000000000","message":"Done","commit_id":"5b94b4b7a976b16ad7645b525220fff818607c7b"},{"author":{"_account_id":2813,"name":"Mehdi Abaakouk","email":"sileht@sileht.net","username":"sileht"},"change_message_id":"75179ec0f31182266e987eef5fe5df35fa8f8cb6","unresolved":false,"context_lines":[{"line_number":298,"context_line":""},{"line_number":299,"context_line":"        self.transport \u003d transport"},{"line_number":300,"context_line":"        self.target \u003d target"},{"line_number":301,"context_line":"        self.timeout \u003d timeout"},{"line_number":302,"context_line":"        self.retry \u003d retry"},{"line_number":303,"context_line":"        self.version_cap \u003d version_cap"},{"line_number":304,"context_line":"        self.serializer \u003d serializer or msg_serializer.NoOpSerializer()"}],"source_content_type":"text/x-python","patch_set":1,"id":"1a122d0e_ddfded6f","side":"PARENT","line":301,"in_reply_to":"1a122d0e_72068821","updated":"2016-04-22 11:32:38.000000000","message":"Forget this comment I have missed your __getattr__ solution.","commit_id":"5b94b4b7a976b16ad7645b525220fff818607c7b"},{"author":{"_account_id":20864,"name":"Gevorg Davoian","email":"gdavoian@gmail.com","username":"gdavoian"},"change_message_id":"6cd6b4b79e6a04018dff408e071c53165909119d","unresolved":false,"context_lines":[{"line_number":367,"context_line":"        :type kwargs: dict"},{"line_number":368,"context_line":"        :raises: MessageDeliveryFailure"},{"line_number":369,"context_line":"        \"\"\""},{"line_number":370,"context_line":"        self.prepare().cast(ctxt, method, **kwargs)"},{"line_number":371,"context_line":""},{"line_number":372,"context_line":"    def call(self, ctxt, method, **kwargs):"},{"line_number":373,"context_line":"        \"\"\"Invoke a method and wait for a reply."}],"source_content_type":"text/x-python","patch_set":2,"id":"1a122d0e_4f2acce8","side":"PARENT","line":370,"range":{"start_line":370,"start_character":8,"end_line":370,"end_character":12},"updated":"2016-04-22 09:11:36.000000000","message":"We really don\u0027t have to create a dummy call context object here which will simply copy all attributes from the default one.","commit_id":"5b94b4b7a976b16ad7645b525220fff818607c7b"},{"author":{"_account_id":20864,"name":"Gevorg Davoian","email":"gdavoian@gmail.com","username":"gdavoian"},"change_message_id":"6cd6b4b79e6a04018dff408e071c53165909119d","unresolved":false,"context_lines":[{"line_number":409,"context_line":"        :type kwargs: dict"},{"line_number":410,"context_line":"        :raises: MessagingTimeout, RemoteError, MessageDeliveryFailure"},{"line_number":411,"context_line":"        \"\"\""},{"line_number":412,"context_line":"        return self.prepare().call(ctxt, method, **kwargs)"},{"line_number":413,"context_line":""},{"line_number":414,"context_line":"    def can_send_version(self, version\u003d_marker):"},{"line_number":415,"context_line":"        \"\"\"Check to see if a version is compatible with the version cap.\"\"\""}],"source_content_type":"text/x-python","patch_set":2,"id":"1a122d0e_6f398841","side":"PARENT","line":412,"range":{"start_line":412,"start_character":0,"end_line":412,"end_character":8},"updated":"2016-04-22 09:11:36.000000000","message":"Same here.","commit_id":"5b94b4b7a976b16ad7645b525220fff818607c7b"},{"author":{"_account_id":20864,"name":"Gevorg Davoian","email":"gdavoian@gmail.com","username":"gdavoian"},"change_message_id":"6cd6b4b79e6a04018dff408e071c53165909119d","unresolved":false,"context_lines":[{"line_number":413,"context_line":""},{"line_number":414,"context_line":"    def can_send_version(self, version\u003d_marker):"},{"line_number":415,"context_line":"        \"\"\"Check to see if a version is compatible with the version cap.\"\"\""},{"line_number":416,"context_line":"        return self.prepare(version\u003dversion).can_send_version()"}],"source_content_type":"text/x-python","patch_set":2,"id":"1a122d0e_4fc64c17","side":"PARENT","line":416,"range":{"start_line":416,"start_character":0,"end_line":416,"end_character":8},"updated":"2016-04-22 09:11:36.000000000","message":"Almost same here except that the prepare method here actually only validates the version.","commit_id":"5b94b4b7a976b16ad7645b525220fff818607c7b"},{"author":{"_account_id":2813,"name":"Mehdi Abaakouk","email":"sileht@sileht.net","username":"sileht"},"change_message_id":"a3d7aff120d4960ffd3fe4ed337e974218ac7d28","unresolved":false,"context_lines":[{"line_number":300,"context_line":""},{"line_number":301,"context_line":"        super(RPCClient, self).__init__()"},{"line_number":302,"context_line":""},{"line_number":303,"context_line":"    def __getattr__(self, name):"},{"line_number":304,"context_line":"        try:"},{"line_number":305,"context_line":"            return getattr(self._default_cctx, name)"},{"line_number":306,"context_line":"        except AttributeError:"}],"source_content_type":"text/x-python","patch_set":2,"id":"1a122d0e_bdebd1af","line":303,"updated":"2016-04-22 11:32:06.000000000","message":"Sorry, I have missing that, I doesn\u0027t like this solution, you expose more that needed and RPCClient().prepare() is shallowed by self._default_cctx.prepare(), same for other methods.","commit_id":"6904ef91b9bc127d64d45470e8ed64239be90e5d"},{"author":{"_account_id":20864,"name":"Gevorg Davoian","email":"gdavoian@gmail.com","username":"gdavoian"},"change_message_id":"937ab52a4af2e203f01450d535b430dec6fbcad9","unresolved":false,"context_lines":[{"line_number":300,"context_line":""},{"line_number":301,"context_line":"        super(RPCClient, self).__init__()"},{"line_number":302,"context_line":""},{"line_number":303,"context_line":"    def __getattr__(self, name):"},{"line_number":304,"context_line":"        try:"},{"line_number":305,"context_line":"            return getattr(self._default_cctx, name)"},{"line_number":306,"context_line":"        except AttributeError:"}],"source_content_type":"text/x-python","patch_set":2,"id":"1a122d0e_9ec36157","line":303,"in_reply_to":"1a122d0e_bdebd1af","updated":"2016-04-22 15:27:14.000000000","message":"I mean that we should use prepare only if we really need to override some context\u0027s attributes. Using prepare without arguments is really useless here because the same work can be done by the default context.","commit_id":"6904ef91b9bc127d64d45470e8ed64239be90e5d"},{"author":{"_account_id":2813,"name":"Mehdi Abaakouk","email":"sileht@sileht.net","username":"sileht"},"change_message_id":"d1b4b5b4944fa18d4070a1b5e1e461688dc10bb7","unresolved":false,"context_lines":[{"line_number":310,"context_line":"        if name \u003d\u003d \"_default_cctx\":"},{"line_number":311,"context_line":"            super(RPCClient, self).__setattr__(name, value)"},{"line_number":312,"context_line":"        else:"},{"line_number":313,"context_line":"            setattr(self._default_cctx, name, value)"},{"line_number":314,"context_line":""},{"line_number":315,"context_line":"    _marker \u003d _CallContext._marker"},{"line_number":316,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"1a122d0e_7b372a4d","line":313,"updated":"2016-04-26 12:51:49.000000000","message":"This looks ugly if it\u0027s only in order to reduce a bit the resource creation.\n\nIf we go that way, I would prefer having a static list of attributes that we should get/set on the default ctxt.\n\nHonestly, more I see your patch more I think we should have a base class shared by RPCClient and _CallContext with just the __init__ method that differ a bit.\n\nBecause we don\u0027t really have implementation difference between RPCClient and _CallContext. This exists only to make the API clear about the fact that a _CallContext is a RPCClient with some configuration value tweaked.","commit_id":"02462d797b1374cf112e7762ec43bb7bc47d6a7a"},{"author":{"_account_id":2813,"name":"Mehdi Abaakouk","email":"sileht@sileht.net","username":"sileht"},"change_message_id":"1b4b68b4e2f59c233a4e311514949d49482a71ab","unresolved":false,"context_lines":[{"line_number":310,"context_line":"        if name \u003d\u003d \"_default_cctx\":"},{"line_number":311,"context_line":"            super(RPCClient, self).__setattr__(name, value)"},{"line_number":312,"context_line":"        else:"},{"line_number":313,"context_line":"            setattr(self._default_cctx, name, value)"},{"line_number":314,"context_line":""},{"line_number":315,"context_line":"    _marker \u003d _CallContext._marker"},{"line_number":316,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"1a122d0e_8fb63bf7","line":313,"in_reply_to":"1a122d0e_5164cf20","updated":"2016-04-26 17:12:27.000000000","message":"Technically we don\u0027t need it, but for API clarification (helpful backtrace, documentation, ...) I think it\u0027s clearer.\n\nRPCClient is the default configuration, _CallContext a tweaked configuration.","commit_id":"02462d797b1374cf112e7762ec43bb7bc47d6a7a"},{"author":{"_account_id":20864,"name":"Gevorg Davoian","email":"gdavoian@gmail.com","username":"gdavoian"},"change_message_id":"b23627027f3df5e4b3da503e8201e1ddf5828ffd","unresolved":false,"context_lines":[{"line_number":310,"context_line":"        if name \u003d\u003d \"_default_cctx\":"},{"line_number":311,"context_line":"            super(RPCClient, self).__setattr__(name, value)"},{"line_number":312,"context_line":"        else:"},{"line_number":313,"context_line":"            setattr(self._default_cctx, name, value)"},{"line_number":314,"context_line":""},{"line_number":315,"context_line":"    _marker \u003d _CallContext._marker"},{"line_number":316,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"1a122d0e_5164cf20","line":313,"in_reply_to":"1a122d0e_7b372a4d","updated":"2016-04-26 13:55:18.000000000","message":"I think inheritance will really simplify the code. But do we really need a distinct base class? Can we inherit RPCClient directly from _CallContext?","commit_id":"02462d797b1374cf112e7762ec43bb7bc47d6a7a"},{"author":{"_account_id":20864,"name":"Gevorg Davoian","email":"gdavoian@gmail.com","username":"gdavoian"},"change_message_id":"c0ca0207c3aa9de17030b0abc780bd54294cf525","unresolved":false,"context_lines":[{"line_number":310,"context_line":"        if name \u003d\u003d \"_default_cctx\":"},{"line_number":311,"context_line":"            super(RPCClient, self).__setattr__(name, value)"},{"line_number":312,"context_line":"        else:"},{"line_number":313,"context_line":"            setattr(self._default_cctx, name, value)"},{"line_number":314,"context_line":""},{"line_number":315,"context_line":"    _marker \u003d _CallContext._marker"},{"line_number":316,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"1a122d0e_63b8e52a","line":313,"in_reply_to":"1a122d0e_8fb63bf7","updated":"2016-04-28 13:16:02.000000000","message":"Done","commit_id":"02462d797b1374cf112e7762ec43bb7bc47d6a7a"}]}
