)]}'
{"keystone/common/controller.py":[{"author":{"_account_id":17123,"name":"Tom Cocozzello (tjcocozz)","email":"tjcocozz@us.ibm.com","username":"tcocozzello"},"change_message_id":"5b7cdf5d85b891ac69ca15946ef747a84946a460","unresolved":false,"context_lines":[{"line_number":807,"context_line":"            # No immutable parameters changed"},{"line_number":808,"context_line":"            return"},{"line_number":809,"context_line":""},{"line_number":810,"context_line":"        exception_args \u003d {\u0027target\u0027: reflection.get_class_name(cls),"},{"line_number":811,"context_line":"                          \u0027attributes\u0027: \u0027, \u0027.join(blocked_keys)}"},{"line_number":812,"context_line":"        raise exception.ImmutableAttributeError(**exception_args)"},{"line_number":813,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"da85f559_e5886cc7","line":810,"updated":"2015-11-11 17:54:02.000000000","message":"reflection.get_class_name(cls, fully_qualified\u003dFalse)","commit_id":"66289f05bfabbd611754a9c3cecd33ba4e2974f2"},{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"17a1160ed4c522b06c45add228b22149a4bd0225","unresolved":false,"context_lines":[{"line_number":807,"context_line":"            # No immutable parameters changed"},{"line_number":808,"context_line":"            return"},{"line_number":809,"context_line":""},{"line_number":810,"context_line":"        exception_args \u003d {\u0027target\u0027: reflection.get_class_name(cls),"},{"line_number":811,"context_line":"                          \u0027attributes\u0027: \u0027, \u0027.join(blocked_keys)}"},{"line_number":812,"context_line":"        raise exception.ImmutableAttributeError(**exception_args)"},{"line_number":813,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"da85f559_736c3808","line":810,"in_reply_to":"da85f559_536c9434","updated":"2015-11-12 00:10:00.000000000","message":"++ Nice catch","commit_id":"66289f05bfabbd611754a9c3cecd33ba4e2974f2"},{"author":{"_account_id":9796,"name":"ChangBo Guo","email":"glongwave@gmail.com","username":"gcb"},"change_message_id":"fac063308e9c8a3dcc791a3de481e0de35eb64b2","unresolved":false,"context_lines":[{"line_number":807,"context_line":"            # No immutable parameters changed"},{"line_number":808,"context_line":"            return"},{"line_number":809,"context_line":""},{"line_number":810,"context_line":"        exception_args \u003d {\u0027target\u0027: reflection.get_class_name(cls),"},{"line_number":811,"context_line":"                          \u0027attributes\u0027: \u0027, \u0027.join(blocked_keys)}"},{"line_number":812,"context_line":"        raise exception.ImmutableAttributeError(**exception_args)"},{"line_number":813,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"da85f559_cc50da0d","line":810,"in_reply_to":"da85f559_736c3808","updated":"2015-11-12 03:26:09.000000000","message":"yes, this should use  fully_qualified\u003dFalse","commit_id":"66289f05bfabbd611754a9c3cecd33ba4e2974f2"},{"author":{"_account_id":13063,"name":"WEI CHEN","email":"dave.jungler@gmail.com","username":"wei.d.chen"},"change_message_id":"34e5c4ea27bc7101b3c3cc1837479f84f7d6af49","unresolved":false,"context_lines":[{"line_number":807,"context_line":"            # No immutable parameters changed"},{"line_number":808,"context_line":"            return"},{"line_number":809,"context_line":""},{"line_number":810,"context_line":"        exception_args \u003d {\u0027target\u0027: reflection.get_class_name(cls),"},{"line_number":811,"context_line":"                          \u0027attributes\u0027: \u0027, \u0027.join(blocked_keys)}"},{"line_number":812,"context_line":"        raise exception.ImmutableAttributeError(**exception_args)"},{"line_number":813,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"da85f559_536c9434","line":810,"in_reply_to":"da85f559_e5886cc7","updated":"2015-11-11 23:55:27.000000000","message":"++\n\ndefault value \"True\" will also return name of the module which should be the reason of python27/34 failure.","commit_id":"66289f05bfabbd611754a9c3cecd33ba4e2974f2"}],"keystone/common/kvs/core.py":[{"author":{"_account_id":17123,"name":"Tom Cocozzello (tjcocozz)","email":"tjcocozz@us.ibm.com","username":"tcocozzello"},"change_message_id":"5b7cdf5d85b891ac69ca15946ef747a84946a460","unresolved":false,"context_lines":[{"line_number":133,"context_line":"                    proxies.append(pxy)"},{"line_number":134,"context_line":"                else:"},{"line_number":135,"context_line":"                    LOG.warning(_LW(\u0027%s is not a dogpile.proxy.ProxyBackend\u0027),"},{"line_number":136,"context_line":"                                reflection.get_class_name(pxy))"},{"line_number":137,"context_line":""},{"line_number":138,"context_line":"            for proxy_cls in reversed(proxies):"},{"line_number":139,"context_line":"                LOG.info(_LI(\u0027Adding proxy \\\u0027%(proxy)s\\\u0027 to KVS %(name)s.\u0027),"}],"source_content_type":"text/x-python","patch_set":4,"id":"da85f559_e0713a77","line":136,"updated":"2015-11-11 17:54:02.000000000","message":"reflection.get_class_name(pxy, fully_qualified\u003dFalse)","commit_id":"66289f05bfabbd611754a9c3cecd33ba4e2974f2"},{"author":{"_account_id":17123,"name":"Tom Cocozzello (tjcocozz)","email":"tjcocozz@us.ibm.com","username":"tcocozzello"},"change_message_id":"aca61bbd125bea27c04aae88c21a818e3998a88e","unresolved":false,"context_lines":[{"line_number":133,"context_line":"                    proxies.append(pxy)"},{"line_number":134,"context_line":"                else:"},{"line_number":135,"context_line":"                    LOG.warning(_LW(\u0027%s is not a dogpile.proxy.ProxyBackend\u0027),"},{"line_number":136,"context_line":"                                reflection.get_class_name(pxy))"},{"line_number":137,"context_line":""},{"line_number":138,"context_line":"            for proxy_cls in reversed(proxies):"},{"line_number":139,"context_line":"                LOG.info(_LI(\u0027Adding proxy \\\u0027%(proxy)s\\\u0027 to KVS %(name)s.\u0027),"}],"source_content_type":"text/x-python","patch_set":4,"id":"da85f559_c9e507dc","line":136,"in_reply_to":"da85f559_4cc86aa6","updated":"2015-11-12 15:31:01.000000000","message":"I am not sure what is better for the logs but if you think this is more beneficial i would do this in a follow up patch.","commit_id":"66289f05bfabbd611754a9c3cecd33ba4e2974f2"},{"author":{"_account_id":9796,"name":"ChangBo Guo","email":"glongwave@gmail.com","username":"gcb"},"change_message_id":"fac063308e9c8a3dcc791a3de481e0de35eb64b2","unresolved":false,"context_lines":[{"line_number":133,"context_line":"                    proxies.append(pxy)"},{"line_number":134,"context_line":"                else:"},{"line_number":135,"context_line":"                    LOG.warning(_LW(\u0027%s is not a dogpile.proxy.ProxyBackend\u0027),"},{"line_number":136,"context_line":"                                reflection.get_class_name(pxy))"},{"line_number":137,"context_line":""},{"line_number":138,"context_line":"            for proxy_cls in reversed(proxies):"},{"line_number":139,"context_line":"                LOG.info(_LI(\u0027Adding proxy \\\u0027%(proxy)s\\\u0027 to KVS %(name)s.\u0027),"}],"source_content_type":"text/x-python","patch_set":4,"id":"da85f559_4cc86aa6","line":136,"in_reply_to":"da85f559_e0713a77","updated":"2015-11-12 03:26:09.000000000","message":"Is fully_qualified class name better here for LOG?","commit_id":"66289f05bfabbd611754a9c3cecd33ba4e2974f2"},{"author":{"_account_id":17123,"name":"Tom Cocozzello (tjcocozz)","email":"tjcocozz@us.ibm.com","username":"tcocozzello"},"change_message_id":"5b7cdf5d85b891ac69ca15946ef747a84946a460","unresolved":false,"context_lines":[{"line_number":137,"context_line":""},{"line_number":138,"context_line":"            for proxy_cls in reversed(proxies):"},{"line_number":139,"context_line":"                LOG.info(_LI(\u0027Adding proxy \\\u0027%(proxy)s\\\u0027 to KVS %(name)s.\u0027),"},{"line_number":140,"context_line":"                         {\u0027proxy\u0027: reflection.get_class_name(proxy_cls),"},{"line_number":141,"context_line":"                          \u0027name\u0027: self._region.name})"},{"line_number":142,"context_line":"                self._region.wrap(proxy_cls)"},{"line_number":143,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"da85f559_60330aac","line":140,"updated":"2015-11-11 17:54:02.000000000","message":"reflection.get_class_name(proxy_cls, fully_qualified\u003dFalse)","commit_id":"66289f05bfabbd611754a9c3cecd33ba4e2974f2"},{"author":{"_account_id":9796,"name":"ChangBo Guo","email":"glongwave@gmail.com","username":"gcb"},"change_message_id":"fac063308e9c8a3dcc791a3de481e0de35eb64b2","unresolved":false,"context_lines":[{"line_number":137,"context_line":""},{"line_number":138,"context_line":"            for proxy_cls in reversed(proxies):"},{"line_number":139,"context_line":"                LOG.info(_LI(\u0027Adding proxy \\\u0027%(proxy)s\\\u0027 to KVS %(name)s.\u0027),"},{"line_number":140,"context_line":"                         {\u0027proxy\u0027: reflection.get_class_name(proxy_cls),"},{"line_number":141,"context_line":"                          \u0027name\u0027: self._region.name})"},{"line_number":142,"context_line":"                self._region.wrap(proxy_cls)"},{"line_number":143,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"da85f559_accc76bb","line":140,"in_reply_to":"da85f559_60330aac","updated":"2015-11-12 03:26:09.000000000","message":"Is fully_qualified class name better here for LOG?","commit_id":"66289f05bfabbd611754a9c3cecd33ba4e2974f2"},{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"8ab6ce8e27b138d1560b6cbafec19be81e9a6983","unresolved":false,"context_lines":[{"line_number":138,"context_line":"                                pxy_name)"},{"line_number":139,"context_line":""},{"line_number":140,"context_line":"            for proxy_cls in reversed(proxies):"},{"line_number":141,"context_line":"                proxy_name \u003d reflection.get_class_name(proxy_cls,"},{"line_number":142,"context_line":"                                                       fully_qualified\u003dFalse)"},{"line_number":143,"context_line":"                LOG.info(_LI(\u0027Adding proxy \\\u0027%(proxy)s\\\u0027 to KVS %(name)s.\u0027),"},{"line_number":144,"context_line":"                         {\u0027proxy\u0027: proxy_name,"}],"source_content_type":"text/x-python","patch_set":7,"id":"ba8a016a_5bdcaf45","line":141,"updated":"2015-11-19 11:24:14.000000000","message":"(nit) Actually it could be a proxy_cls_name, to be consistent with other occurrences, and since it is the name of the class, not the name of the object :)","commit_id":"3b1ad19e498986eb1d1c85973bf39055fd6e6b79"},{"author":{"_account_id":9796,"name":"ChangBo Guo","email":"glongwave@gmail.com","username":"gcb"},"change_message_id":"19aacf683eccb92cdc3331c7a8871744f1dba680","unresolved":false,"context_lines":[{"line_number":138,"context_line":"                                pxy_name)"},{"line_number":139,"context_line":""},{"line_number":140,"context_line":"            for proxy_cls in reversed(proxies):"},{"line_number":141,"context_line":"                proxy_name \u003d reflection.get_class_name(proxy_cls,"},{"line_number":142,"context_line":"                                                       fully_qualified\u003dFalse)"},{"line_number":143,"context_line":"                LOG.info(_LI(\u0027Adding proxy \\\u0027%(proxy)s\\\u0027 to KVS %(name)s.\u0027),"},{"line_number":144,"context_line":"                         {\u0027proxy\u0027: proxy_name,"}],"source_content_type":"text/x-python","patch_set":7,"id":"7a740942_b38a9719","line":141,"in_reply_to":"ba8a016a_5bdcaf45","updated":"2015-12-14 06:51:53.000000000","message":"Done","commit_id":"3b1ad19e498986eb1d1c85973bf39055fd6e6b79"},{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"9731967dfec8b4e649b1a755b4b04f5e4a724efb","unresolved":false,"context_lines":[{"line_number":138,"context_line":"                                pxy_cls_name)"},{"line_number":139,"context_line":""},{"line_number":140,"context_line":"            for proxy_cls in reversed(proxies):"},{"line_number":141,"context_line":"                proxy_name \u003d reflection.get_class_name(proxy_cls,"},{"line_number":142,"context_line":"                                                       fully_qualified\u003dFalse)"},{"line_number":143,"context_line":"                LOG.info(_LI(\u0027Adding proxy \\\u0027%(proxy)s\\\u0027 to KVS %(name)s.\u0027),"},{"line_number":144,"context_line":"                         {\u0027proxy\u0027: proxy_name,"}],"source_content_type":"text/x-python","patch_set":8,"id":"3a7e1126_25aea481","line":141,"range":{"start_line":141,"start_character":16,"end_line":141,"end_character":26},"updated":"2015-12-18 13:30:45.000000000","message":"(nit) I thought you had renamed this to proxy_cls_name too :)","commit_id":"cd98fc9204f7ad4b0683d27a201a2167500200b8"}],"keystone/common/ldap/core.py":[{"author":{"_account_id":9796,"name":"ChangBo Guo","email":"glongwave@gmail.com","username":"gcb"},"change_message_id":"fac063308e9c8a3dcc791a3de481e0de35eb64b2","unresolved":false,"context_lines":[{"line_number":71,"context_line":"        return value"},{"line_number":72,"context_line":"    else:"},{"line_number":73,"context_line":"        raise TypeError(\"value must be basestring, \""},{"line_number":74,"context_line":"                        \"not %s\" % reflection.get_class_name(value))"},{"line_number":75,"context_line":""},{"line_number":76,"context_line":"_utf8_decoder \u003d codecs.getdecoder(\u0027utf-8\u0027)"},{"line_number":77,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"da85f559_ec64beb9","line":74,"updated":"2015-11-12 03:26:09.000000000","message":"use fully_qualified class name here ?","commit_id":"66289f05bfabbd611754a9c3cecd33ba4e2974f2"},{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"8ab6ce8e27b138d1560b6cbafec19be81e9a6983","unresolved":false,"context_lines":[{"line_number":70,"context_line":"    elif isinstance(value, six.binary_type):"},{"line_number":71,"context_line":"        return value"},{"line_number":72,"context_line":"    else:"},{"line_number":73,"context_line":"        value_name \u003d reflection.get_class_name(value,"},{"line_number":74,"context_line":"                                               fully_qualified\u003dFalse)"},{"line_number":75,"context_line":"        raise TypeError(\"value must be basestring, \""},{"line_number":76,"context_line":"                        \"not %s\" % value_name)"}],"source_content_type":"text/x-python","patch_set":7,"id":"ba8a016a_7bb653fa","line":73,"updated":"2015-11-19 11:24:14.000000000","message":"(nit) It is a value_cls_name, to be consistent with other occurrences, and since it is the name of the class, not the name of the object","commit_id":"3b1ad19e498986eb1d1c85973bf39055fd6e6b79"},{"author":{"_account_id":9796,"name":"ChangBo Guo","email":"glongwave@gmail.com","username":"gcb"},"change_message_id":"19aacf683eccb92cdc3331c7a8871744f1dba680","unresolved":false,"context_lines":[{"line_number":70,"context_line":"    elif isinstance(value, six.binary_type):"},{"line_number":71,"context_line":"        return value"},{"line_number":72,"context_line":"    else:"},{"line_number":73,"context_line":"        value_name \u003d reflection.get_class_name(value,"},{"line_number":74,"context_line":"                                               fully_qualified\u003dFalse)"},{"line_number":75,"context_line":"        raise TypeError(\"value must be basestring, \""},{"line_number":76,"context_line":"                        \"not %s\" % value_name)"}],"source_content_type":"text/x-python","patch_set":7,"id":"7a740942_7380aff7","line":73,"in_reply_to":"ba8a016a_7bb653fa","updated":"2015-12-14 06:51:53.000000000","message":"Done","commit_id":"3b1ad19e498986eb1d1c85973bf39055fd6e6b79"}],"keystone/common/manager.py":[{"author":{"_account_id":13063,"name":"WEI CHEN","email":"dave.jungler@gmail.com","username":"wei.d.chen"},"change_message_id":"e6f34ab65c87b85fcb83035845c130ea3442aa24","unresolved":false,"context_lines":[{"line_number":122,"context_line":"        Driver \u003d create_legacy_driver(CatalogDriverV8)"},{"line_number":123,"context_line":""},{"line_number":124,"context_line":"    \"\"\""},{"line_number":125,"context_line":"    module_name \u003d driver_class.__module__"},{"line_number":126,"context_line":"    class_name \u003d reflection.get_class_name(driver_class)"},{"line_number":127,"context_line":""},{"line_number":128,"context_line":"    class Driver(driver_class):"}],"source_content_type":"text/x-python","patch_set":6,"id":"da85f559_08a9a9df","line":125,"updated":"2015-11-13 04:50:09.000000000","message":"This like could be moved and L132 can be replaced by:\n    class_name[0]\n\nMore precisely, var: `class_name` can also be changed to a more accurate name.","commit_id":"716850a6522496db8a8736113ebb478ad114f1e6"},{"author":{"_account_id":13063,"name":"WEI CHEN","email":"dave.jungler@gmail.com","username":"wei.d.chen"},"change_message_id":"b2ac86ebb95638e03f7c357ab2813c53a4b00c21","unresolved":false,"context_lines":[{"line_number":122,"context_line":"        Driver \u003d create_legacy_driver(CatalogDriverV8)"},{"line_number":123,"context_line":""},{"line_number":124,"context_line":"    \"\"\""},{"line_number":125,"context_line":"    module_name \u003d driver_class.__module__"},{"line_number":126,"context_line":"    class_name \u003d reflection.get_class_name(driver_class)"},{"line_number":127,"context_line":""},{"line_number":128,"context_line":"    class Driver(driver_class):"}],"source_content_type":"text/x-python","patch_set":6,"id":"da85f559_089d2959","line":125,"in_reply_to":"da85f559_08a9a9df","updated":"2015-11-13 04:57:13.000000000","message":"some typos there, I meant *that line could be removed* after your changes.","commit_id":"716850a6522496db8a8736113ebb478ad114f1e6"},{"author":{"_account_id":9796,"name":"ChangBo Guo","email":"glongwave@gmail.com","username":"gcb"},"change_message_id":"f8c332215b2294d80dc281bc05ef9d48844403fe","unresolved":false,"context_lines":[{"line_number":130,"context_line":"        @versionutils.deprecated("},{"line_number":131,"context_line":"            as_of\u003dversionutils.deprecated.LIBERTY,"},{"line_number":132,"context_line":"            what\u003d\u0027%s.Driver\u0027 % module_name,"},{"line_number":133,"context_line":"            in_favor_of\u003dclass_name,"},{"line_number":134,"context_line":"            remove_in\u003d+2)"},{"line_number":135,"context_line":"        def __init__(self, *args, **kwargs):"},{"line_number":136,"context_line":"            super(Driver, self).__init__(*args, **kwargs)"}],"source_content_type":"text/x-python","patch_set":6,"id":"da85f559_285fcd76","line":133,"updated":"2015-11-13 05:08:35.000000000","message":"class_name is string  in the form \u0027modulename.classsname\u0027,  not a list type.we need module_name in line 125.","commit_id":"716850a6522496db8a8736113ebb478ad114f1e6"}],"keystone/common/utils.py":[{"author":{"_account_id":13063,"name":"WEI CHEN","email":"dave.jungler@gmail.com","username":"wei.d.chen"},"change_message_id":"e6f34ab65c87b85fcb83035845c130ea3442aa24","unresolved":false,"context_lines":[{"line_number":358,"context_line":"        group_info \u003d grp.getgrgid(os.getegid())"},{"line_number":359,"context_line":"    else:"},{"line_number":360,"context_line":"        raise TypeError(\u0027group must be string, int or None; not %s (%r)\u0027 %"},{"line_number":361,"context_line":"                        (reflection.get_class_name(group), group))"},{"line_number":362,"context_line":""},{"line_number":363,"context_line":"    return group_info.gr_gid, group_info.gr_name"},{"line_number":364,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"da85f559_68e63546","line":361,"updated":"2015-11-13 04:50:09.000000000","message":"miss this, pls change to:\n reflection.get_class_name(group, fully_qualified\u003dFalse)","commit_id":"716850a6522496db8a8736113ebb478ad114f1e6"},{"author":{"_account_id":9796,"name":"ChangBo Guo","email":"glongwave@gmail.com","username":"gcb"},"change_message_id":"f8c332215b2294d80dc281bc05ef9d48844403fe","unresolved":false,"context_lines":[{"line_number":358,"context_line":"        group_info \u003d grp.getgrgid(os.getegid())"},{"line_number":359,"context_line":"    else:"},{"line_number":360,"context_line":"        raise TypeError(\u0027group must be string, int or None; not %s (%r)\u0027 %"},{"line_number":361,"context_line":"                        (reflection.get_class_name(group), group))"},{"line_number":362,"context_line":""},{"line_number":363,"context_line":"    return group_info.gr_gid, group_info.gr_name"},{"line_number":364,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"da85f559_c8508161","line":361,"in_reply_to":"da85f559_68e63546","updated":"2015-11-13 05:08:35.000000000","message":"yea, I missed this.","commit_id":"716850a6522496db8a8736113ebb478ad114f1e6"}],"keystone/notifications.py":[{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"17a1160ed4c522b06c45add228b22149a4bd0225","unresolved":false,"context_lines":[{"line_number":253,"context_line":"    \"\"\""},{"line_number":254,"context_line":"    module_name \u003d getattr(callback, \u0027__module__\u0027, None)"},{"line_number":255,"context_line":"    func_name \u003d callback.__name__"},{"line_number":256,"context_line":"    if reflection.is_bound_method(callback):"},{"line_number":257,"context_line":"        class_name \u003d reflection.get_class_name(callback.__self__,"},{"line_number":258,"context_line":"                                               fully_qualified\u003dFalse)"},{"line_number":259,"context_line":"        return [module_name, class_name, func_name]"}],"source_content_type":"text/x-python","patch_set":4,"id":"da85f559_2e6c03cd","line":256,"updated":"2015-11-12 00:10:00.000000000","message":"Is this going to be right ? From the docs: \"Returns if the given method is bound to an object.\"; which is different than just checking it is a method.\n\n\n[1] https://github.com/openstack/oslo.utils/blob/master/oslo_utils/reflection.py#L166-L168","commit_id":"66289f05bfabbd611754a9c3cecd33ba4e2974f2"},{"author":{"_account_id":9796,"name":"ChangBo Guo","email":"glongwave@gmail.com","username":"gcb"},"change_message_id":"fac063308e9c8a3dcc791a3de481e0de35eb64b2","unresolved":false,"context_lines":[{"line_number":253,"context_line":"    \"\"\""},{"line_number":254,"context_line":"    module_name \u003d getattr(callback, \u0027__module__\u0027, None)"},{"line_number":255,"context_line":"    func_name \u003d callback.__name__"},{"line_number":256,"context_line":"    if reflection.is_bound_method(callback):"},{"line_number":257,"context_line":"        class_name \u003d reflection.get_class_name(callback.__self__,"},{"line_number":258,"context_line":"                                               fully_qualified\u003dFalse)"},{"line_number":259,"context_line":"        return [module_name, class_name, func_name]"}],"source_content_type":"text/x-python","patch_set":4,"id":"da85f559_cc921a4c","line":256,"in_reply_to":"da85f559_2e6c03cd","updated":"2015-11-12 03:26:09.000000000","message":"only bound_method has  \u0027__self__\u0027  which points to class, I think the check here is right,   before this change, an unbound method  will raise Attribute ERROR here.","commit_id":"66289f05bfabbd611754a9c3cecd33ba4e2974f2"},{"author":{"_account_id":13063,"name":"WEI CHEN","email":"dave.jungler@gmail.com","username":"wei.d.chen"},"change_message_id":"34e5c4ea27bc7101b3c3cc1837479f84f7d6af49","unresolved":false,"context_lines":[{"line_number":255,"context_line":"    func_name \u003d callback.__name__"},{"line_number":256,"context_line":"    if reflection.is_bound_method(callback):"},{"line_number":257,"context_line":"        class_name \u003d reflection.get_class_name(callback.__self__,"},{"line_number":258,"context_line":"                                               fully_qualified\u003dFalse)"},{"line_number":259,"context_line":"        return [module_name, class_name, func_name]"},{"line_number":260,"context_line":"    else:"},{"line_number":261,"context_line":"        return [module_name, func_name]"}],"source_content_type":"text/x-python","patch_set":4,"id":"da85f559_93d3dcd4","line":258,"updated":"2015-11-11 23:55:27.000000000","message":"Nice! this change make the code looks more clear.","commit_id":"66289f05bfabbd611754a9c3cecd33ba4e2974f2"},{"author":{"_account_id":9796,"name":"ChangBo Guo","email":"glongwave@gmail.com","username":"gcb"},"change_message_id":"fac063308e9c8a3dcc791a3de481e0de35eb64b2","unresolved":false,"context_lines":[{"line_number":255,"context_line":"    func_name \u003d callback.__name__"},{"line_number":256,"context_line":"    if reflection.is_bound_method(callback):"},{"line_number":257,"context_line":"        class_name \u003d reflection.get_class_name(callback.__self__,"},{"line_number":258,"context_line":"                                               fully_qualified\u003dFalse)"},{"line_number":259,"context_line":"        return [module_name, class_name, func_name]"},{"line_number":260,"context_line":"    else:"},{"line_number":261,"context_line":"        return [module_name, func_name]"}],"source_content_type":"text/x-python","patch_set":4,"id":"da85f559_4cd5cae5","line":258,"in_reply_to":"da85f559_93d3dcd4","updated":"2015-11-12 03:26:09.000000000","message":"Actually , I\u0027m adding method get_class_name_by_method in https://review.openstack.org/#/c/241493/. \n\nIf that is merged , we just use\nreflection.get_class_name_by_method(callback, fully_qualified\u003dFalse).","commit_id":"66289f05bfabbd611754a9c3cecd33ba4e2974f2"}],"keystone/tests/unit/test_v3_controller.py":[{"author":{"_account_id":9796,"name":"ChangBo Guo","email":"glongwave@gmail.com","username":"gcb"},"change_message_id":"fac063308e9c8a3dcc791a3de481e0de35eb64b2","unresolved":false,"context_lines":[{"line_number":50,"context_line":"        ex \u003d self.assertRaises(exception.ImmutableAttributeError,"},{"line_number":51,"context_line":"                               self.api.check_immutable_params, ref)"},{"line_number":52,"context_line":"        ex_msg \u003d six.text_type(ex)"},{"line_number":53,"context_line":"        class_name \u003d reflection.get_class_name(self.api, fully_qualified\u003dFalse)"},{"line_number":54,"context_line":"        self.assertThat(ex_msg,"},{"line_number":55,"context_line":"                        matchers.Contains(class_name))"},{"line_number":56,"context_line":"        for key in ref.keys():"}],"source_content_type":"text/x-python","patch_set":4,"id":"da85f559_8c82d2c6","line":53,"updated":"2015-11-12 03:26:09.000000000","message":"this change doesn\u0027t work  on Python 3 before,  A fix just was merged in  https://review.openstack.org/#/c/241591/, \n\nwe need wait new release of oslo.utils to pick up the fix.","commit_id":"66289f05bfabbd611754a9c3cecd33ba4e2974f2"}]}
