)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":13609,"name":"Pavel Boldin","email":"pboldin@mirantis.com","username":"pboldin"},"change_message_id":"50cdfc6bec62b7a85178af00b321700bb7efdae0","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Remove lock object from BaseIdentityPlugin"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"BaseIdentityPlugin can\u0027t be copied with copy.deepcopy because lock object is not copyable."},{"line_number":10,"context_line":"Remove lock object to allow users perform deepcopy."},{"line_number":11,"context_line":""},{"line_number":12,"context_line":"Closes-Bug: #1506958"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":5,"id":"7a740942_a6c09e7d","line":9,"updated":"2015-12-04 15:08:23.000000000","message":"72 symbols max.","commit_id":"95a9da16b2be86e843bf774cf7860a95b35d0559"},{"author":{"_account_id":14358,"name":"Marian Horban","email":"m.horban@gmail.com","username":"mhorban"},"change_message_id":"47041a73eaf284272cb9971a7fbc4759c06db52e","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Remove lock object from BaseIdentityPlugin"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"BaseIdentityPlugin can\u0027t be copied with copy.deepcopy because lock object is not copyable."},{"line_number":10,"context_line":"Remove lock object to allow users perform deepcopy."},{"line_number":11,"context_line":""},{"line_number":12,"context_line":"Closes-Bug: #1506958"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":5,"id":"7a740942_7a47a94b","line":9,"in_reply_to":"7a740942_a6c09e7d","updated":"2015-12-04 16:09:32.000000000","message":"Done","commit_id":"95a9da16b2be86e843bf774cf7860a95b35d0559"}],"keystoneclient/auth/identity/base.py":[{"author":{"_account_id":6849,"name":"Roman Podoliaka","email":"roman.podoliaka@gmail.com","username":"rpodolyaka"},"change_message_id":"0ac7e813976f67e9b96ee0b265a7dfb9b41af2af","unresolved":false,"context_lines":[{"line_number":243,"context_line":"        # to make calls from many threads. As a token expires all the threads"},{"line_number":244,"context_line":"        # will try and fetch a new token at once, so we want to ensure that"},{"line_number":245,"context_line":"        # only one thread tries to actually fetch from keystone at once."},{"line_number":246,"context_line":"        with lockutils.lock(id(self)):"},{"line_number":247,"context_line":"            if self._needs_reauthenticate():"},{"line_number":248,"context_line":"                self.auth_ref \u003d self.get_auth_ref(session)"},{"line_number":249,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"ba8a016a_a108c12e","line":246,"updated":"2015-11-20 14:44:16.000000000","message":"The alternative to using of lockutils here would be a custom implementation of __deepcopy__(), which would initialize an empty Lock.\n\nIn any way we should properly document what is expected from locks here when a copy of an instance is created (i.e. that locks won\u0027t be shared among instances).","commit_id":"8d31b056f1f07a8fa8bbd59dd5680ba4f74223a6"},{"author":{"_account_id":13478,"name":"Boris Bobrov","email":"b.bobrov@sap.com","username":"bbobrov"},"change_message_id":"36aaaf0497b36129fac69c4bc0d4eb0565764901","unresolved":false,"context_lines":[{"line_number":243,"context_line":"        # to make calls from many threads. As a token expires all the threads"},{"line_number":244,"context_line":"        # will try and fetch a new token at once, so we want to ensure that"},{"line_number":245,"context_line":"        # only one thread tries to actually fetch from keystone at once."},{"line_number":246,"context_line":"        with lockutils.lock(id(self)):"},{"line_number":247,"context_line":"            if self._needs_reauthenticate():"},{"line_number":248,"context_line":"                self.auth_ref \u003d self.get_auth_ref(session)"},{"line_number":249,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"9a8ffd7b_d63c04ca","line":246,"in_reply_to":"9a8ffd7b_335d6279","updated":"2015-11-27 09:42:10.000000000","message":"That\u0027s by design of keystoneauth. We want it to have as few dependencies as possible. Now it has these: https://raw.githubusercontent.com/openstack/keystoneauth/stable/liberty/requirements.txt","commit_id":"8d31b056f1f07a8fa8bbd59dd5680ba4f74223a6"},{"author":{"_account_id":14358,"name":"Marian Horban","email":"m.horban@gmail.com","username":"mhorban"},"change_message_id":"7e7e1f82c675f27e5eb61a5f256f5bba9b8d6168","unresolved":false,"context_lines":[{"line_number":243,"context_line":"        # to make calls from many threads. As a token expires all the threads"},{"line_number":244,"context_line":"        # will try and fetch a new token at once, so we want to ensure that"},{"line_number":245,"context_line":"        # only one thread tries to actually fetch from keystone at once."},{"line_number":246,"context_line":"        with lockutils.lock(id(self)):"},{"line_number":247,"context_line":"            if self._needs_reauthenticate():"},{"line_number":248,"context_line":"                self.auth_ref \u003d self.get_auth_ref(session)"},{"line_number":249,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"9a8ffd7b_b69aa06c","line":246,"in_reply_to":"9a8ffd7b_d63c04ca","updated":"2015-11-27 09:49:24.000000000","message":"Boris, thanks for explanation. I\u0027ll remove this dependency.","commit_id":"8d31b056f1f07a8fa8bbd59dd5680ba4f74223a6"},{"author":{"_account_id":14358,"name":"Marian Horban","email":"m.horban@gmail.com","username":"mhorban"},"change_message_id":"10515e6fb48102a939bbbce969049c6e1863635f","unresolved":false,"context_lines":[{"line_number":243,"context_line":"        # to make calls from many threads. As a token expires all the threads"},{"line_number":244,"context_line":"        # will try and fetch a new token at once, so we want to ensure that"},{"line_number":245,"context_line":"        # only one thread tries to actually fetch from keystone at once."},{"line_number":246,"context_line":"        with lockutils.lock(id(self)):"},{"line_number":247,"context_line":"            if self._needs_reauthenticate():"},{"line_number":248,"context_line":"                self.auth_ref \u003d self.get_auth_ref(session)"},{"line_number":249,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"9a8ffd7b_335d6279","line":246,"in_reply_to":"9a8ffd7b_f3903f45","updated":"2015-11-27 09:34:32.000000000","message":"Could you please explain why we can not use oslo_concurrency in keystoneauth?","commit_id":"8d31b056f1f07a8fa8bbd59dd5680ba4f74223a6"},{"author":{"_account_id":13478,"name":"Boris Bobrov","email":"b.bobrov@sap.com","username":"bbobrov"},"change_message_id":"6d132ae3d9e93c58e3a4c82ceb59e986f4e75370","unresolved":false,"context_lines":[{"line_number":243,"context_line":"        # to make calls from many threads. As a token expires all the threads"},{"line_number":244,"context_line":"        # will try and fetch a new token at once, so we want to ensure that"},{"line_number":245,"context_line":"        # only one thread tries to actually fetch from keystone at once."},{"line_number":246,"context_line":"        with lockutils.lock(id(self)):"},{"line_number":247,"context_line":"            if self._needs_reauthenticate():"},{"line_number":248,"context_line":"                self.auth_ref \u003d self.get_auth_ref(session)"},{"line_number":249,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"9a8ffd7b_33c24735","line":246,"in_reply_to":"ba8a016a_a108c12e","updated":"2015-11-27 07:16:41.000000000","message":"Roman, I think that the behaviour doesn\u0027t change with the patch -- there still will be a lock per instance because of id(self).","commit_id":"8d31b056f1f07a8fa8bbd59dd5680ba4f74223a6"},{"author":{"_account_id":14358,"name":"Marian Horban","email":"m.horban@gmail.com","username":"mhorban"},"change_message_id":"ce18c09b5edb456af8178d893c4eb9706687f2a3","unresolved":false,"context_lines":[{"line_number":243,"context_line":"        # to make calls from many threads. As a token expires all the threads"},{"line_number":244,"context_line":"        # will try and fetch a new token at once, so we want to ensure that"},{"line_number":245,"context_line":"        # only one thread tries to actually fetch from keystone at once."},{"line_number":246,"context_line":"        with lockutils.lock(id(self)):"},{"line_number":247,"context_line":"            if self._needs_reauthenticate():"},{"line_number":248,"context_line":"                self.auth_ref \u003d self.get_auth_ref(session)"},{"line_number":249,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"ba8a016a_a86c2137","line":246,"in_reply_to":"ba8a016a_a108c12e","updated":"2015-11-20 15:46:07.000000000","message":"Why do we need additional implementation of __deepcopy__() ?\nLooks like this fix doesn\u0027t change logic of the BaseIdentityPlugin and fix issue. \nWhat do you think about it?","commit_id":"8d31b056f1f07a8fa8bbd59dd5680ba4f74223a6"},{"author":{"_account_id":13478,"name":"Boris Bobrov","email":"b.bobrov@sap.com","username":"bbobrov"},"change_message_id":"6d132ae3d9e93c58e3a4c82ceb59e986f4e75370","unresolved":false,"context_lines":[{"line_number":243,"context_line":"        # to make calls from many threads. As a token expires all the threads"},{"line_number":244,"context_line":"        # will try and fetch a new token at once, so we want to ensure that"},{"line_number":245,"context_line":"        # only one thread tries to actually fetch from keystone at once."},{"line_number":246,"context_line":"        with lockutils.lock(id(self)):"},{"line_number":247,"context_line":"            if self._needs_reauthenticate():"},{"line_number":248,"context_line":"                self.auth_ref \u003d self.get_auth_ref(session)"},{"line_number":249,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"9a8ffd7b_f3903f45","line":246,"in_reply_to":"ba8a016a_a86c2137","updated":"2015-11-27 07:16:41.000000000","message":"Marian, although your fix works, it will not work for keystoneauth, where we will not add oslo_concurrency as a dependency. I am OK with it in python-keystoneclient, but it will not live long here -- auth plugins will soon be used from keystoneauth.","commit_id":"8d31b056f1f07a8fa8bbd59dd5680ba4f74223a6"},{"author":{"_account_id":13609,"name":"Pavel Boldin","email":"pboldin@mirantis.com","username":"pboldin"},"change_message_id":"50cdfc6bec62b7a85178af00b321700bb7efdae0","unresolved":false,"context_lines":[{"line_number":64,"context_line":"        self._trust_id \u003d trust_id"},{"line_number":65,"context_line":""},{"line_number":66,"context_line":"    def __deepcopy__(self, memo):"},{"line_number":67,"context_line":"        new_plugin \u003d type(self).__new__(type(self))"},{"line_number":68,"context_line":"        for key, val in self.__dict__.items():"},{"line_number":69,"context_line":"            if key \u003d\u003d \u0027_lock\u0027:"},{"line_number":70,"context_line":"                setattr(new_plugin, key, threading.Lock())"}],"source_content_type":"text/x-python","patch_set":5,"id":"7a740942_66d716ee","line":67,"updated":"2015-12-04 15:08:23.000000000","message":"You can just call the type itself:\n\n new_plugin \u003d type(self)()","commit_id":"95a9da16b2be86e843bf774cf7860a95b35d0559"},{"author":{"_account_id":14358,"name":"Marian Horban","email":"m.horban@gmail.com","username":"mhorban"},"change_message_id":"84028e7233263995d1611608626f48016ca7ad23","unresolved":false,"context_lines":[{"line_number":64,"context_line":"        self._trust_id \u003d trust_id"},{"line_number":65,"context_line":""},{"line_number":66,"context_line":"    def __deepcopy__(self, memo):"},{"line_number":67,"context_line":"        new_plugin \u003d type(self).__new__(type(self))"},{"line_number":68,"context_line":"        for key, val in self.__dict__.items():"},{"line_number":69,"context_line":"            if key \u003d\u003d \u0027_lock\u0027:"},{"line_number":70,"context_line":"                setattr(new_plugin, key, threading.Lock())"}],"source_content_type":"text/x-python","patch_set":5,"id":"7a740942_c644ca75","line":67,"in_reply_to":"7a740942_66d716ee","updated":"2015-12-04 15:17:00.000000000","message":"I can not do it because it is abstract class","commit_id":"95a9da16b2be86e843bf774cf7860a95b35d0559"},{"author":{"_account_id":6849,"name":"Roman Podoliaka","email":"roman.podoliaka@gmail.com","username":"rpodolyaka"},"change_message_id":"64da8303f92fc03eb69f5deafe796bad42bdfe01","unresolved":false,"context_lines":[{"line_number":66,"context_line":"    def __deepcopy__(self, memo):"},{"line_number":67,"context_line":"        new_plugin \u003d type(self).__new__(type(self))"},{"line_number":68,"context_line":"        for key, val in self.__dict__.items():"},{"line_number":69,"context_line":"            if key \u003d\u003d \u0027_lock\u0027:"},{"line_number":70,"context_line":"                setattr(new_plugin, key, threading.Lock())"},{"line_number":71,"context_line":"            else:"},{"line_number":72,"context_line":"                setattr(new_plugin, key, copy.deepcopy(val, memo))"}],"source_content_type":"text/x-python","patch_set":7,"id":"7a740942_55328911","line":69,"updated":"2015-12-07 10:32:37.000000000","message":"let\u0027s leave a small NOTE here on why we are doing this","commit_id":"6cf4c6ee2e41394d2c8456aa56fc2cee80c8dd09"},{"author":{"_account_id":14358,"name":"Marian Horban","email":"m.horban@gmail.com","username":"mhorban"},"change_message_id":"0419a274cd2b231055860745c4d6daafe25ec7ff","unresolved":false,"context_lines":[{"line_number":66,"context_line":"    def __deepcopy__(self, memo):"},{"line_number":67,"context_line":"        new_plugin \u003d type(self).__new__(type(self))"},{"line_number":68,"context_line":"        for key, val in self.__dict__.items():"},{"line_number":69,"context_line":"            if key \u003d\u003d \u0027_lock\u0027:"},{"line_number":70,"context_line":"                setattr(new_plugin, key, threading.Lock())"},{"line_number":71,"context_line":"            else:"},{"line_number":72,"context_line":"                setattr(new_plugin, key, copy.deepcopy(val, memo))"}],"source_content_type":"text/x-python","patch_set":7,"id":"7a740942_649ea0ba","line":69,"in_reply_to":"7a740942_55328911","updated":"2015-12-08 15:47:35.000000000","message":"Done","commit_id":"6cf4c6ee2e41394d2c8456aa56fc2cee80c8dd09"},{"author":{"_account_id":13478,"name":"Boris Bobrov","email":"b.bobrov@sap.com","username":"bbobrov"},"change_message_id":"3528efc9ae748f71688649eb055319511049d6cd","unresolved":false,"context_lines":[{"line_number":70,"context_line":"            # that\u0027s why a new instance of threading.Lock is created,"},{"line_number":71,"context_line":"            # which will be a new independent lock"},{"line_number":72,"context_line":"            if key \u003d\u003d \u0027_lock\u0027:"},{"line_number":73,"context_line":"                setattr(new_plugin, key, threading.Lock())"},{"line_number":74,"context_line":"            else:"},{"line_number":75,"context_line":"                setattr(new_plugin, key, copy.deepcopy(val, memo))"},{"line_number":76,"context_line":"        return new_plugin"}],"source_content_type":"text/x-python","patch_set":9,"id":"7a740942_713632e9","line":73,"updated":"2015-12-09 11:20:47.000000000","message":"Now I\u0027m concerned about comment on line 254-258. The lock there is to prevent multiple simultaneous requests to keystone when a token gets expired.\n\nWhen a plugin is deepcopied, the token gets deepcopied too. So, it will expire in both copies at the same time and will be re-requested from keystone by both copies at once. Which is the situation we want to prevent.\n\nMaybe nova should not deepcopy the plugin? What\u0027s the reason for nova to do it?","commit_id":"4b3395704db89a5e27d0ce38f3e4d4f69f0727fb"},{"author":{"_account_id":14358,"name":"Marian Horban","email":"m.horban@gmail.com","username":"mhorban"},"change_message_id":"33cf153057b43d8cb21d3dc59516927dd43d7e92","unresolved":false,"context_lines":[{"line_number":70,"context_line":"            # that\u0027s why a new instance of threading.Lock is created,"},{"line_number":71,"context_line":"            # which will be a new independent lock"},{"line_number":72,"context_line":"            if key \u003d\u003d \u0027_lock\u0027:"},{"line_number":73,"context_line":"                setattr(new_plugin, key, threading.Lock())"},{"line_number":74,"context_line":"            else:"},{"line_number":75,"context_line":"                setattr(new_plugin, key, copy.deepcopy(val, memo))"},{"line_number":76,"context_line":"        return new_plugin"}],"source_content_type":"text/x-python","patch_set":9,"id":"7a740942_088c5b34","line":73,"in_reply_to":"7a740942_1d025fb5","updated":"2015-12-09 13:07:57.000000000","message":"nova makes deep copy of BaseIdentityPlugin for a long time .\nIt worked well because when we use eventlet.monkey_patch(threading\u003dTrue) threading.Lock() can be deep copied successfully.","commit_id":"4b3395704db89a5e27d0ce38f3e4d4f69f0727fb"},{"author":{"_account_id":14358,"name":"Marian Horban","email":"m.horban@gmail.com","username":"mhorban"},"change_message_id":"272643d8d3e38eceb654e441613f6b2431cf9c12","unresolved":false,"context_lines":[{"line_number":70,"context_line":"            # that\u0027s why a new instance of threading.Lock is created,"},{"line_number":71,"context_line":"            # which will be a new independent lock"},{"line_number":72,"context_line":"            if key \u003d\u003d \u0027_lock\u0027:"},{"line_number":73,"context_line":"                setattr(new_plugin, key, threading.Lock())"},{"line_number":74,"context_line":"            else:"},{"line_number":75,"context_line":"                setattr(new_plugin, key, copy.deepcopy(val, memo))"},{"line_number":76,"context_line":"        return new_plugin"}],"source_content_type":"text/x-python","patch_set":9,"id":"7a740942_d786f615","line":73,"in_reply_to":"7a740942_713632e9","updated":"2015-12-09 12:09:50.000000000","message":"If we want to have the same mutex in copied object I can change code to:\n setattr(new_plugin, key, self._lock)\nAre you agree with that?","commit_id":"4b3395704db89a5e27d0ce38f3e4d4f69f0727fb"},{"author":{"_account_id":13478,"name":"Boris Bobrov","email":"b.bobrov@sap.com","username":"bbobrov"},"change_message_id":"f877a4b9077a62a2648204d3e4ee714be953903d","unresolved":false,"context_lines":[{"line_number":70,"context_line":"            # that\u0027s why a new instance of threading.Lock is created,"},{"line_number":71,"context_line":"            # which will be a new independent lock"},{"line_number":72,"context_line":"            if key \u003d\u003d \u0027_lock\u0027:"},{"line_number":73,"context_line":"                setattr(new_plugin, key, threading.Lock())"},{"line_number":74,"context_line":"            else:"},{"line_number":75,"context_line":"                setattr(new_plugin, key, copy.deepcopy(val, memo))"},{"line_number":76,"context_line":"        return new_plugin"}],"source_content_type":"text/x-python","patch_set":9,"id":"7a740942_1d025fb5","line":73,"in_reply_to":"7a740942_d786f615","updated":"2015-12-09 12:44:30.000000000","message":"I don\u0027t know. Before we do anything here, I would like to understand why deepcopy is even required. Why can\u0027t nova reuse the same auth plugin? If it can, __deepcopy__, which will skip deepcopying the entire auth plugin, should be implemented there.","commit_id":"4b3395704db89a5e27d0ce38f3e4d4f69f0727fb"}],"keystoneclient/tests/unit/auth/test_identity_base.py":[{"author":{"_account_id":13478,"name":"Boris Bobrov","email":"b.bobrov@sap.com","username":"bbobrov"},"change_message_id":"6d132ae3d9e93c58e3a4c82ceb59e986f4e75370","unresolved":false,"context_lines":[{"line_number":29,"context_line":"                                         password\u003d\u0027test_password\u0027,"},{"line_number":30,"context_line":"                                         token\u003d\u0027test_token\u0027,"},{"line_number":31,"context_line":"                                         trust_id\u003d\u0027test_trust_id\u0027)"},{"line_number":32,"context_line":"        copy.deepcopy(plugin)"}],"source_content_type":"text/x-python","patch_set":3,"id":"9a8ffd7b_53d6ebf1","line":32,"updated":"2015-11-27 07:16:41.000000000","message":"it would be great to have a description why this is needed so that we don\u0027t lose it in the future.","commit_id":"8d31b056f1f07a8fa8bbd59dd5680ba4f74223a6"},{"author":{"_account_id":14358,"name":"Marian Horban","email":"m.horban@gmail.com","username":"mhorban"},"change_message_id":"7540c95eef661c92dafba052c5e8f5c63068cd8e","unresolved":false,"context_lines":[{"line_number":29,"context_line":"                                         password\u003d\u0027test_password\u0027,"},{"line_number":30,"context_line":"                                         token\u003d\u0027test_token\u0027,"},{"line_number":31,"context_line":"                                         trust_id\u003d\u0027test_trust_id\u0027)"},{"line_number":32,"context_line":"        copy.deepcopy(plugin)"}],"source_content_type":"text/x-python","patch_set":3,"id":"9a8ffd7b_87f7e3d1","line":32,"in_reply_to":"9a8ffd7b_53d6ebf1","updated":"2015-11-30 11:44:44.000000000","message":"Done","commit_id":"8d31b056f1f07a8fa8bbd59dd5680ba4f74223a6"},{"author":{"_account_id":13609,"name":"Pavel Boldin","email":"pboldin@mirantis.com","username":"pboldin"},"change_message_id":"50cdfc6bec62b7a85178af00b321700bb7efdae0","unresolved":false,"context_lines":[{"line_number":30,"context_line":"                                         password\u003d\u0027test_password\u0027,"},{"line_number":31,"context_line":"                                         token\u003d\u0027test_token\u0027,"},{"line_number":32,"context_line":"                                         trust_id\u003d\u0027test_trust_id\u0027)"},{"line_number":33,"context_line":"        copy.deepcopy(plugin)"}],"source_content_type":"text/x-python","patch_set":5,"id":"7a740942_464a1ac7","line":33,"updated":"2015-12-04 15:08:23.000000000","message":"Please check the content of the `plugin\u0027 variable.","commit_id":"95a9da16b2be86e843bf774cf7860a95b35d0559"},{"author":{"_account_id":14358,"name":"Marian Horban","email":"m.horban@gmail.com","username":"mhorban"},"change_message_id":"47041a73eaf284272cb9971a7fbc4759c06db52e","unresolved":false,"context_lines":[{"line_number":30,"context_line":"                                         password\u003d\u0027test_password\u0027,"},{"line_number":31,"context_line":"                                         token\u003d\u0027test_token\u0027,"},{"line_number":32,"context_line":"                                         trust_id\u003d\u0027test_trust_id\u0027)"},{"line_number":33,"context_line":"        copy.deepcopy(plugin)"}],"source_content_type":"text/x-python","patch_set":5,"id":"7a740942_1a754597","line":33,"in_reply_to":"7a740942_464a1ac7","updated":"2015-12-04 16:09:32.000000000","message":"Done","commit_id":"95a9da16b2be86e843bf774cf7860a95b35d0559"},{"author":{"_account_id":14358,"name":"Marian Horban","email":"m.horban@gmail.com","username":"mhorban"},"change_message_id":"84028e7233263995d1611608626f48016ca7ad23","unresolved":false,"context_lines":[{"line_number":30,"context_line":"                                         password\u003d\u0027test_password\u0027,"},{"line_number":31,"context_line":"                                         token\u003d\u0027test_token\u0027,"},{"line_number":32,"context_line":"                                         trust_id\u003d\u0027test_trust_id\u0027)"},{"line_number":33,"context_line":"        copy.deepcopy(plugin)"}],"source_content_type":"text/x-python","patch_set":5,"id":"7a740942_e923d9a5","line":33,"in_reply_to":"7a740942_464a1ac7","updated":"2015-12-04 15:17:00.000000000","message":"My test is intended to check that BaseIdentityPluginTests could be deep copied.\nI believe that additional tests should be written for checking of BaseIdentityPluginTests content.","commit_id":"95a9da16b2be86e843bf774cf7860a95b35d0559"},{"author":{"_account_id":6849,"name":"Roman Podoliaka","email":"roman.podoliaka@gmail.com","username":"rpodolyaka"},"change_message_id":"64da8303f92fc03eb69f5deafe796bad42bdfe01","unresolved":false,"context_lines":[{"line_number":39,"context_line":"        self.assertEqual(plugin._password, plugin_copy._password)"},{"line_number":40,"context_line":"        self.assertEqual(plugin._token, plugin_copy._token)"},{"line_number":41,"context_line":"        self.assertEqual(plugin._trust_id, plugin_copy._trust_id)"},{"line_number":42,"context_line":"        self.assertEqual(type(plugin._lock), type(plugin_copy._lock))"}],"source_content_type":"text/x-python","patch_set":7,"id":"7a740942_189af863","line":42,"updated":"2015-12-07 10:32:37.000000000","message":"can we instead assert these are not the same instance and are of correct type?\n\nself.assertIsNot(plugin._lock, plugin_copy._lock)\nself.assertIsInstance(plugin._lock, ...)\nself.assertIsInstance(plugin_copy._lock, ...)","commit_id":"6cf4c6ee2e41394d2c8456aa56fc2cee80c8dd09"},{"author":{"_account_id":14358,"name":"Marian Horban","email":"m.horban@gmail.com","username":"mhorban"},"change_message_id":"0419a274cd2b231055860745c4d6daafe25ec7ff","unresolved":false,"context_lines":[{"line_number":39,"context_line":"        self.assertEqual(plugin._password, plugin_copy._password)"},{"line_number":40,"context_line":"        self.assertEqual(plugin._token, plugin_copy._token)"},{"line_number":41,"context_line":"        self.assertEqual(plugin._trust_id, plugin_copy._trust_id)"},{"line_number":42,"context_line":"        self.assertEqual(type(plugin._lock), type(plugin_copy._lock))"}],"source_content_type":"text/x-python","patch_set":7,"id":"7a740942_447044a4","line":42,"in_reply_to":"7a740942_189af863","updated":"2015-12-08 15:47:35.000000000","message":"Done","commit_id":"6cf4c6ee2e41394d2c8456aa56fc2cee80c8dd09"}]}
