)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"5676a7effd4e78712d21c132d67a7cf6db6cd978","unresolved":false,"context_lines":[{"line_number":7,"context_line":"Return `revoked_at` for list revoke events"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"The field will help to figure out when the event is recorded, and thus"},{"line_number":10,"context_line":"give clue on when the revocation was been done."},{"line_number":11,"context_line":""},{"line_number":12,"context_line":"Change-Id: If5ba3bb9b68fff5f35be2b57af15584d69c6df8d"},{"line_number":13,"context_line":"Closes-Bug: #1598040"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":4,"id":"1aa78d24_f74c5e78","line":10,"range":{"start_line":10,"start_character":0,"end_line":10,"end_character":4},"updated":"2016-07-03 15:16:40.000000000","message":"\"give a\"","commit_id":"d3745677472059d685d21a789bbea159cc7476a6"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"5676a7effd4e78712d21c132d67a7cf6db6cd978","unresolved":false,"context_lines":[{"line_number":7,"context_line":"Return `revoked_at` for list revoke events"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"The field will help to figure out when the event is recorded, and thus"},{"line_number":10,"context_line":"give clue on when the revocation was been done."},{"line_number":11,"context_line":""},{"line_number":12,"context_line":"Change-Id: If5ba3bb9b68fff5f35be2b57af15584d69c6df8d"},{"line_number":13,"context_line":"Closes-Bug: #1598040"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":4,"id":"1aa78d24_97319aef","line":10,"range":{"start_line":10,"start_character":37,"end_line":10,"end_character":41},"updated":"2016-07-03 15:16:40.000000000","message":"remove \"been\" ?","commit_id":"d3745677472059d685d21a789bbea159cc7476a6"},{"author":{"_account_id":13063,"name":"WEI CHEN","email":"dave.jungler@gmail.com","username":"wei.d.chen"},"change_message_id":"e0332d10c87206d897e58a5e2622176f1dfe2fae","unresolved":false,"context_lines":[{"line_number":7,"context_line":"Return `revoked_at` for list revoke events"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"The field will help to figure out when the event is recorded, and thus"},{"line_number":10,"context_line":"give clue on when the revocation was been done."},{"line_number":11,"context_line":""},{"line_number":12,"context_line":"Change-Id: If5ba3bb9b68fff5f35be2b57af15584d69c6df8d"},{"line_number":13,"context_line":"Closes-Bug: #1598040"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":4,"id":"1aa78d24_294dea72","line":10,"range":{"start_line":10,"start_character":37,"end_line":10,"end_character":41},"in_reply_to":"1aa78d24_97319aef","updated":"2016-07-04 00:27:11.000000000","message":"Done","commit_id":"d3745677472059d685d21a789bbea159cc7476a6"},{"author":{"_account_id":13063,"name":"WEI CHEN","email":"dave.jungler@gmail.com","username":"wei.d.chen"},"change_message_id":"e0332d10c87206d897e58a5e2622176f1dfe2fae","unresolved":false,"context_lines":[{"line_number":7,"context_line":"Return `revoked_at` for list revoke events"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"The field will help to figure out when the event is recorded, and thus"},{"line_number":10,"context_line":"give clue on when the revocation was been done."},{"line_number":11,"context_line":""},{"line_number":12,"context_line":"Change-Id: If5ba3bb9b68fff5f35be2b57af15584d69c6df8d"},{"line_number":13,"context_line":"Closes-Bug: #1598040"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":4,"id":"1aa78d24_495cb625","line":10,"range":{"start_line":10,"start_character":0,"end_line":10,"end_character":4},"in_reply_to":"1aa78d24_f74c5e78","updated":"2016-07-04 00:27:11.000000000","message":"Done","commit_id":"d3745677472059d685d21a789bbea159cc7476a6"}],"keystone/tests/unit/test_v3_os_revoke.py":[{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"cfcfaa981645d10d940c990297099835d4c0951c","unresolved":false,"context_lines":[{"line_number":142,"context_line":"        resp \u003d self.get(\u0027/OS-REVOKE/events\u0027)"},{"line_number":143,"context_line":"        events \u003d resp.json_body[\u0027events\u0027]"},{"line_number":144,"context_line":"        self.assertEqual(1, len(events))"},{"line_number":145,"context_line":"        self.assertIn(\u0027revoked_at\u0027, events[0])"}],"source_content_type":"text/x-python","patch_set":2,"id":"1aa78d24_0df3e80b","line":145,"range":{"start_line":145,"start_character":8,"end_line":145,"end_character":46},"updated":"2016-07-02 12:57:28.000000000","message":"anyway we could use assertTimeStampEqual here: https://github.com/openstack/keystone/blob/d9c6b50a3ae514e640fa13a344e59fe3649ee0ef/keystone/tests/unit/test_v3_auth.py#L248\n\nand match up the two revoked_at values","commit_id":"67d9d81a971d063ed2f2759b1781e2a2a3e3d8f9"},{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"8646981d5aeeaa21e0a9f79a9200fd99e45eedd5","unresolved":false,"context_lines":[{"line_number":141,"context_line":""},{"line_number":142,"context_line":"        resp \u003d self.get(\u0027/OS-REVOKE/events\u0027)"},{"line_number":143,"context_line":"        events \u003d resp.json_body[\u0027events\u0027]"},{"line_number":144,"context_line":"        self.assertEqual(1, len(events))"},{"line_number":145,"context_line":"        self.assertIn(\u0027revoked_at\u0027, events[0])"}],"source_content_type":"text/x-python","patch_set":2,"id":"1aa78d24_79a7ca4f","line":145,"range":{"start_line":144,"start_character":7,"end_line":145,"end_character":46},"updated":"2016-07-02 21:54:06.000000000","message":"assertItemsEqual could replace these 2 calls","commit_id":"67d9d81a971d063ed2f2759b1781e2a2a3e3d8f9"},{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"8646981d5aeeaa21e0a9f79a9200fd99e45eedd5","unresolved":false,"context_lines":[{"line_number":142,"context_line":"        resp \u003d self.get(\u0027/OS-REVOKE/events\u0027)"},{"line_number":143,"context_line":"        events \u003d resp.json_body[\u0027events\u0027]"},{"line_number":144,"context_line":"        self.assertEqual(1, len(events))"},{"line_number":145,"context_line":"        self.assertIn(\u0027revoked_at\u0027, events[0])"}],"source_content_type":"text/x-python","patch_set":2,"id":"1aa78d24_d9623e16","line":145,"range":{"start_line":145,"start_character":8,"end_line":145,"end_character":46},"in_reply_to":"1aa78d24_0df3e80b","updated":"2016-07-02 21:54:06.000000000","message":"++","commit_id":"67d9d81a971d063ed2f2759b1781e2a2a3e3d8f9"},{"author":{"_account_id":13063,"name":"WEI CHEN","email":"dave.jungler@gmail.com","username":"wei.d.chen"},"change_message_id":"28e7f52b6d78681973ca8e745e23f419cffa7116","unresolved":false,"context_lines":[{"line_number":142,"context_line":"        resp \u003d self.get(\u0027/OS-REVOKE/events\u0027)"},{"line_number":143,"context_line":"        events \u003d resp.json_body[\u0027events\u0027]"},{"line_number":144,"context_line":"        self.assertEqual(1, len(events))"},{"line_number":145,"context_line":"        self.assertIn(\u0027revoked_at\u0027, events[0])"}],"source_content_type":"text/x-python","patch_set":2,"id":"1aa78d24_a62c6eac","line":145,"range":{"start_line":145,"start_character":8,"end_line":145,"end_character":46},"in_reply_to":"1aa78d24_d9623e16","updated":"2016-07-03 09:44:33.000000000","message":"Good point, thanks Steve \u0026 Samuel.","commit_id":"67d9d81a971d063ed2f2759b1781e2a2a3e3d8f9"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"5676a7effd4e78712d21c132d67a7cf6db6cd978","unresolved":false,"context_lines":[{"line_number":38,"context_line":"        },"},{"line_number":39,"context_line":"    }"},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"    # FIXME (davechen): This method is copied from `keystone.tests.unit."},{"line_number":42,"context_line":"    # test_v3_auth.TokenAPITests`, move this method into utils.py to avoid"},{"line_number":43,"context_line":"    # the duplication?"},{"line_number":44,"context_line":"    def assertTimestampEqual(self, expected, value):"}],"source_content_type":"text/x-python","patch_set":4,"id":"1aa78d24_3720a69b","line":41,"range":{"start_line":41,"start_character":6,"end_line":41,"end_character":11},"updated":"2016-07-03 15:16:40.000000000","message":"probably better say TODO here....FIXME tends to imply you need to fix it really urgently","commit_id":"d3745677472059d685d21a789bbea159cc7476a6"},{"author":{"_account_id":13063,"name":"WEI CHEN","email":"dave.jungler@gmail.com","username":"wei.d.chen"},"change_message_id":"e0332d10c87206d897e58a5e2622176f1dfe2fae","unresolved":false,"context_lines":[{"line_number":38,"context_line":"        },"},{"line_number":39,"context_line":"    }"},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"    # FIXME (davechen): This method is copied from `keystone.tests.unit."},{"line_number":42,"context_line":"    # test_v3_auth.TokenAPITests`, move this method into utils.py to avoid"},{"line_number":43,"context_line":"    # the duplication?"},{"line_number":44,"context_line":"    def assertTimestampEqual(self, expected, value):"}],"source_content_type":"text/x-python","patch_set":4,"id":"1aa78d24_89105e50","line":41,"range":{"start_line":41,"start_character":6,"end_line":41,"end_character":11},"in_reply_to":"1aa78d24_3720a69b","updated":"2016-07-04 00:27:11.000000000","message":"Done","commit_id":"d3745677472059d685d21a789bbea159cc7476a6"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"43f60479eaa9036ba167f05d7c8c72fca5c50ef9","unresolved":false,"context_lines":[{"line_number":39,"context_line":"    }"},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"    # FIXME (davechen): This method is copied from `keystone.tests.unit."},{"line_number":42,"context_line":"    # test_v3_auth.TokenAPITests`, move this method into utils.py to avoid"},{"line_number":43,"context_line":"    # the duplication?"},{"line_number":44,"context_line":"    def assertTimestampEqual(self, expected, value):"},{"line_number":45,"context_line":"        # Compare two timestamps but ignore the microseconds part"}],"source_content_type":"text/x-python","patch_set":4,"id":"1aa78d24_ac628dd6","line":42,"range":{"start_line":42,"start_character":35,"end_line":42,"end_character":65},"updated":"2016-07-03 13:07:53.000000000","message":"definitely","commit_id":"d3745677472059d685d21a789bbea159cc7476a6"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"3419aca500e8f1e87b7e2aa078fa845c8d5c5d3c","unresolved":false,"context_lines":[{"line_number":148,"context_line":"        self.assertEqual([], events)"},{"line_number":149,"context_line":""},{"line_number":150,"context_line":"    def test_revoked_at_in_list(self):"},{"line_number":151,"context_line":"        revoked_at \u003d timeutils.utcnow()"},{"line_number":152,"context_line":"        # Given or not, `revoked_at` will always be set in the backend."},{"line_number":153,"context_line":"        self.revoke_api.revoke("},{"line_number":154,"context_line":"            revoke_model.RevokeEvent(revoked_at\u003drevoked_at))"}],"source_content_type":"text/x-python","patch_set":5,"id":"1aa78d24_2e267eba","line":151,"updated":"2016-07-04 10:25:25.000000000","message":"I *think* this test can cause some intermittent failures due seconds comparison, we can\u0027t be sure both \"revoked_at\" and the revoke event will be *always* within the same second. Or is there any mechanism to make this will happen?","commit_id":"25e5227d23d7b8e1b2969a6b7dd6da4fe50972a4"},{"author":{"_account_id":13063,"name":"WEI CHEN","email":"dave.jungler@gmail.com","username":"wei.d.chen"},"change_message_id":"27d4230b1e3fadbec88441d142713938847b020d","unresolved":false,"context_lines":[{"line_number":148,"context_line":"        self.assertEqual([], events)"},{"line_number":149,"context_line":""},{"line_number":150,"context_line":"    def test_revoked_at_in_list(self):"},{"line_number":151,"context_line":"        revoked_at \u003d timeutils.utcnow()"},{"line_number":152,"context_line":"        # Given or not, `revoked_at` will always be set in the backend."},{"line_number":153,"context_line":"        self.revoke_api.revoke("},{"line_number":154,"context_line":"            revoke_model.RevokeEvent(revoked_at\u003drevoked_at))"}],"source_content_type":"text/x-python","patch_set":5,"id":"1aa78d24_8f97908f","line":151,"in_reply_to":"1aa78d24_2d0156af","updated":"2016-07-05 02:29:05.000000000","message":"@Rodrigo, the fact is not just the second but also the *microseconds* should be exactly the same since it has been set explicitly in L154 (this doesn\u0027t mean it must be set just for sake of a easier test), assertTimestampEqual is used here to ignore *microseconds* since it maybe deliberately abandoned in the future.","commit_id":"25e5227d23d7b8e1b2969a6b7dd6da4fe50972a4"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"e55347325d9d5c63de4c9cf51caf6adaa5784fe0","unresolved":false,"context_lines":[{"line_number":148,"context_line":"        self.assertEqual([], events)"},{"line_number":149,"context_line":""},{"line_number":150,"context_line":"    def test_revoked_at_in_list(self):"},{"line_number":151,"context_line":"        revoked_at \u003d timeutils.utcnow()"},{"line_number":152,"context_line":"        # Given or not, `revoked_at` will always be set in the backend."},{"line_number":153,"context_line":"        self.revoke_api.revoke("},{"line_number":154,"context_line":"            revoke_model.RevokeEvent(revoked_at\u003drevoked_at))"}],"source_content_type":"text/x-python","patch_set":5,"id":"1aa78d24_8ef5f284","line":151,"in_reply_to":"1aa78d24_2e267eba","updated":"2016-07-04 10:38:53.000000000","message":"to make sure this will happen*","commit_id":"25e5227d23d7b8e1b2969a6b7dd6da4fe50972a4"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"6d0f158f286ac5944f6a6ae0046ebf1406ef3da5","unresolved":false,"context_lines":[{"line_number":148,"context_line":"        self.assertEqual([], events)"},{"line_number":149,"context_line":""},{"line_number":150,"context_line":"    def test_revoked_at_in_list(self):"},{"line_number":151,"context_line":"        revoked_at \u003d timeutils.utcnow()"},{"line_number":152,"context_line":"        # Given or not, `revoked_at` will always be set in the backend."},{"line_number":153,"context_line":"        self.revoke_api.revoke("},{"line_number":154,"context_line":"            revoke_model.RevokeEvent(revoked_at\u003drevoked_at))"}],"source_content_type":"text/x-python","patch_set":5,"id":"1aa78d24_2d0156af","line":151,"in_reply_to":"1aa78d24_8ef5f284","updated":"2016-07-04 15:05:30.000000000","message":"I think the same second is pretty safe it\u0027s something we already do in our tests: (https://github.com/openstack/keystone/blob/d9c6b50a3ae514e640fa13a344e59fe3649ee0ef/keystone/tests/unit/test_v3_auth.py#L1242-L1260)","commit_id":"25e5227d23d7b8e1b2969a6b7dd6da4fe50972a4"}]}
