)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"b611f679fe0ca95324423e426b1cfb044857665d","unresolved":false,"context_lines":[{"line_number":8,"context_line":""},{"line_number":9,"context_line":"There are two things being fixed here:"},{"line_number":10,"context_line":" - In py3 a class is unhashable if it defines an __eq__, but doesn\u0027t"},{"line_number":11,"context_line":"   define a __hash__. testtools.TestCase does this so the fake Manager"},{"line_number":12,"context_line":"   class was created to bypass the issue."},{"line_number":13,"context_line":" - In py3 unbound methods are no longer a special object. It is treated"},{"line_number":14,"context_line":"   the same an any other function object (note I don\u0027t mean instance"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":3,"id":"5aef4532_9dda9115","line":11,"range":{"start_line":11,"start_character":46,"end_line":11,"end_character":50},"updated":"2016-03-10 20:57:02.000000000","message":"does what?\n\nand why is that a problem?","commit_id":"0d76172b768899720d462d769a3c39388066add4"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"b611f679fe0ca95324423e426b1cfb044857665d","unresolved":false,"context_lines":[{"line_number":12,"context_line":"   class was created to bypass the issue."},{"line_number":13,"context_line":" - In py3 unbound methods are no longer a special object. It is treated"},{"line_number":14,"context_line":"   the same an any other function object (note I don\u0027t mean instance"},{"line_number":15,"context_line":"   method). Because of this the TypeError is no longer raise when"},{"line_number":16,"context_line":"   calling it without a class instance. To catch the same error in py3"},{"line_number":17,"context_line":"   we can get rid of the *args and spell out the arguments. This way"},{"line_number":18,"context_line":"   when the method is called it will get a TypeError, since not all of"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":3,"id":"5aef4532_bd302d57","line":15,"range":{"start_line":15,"start_character":55,"end_line":15,"end_character":60},"updated":"2016-03-10 20:57:02.000000000","message":"raised","commit_id":"0d76172b768899720d462d769a3c39388066add4"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"b611f679fe0ca95324423e426b1cfb044857665d","unresolved":false,"context_lines":[{"line_number":13,"context_line":" - In py3 unbound methods are no longer a special object. It is treated"},{"line_number":14,"context_line":"   the same an any other function object (note I don\u0027t mean instance"},{"line_number":15,"context_line":"   method). Because of this the TypeError is no longer raise when"},{"line_number":16,"context_line":"   calling it without a class instance. To catch the same error in py3"},{"line_number":17,"context_line":"   we can get rid of the *args and spell out the arguments. This way"},{"line_number":18,"context_line":"   when the method is called it will get a TypeError, since not all of"},{"line_number":19,"context_line":"   the arguments will be passed in (no self, because it\u0027s not being"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":3,"id":"5aef4532_1d34c147","line":16,"range":{"start_line":16,"start_character":11,"end_line":16,"end_character":13},"updated":"2016-03-10 20:57:02.000000000","message":"what is it?","commit_id":"0d76172b768899720d462d769a3c39388066add4"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"0ec00cdd84102287822b91468517eba9d6e715e6","unresolved":false,"context_lines":[{"line_number":9,"context_line":"There are two things being fixed here:"},{"line_number":10,"context_line":" - In py3 a class is unhashable if it defines an __eq__, but doesn\u0027t"},{"line_number":11,"context_line":"   define a __hash__. testtools.TestCase does this so adding the"},{"line_number":12,"context_line":"   TestCase\u0027s methods into the set of methods to be called failes. The"},{"line_number":13,"context_line":"   fake Manager class was created to bypass the issue since objects are"},{"line_number":14,"context_line":"   hashable by default."},{"line_number":15,"context_line":" - In py3 unbound methods are no longer a special object. They are"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":5,"id":"1af94dfe_d11f4206","line":12,"range":{"start_line":12,"start_character":59,"end_line":12,"end_character":65},"updated":"2016-03-17 16:31:22.000000000","message":"failed? fails?","commit_id":"f60bbdd5e35ee15543e40e66bd9edffb44f3a253"}],"keystone/tests/unit/common/test_notifications.py":[{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"1a6efcc263073d5bc45c7da1982a5b51fae9c707","unresolved":false,"context_lines":[{"line_number":1004,"context_line":"        Foo()"},{"line_number":1005,"context_line":"        project_ref \u003d unit.new_project_ref(domain_id\u003dself.domain_id)"},{"line_number":1006,"context_line":"        self.assertRaises(TypeError, self.resource_api.create_project,"},{"line_number":1007,"context_line":"                          project_ref[\u0027id\u0027], project_ref)"},{"line_number":1008,"context_line":""},{"line_number":1009,"context_line":""},{"line_number":1010,"context_line":"class CadfNotificationsWrapperTestCase(test_v3.RestfulTestCase):"}],"source_content_type":"text/x-python","patch_set":1,"id":"dae33548_54bea9d4","line":1007,"updated":"2016-02-16 17:11:56.000000000","message":"This is now failing because of TypeError: callback() missing 1 required positional argument: \u0027payload\u0027 -- not because it\u0027s using an unbound method. The fact that this had to change is showing that using an unbound method as a callback doesn\u0027t fail on py3 like it did on py27. (Maybe the test needs to be specific to the version)","commit_id":"d23b926c9b9d0ad114a3fdee714ffa8f4b1ed4b8"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"cfe39c78c5d73eda71efd69fe95626f9661595e0","unresolved":false,"context_lines":[{"line_number":1004,"context_line":"        Foo()"},{"line_number":1005,"context_line":"        project_ref \u003d unit.new_project_ref(domain_id\u003dself.domain_id)"},{"line_number":1006,"context_line":"        self.assertRaises(TypeError, self.resource_api.create_project,"},{"line_number":1007,"context_line":"                          project_ref[\u0027id\u0027], project_ref)"},{"line_number":1008,"context_line":""},{"line_number":1009,"context_line":""},{"line_number":1010,"context_line":"class CadfNotificationsWrapperTestCase(test_v3.RestfulTestCase):"}],"source_content_type":"text/x-python","patch_set":1,"id":"dae33548_83ec7090","line":1007,"in_reply_to":"dae33548_54bea9d4","updated":"2016-02-16 19:07:23.000000000","message":"Oops.. i thought i fixed this mess.","commit_id":"d23b926c9b9d0ad114a3fdee714ffa8f4b1ed4b8"},{"author":{"_account_id":6460,"name":"Brad Topol","email":"btopol@us.ibm.com","username":"btopol"},"change_message_id":"f91fcae762e491e79dc5b036e8b92a082149e7ef","unresolved":false,"context_lines":[{"line_number":885,"context_line":"                                  payload):"},{"line_number":886,"context_line":"        self.has_been_called \u003d True"},{"line_number":887,"context_line":""},{"line_number":888,"context_line":"    def _project_created_callback(self, service, resource_type, operation,"},{"line_number":889,"context_line":"                                  payload):"},{"line_number":890,"context_line":"        self.has_been_called \u003d True"},{"line_number":891,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"5aef4532_41a4a906","side":"PARENT","line":888,"updated":"2016-03-10 18:54:12.000000000","message":"This was removed because it was never used correct?  Might have been nice to mention you removed this unused function in the commit message","commit_id":"e2ee0641922c46c5cd5f9b541865f45b63d7b78d"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"06cf4e68dadde31626d0ddf0e0c46db4489fbcb3","unresolved":false,"context_lines":[{"line_number":885,"context_line":"                                  payload):"},{"line_number":886,"context_line":"        self.has_been_called \u003d True"},{"line_number":887,"context_line":""},{"line_number":888,"context_line":"    def _project_created_callback(self, service, resource_type, operation,"},{"line_number":889,"context_line":"                                  payload):"},{"line_number":890,"context_line":"        self.has_been_called \u003d True"},{"line_number":891,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"5aef4532_bc6b1484","side":"PARENT","line":888,"in_reply_to":"5aef4532_41a4a906","updated":"2016-03-10 19:16:16.000000000","message":"Yep, good call. Done in latest.","commit_id":"e2ee0641922c46c5cd5f9b541865f45b63d7b78d"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"b611f679fe0ca95324423e426b1cfb044857665d","unresolved":false,"context_lines":[{"line_number":885,"context_line":""},{"line_number":886,"context_line":"    def setUp(self):"},{"line_number":887,"context_line":"        super(TestEventCallbacks, self).setUp()"},{"line_number":888,"context_line":"        self.has_been_called \u003d False"},{"line_number":889,"context_line":""},{"line_number":890,"context_line":"    def test_notification_received(self):"},{"line_number":891,"context_line":"        callback \u003d register_callback(CREATED_OPERATION, \u0027project\u0027)"}],"source_content_type":"text/x-python","patch_set":3,"id":"5aef4532_7d8d05d2","line":888,"updated":"2016-03-10 20:57:02.000000000","message":"has_been_called is no longer used so remove it... apparently it wasn\u0027t checked anyways.","commit_id":"0d76172b768899720d462d769a3c39388066add4"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"de9555df4a5080ab359f3b4673f6c83a3c1971ee","unresolved":false,"context_lines":[{"line_number":885,"context_line":""},{"line_number":886,"context_line":"    def setUp(self):"},{"line_number":887,"context_line":"        super(TestEventCallbacks, self).setUp()"},{"line_number":888,"context_line":"        self.has_been_called \u003d False"},{"line_number":889,"context_line":""},{"line_number":890,"context_line":"    def test_notification_received(self):"},{"line_number":891,"context_line":"        callback \u003d register_callback(CREATED_OPERATION, \u0027project\u0027)"}],"source_content_type":"text/x-python","patch_set":4,"id":"3afc51ec_60d08e54","line":888,"updated":"2016-03-11 21:29:30.000000000","message":"has_been_called is no longer referenced so remove it... apparently it wasn\u0027t checked anyways.","commit_id":"0939073b21e58f0b66b9d8f3c978181853fa7006"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"1a6b22b48ecf175187c1a224d564879607ca4226","unresolved":false,"context_lines":[{"line_number":885,"context_line":""},{"line_number":886,"context_line":"    def setUp(self):"},{"line_number":887,"context_line":"        super(TestEventCallbacks, self).setUp()"},{"line_number":888,"context_line":"        self.has_been_called \u003d False"},{"line_number":889,"context_line":""},{"line_number":890,"context_line":"    def test_notification_received(self):"},{"line_number":891,"context_line":"        callback \u003d register_callback(CREATED_OPERATION, \u0027project\u0027)"}],"source_content_type":"text/x-python","patch_set":4,"id":"1af94dfe_98c9927b","line":888,"in_reply_to":"3afc51ec_60d08e54","updated":"2016-03-16 18:39:39.000000000","message":"Done. Good catch.","commit_id":"0939073b21e58f0b66b9d8f3c978181853fa7006"},{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"09747957107df301b6ef2c53434a0f5485c6163e","unresolved":false,"context_lines":[{"line_number":984,"context_line":"        self.assertRaises(AttributeError, Foo)"},{"line_number":985,"context_line":""},{"line_number":986,"context_line":"    def test_using_an_unbound_method_as_a_callback_fails(self):"},{"line_number":987,"context_line":"        # NOTE(dstanek): An unbound method is when you reference a method"},{"line_number":988,"context_line":"        # from a class object. You\u0027ll get a method that isn\u0027t bound to a"},{"line_number":989,"context_line":"        # particular instance so there is no magic \u0027self\u0027. You can call it,"},{"line_number":990,"context_line":"        # but you have to pass in the instance manually like: C.m(C())."},{"line_number":991,"context_line":"        # If you reference the method from an instance then you get a method"},{"line_number":992,"context_line":"        # that effectively curries the self argument for you"},{"line_number":993,"context_line":"        # (think functools.partial). Obviously is we don\u0027t have an"},{"line_number":994,"context_line":"        # instance then we can\u0027t call the method."},{"line_number":995,"context_line":"        @notifications.listener"},{"line_number":996,"context_line":"        class Foo(object):"},{"line_number":997,"context_line":"            def __init__(self):"}],"source_content_type":"text/x-python","patch_set":4,"id":"3afc51ec_83268e14","line":994,"range":{"start_line":987,"start_character":8,"end_line":994,"end_character":49},"updated":"2016-03-11 17:47:29.000000000","message":"is this comment still valid ?","commit_id":"0939073b21e58f0b66b9d8f3c978181853fa7006"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"1a6b22b48ecf175187c1a224d564879607ca4226","unresolved":false,"context_lines":[{"line_number":984,"context_line":"        self.assertRaises(AttributeError, Foo)"},{"line_number":985,"context_line":""},{"line_number":986,"context_line":"    def test_using_an_unbound_method_as_a_callback_fails(self):"},{"line_number":987,"context_line":"        # NOTE(dstanek): An unbound method is when you reference a method"},{"line_number":988,"context_line":"        # from a class object. You\u0027ll get a method that isn\u0027t bound to a"},{"line_number":989,"context_line":"        # particular instance so there is no magic \u0027self\u0027. You can call it,"},{"line_number":990,"context_line":"        # but you have to pass in the instance manually like: C.m(C())."},{"line_number":991,"context_line":"        # If you reference the method from an instance then you get a method"},{"line_number":992,"context_line":"        # that effectively curries the self argument for you"},{"line_number":993,"context_line":"        # (think functools.partial). Obviously is we don\u0027t have an"},{"line_number":994,"context_line":"        # instance then we can\u0027t call the method."},{"line_number":995,"context_line":"        @notifications.listener"},{"line_number":996,"context_line":"        class Foo(object):"},{"line_number":997,"context_line":"            def __init__(self):"}],"source_content_type":"text/x-python","patch_set":4,"id":"1af94dfe_9391759c","line":994,"range":{"start_line":987,"start_character":8,"end_line":994,"end_character":49},"in_reply_to":"3afc51ec_83268e14","updated":"2016-03-16 18:39:39.000000000","message":"Yes, it\u0027s just describing what an unbound method is.","commit_id":"0939073b21e58f0b66b9d8f3c978181853fa7006"}]}
