)]}'
{"keystone/notifications.py":[{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"aeba5a3dfba19189e4df3e327cb402fb387720d4","unresolved":false,"context_lines":[{"line_number":179,"context_line":"        if sys.version_info[0] \u003c 3:"},{"line_number":180,"context_line":"            im_class \u003d callback.im_class.__name__"},{"line_number":181,"context_line":"        else:"},{"line_number":182,"context_line":"            im_class \u003d callback.__self__.__class__.__name__"},{"line_number":183,"context_line":"        return [getattr(callback, \u0027__module__\u0027, None),"},{"line_number":184,"context_line":"                im_class,"},{"line_number":185,"context_line":"                callback.__name__]"}],"source_content_type":"text/x-python","patch_set":1,"id":"ba7be1f8_14a58046","line":182,"updated":"2015-02-24 23:44:36.000000000","message":"I think __self__ existed on methods as far back as Python2.6. Are you finding that this is not the same and you still need Python2.3 style access?","commit_id":"d001bad38cbaa526709b68d6119126c4130b755c"},{"author":{"_account_id":7186,"name":"Matthieu Huin","email":"mhuin@redhat.com","username":"mhu"},"change_message_id":"ec16841fecefb0373e070ceba0dcfdade56678a0","unresolved":false,"context_lines":[{"line_number":179,"context_line":"        if sys.version_info[0] \u003c 3:"},{"line_number":180,"context_line":"            im_class \u003d callback.im_class.__name__"},{"line_number":181,"context_line":"        else:"},{"line_number":182,"context_line":"            im_class \u003d callback.__self__.__class__.__name__"},{"line_number":183,"context_line":"        return [getattr(callback, \u0027__module__\u0027, None),"},{"line_number":184,"context_line":"                im_class,"},{"line_number":185,"context_line":"                callback.__name__]"}],"source_content_type":"text/x-python","patch_set":1,"id":"ba7be1f8_66b9a414","line":182,"in_reply_to":"ba7be1f8_14a58046","updated":"2015-02-25 09:57:20.000000000","message":"It does, but __self__ seems to return an instance in python \u003c 3. I\u0027ve tested this in python 2.7.6:\n\nIn [1]: class C(object):\n   ...:    def callback(self, *args, **kwargs):\n   ...:        pass\n   ...: \nIn [2]: C.callback\nOut[2]: \u003cunbound method C.callback\u003e\nIn [3]: C.callback.im_class.__name__\nOut[3]: \u0027C\u0027\nIn [4]: C.callback.__self__\nIn [5]: C.callback.__self__.__class__.__name__\nOut[5]: \u0027NoneType\u0027\nIn [6]: C().callback.__self__.__class__.__name__\nOut[6]: \u0027C\u0027","commit_id":"d001bad38cbaa526709b68d6119126c4130b755c"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"e39f526f165034dcb159ef6c02694289bf637856","unresolved":false,"context_lines":[{"line_number":179,"context_line":"        if sys.version_info[0] \u003c 3:"},{"line_number":180,"context_line":"            im_class \u003d callback.im_class.__name__"},{"line_number":181,"context_line":"        else:"},{"line_number":182,"context_line":"            im_class \u003d callback.__self__.__class__.__name__"},{"line_number":183,"context_line":"        return [getattr(callback, \u0027__module__\u0027, None),"},{"line_number":184,"context_line":"                im_class,"},{"line_number":185,"context_line":"                callback.__name__]"}],"source_content_type":"text/x-python","patch_set":1,"id":"1a6ced46_0696b394","line":182,"in_reply_to":"ba7be1f8_66b9a414","updated":"2015-03-23 16:34:05.000000000","message":"We are only doing this on instance methods right? Otherwise it won\u0027t work on Python 3 anyway.\n\n`C().callback.__self__.__class__.__name__` should return the same on both versions of Python.","commit_id":"d001bad38cbaa526709b68d6119126c4130b755c"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"f3507e10f0aa036c194f9c013af15c0612ea8906","unresolved":false,"context_lines":[{"line_number":248,"context_line":"    :rtype: list"},{"line_number":249,"context_line":"    \"\"\""},{"line_number":250,"context_line":"    if inspect.ismethod(callback):"},{"line_number":251,"context_line":"        if callback.__self__:"},{"line_number":252,"context_line":"            im_class \u003d callback.__self__.__class__.__name__"},{"line_number":253,"context_line":"            return [getattr(callback, \u0027__module__\u0027, None),"},{"line_number":254,"context_line":"                    im_class,"}],"source_content_type":"text/x-python","patch_set":4,"id":"dac4157f_64bce16c","line":251,"updated":"2015-04-20 13:05:19.000000000","message":"Why is this \u0027if\u0027 statement here? Seems odd and the tests run without it.","commit_id":"e6ccedd9fc40b52e78d0d2038fe6459ffa08ae0d"},{"author":{"_account_id":7186,"name":"Matthieu Huin","email":"mhuin@redhat.com","username":"mhu"},"change_message_id":"ca20fd85968b2bc90554d30063d69ee383bc9d8a","unresolved":false,"context_lines":[{"line_number":248,"context_line":"    :rtype: list"},{"line_number":249,"context_line":"    \"\"\""},{"line_number":250,"context_line":"    if inspect.ismethod(callback):"},{"line_number":251,"context_line":"        if callback.__self__:"},{"line_number":252,"context_line":"            im_class \u003d callback.__self__.__class__.__name__"},{"line_number":253,"context_line":"            return [getattr(callback, \u0027__module__\u0027, None),"},{"line_number":254,"context_line":"                    im_class,"}],"source_content_type":"text/x-python","patch_set":4,"id":"dac4157f_dff938ca","line":251,"in_reply_to":"dac4157f_64bce16c","updated":"2015-04-20 14:15:08.000000000","message":"this tests whether callback is bound (then __self__ is set to the instance) or unbound (set to None), and this is tested in keystone/tests/unit/common/test_notifications.py#988","commit_id":"e6ccedd9fc40b52e78d0d2038fe6459ffa08ae0d"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"7ccb0430f557b60621eb5572d6c978eec6df6d57","unresolved":false,"context_lines":[{"line_number":248,"context_line":"    :rtype: list"},{"line_number":249,"context_line":"    \"\"\""},{"line_number":250,"context_line":"    if inspect.ismethod(callback):"},{"line_number":251,"context_line":"        if callback.__self__:"},{"line_number":252,"context_line":"            im_class \u003d callback.__self__.__class__.__name__"},{"line_number":253,"context_line":"            return [getattr(callback, \u0027__module__\u0027, None),"},{"line_number":254,"context_line":"                    im_class,"}],"source_content_type":"text/x-python","patch_set":4,"id":"bab921fb_8871e746","line":251,"in_reply_to":"dac4157f_dff938ca","updated":"2015-04-24 22:25:03.000000000","message":"I think there is a hole in the testing coverage because the tests pass without this statement.","commit_id":"e6ccedd9fc40b52e78d0d2038fe6459ffa08ae0d"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"f3507e10f0aa036c194f9c013af15c0612ea8906","unresolved":false,"context_lines":[{"line_number":249,"context_line":"    \"\"\""},{"line_number":250,"context_line":"    if inspect.ismethod(callback):"},{"line_number":251,"context_line":"        if callback.__self__:"},{"line_number":252,"context_line":"            im_class \u003d callback.__self__.__class__.__name__"},{"line_number":253,"context_line":"            return [getattr(callback, \u0027__module__\u0027, None),"},{"line_number":254,"context_line":"                    im_class,"},{"line_number":255,"context_line":"                    callback.__name__]"}],"source_content_type":"text/x-python","patch_set":4,"id":"dac4157f_64186185","line":252,"updated":"2015-04-20 13:05:19.000000000","message":"replace im_class with class_name. what you are getting back is not the class object.","commit_id":"e6ccedd9fc40b52e78d0d2038fe6459ffa08ae0d"},{"author":{"_account_id":7186,"name":"Matthieu Huin","email":"mhuin@redhat.com","username":"mhu"},"change_message_id":"ca20fd85968b2bc90554d30063d69ee383bc9d8a","unresolved":false,"context_lines":[{"line_number":249,"context_line":"    \"\"\""},{"line_number":250,"context_line":"    if inspect.ismethod(callback):"},{"line_number":251,"context_line":"        if callback.__self__:"},{"line_number":252,"context_line":"            im_class \u003d callback.__self__.__class__.__name__"},{"line_number":253,"context_line":"            return [getattr(callback, \u0027__module__\u0027, None),"},{"line_number":254,"context_line":"                    im_class,"},{"line_number":255,"context_line":"                    callback.__name__]"}],"source_content_type":"text/x-python","patch_set":4,"id":"dac4157f_3f8dd431","line":252,"in_reply_to":"dac4157f_64186185","updated":"2015-04-20 14:15:08.000000000","message":"Done","commit_id":"e6ccedd9fc40b52e78d0d2038fe6459ffa08ae0d"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"f3507e10f0aa036c194f9c013af15c0612ea8906","unresolved":false,"context_lines":[{"line_number":252,"context_line":"            im_class \u003d callback.__self__.__class__.__name__"},{"line_number":253,"context_line":"            return [getattr(callback, \u0027__module__\u0027, None),"},{"line_number":254,"context_line":"                    im_class,"},{"line_number":255,"context_line":"                    callback.__name__]"},{"line_number":256,"context_line":"    return [getattr(callback, \u0027__module__\u0027, None), callback.__name__]"},{"line_number":257,"context_line":""},{"line_number":258,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"dac4157f_0472c5e5","line":255,"updated":"2015-04-20 13:05:19.000000000","message":"(nit) I like the \u0027else\u0027 here for symmetry.","commit_id":"e6ccedd9fc40b52e78d0d2038fe6459ffa08ae0d"},{"author":{"_account_id":7186,"name":"Matthieu Huin","email":"mhuin@redhat.com","username":"mhu"},"change_message_id":"ca20fd85968b2bc90554d30063d69ee383bc9d8a","unresolved":false,"context_lines":[{"line_number":252,"context_line":"            im_class \u003d callback.__self__.__class__.__name__"},{"line_number":253,"context_line":"            return [getattr(callback, \u0027__module__\u0027, None),"},{"line_number":254,"context_line":"                    im_class,"},{"line_number":255,"context_line":"                    callback.__name__]"},{"line_number":256,"context_line":"    return [getattr(callback, \u0027__module__\u0027, None), callback.__name__]"},{"line_number":257,"context_line":""},{"line_number":258,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"dac4157f_dfa3789d","line":255,"in_reply_to":"dac4157f_0472c5e5","updated":"2015-04-20 14:15:08.000000000","message":"Done","commit_id":"e6ccedd9fc40b52e78d0d2038fe6459ffa08ae0d"},{"author":{"_account_id":13063,"name":"WEI CHEN","email":"dave.jungler@gmail.com","username":"wei.d.chen"},"change_message_id":"828b526add71c5e01d28233ad66b310fa9290e57","unresolved":false,"context_lines":[{"line_number":247,"context_line":"    :returns: List containing parent module, (optional class,) function name"},{"line_number":248,"context_line":"    :rtype: list"},{"line_number":249,"context_line":"    \"\"\""},{"line_number":250,"context_line":"    if inspect.ismethod(callback) and callback.__self__:"},{"line_number":251,"context_line":"        class_name \u003d callback.__self__.__class__.__name__"},{"line_number":252,"context_line":"        return [getattr(callback, \u0027__module__\u0027, None),"},{"line_number":253,"context_line":"                class_name,"}],"source_content_type":"text/x-python","patch_set":5,"id":"dac4157f_d91c8615","line":250,"updated":"2015-04-21 13:13:54.000000000","message":"Maybe we can provide some testcase to test directly against this change, saying, bound instance method will return class name but unbound method will return without the class name?","commit_id":"fb80b10f49d40cba23d395289419039ee0dd02d4"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"f59b949acb6999184951118fee63767943029947","unresolved":false,"context_lines":[{"line_number":247,"context_line":"    :returns: List containing parent module, (optional class,) function name"},{"line_number":248,"context_line":"    :rtype: list"},{"line_number":249,"context_line":"    \"\"\""},{"line_number":250,"context_line":"    if inspect.ismethod(callback) and callback.__self__:"},{"line_number":251,"context_line":"        class_name \u003d callback.__self__.__class__.__name__"},{"line_number":252,"context_line":"        return [getattr(callback, \u0027__module__\u0027, None),"},{"line_number":253,"context_line":"                class_name,"}],"source_content_type":"text/x-python","patch_set":5,"id":"1a4dcd0f_1ded6625","line":250,"in_reply_to":"dac4157f_19879ed8","updated":"2015-08-07 21:59:55.000000000","message":"unbound methods are not supported. there is no way for us to call it since we don\u0027t have an instance. See https://review.openstack.org/#/c/210478/ for the test case.","commit_id":"fb80b10f49d40cba23d395289419039ee0dd02d4"},{"author":{"_account_id":13063,"name":"WEI CHEN","email":"dave.jungler@gmail.com","username":"wei.d.chen"},"change_message_id":"5518c0a4ba8397fd9214b3200bf3fcb7ca4828a2","unresolved":false,"context_lines":[{"line_number":247,"context_line":"    :returns: List containing parent module, (optional class,) function name"},{"line_number":248,"context_line":"    :rtype: list"},{"line_number":249,"context_line":"    \"\"\""},{"line_number":250,"context_line":"    if inspect.ismethod(callback) and callback.__self__:"},{"line_number":251,"context_line":"        class_name \u003d callback.__self__.__class__.__name__"},{"line_number":252,"context_line":"        return [getattr(callback, \u0027__module__\u0027, None),"},{"line_number":253,"context_line":"                class_name,"}],"source_content_type":"text/x-python","patch_set":5,"id":"dac4157f_1f2759cb","line":250,"in_reply_to":"dac4157f_19879ed8","updated":"2015-04-22 15:05:07.000000000","message":"yeah, I just run your testcase, the testcase covered the changes here perfectly.","commit_id":"fb80b10f49d40cba23d395289419039ee0dd02d4"},{"author":{"_account_id":7186,"name":"Matthieu Huin","email":"mhuin@redhat.com","username":"mhu"},"change_message_id":"1916bcd7fcc867bd00c619e4afcf6c8a7694ad4e","unresolved":false,"context_lines":[{"line_number":247,"context_line":"    :returns: List containing parent module, (optional class,) function name"},{"line_number":248,"context_line":"    :rtype: list"},{"line_number":249,"context_line":"    \"\"\""},{"line_number":250,"context_line":"    if inspect.ismethod(callback) and callback.__self__:"},{"line_number":251,"context_line":"        class_name \u003d callback.__self__.__class__.__name__"},{"line_number":252,"context_line":"        return [getattr(callback, \u0027__module__\u0027, None),"},{"line_number":253,"context_line":"                class_name,"}],"source_content_type":"text/x-python","patch_set":5,"id":"dac4157f_19879ed8","line":250,"in_reply_to":"dac4157f_d91c8615","updated":"2015-04-21 13:20:57.000000000","message":"3 different cases are tested in test_a_list_of_callbacks:\n\n* classic function callback\n* bound method C().callback\n* unbound method C.callback\n\nAre there other cases you want covered, or differently ?","commit_id":"fb80b10f49d40cba23d395289419039ee0dd02d4"},{"author":{"_account_id":13063,"name":"WEI CHEN","email":"dave.jungler@gmail.com","username":"wei.d.chen"},"change_message_id":"1672f72d7918a7efbc0f7072425cf4c0792acf11","unresolved":false,"context_lines":[{"line_number":249,"context_line":"    \"\"\""},{"line_number":250,"context_line":"    module_name \u003d getattr(callback, \u0027__module__\u0027, None)"},{"line_number":251,"context_line":"    func_name \u003d callback.__name__"},{"line_number":252,"context_line":"    if inspect.ismethod(callback):"},{"line_number":253,"context_line":"        class_name \u003d callback.__self__.__class__.__name__"},{"line_number":254,"context_line":"    else:"},{"line_number":255,"context_line":"        class_name \u003d None"}],"source_content_type":"text/x-python","patch_set":6,"id":"bab921fb_7439b6f1","line":252,"updated":"2015-04-25 06:33:51.000000000","message":"David, I believe Matthieu\u0027s check against `callback.__self__` is necessary.\n\ncallback.__self__ is None when passing in an unbound method, that mean the callback_str in this case is \"keystone.tests.unit.common.test_notifications.*NoneType*.callback\" instead of \"keystone.tests.unit.common.test_notifications.callback\" or \"keystone.tests.unit.common.test_notifications.C.callback\".\n\nThe testcases here would pass just beacuse `assert_any_call` only assert the mock has been called, thus, in the case of the unbound method and the testcase provided it will assert\n `keystone.tests.unit.common.test_notifications.callback` is in these list: \n[call(\u0027Callback: `%(callback)s` subscribed to event `%(event)s`.\u0027, {\u0027callback\u0027: \n \u0027keystone.tests.unit.common.test_notifications.callback\u0027, \u0027event\u0027: \u0027identity.thing.created\u0027}),\n call(\u0027Callback: `%(callback)s` subscribed to event `%(event)s`.\u0027, {\u0027callback\u0027: \u0027keystone.tests.\n  unit.common.test_notifications.C.callback\u0027, \u0027event\u0027: \u0027identity.thing.created\u0027}),\n call(\u0027Callback: `%(callback)s` subscribed to event `%(event)s`.\u0027, {\u0027callback\u0027: \u0027keystone.tests.\n  unit.common.test_notifications.*NoneType*.callback\u0027, \u0027event\u0027: \u0027identity.thing.created\u0027})]\n\nSo, the testcase will pass, acutally, I believe the unbound method is not tested at all.\n\nPls debug the testcase then you will know what I am talking here.","commit_id":"12e4fd838a4917f6a817ce30b5655fca217dcda6"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"ec43624dc8f85aa552f6387e22b82c31cddd2d09","unresolved":false,"context_lines":[{"line_number":249,"context_line":"    \"\"\""},{"line_number":250,"context_line":"    module_name \u003d getattr(callback, \u0027__module__\u0027, None)"},{"line_number":251,"context_line":"    func_name \u003d callback.__name__"},{"line_number":252,"context_line":"    if inspect.ismethod(callback):"},{"line_number":253,"context_line":"        class_name \u003d callback.__self__.__class__.__name__"},{"line_number":254,"context_line":"    else:"},{"line_number":255,"context_line":"        class_name \u003d None"}],"source_content_type":"text/x-python","patch_set":6,"id":"1a4dcd0f_fdce7ab6","line":252,"in_reply_to":"bab921fb_7439b6f1","updated":"2015-08-07 22:00:59.000000000","message":"I\u0027m going to update this review, but we don\u0027t care about unbound methods since that can\u0027t work anyway. Added a test case here https://review.openstack.org/#/c/210478/","commit_id":"12e4fd838a4917f6a817ce30b5655fca217dcda6"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"d495c8e728ee410bfe505ea57da6768f57f1f0c5","unresolved":false,"context_lines":[{"line_number":240,"context_line":""},{"line_number":241,"context_line":""},{"line_number":242,"context_line":"def _get_callback_info(callback):"},{"line_number":243,"context_line":"    \"\"\"Return list containing callback\u0027s module and name."},{"line_number":244,"context_line":""},{"line_number":245,"context_line":"    If the callback is a bound instance method also return the class name."},{"line_number":246,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"ba15a1d1_8edb84ed","line":243,"updated":"2015-09-13 23:57:21.000000000","message":"(unrelated) this is not accurate.","commit_id":"dbb98ef7dbf85c3e03caa54250283c05d9087732"},{"author":{"_account_id":13063,"name":"WEI CHEN","email":"dave.jungler@gmail.com","username":"wei.d.chen"},"change_message_id":"452c657615167f8d4e55aebd261404df9596faab","unresolved":false,"context_lines":[{"line_number":242,"context_line":"def _get_callback_info(callback):"},{"line_number":243,"context_line":"    \"\"\"Return list containing callback\u0027s module and name."},{"line_number":244,"context_line":""},{"line_number":245,"context_line":"    If the callback is a bound instance method also return the class name."},{"line_number":246,"context_line":""},{"line_number":247,"context_line":"    :param callback: Function to call"},{"line_number":248,"context_line":"    :type callback: function"}],"source_content_type":"text/x-python","patch_set":7,"id":"da20952f_044c1c41","line":245,"updated":"2015-08-27 07:58:50.000000000","message":"i think there is no need to hightlight bound/unbound anymore.","commit_id":"dbb98ef7dbf85c3e03caa54250283c05d9087732"}],"keystone/tests/unit/common/test_notifications.py":[{"author":{"_account_id":7186,"name":"Matthieu Huin","email":"mhuin@redhat.com","username":"mhu"},"change_message_id":"e723e6199f7a69875d723204b6b2837f4bd5db5d","unresolved":false,"context_lines":[{"line_number":923,"context_line":""},{"line_number":924,"context_line":"        with mock.patch(\u0027keystone.notifications.LOG\u0027, self.mock_log):"},{"line_number":925,"context_line":"            notifications.register_event_callback("},{"line_number":926,"context_line":"                CREATED_OPERATION, \u0027thing\u0027, C().callback)"},{"line_number":927,"context_line":""},{"line_number":928,"context_line":"        callback \u003d \u0027keystone.tests.unit.common.test_notifications.C.callback\u0027"},{"line_number":929,"context_line":"        expected_log_data \u003d {"}],"source_content_type":"text/x-python","patch_set":2,"id":"1a6ced46_42b16ee0","line":926,"updated":"2015-03-23 20:00:11.000000000","message":"assuming we\u0027re always going to use this with instance methods, I modified the test. Maybe this should be documented in the docstring in notifications.py ?","commit_id":"9eb75699771e9d602106fac3d7338a3e2e9b1d93"},{"author":{"_account_id":13063,"name":"WEI CHEN","email":"dave.jungler@gmail.com","username":"wei.d.chen"},"change_message_id":"96a2710928ccb379c4e5b3960f9aaafe5de47922","unresolved":false,"context_lines":[{"line_number":924,"context_line":"        with mock.patch(\u0027keystone.notifications.LOG\u0027, self.mock_log):"},{"line_number":925,"context_line":"            notifications.register_event_callback("},{"line_number":926,"context_line":"                CREATED_OPERATION, \u0027thing\u0027, C().callback)"},{"line_number":927,"context_line":""},{"line_number":928,"context_line":"        callback \u003d \u0027keystone.tests.unit.common.test_notifications.C.callback\u0027"},{"line_number":929,"context_line":"        expected_log_data \u003d {"},{"line_number":930,"context_line":"            \u0027callback\u0027: callback,"}],"source_content_type":"text/x-python","patch_set":3,"id":"3ab451fb_49033d74","line":927,"updated":"2015-04-17 15:48:06.000000000","message":"@Matthieu Huin, as the question you have brought up early, we need pay attention to any place where the event is registered.\n\nSo, I suggest you to add some comments in some place to indicate how to follow if this patch is merged.\n\nHave checked in current source, so far, it\u0027s okay.","commit_id":"9a8ad11dbfaca7d58312d130c50485b6475d5b45"},{"author":{"_account_id":7186,"name":"Matthieu Huin","email":"mhuin@redhat.com","username":"mhu"},"change_message_id":"9dc3c67a0c5e2084a387ca9990b156ea16c88834","unresolved":false,"context_lines":[{"line_number":924,"context_line":"        with mock.patch(\u0027keystone.notifications.LOG\u0027, self.mock_log):"},{"line_number":925,"context_line":"            notifications.register_event_callback("},{"line_number":926,"context_line":"                CREATED_OPERATION, \u0027thing\u0027, C().callback)"},{"line_number":927,"context_line":""},{"line_number":928,"context_line":"        callback \u003d \u0027keystone.tests.unit.common.test_notifications.C.callback\u0027"},{"line_number":929,"context_line":"        expected_log_data \u003d {"},{"line_number":930,"context_line":"            \u0027callback\u0027: callback,"}],"source_content_type":"text/x-python","patch_set":3,"id":"dac4157f_01207c9a","line":927,"in_reply_to":"3ab451fb_49033d74","updated":"2015-04-20 10:12:47.000000000","message":"Done, and I\u0027ve actually taken care of the \"unbound method\" case by treating it like a normal function, in the spirit of python 3.","commit_id":"9a8ad11dbfaca7d58312d130c50485b6475d5b45"},{"author":{"_account_id":13063,"name":"WEI CHEN","email":"dave.jungler@gmail.com","username":"wei.d.chen"},"change_message_id":"9b9683e8e00140f49b191c7007e887b4b7d77e18","unresolved":false,"context_lines":[{"line_number":1001,"context_line":"            {"},{"line_number":1002,"context_line":"                \u0027callback\u0027: callback_1,"},{"line_number":1003,"context_line":"                \u0027event\u0027: \u0027identity.thing.created\u0027"},{"line_number":1004,"context_line":"            },"},{"line_number":1005,"context_line":"        ]"},{"line_number":1006,"context_line":"        self.verify_log_message(expected_log_data)"},{"line_number":1007,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"bab921fb_cf710f46","line":1004,"updated":"2015-04-25 06:44:52.000000000","message":"Acutally, we cannot expect this could cover the changes, the testcase will pass regardless you define the \u0027callback\u0027 str as callback_1 or callback_2.","commit_id":"12e4fd838a4917f6a817ce30b5655fca217dcda6"}]}
