)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":9107,"name":"Victor Stinner","email":"vstinner@redhat.com","username":"haypo"},"change_message_id":"a81316823a771435389d6d90680bcb22822757de","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     ChangBo Guo(gcb) \u003ceric.guo@easystack.cn\u003e"},{"line_number":5,"context_line":"CommitDate: 2015-11-30 17:44:58 +0800"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Allow get_class_name to accept bound method"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"It is convenient in some cases like:"},{"line_number":10,"context_line":"  if inspect.ismethod(callback):"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":10,"id":"9a8ffd7b_b9425166","line":7,"updated":"2015-11-30 09:51:18.000000000","message":"and class methods ;)","commit_id":"f00008d2342573f1030826604aa5c11b4dddebc5"}],"oslo_utils/reflection.py":[{"author":{"_account_id":1669,"name":"Julien Danjou","display_name":"jd","email":"julien@danjou.info","username":"jdanjou"},"change_message_id":"5d62b8bde51ecf8167722ab6665e438e02c9ad6c","unresolved":false,"context_lines":[{"line_number":77,"context_line":""},{"line_number":78,"context_line":""},{"line_number":79,"context_line":"def get_class_name_by_method(method, fully_qualified\u003dTrue):"},{"line_number":80,"context_line":"    \"\"\"Get class name from  bound method."},{"line_number":81,"context_line":""},{"line_number":82,"context_line":"    Similar with method get_class_name, just get the ``self`` object attached"},{"line_number":83,"context_line":"    to this method, then get class name of ``self`` object."}],"source_content_type":"text/x-python","patch_set":1,"id":"fa80f949_4bf6ab90","line":80,"updated":"2015-11-04 11:41:15.000000000","message":"two spaces","commit_id":"0d4f99cd347b1e2a741b7d6a680fb95e0c73e366"},{"author":{"_account_id":9796,"name":"ChangBo Guo","email":"glongwave@gmail.com","username":"gcb"},"change_message_id":"ce3b6d0190ab9609afc6db5789fb80599852ff78","unresolved":false,"context_lines":[{"line_number":77,"context_line":""},{"line_number":78,"context_line":""},{"line_number":79,"context_line":"def get_class_name_by_method(method, fully_qualified\u003dTrue):"},{"line_number":80,"context_line":"    \"\"\"Get class name from  bound method."},{"line_number":81,"context_line":""},{"line_number":82,"context_line":"    Similar with method get_class_name, just get the ``self`` object attached"},{"line_number":83,"context_line":"    to this method, then get class name of ``self`` object."}],"source_content_type":"text/x-python","patch_set":1,"id":"fa80f949_f103d0b6","line":80,"in_reply_to":"fa80f949_4bf6ab90","updated":"2015-11-04 12:36:03.000000000","message":"Done","commit_id":"0d4f99cd347b1e2a741b7d6a680fb95e0c73e366"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"bc0ec4b85169b91aae102cae36238cb0b23a3f8e","unresolved":false,"context_lines":[{"line_number":79,"context_line":"def get_class_name_by_method(method, fully_qualified\u003dTrue):"},{"line_number":80,"context_line":"    \"\"\"Get class name from bound method."},{"line_number":81,"context_line":""},{"line_number":82,"context_line":"    Similar with method get_class_name, just get the ``self`` object attached"},{"line_number":83,"context_line":"    to this method, then get class name of ``self`` object."},{"line_number":84,"context_line":"    \"\"\""},{"line_number":85,"context_line":"    method_self \u003d get_method_self(method)"}],"source_content_type":"text/x-python","patch_set":2,"id":"da85f559_b47478cf","line":82,"updated":"2015-11-08 17:26:41.000000000","message":"change \"Similar with method get_class_name\" to \"Similar to :meth:`get_class_name`\"","commit_id":"a3c90b7f461cec1a334571c12902f053401258b9"},{"author":{"_account_id":9796,"name":"ChangBo Guo","email":"glongwave@gmail.com","username":"gcb"},"change_message_id":"e4bd29477039681703df76b54f3e81cefc32257f","unresolved":false,"context_lines":[{"line_number":79,"context_line":"def get_class_name_by_method(method, fully_qualified\u003dTrue):"},{"line_number":80,"context_line":"    \"\"\"Get class name from bound method."},{"line_number":81,"context_line":""},{"line_number":82,"context_line":"    Similar with method get_class_name, just get the ``self`` object attached"},{"line_number":83,"context_line":"    to this method, then get class name of ``self`` object."},{"line_number":84,"context_line":"    \"\"\""},{"line_number":85,"context_line":"    method_self \u003d get_method_self(method)"}],"source_content_type":"text/x-python","patch_set":2,"id":"da85f559_aa6cfa9c","line":82,"in_reply_to":"da85f559_b47478cf","updated":"2015-11-09 11:35:27.000000000","message":"Done","commit_id":"a3c90b7f461cec1a334571c12902f053401258b9"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"bc0ec4b85169b91aae102cae36238cb0b23a3f8e","unresolved":false,"context_lines":[{"line_number":80,"context_line":"    \"\"\"Get class name from bound method."},{"line_number":81,"context_line":""},{"line_number":82,"context_line":"    Similar with method get_class_name, just get the ``self`` object attached"},{"line_number":83,"context_line":"    to this method, then get class name of ``self`` object."},{"line_number":84,"context_line":"    \"\"\""},{"line_number":85,"context_line":"    method_self \u003d get_method_self(method)"},{"line_number":86,"context_line":"    if method_self is not None:"}],"source_content_type":"text/x-python","patch_set":2,"id":"da85f559_d43a5ce7","line":83,"updated":"2015-11-08 17:26:41.000000000","message":"this is explaining how the function is implemented and doesn\u0027t belong in a docstring. The docstring should explain why and how the function is used.\n\nThe docstring should say that an empty string is returned for whatever reason there\u0027s a \"return \u0027\u0027\" in the implementation.","commit_id":"a3c90b7f461cec1a334571c12902f053401258b9"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"9b7387bb88b35df384b358ec3ed08ca7cfa67022","unresolved":false,"context_lines":[{"line_number":85,"context_line":"    return \u0027.\u0027.join(pieces)"},{"line_number":86,"context_line":""},{"line_number":87,"context_line":""},{"line_number":88,"context_line":"def get_class_name_by_method(method, fully_qualified\u003dTrue):"},{"line_number":89,"context_line":"    \"\"\"Get class name from bound method."},{"line_number":90,"context_line":""},{"line_number":91,"context_line":"    Similar with method :meth:`get_class_name`, returns method parameter\u0027s"}],"source_content_type":"text/x-python","patch_set":3,"id":"ba8a016a_d3afbfe1","line":88,"updated":"2015-11-16 21:54:55.000000000","message":"Change the name to \"get_method_class_name\" to match the naming convention used in this module. (e.g., get_method_self)","commit_id":"34366c8a51c26b7e1b93f252673096fe6f434abd"},{"author":{"_account_id":9796,"name":"ChangBo Guo","email":"glongwave@gmail.com","username":"gcb"},"change_message_id":"852e790c05bd82c08dc72cd3a795bb0e8b056135","unresolved":false,"context_lines":[{"line_number":85,"context_line":"    return \u0027.\u0027.join(pieces)"},{"line_number":86,"context_line":""},{"line_number":87,"context_line":""},{"line_number":88,"context_line":"def get_class_name_by_method(method, fully_qualified\u003dTrue):"},{"line_number":89,"context_line":"    \"\"\"Get class name from bound method."},{"line_number":90,"context_line":""},{"line_number":91,"context_line":"    Similar with method :meth:`get_class_name`, returns method parameter\u0027s"}],"source_content_type":"text/x-python","patch_set":3,"id":"ba8a016a_8e9fa502","line":88,"in_reply_to":"ba8a016a_d3afbfe1","updated":"2015-11-17 15:58:58.000000000","message":"Done","commit_id":"34366c8a51c26b7e1b93f252673096fe6f434abd"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"9b7387bb88b35df384b358ec3ed08ca7cfa67022","unresolved":false,"context_lines":[{"line_number":86,"context_line":""},{"line_number":87,"context_line":""},{"line_number":88,"context_line":"def get_class_name_by_method(method, fully_qualified\u003dTrue):"},{"line_number":89,"context_line":"    \"\"\"Get class name from bound method."},{"line_number":90,"context_line":""},{"line_number":91,"context_line":"    Similar with method :meth:`get_class_name`, returns method parameter\u0027s"},{"line_number":92,"context_line":"    ``self`` object\u0027s class name. The empty string is returned if method"}],"source_content_type":"text/x-python","patch_set":3,"id":"ba8a016a_1320e79a","line":89,"updated":"2015-11-16 21:54:55.000000000","message":"from \"Get class name from bound method.\" to \"Get the class name for a bound method.\"","commit_id":"34366c8a51c26b7e1b93f252673096fe6f434abd"},{"author":{"_account_id":9796,"name":"ChangBo Guo","email":"glongwave@gmail.com","username":"gcb"},"change_message_id":"852e790c05bd82c08dc72cd3a795bb0e8b056135","unresolved":false,"context_lines":[{"line_number":86,"context_line":""},{"line_number":87,"context_line":""},{"line_number":88,"context_line":"def get_class_name_by_method(method, fully_qualified\u003dTrue):"},{"line_number":89,"context_line":"    \"\"\"Get class name from bound method."},{"line_number":90,"context_line":""},{"line_number":91,"context_line":"    Similar with method :meth:`get_class_name`, returns method parameter\u0027s"},{"line_number":92,"context_line":"    ``self`` object\u0027s class name. The empty string is returned if method"}],"source_content_type":"text/x-python","patch_set":3,"id":"ba8a016a_aea2a949","line":89,"in_reply_to":"ba8a016a_1320e79a","updated":"2015-11-17 15:58:58.000000000","message":"Done","commit_id":"34366c8a51c26b7e1b93f252673096fe6f434abd"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"9b7387bb88b35df384b358ec3ed08ca7cfa67022","unresolved":false,"context_lines":[{"line_number":88,"context_line":"def get_class_name_by_method(method, fully_qualified\u003dTrue):"},{"line_number":89,"context_line":"    \"\"\"Get class name from bound method."},{"line_number":90,"context_line":""},{"line_number":91,"context_line":"    Similar with method :meth:`get_class_name`, returns method parameter\u0027s"},{"line_number":92,"context_line":"    ``self`` object\u0027s class name. The empty string is returned if method"},{"line_number":93,"context_line":"    parameter is not a bound method."},{"line_number":94,"context_line":"    \"\"\""}],"source_content_type":"text/x-python","patch_set":3,"id":"ba8a016a_c1936cf9","line":91,"updated":"2015-11-16 21:54:55.000000000","message":"change \"Similar with method :meth:`get_class_name`\" to \"Similar to :meth:`get_class_name`\".\n\nchange \"returns method\" to \"returns the `method`\"","commit_id":"34366c8a51c26b7e1b93f252673096fe6f434abd"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"9b7387bb88b35df384b358ec3ed08ca7cfa67022","unresolved":false,"context_lines":[{"line_number":89,"context_line":"    \"\"\"Get class name from bound method."},{"line_number":90,"context_line":""},{"line_number":91,"context_line":"    Similar with method :meth:`get_class_name`, returns method parameter\u0027s"},{"line_number":92,"context_line":"    ``self`` object\u0027s class name. The empty string is returned if method"},{"line_number":93,"context_line":"    parameter is not a bound method."},{"line_number":94,"context_line":"    \"\"\""},{"line_number":95,"context_line":"    method_self \u003d get_method_self(method)"}],"source_content_type":"text/x-python","patch_set":3,"id":"ba8a016a_413bfceb","line":92,"updated":"2015-11-16 21:54:55.000000000","message":"change \"if method\" to \"if the `method`\"","commit_id":"34366c8a51c26b7e1b93f252673096fe6f434abd"},{"author":{"_account_id":9796,"name":"ChangBo Guo","email":"glongwave@gmail.com","username":"gcb"},"change_message_id":"852e790c05bd82c08dc72cd3a795bb0e8b056135","unresolved":false,"context_lines":[{"line_number":89,"context_line":"    \"\"\"Get class name from bound method."},{"line_number":90,"context_line":""},{"line_number":91,"context_line":"    Similar with method :meth:`get_class_name`, returns method parameter\u0027s"},{"line_number":92,"context_line":"    ``self`` object\u0027s class name. The empty string is returned if method"},{"line_number":93,"context_line":"    parameter is not a bound method."},{"line_number":94,"context_line":"    \"\"\""},{"line_number":95,"context_line":"    method_self \u003d get_method_self(method)"}],"source_content_type":"text/x-python","patch_set":3,"id":"ba8a016a_c9ffe7ff","line":92,"in_reply_to":"ba8a016a_413bfceb","updated":"2015-11-17 15:58:58.000000000","message":"Done","commit_id":"34366c8a51c26b7e1b93f252673096fe6f434abd"},{"author":{"_account_id":9107,"name":"Victor Stinner","email":"vstinner@redhat.com","username":"haypo"},"change_message_id":"6926a728d17c8e217eea20ff0c219f6d8a37692b","unresolved":false,"context_lines":[{"line_number":87,"context_line":"    if method_self is not None:"},{"line_number":88,"context_line":"        return get_class_name(method_self, fully_qualified)"},{"line_number":89,"context_line":"    else:"},{"line_number":90,"context_line":"        return \u0027\u0027"},{"line_number":91,"context_line":""},{"line_number":92,"context_line":""},{"line_number":93,"context_line":"def get_all_class_names(obj, up_to\u003dobject):"}],"source_content_type":"text/x-python","patch_set":5,"id":"ba8a016a_0b92bc4b","line":90,"updated":"2015-11-23 16:05:49.000000000","message":"I don\u0027t like this API. I would expect a TypeError here.","commit_id":"60f7d8fc575b492301120f03b0f5d59eb965b4ed"},{"author":{"_account_id":9796,"name":"ChangBo Guo","email":"glongwave@gmail.com","username":"gcb"},"change_message_id":"8a9be7387500d05639d391d1bf881b8363e574bd","unresolved":false,"context_lines":[{"line_number":87,"context_line":"    if method_self is not None:"},{"line_number":88,"context_line":"        return get_class_name(method_self, fully_qualified)"},{"line_number":89,"context_line":"    else:"},{"line_number":90,"context_line":"        return \u0027\u0027"},{"line_number":91,"context_line":""},{"line_number":92,"context_line":""},{"line_number":93,"context_line":"def get_all_class_names(obj, up_to\u003dobject):"}],"source_content_type":"text/x-python","patch_set":5,"id":"9a8ffd7b_66cf2a57","line":90,"in_reply_to":"ba8a016a_0b92bc4b","updated":"2015-11-25 05:57:05.000000000","message":"It\u0027s ok for me to raise TypeError","commit_id":"60f7d8fc575b492301120f03b0f5d59eb965b4ed"},{"author":{"_account_id":9107,"name":"Victor Stinner","email":"vstinner@redhat.com","username":"haypo"},"change_message_id":"0ef0fe42657befa5ae02468f8fe50797c8245dce","unresolved":false,"context_lines":[{"line_number":81,"context_line":""},{"line_number":82,"context_line":"    Similar to :meth:`get_class_name`, returns `method` parameter\u0027s"},{"line_number":83,"context_line":"    ``self`` object\u0027s class name. TypeError is raised if the `method`"},{"line_number":84,"context_line":"    parameter is not a bound method."},{"line_number":85,"context_line":"    \"\"\""},{"line_number":86,"context_line":"    method_self \u003d get_method_self(method)"},{"line_number":87,"context_line":"    if method_self is not None:"}],"source_content_type":"text/x-python","patch_set":7,"id":"9a8ffd7b_1f8a18c0","line":84,"updated":"2015-11-25 09:29:54.000000000","message":"Sorry, I completly misunderstood the whole change... I first understood that the method returns the name of the *method*, not the name of the *class*...\n\nWhy adding a new function? It\u0027s quite easy to enhance the existing get_class_name() method to accept methods, use \"inspect.ismethod(method)\" to add your code.\n\nWhat do you think of that?","commit_id":"7500afd65f40ef3950baf558c77c30ac097f1d69"},{"author":{"_account_id":9796,"name":"ChangBo Guo","email":"glongwave@gmail.com","username":"gcb"},"change_message_id":"7368be72831184fc8d939be3e6bd731bdff2ca19","unresolved":false,"context_lines":[{"line_number":81,"context_line":""},{"line_number":82,"context_line":"    Similar to :meth:`get_class_name`, returns `method` parameter\u0027s"},{"line_number":83,"context_line":"    ``self`` object\u0027s class name. TypeError is raised if the `method`"},{"line_number":84,"context_line":"    parameter is not a bound method."},{"line_number":85,"context_line":"    \"\"\""},{"line_number":86,"context_line":"    method_self \u003d get_method_self(method)"},{"line_number":87,"context_line":"    if method_self is not None:"}],"source_content_type":"text/x-python","patch_set":7,"id":"9a8ffd7b_b06e9694","line":84,"in_reply_to":"9a8ffd7b_1f8a18c0","updated":"2015-11-25 11:42:52.000000000","message":"So in method get_class_name  parameter obj can be a method or class or class instance, yes , looks good to me , will also adjust the docstring and unit test.","commit_id":"7500afd65f40ef3950baf558c77c30ac097f1d69"},{"author":{"_account_id":9796,"name":"ChangBo Guo","email":"glongwave@gmail.com","username":"gcb"},"change_message_id":"f453223c1bbf4209574b41bf059f546f81029791","unresolved":false,"context_lines":[{"line_number":81,"context_line":""},{"line_number":82,"context_line":"    Similar to :meth:`get_class_name`, returns `method` parameter\u0027s"},{"line_number":83,"context_line":"    ``self`` object\u0027s class name. TypeError is raised if the `method`"},{"line_number":84,"context_line":"    parameter is not a bound method."},{"line_number":85,"context_line":"    \"\"\""},{"line_number":86,"context_line":"    method_self \u003d get_method_self(method)"},{"line_number":87,"context_line":"    if method_self is not None:"}],"source_content_type":"text/x-python","patch_set":7,"id":"9a8ffd7b_db7c9b74","line":84,"in_reply_to":"9a8ffd7b_b06e9694","updated":"2015-11-25 11:56:08.000000000","message":"Just thought that again, does that make developer confusing this same method accept different type of obj ?  Another method is clear for caller. What do you think?","commit_id":"7500afd65f40ef3950baf558c77c30ac097f1d69"},{"author":{"_account_id":9107,"name":"Victor Stinner","email":"vstinner@redhat.com","username":"haypo"},"change_message_id":"c67b7f28142ce52118ced59b5cf7e6f2e4415ae2","unresolved":false,"context_lines":[{"line_number":64,"context_line":"    returned."},{"line_number":65,"context_line":"    \"\"\""},{"line_number":66,"context_line":"    if inspect.ismethod(obj):"},{"line_number":67,"context_line":"        obj \u003d get_method_self(obj)"},{"line_number":68,"context_line":"    if not isinstance(obj, six.class_types):"},{"line_number":69,"context_line":"        obj \u003d type(obj)"},{"line_number":70,"context_line":"    try:"}],"source_content_type":"text/x-python","patch_set":9,"id":"9a8ffd7b_5de7c3ab","line":67,"updated":"2015-11-27 14:13:04.000000000","message":"Hum, I expected to see again the old code to detect when self is None. Something like:\n\nobj_self \u003d get_method_self(obj)\nif obj_self is None:\n    raise TypeError(\u0027%s is not a bound method.\u0027 % get_callable_name(obj))\nobj \u003d obj_self","commit_id":"e5052ab4a79622e2ac42618217414abe41f42846"},{"author":{"_account_id":9796,"name":"ChangBo Guo","email":"glongwave@gmail.com","username":"gcb"},"change_message_id":"de0189707589c747c5cbf8fd1aeafedb1a43e520","unresolved":false,"context_lines":[{"line_number":64,"context_line":"    returned."},{"line_number":65,"context_line":"    \"\"\""},{"line_number":66,"context_line":"    if inspect.ismethod(obj):"},{"line_number":67,"context_line":"        obj \u003d get_method_self(obj)"},{"line_number":68,"context_line":"    if not isinstance(obj, six.class_types):"},{"line_number":69,"context_line":"        obj \u003d type(obj)"},{"line_number":70,"context_line":"    try:"}],"source_content_type":"text/x-python","patch_set":9,"id":"9a8ffd7b_803a9fe5","line":67,"in_reply_to":"9a8ffd7b_5de7c3ab","updated":"2015-11-27 15:58:28.000000000","message":"If obj is  six.class_type  or builtin ,  obj_self is None, this really break the api.\n\nThe better way is a new method which only handle bound method.","commit_id":"e5052ab4a79622e2ac42618217414abe41f42846"},{"author":{"_account_id":9107,"name":"Victor Stinner","email":"vstinner@redhat.com","username":"haypo"},"change_message_id":"a81316823a771435389d6d90680bcb22822757de","unresolved":false,"context_lines":[{"line_number":57,"context_line":"    \"\"\"Get class name for object."},{"line_number":58,"context_line":""},{"line_number":59,"context_line":"    If object is a type, returns name of the type. If object is a bound"},{"line_number":60,"context_line":"    method, returns its ``self`` object\u0027s class name. If object is an"},{"line_number":61,"context_line":"    instance of class, returns instance\u0027s class name. Else, name of the"},{"line_number":62,"context_line":"    type of the object is returned. If fully_qualified is True, returns"},{"line_number":63,"context_line":"    fully qualified name of the type. For builtin types, just name is"}],"source_content_type":"text/x-python","patch_set":10,"id":"9a8ffd7b_b90a5177","line":60,"updated":"2015-11-30 09:51:18.000000000","message":"\"If object is a bound method\": or a class method?","commit_id":"f00008d2342573f1030826604aa5c11b4dddebc5"}],"oslo_utils/tests/test_reflection.py":[{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"bc0ec4b85169b91aae102cae36238cb0b23a3f8e","unresolved":false,"context_lines":[{"line_number":317,"context_line":""},{"line_number":318,"context_line":"class GetClassNameByMethodTest(test_base.BaseTestCase):"},{"line_number":319,"context_line":""},{"line_number":320,"context_line":"    def test_none_method(self):"},{"line_number":321,"context_line":"        name \u003d reflection.get_class_name_by_method(RuntimeError)"},{"line_number":322,"context_line":"        self.assertEqual(\u0027\u0027, name)"},{"line_number":323,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"da85f559_280ee834","line":320,"updated":"2015-11-08 17:26:41.000000000","message":"suggest change \"none_method\" to \"class\"\n\nand add a comment explaining what this is testing. e.g.,\n\n # When a class is passed to get_class_name_by_method, the empty string is returned.","commit_id":"a3c90b7f461cec1a334571c12902f053401258b9"},{"author":{"_account_id":9796,"name":"ChangBo Guo","email":"glongwave@gmail.com","username":"gcb"},"change_message_id":"e4bd29477039681703df76b54f3e81cefc32257f","unresolved":false,"context_lines":[{"line_number":317,"context_line":""},{"line_number":318,"context_line":"class GetClassNameByMethodTest(test_base.BaseTestCase):"},{"line_number":319,"context_line":""},{"line_number":320,"context_line":"    def test_none_method(self):"},{"line_number":321,"context_line":"        name \u003d reflection.get_class_name_by_method(RuntimeError)"},{"line_number":322,"context_line":"        self.assertEqual(\u0027\u0027, name)"},{"line_number":323,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"da85f559_ea20c24b","line":320,"in_reply_to":"da85f559_280ee834","updated":"2015-11-09 11:35:27.000000000","message":"Done","commit_id":"a3c90b7f461cec1a334571c12902f053401258b9"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"bc0ec4b85169b91aae102cae36238cb0b23a3f8e","unresolved":false,"context_lines":[{"line_number":326,"context_line":"        name \u003d reflection.get_class_name_by_method(c.method)"},{"line_number":327,"context_line":"        self.assertEqual(\u0027.\u0027.join((__name__, \u0027Class\u0027)), name)"},{"line_number":328,"context_line":""},{"line_number":329,"context_line":"    def test_none_bound_method(self):"},{"line_number":330,"context_line":"        name \u003d reflection.get_class_name_by_method(Class.static_method)"},{"line_number":331,"context_line":"        self.assertEqual(\u0027\u0027, name)"},{"line_number":332,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"da85f559_c8139c5b","line":329,"updated":"2015-11-08 17:26:41.000000000","message":"suggest change \"none_bound_method\" to \"static_method\" and add a comment explaining what this is testing.","commit_id":"a3c90b7f461cec1a334571c12902f053401258b9"},{"author":{"_account_id":9796,"name":"ChangBo Guo","email":"glongwave@gmail.com","username":"gcb"},"change_message_id":"e4bd29477039681703df76b54f3e81cefc32257f","unresolved":false,"context_lines":[{"line_number":326,"context_line":"        name \u003d reflection.get_class_name_by_method(c.method)"},{"line_number":327,"context_line":"        self.assertEqual(\u0027.\u0027.join((__name__, \u0027Class\u0027)), name)"},{"line_number":328,"context_line":""},{"line_number":329,"context_line":"    def test_none_bound_method(self):"},{"line_number":330,"context_line":"        name \u003d reflection.get_class_name_by_method(Class.static_method)"},{"line_number":331,"context_line":"        self.assertEqual(\u0027\u0027, name)"},{"line_number":332,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"da85f559_0a1e660c","line":329,"in_reply_to":"da85f559_c8139c5b","updated":"2015-11-09 11:35:27.000000000","message":"Done","commit_id":"a3c90b7f461cec1a334571c12902f053401258b9"},{"author":{"_account_id":9107,"name":"Victor Stinner","email":"vstinner@redhat.com","username":"haypo"},"change_message_id":"6926a728d17c8e217eea20ff0c219f6d8a37692b","unresolved":false,"context_lines":[{"line_number":327,"context_line":"    # When a class is passed to get_method_class_name,"},{"line_number":328,"context_line":"    # the empty string is returned."},{"line_number":329,"context_line":"    def test_class(self):"},{"line_number":330,"context_line":"        name \u003d reflection.get_method_class_name(RuntimeError)"},{"line_number":331,"context_line":"        self.assertEqual(\u0027\u0027, name)"},{"line_number":332,"context_line":""},{"line_number":333,"context_line":"    def test_bound_method(self):"}],"source_content_type":"text/x-python","patch_set":5,"id":"ba8a016a_70b0138c","line":330,"updated":"2015-11-23 16:05:49.000000000","message":"Hum, I would prefer to see Class here.","commit_id":"60f7d8fc575b492301120f03b0f5d59eb965b4ed"},{"author":{"_account_id":9796,"name":"ChangBo Guo","email":"glongwave@gmail.com","username":"gcb"},"change_message_id":"8a9be7387500d05639d391d1bf881b8363e574bd","unresolved":false,"context_lines":[{"line_number":327,"context_line":"    # When a class is passed to get_method_class_name,"},{"line_number":328,"context_line":"    # the empty string is returned."},{"line_number":329,"context_line":"    def test_class(self):"},{"line_number":330,"context_line":"        name \u003d reflection.get_method_class_name(RuntimeError)"},{"line_number":331,"context_line":"        self.assertEqual(\u0027\u0027, name)"},{"line_number":332,"context_line":""},{"line_number":333,"context_line":"    def test_bound_method(self):"}],"source_content_type":"text/x-python","patch_set":5,"id":"9a8ffd7b_26d92222","line":330,"in_reply_to":"ba8a016a_70b0138c","updated":"2015-11-25 05:57:05.000000000","message":"Done","commit_id":"60f7d8fc575b492301120f03b0f5d59eb965b4ed"},{"author":{"_account_id":9107,"name":"Victor Stinner","email":"vstinner@redhat.com","username":"haypo"},"change_message_id":"6926a728d17c8e217eea20ff0c219f6d8a37692b","unresolved":false,"context_lines":[{"line_number":339,"context_line":"    # the empty string is returned."},{"line_number":340,"context_line":"    def test_static_method(self):"},{"line_number":341,"context_line":"        name \u003d reflection.get_method_class_name(Class.static_method)"},{"line_number":342,"context_line":"        self.assertEqual(\u0027\u0027, name)"},{"line_number":343,"context_line":""},{"line_number":344,"context_line":""},{"line_number":345,"context_line":"class GetAllClassNamesTest(test_base.BaseTestCase):"}],"source_content_type":"text/x-python","patch_set":5,"id":"ba8a016a_907257e2","line":342,"updated":"2015-11-23 16:05:49.000000000","message":"Can you please add a test for unbound methods which are not static? You may have to skip the test on Python 3.\n\n(Is it worth to add a test for class methods?)","commit_id":"60f7d8fc575b492301120f03b0f5d59eb965b4ed"},{"author":{"_account_id":9796,"name":"ChangBo Guo","email":"glongwave@gmail.com","username":"gcb"},"change_message_id":"8a9be7387500d05639d391d1bf881b8363e574bd","unresolved":false,"context_lines":[{"line_number":339,"context_line":"    # the empty string is returned."},{"line_number":340,"context_line":"    def test_static_method(self):"},{"line_number":341,"context_line":"        name \u003d reflection.get_method_class_name(Class.static_method)"},{"line_number":342,"context_line":"        self.assertEqual(\u0027\u0027, name)"},{"line_number":343,"context_line":""},{"line_number":344,"context_line":""},{"line_number":345,"context_line":"class GetAllClassNamesTest(test_base.BaseTestCase):"}],"source_content_type":"text/x-python","patch_set":5,"id":"9a8ffd7b_e609da96","line":342,"in_reply_to":"ba8a016a_907257e2","updated":"2015-11-25 05:57:05.000000000","message":"Done","commit_id":"60f7d8fc575b492301120f03b0f5d59eb965b4ed"},{"author":{"_account_id":9107,"name":"Victor Stinner","email":"vstinner@redhat.com","username":"haypo"},"change_message_id":"ab55fccf752ef7228f43d2d7e97ea748190d13fc","unresolved":false,"context_lines":[{"line_number":334,"context_line":""},{"line_number":335,"context_line":"    def test_static_method(self):"},{"line_number":336,"context_line":"        self.assertRaises(TypeError, reflection.get_method_class_name,"},{"line_number":337,"context_line":"                          Class.static_method)"},{"line_number":338,"context_line":""},{"line_number":339,"context_line":"    def test_class_method(self):"},{"line_number":340,"context_line":"        self.assertRaises(TypeError, reflection.get_method_class_name,"}],"source_content_type":"text/x-python","patch_set":6,"id":"9a8ffd7b_b28f8822","line":337,"updated":"2015-11-25 07:48:00.000000000","message":"Wait, you cannot read the name of a static method?\n\nIt works for me on Python 3:\n\n \u003e\u003e\u003e class Bla:\n ...  @staticmethod\n ...  def func(): pass\n ... \n \u003e\u003e\u003e Bla.func\n \u003cfunction Bla.func at 0x7f793434c2f0\u003e\n \u003e\u003e\u003e (Bla.func).__name__\n \u0027func\u0027\n \u003e\u003e\u003e bla \u003d Bla()\n \u003e\u003e\u003e bla.func.__name__\n \u0027func\u0027","commit_id":"3d047b78fab344781577e01a8d275fe0578f617b"},{"author":{"_account_id":9107,"name":"Victor Stinner","email":"vstinner@redhat.com","username":"haypo"},"change_message_id":"b44d0740e0956e0653e1ec1424d58f311f16ec9d","unresolved":false,"context_lines":[{"line_number":334,"context_line":""},{"line_number":335,"context_line":"    def test_static_method(self):"},{"line_number":336,"context_line":"        self.assertRaises(TypeError, reflection.get_method_class_name,"},{"line_number":337,"context_line":"                          Class.static_method)"},{"line_number":338,"context_line":""},{"line_number":339,"context_line":"    def test_class_method(self):"},{"line_number":340,"context_line":"        self.assertRaises(TypeError, reflection.get_method_class_name,"}],"source_content_type":"text/x-python","patch_set":6,"id":"9a8ffd7b_9fdda816","line":337,"in_reply_to":"9a8ffd7b_3f94bc89","updated":"2015-11-25 09:23:40.000000000","message":"I don\u0027t understand the comment. Do you mean that the function raises a TypeError *as expected*?\n\nMy point is that I don\u0027t understand why the function is unable to get the name. It expect to get the name, not an error.","commit_id":"3d047b78fab344781577e01a8d275fe0578f617b"},{"author":{"_account_id":9107,"name":"Victor Stinner","email":"vstinner@redhat.com","username":"haypo"},"change_message_id":"476de986f14157b7f2aa23712ac6722d86a178dd","unresolved":false,"context_lines":[{"line_number":334,"context_line":""},{"line_number":335,"context_line":"    def test_static_method(self):"},{"line_number":336,"context_line":"        self.assertRaises(TypeError, reflection.get_method_class_name,"},{"line_number":337,"context_line":"                          Class.static_method)"},{"line_number":338,"context_line":""},{"line_number":339,"context_line":"    def test_class_method(self):"},{"line_number":340,"context_line":"        self.assertRaises(TypeError, reflection.get_method_class_name,"}],"source_content_type":"text/x-python","patch_set":6,"id":"9a8ffd7b_5f0c2094","line":337,"in_reply_to":"9a8ffd7b_9fdda816","updated":"2015-11-25 09:25:10.000000000","message":"Oh wait. I think that I completly misunderstood the whole change...\n\nIt\u0027s the name of the *class*, not the name of the *method*...","commit_id":"3d047b78fab344781577e01a8d275fe0578f617b"},{"author":{"_account_id":9796,"name":"ChangBo Guo","email":"glongwave@gmail.com","username":"gcb"},"change_message_id":"9ce760bbc44c40ca3d6446898b577e0814638958","unresolved":false,"context_lines":[{"line_number":334,"context_line":""},{"line_number":335,"context_line":"    def test_static_method(self):"},{"line_number":336,"context_line":"        self.assertRaises(TypeError, reflection.get_method_class_name,"},{"line_number":337,"context_line":"                          Class.static_method)"},{"line_number":338,"context_line":""},{"line_number":339,"context_line":"    def test_class_method(self):"},{"line_number":340,"context_line":"        self.assertRaises(TypeError, reflection.get_method_class_name,"}],"source_content_type":"text/x-python","patch_set":6,"id":"9a8ffd7b_3f94bc89","line":337,"in_reply_to":"9a8ffd7b_b28f8822","updated":"2015-11-25 09:16:05.000000000","message":"this works for me and Jekins.","commit_id":"3d047b78fab344781577e01a8d275fe0578f617b"},{"author":{"_account_id":9107,"name":"Victor Stinner","email":"vstinner@redhat.com","username":"haypo"},"change_message_id":"ab55fccf752ef7228f43d2d7e97ea748190d13fc","unresolved":false,"context_lines":[{"line_number":338,"context_line":""},{"line_number":339,"context_line":"    def test_class_method(self):"},{"line_number":340,"context_line":"        self.assertRaises(TypeError, reflection.get_method_class_name,"},{"line_number":341,"context_line":"                          Class.class_method)"},{"line_number":342,"context_line":""},{"line_number":343,"context_line":"    def test_unbound_method(self):"},{"line_number":344,"context_line":"        self.assertRaises(TypeError, reflection.get_method_class_name,"}],"source_content_type":"text/x-python","patch_set":6,"id":"9a8ffd7b_d2a6ccc0","line":341,"updated":"2015-11-25 07:48:00.000000000","message":"According to Jenkins, this test fails on Python 2 \u0026 3.","commit_id":"3d047b78fab344781577e01a8d275fe0578f617b"},{"author":{"_account_id":9796,"name":"ChangBo Guo","email":"glongwave@gmail.com","username":"gcb"},"change_message_id":"9ce760bbc44c40ca3d6446898b577e0814638958","unresolved":false,"context_lines":[{"line_number":338,"context_line":""},{"line_number":339,"context_line":"    def test_class_method(self):"},{"line_number":340,"context_line":"        self.assertRaises(TypeError, reflection.get_method_class_name,"},{"line_number":341,"context_line":"                          Class.class_method)"},{"line_number":342,"context_line":""},{"line_number":343,"context_line":"    def test_unbound_method(self):"},{"line_number":344,"context_line":"        self.assertRaises(TypeError, reflection.get_method_class_name,"}],"source_content_type":"text/x-python","patch_set":6,"id":"9a8ffd7b_c9d5c243","line":341,"in_reply_to":"9a8ffd7b_d2a6ccc0","updated":"2015-11-25 09:16:05.000000000","message":"a class method  is a bound method :-)","commit_id":"3d047b78fab344781577e01a8d275fe0578f617b"},{"author":{"_account_id":9107,"name":"Victor Stinner","email":"vstinner@redhat.com","username":"haypo"},"change_message_id":"ab55fccf752ef7228f43d2d7e97ea748190d13fc","unresolved":false,"context_lines":[{"line_number":343,"context_line":"    def test_unbound_method(self):"},{"line_number":344,"context_line":"        self.assertRaises(TypeError, reflection.get_method_class_name,"},{"line_number":345,"context_line":"                          mere_function)"},{"line_number":346,"context_line":""},{"line_number":347,"context_line":""},{"line_number":348,"context_line":"class GetAllClassNamesTest(test_base.BaseTestCase):"},{"line_number":349,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"9a8ffd7b_d2bb2cc3","line":346,"updated":"2015-11-25 07:48:00.000000000","message":"Hum, you should also add at least one test getting the fully qualified name (with the module name). Or maybe check it in each method.","commit_id":"3d047b78fab344781577e01a8d275fe0578f617b"},{"author":{"_account_id":9796,"name":"ChangBo Guo","email":"glongwave@gmail.com","username":"gcb"},"change_message_id":"9ce760bbc44c40ca3d6446898b577e0814638958","unresolved":false,"context_lines":[{"line_number":343,"context_line":"    def test_unbound_method(self):"},{"line_number":344,"context_line":"        self.assertRaises(TypeError, reflection.get_method_class_name,"},{"line_number":345,"context_line":"                          mere_function)"},{"line_number":346,"context_line":""},{"line_number":347,"context_line":""},{"line_number":348,"context_line":"class GetAllClassNamesTest(test_base.BaseTestCase):"},{"line_number":349,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"9a8ffd7b_e976863d","line":346,"in_reply_to":"9a8ffd7b_d2bb2cc3","updated":"2015-11-25 09:16:05.000000000","message":"good catch, will add in each method.","commit_id":"3d047b78fab344781577e01a8d275fe0578f617b"},{"author":{"_account_id":9107,"name":"Victor Stinner","email":"vstinner@redhat.com","username":"haypo"},"change_message_id":"c67b7f28142ce52118ced59b5cf7e6f2e4415ae2","unresolved":false,"context_lines":[{"line_number":335,"context_line":"        # test with fully_qualified\u003dFalse"},{"line_number":336,"context_line":"        name \u003d reflection.get_class_name(Class.static_method,"},{"line_number":337,"context_line":"                                         fully_qualified\u003dFalse)"},{"line_number":338,"context_line":"        self.assertEqual(\u0027function\u0027, name)"},{"line_number":339,"context_line":""},{"line_number":340,"context_line":"    def test_unbound_method(self):"},{"line_number":341,"context_line":"        name \u003d reflection.get_class_name(mere_function)"}],"source_content_type":"text/x-python","patch_set":9,"id":"9a8ffd7b_dd92d3f5","line":338,"updated":"2015-11-27 14:13:04.000000000","message":"Wait what? \u0027function\u0027 is not the name of the class: the class is called \u0027Class\u0027.\n\nYour test is wrong, but it\u0027s maybe a consequence of not testing self to be self (see my comment in reflection.py.)","commit_id":"e5052ab4a79622e2ac42618217414abe41f42846"},{"author":{"_account_id":9107,"name":"Victor Stinner","email":"vstinner@redhat.com","username":"haypo"},"change_message_id":"c67b7f28142ce52118ced59b5cf7e6f2e4415ae2","unresolved":false,"context_lines":[{"line_number":342,"context_line":"        self.assertEqual(\u0027function\u0027, name)"},{"line_number":343,"context_line":"        # test with fully_qualified\u003dFalse"},{"line_number":344,"context_line":"        name \u003d reflection.get_class_name(mere_function, fully_qualified\u003dFalse)"},{"line_number":345,"context_line":"        self.assertEqual(\u0027function\u0027, name)"},{"line_number":346,"context_line":""},{"line_number":347,"context_line":"    def test_bound_method(self):"},{"line_number":348,"context_line":"        c \u003d Class()"}],"source_content_type":"text/x-python","patch_set":9,"id":"9a8ffd7b_9dbf6b60","line":345,"updated":"2015-11-27 14:13:04.000000000","message":"Ditto.","commit_id":"e5052ab4a79622e2ac42618217414abe41f42846"},{"author":{"_account_id":9107,"name":"Victor Stinner","email":"vstinner@redhat.com","username":"haypo"},"change_message_id":"c67b7f28142ce52118ced59b5cf7e6f2e4415ae2","unresolved":false,"context_lines":[{"line_number":347,"context_line":"    def test_bound_method(self):"},{"line_number":348,"context_line":"        c \u003d Class()"},{"line_number":349,"context_line":"        name \u003d reflection.get_class_name(c.method)"},{"line_number":350,"context_line":"        self.assertEqual(\u0027.\u0027.join((__name__, \u0027Class\u0027)), name)"},{"line_number":351,"context_line":"        # test with fully_qualified\u003dFalse"},{"line_number":352,"context_line":"        name \u003d reflection.get_class_name(c.method, fully_qualified\u003dFalse)"},{"line_number":353,"context_line":"        self.assertEqual(\u0027Class\u0027, name)"}],"source_content_type":"text/x-python","patch_set":9,"id":"9a8ffd7b_5d6ca307","line":350,"updated":"2015-11-27 14:13:04.000000000","message":"nitpick: IMHO \u0027%s.Class\u0027 % __name__ is more readable.","commit_id":"e5052ab4a79622e2ac42618217414abe41f42846"},{"author":{"_account_id":9796,"name":"ChangBo Guo","email":"glongwave@gmail.com","username":"gcb"},"change_message_id":"de0189707589c747c5cbf8fd1aeafedb1a43e520","unresolved":false,"context_lines":[{"line_number":347,"context_line":"    def test_bound_method(self):"},{"line_number":348,"context_line":"        c \u003d Class()"},{"line_number":349,"context_line":"        name \u003d reflection.get_class_name(c.method)"},{"line_number":350,"context_line":"        self.assertEqual(\u0027.\u0027.join((__name__, \u0027Class\u0027)), name)"},{"line_number":351,"context_line":"        # test with fully_qualified\u003dFalse"},{"line_number":352,"context_line":"        name \u003d reflection.get_class_name(c.method, fully_qualified\u003dFalse)"},{"line_number":353,"context_line":"        self.assertEqual(\u0027Class\u0027, name)"}],"source_content_type":"text/x-python","patch_set":9,"id":"9a8ffd7b_6339c5d6","line":350,"in_reply_to":"9a8ffd7b_5d6ca307","updated":"2015-11-27 15:58:28.000000000","message":"good catch.","commit_id":"e5052ab4a79622e2ac42618217414abe41f42846"},{"author":{"_account_id":9107,"name":"Victor Stinner","email":"vstinner@redhat.com","username":"haypo"},"change_message_id":"c67b7f28142ce52118ced59b5cf7e6f2e4415ae2","unresolved":false,"context_lines":[{"line_number":351,"context_line":"        # test with fully_qualified\u003dFalse"},{"line_number":352,"context_line":"        name \u003d reflection.get_class_name(c.method, fully_qualified\u003dFalse)"},{"line_number":353,"context_line":"        self.assertEqual(\u0027Class\u0027, name)"},{"line_number":354,"context_line":""},{"line_number":355,"context_line":""},{"line_number":356,"context_line":"class GetAllClassNamesTest(test_base.BaseTestCase):"},{"line_number":357,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"9a8ffd7b_5d3a63e8","line":354,"updated":"2015-11-27 14:13:04.000000000","message":"Did you lost the test on class method? I don\u0027t recall if I added such test before or not.","commit_id":"e5052ab4a79622e2ac42618217414abe41f42846"},{"author":{"_account_id":9796,"name":"ChangBo Guo","email":"glongwave@gmail.com","username":"gcb"},"change_message_id":"de0189707589c747c5cbf8fd1aeafedb1a43e520","unresolved":false,"context_lines":[{"line_number":351,"context_line":"        # test with fully_qualified\u003dFalse"},{"line_number":352,"context_line":"        name \u003d reflection.get_class_name(c.method, fully_qualified\u003dFalse)"},{"line_number":353,"context_line":"        self.assertEqual(\u0027Class\u0027, name)"},{"line_number":354,"context_line":""},{"line_number":355,"context_line":""},{"line_number":356,"context_line":"class GetAllClassNamesTest(test_base.BaseTestCase):"},{"line_number":357,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"9a8ffd7b_031d5965","line":354,"in_reply_to":"9a8ffd7b_5d3a63e8","updated":"2015-11-27 15:58:28.000000000","message":"see line 324","commit_id":"e5052ab4a79622e2ac42618217414abe41f42846"},{"author":{"_account_id":9107,"name":"Victor Stinner","email":"vstinner@redhat.com","username":"haypo"},"change_message_id":"a81316823a771435389d6d90680bcb22822757de","unresolved":false,"context_lines":[{"line_number":323,"context_line":""},{"line_number":324,"context_line":"    def test_class_method(self):"},{"line_number":325,"context_line":"        name \u003d reflection.get_class_name(Class.class_method)"},{"line_number":326,"context_line":"        self.assertEqual((\u0027%s.Class\u0027 % __name__), name)"},{"line_number":327,"context_line":"        # test with fully_qualified\u003dFalse"},{"line_number":328,"context_line":"        name \u003d reflection.get_class_name(Class.class_method,"},{"line_number":329,"context_line":"                                         fully_qualified\u003dFalse)"}],"source_content_type":"text/x-python","patch_set":10,"id":"9a8ffd7b_b9cfb127","line":326,"updated":"2015-11-30 09:51:18.000000000","message":"parenthesis are optional here.","commit_id":"f00008d2342573f1030826604aa5c11b4dddebc5"}]}
