)]}'
{"keystone/contrib/revoke/backends/sql.py":[{"author":{"_account_id":16523,"name":"ZhangLei","display_name":"ZhangLei","email":"zhang.lei@99cloud.net","username":"zhang.lei"},"change_message_id":"1016d677bfcc90cc4842cdae574f9ca9d756e429","unresolved":false,"context_lines":[{"line_number":108,"context_line":"    def check_max_entry(self):"},{"line_number":109,"context_line":"        session \u003d sql.get_session()"},{"line_number":110,"context_line":"        query \u003d session.query(func.max(RevocationEvent.revoked_at)"},{"line_number":111,"context_line":"                              .label(\"revoked_at\"))"},{"line_number":112,"context_line":"        result \u003d query.one()"},{"line_number":113,"context_line":"        max_revoked_at \u003d result.revoked_at"},{"line_number":114,"context_line":"        return max_revoked_at"}],"source_content_type":"text/x-python","patch_set":2,"id":"7a2fa921_e0232ba6","line":111,"updated":"2015-10-12 08:10:43.000000000","message":"i think it\u0027s better with:\n\n        query \u003d session.query(func.max(RevocationEvent.revoked_at).\n                              label(\"revoked_at\"))","commit_id":"094851080e6aac2bb1daede5351b89d6846a2139"},{"author":{"_account_id":18618,"name":"Sonali Pitre","email":"sonali.pitre@in.ibm.com","username":"Sonali"},"change_message_id":"9b95cc052425ba943b5378dbb6bfa8f932fd8cda","unresolved":false,"context_lines":[{"line_number":108,"context_line":"    def check_max_entry(self):"},{"line_number":109,"context_line":"        session \u003d sql.get_session()"},{"line_number":110,"context_line":"        query \u003d session.query(func.max(RevocationEvent.revoked_at)"},{"line_number":111,"context_line":"                              .label(\"revoked_at\"))"},{"line_number":112,"context_line":"        result \u003d query.one()"},{"line_number":113,"context_line":"        max_revoked_at \u003d result.revoked_at"},{"line_number":114,"context_line":"        return max_revoked_at"}],"source_content_type":"text/x-python","patch_set":2,"id":"5a2ca52d_1e656c44","line":111,"in_reply_to":"7a2fa921_e0232ba6","updated":"2015-10-13 12:24:49.000000000","message":"Done","commit_id":"094851080e6aac2bb1daede5351b89d6846a2139"},{"author":{"_account_id":16523,"name":"ZhangLei","display_name":"ZhangLei","email":"zhang.lei@99cloud.net","username":"zhang.lei"},"change_message_id":"1016d677bfcc90cc4842cdae574f9ca9d756e429","unresolved":false,"context_lines":[{"line_number":111,"context_line":"                              .label(\"revoked_at\"))"},{"line_number":112,"context_line":"        result \u003d query.one()"},{"line_number":113,"context_line":"        max_revoked_at \u003d result.revoked_at"},{"line_number":114,"context_line":"        return max_revoked_at"}],"source_content_type":"text/x-python","patch_set":2,"id":"7a2fa921_5d8f6ccc","line":114,"updated":"2015-10-12 08:10:43.000000000","message":"Please add a newline at end of file\n\nwhen i run \u0027tox -e pep8\u0027, it will report \"W292 no newline at end of file\"\n\nhttp://pep8.readthedocs.org/en/latest/intro.html\nhttps://github.com/PyCQA/pep8/commit/588f1f49eb0567006564451923c439f77d33ff7e","commit_id":"094851080e6aac2bb1daede5351b89d6846a2139"},{"author":{"_account_id":18618,"name":"Sonali Pitre","email":"sonali.pitre@in.ibm.com","username":"Sonali"},"change_message_id":"9b95cc052425ba943b5378dbb6bfa8f932fd8cda","unresolved":false,"context_lines":[{"line_number":111,"context_line":"                              .label(\"revoked_at\"))"},{"line_number":112,"context_line":"        result \u003d query.one()"},{"line_number":113,"context_line":"        max_revoked_at \u003d result.revoked_at"},{"line_number":114,"context_line":"        return max_revoked_at"}],"source_content_type":"text/x-python","patch_set":2,"id":"5a2ca52d_9e865cb8","line":114,"in_reply_to":"7a2fa921_5d8f6ccc","updated":"2015-10-13 12:24:49.000000000","message":"I see this warning message if I put the newline at the end -\nW391 blank line at end of file\n\nBut the test passes if there is no new line at the end. Also, I observer there are no new lines at the end of other files.","commit_id":"094851080e6aac2bb1daede5351b89d6846a2139"},{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"8dd800c485af540a012dbfe1276580c7889bc44a","unresolved":false,"context_lines":[{"line_number":111,"context_line":"                              label(\"revoked_at\"))"},{"line_number":112,"context_line":"        result \u003d query.one()"},{"line_number":113,"context_line":"        max_revoked_at \u003d result.revoked_at"},{"line_number":114,"context_line":"        return max_revoked_at"}],"source_content_type":"text/x-python","patch_set":3,"id":"9a8ffd7b_964997b9","line":114,"updated":"2015-11-27 11:52:13.000000000","message":"Just \u0027return result.revoked_at\u0027 would be fine too","commit_id":"64d43712aab6929fea9899000de7f58b71d2b886"}],"keystone/contrib/revoke/core.py":[{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"c7729f42745b8021f294b3a9b0a65ef306189e9a","unresolved":false,"context_lines":[{"line_number":77,"context_line":""},{"line_number":78,"context_line":"    driver_namespace \u003d \u0027keystone.revoke\u0027"},{"line_number":79,"context_line":"    revoke_tree \u003d None"},{"line_number":80,"context_line":"    last_fetch \u003d datetime.datetime(0o0001, 0o1, 0o1, 0, 0, 0)"},{"line_number":81,"context_line":""},{"line_number":82,"context_line":"    def __init__(self):"},{"line_number":83,"context_line":"        super(Manager, self).__init__(CONF.revoke.driver)"}],"source_content_type":"text/x-python","patch_set":1,"id":"7a2fa921_726ae682","line":80,"updated":"2015-10-08 21:28:07.000000000","message":"we should add a comment here just explain the time that we are using.","commit_id":"5b06b963cf12c5bc3c1e1eaa8eb247448e81b316"},{"author":{"_account_id":18618,"name":"Sonali Pitre","email":"sonali.pitre@in.ibm.com","username":"Sonali"},"change_message_id":"6427c94cd19667678e71c4d3f872164ee6ad61a8","unresolved":false,"context_lines":[{"line_number":77,"context_line":""},{"line_number":78,"context_line":"    driver_namespace \u003d \u0027keystone.revoke\u0027"},{"line_number":79,"context_line":"    revoke_tree \u003d None"},{"line_number":80,"context_line":"    last_fetch \u003d datetime.datetime(0o0001, 0o1, 0o1, 0, 0, 0)"},{"line_number":81,"context_line":""},{"line_number":82,"context_line":"    def __init__(self):"},{"line_number":83,"context_line":"        super(Manager, self).__init__(CONF.revoke.driver)"}],"source_content_type":"text/x-python","patch_set":1,"id":"7a2fa921_9a5a22f1","line":80,"in_reply_to":"7a2fa921_44491d5f","updated":"2015-10-09 11:29:55.000000000","message":"Done","commit_id":"5b06b963cf12c5bc3c1e1eaa8eb247448e81b316"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"48e73170f0d2f88a97eeb651f95793ade1f299ef","unresolved":false,"context_lines":[{"line_number":77,"context_line":""},{"line_number":78,"context_line":"    driver_namespace \u003d \u0027keystone.revoke\u0027"},{"line_number":79,"context_line":"    revoke_tree \u003d None"},{"line_number":80,"context_line":"    last_fetch \u003d datetime.datetime(0o0001, 0o1, 0o1, 0, 0, 0)"},{"line_number":81,"context_line":""},{"line_number":82,"context_line":"    def __init__(self):"},{"line_number":83,"context_line":"        super(Manager, self).__init__(CONF.revoke.driver)"}],"source_content_type":"text/x-python","patch_set":1,"id":"7a2fa921_44491d5f","line":80,"in_reply_to":"7a2fa921_726ae682","updated":"2015-10-09 03:01:13.000000000","message":"++ add a comment here, it\u0027s a bit cryptic","commit_id":"5b06b963cf12c5bc3c1e1eaa8eb247448e81b316"},{"author":{"_account_id":18618,"name":"Sonali Pitre","email":"sonali.pitre@in.ibm.com","username":"Sonali"},"change_message_id":"6427c94cd19667678e71c4d3f872164ee6ad61a8","unresolved":false,"context_lines":[{"line_number":77,"context_line":""},{"line_number":78,"context_line":"    driver_namespace \u003d \u0027keystone.revoke\u0027"},{"line_number":79,"context_line":"    revoke_tree \u003d None"},{"line_number":80,"context_line":"    last_fetch \u003d datetime.datetime(0o0001, 0o1, 0o1, 0, 0, 0)"},{"line_number":81,"context_line":""},{"line_number":82,"context_line":"    def __init__(self):"},{"line_number":83,"context_line":"        super(Manager, self).__init__(CONF.revoke.driver)"}],"source_content_type":"text/x-python","patch_set":1,"id":"7a2fa921_ba611eab","line":80,"in_reply_to":"7a2fa921_726ae682","updated":"2015-10-09 11:29:55.000000000","message":"Done","commit_id":"5b06b963cf12c5bc3c1e1eaa8eb247448e81b316"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"c7729f42745b8021f294b3a9b0a65ef306189e9a","unresolved":false,"context_lines":[{"line_number":210,"context_line":""},{"line_number":211,"context_line":"    def _get_revoke_tree(self):"},{"line_number":212,"context_line":"        max_revoked_at \u003d None"},{"line_number":213,"context_line":"        if Manager.revoke_tree is not None:"},{"line_number":214,"context_line":"            max_revoked_at \u003d self.driver.check_max_entry()"},{"line_number":215,"context_line":"        if Manager.revoke_tree is None or (max_revoked_at is None or"},{"line_number":216,"context_line":"                                           max_revoked_at \u003e"}],"source_content_type":"text/x-python","patch_set":1,"id":"7a2fa921_b222be50","line":213,"updated":"2015-10-08 21:28:07.000000000","message":"i think we could use something like: \n\n    if self.revoke_tree \n\ninstead of using: \n\n    if Manager.revoke_tree","commit_id":"5b06b963cf12c5bc3c1e1eaa8eb247448e81b316"},{"author":{"_account_id":18618,"name":"Sonali Pitre","email":"sonali.pitre@in.ibm.com","username":"Sonali"},"change_message_id":"6427c94cd19667678e71c4d3f872164ee6ad61a8","unresolved":false,"context_lines":[{"line_number":210,"context_line":""},{"line_number":211,"context_line":"    def _get_revoke_tree(self):"},{"line_number":212,"context_line":"        max_revoked_at \u003d None"},{"line_number":213,"context_line":"        if Manager.revoke_tree is not None:"},{"line_number":214,"context_line":"            max_revoked_at \u003d self.driver.check_max_entry()"},{"line_number":215,"context_line":"        if Manager.revoke_tree is None or (max_revoked_at is None or"},{"line_number":216,"context_line":"                                           max_revoked_at \u003e"}],"source_content_type":"text/x-python","patch_set":1,"id":"7a2fa921_fa6b1683","line":213,"in_reply_to":"7a2fa921_b222be50","updated":"2015-10-09 11:29:55.000000000","message":"Done","commit_id":"5b06b963cf12c5bc3c1e1eaa8eb247448e81b316"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"c7729f42745b8021f294b3a9b0a65ef306189e9a","unresolved":false,"context_lines":[{"line_number":214,"context_line":"            max_revoked_at \u003d self.driver.check_max_entry()"},{"line_number":215,"context_line":"        if Manager.revoke_tree is None or (max_revoked_at is None or"},{"line_number":216,"context_line":"                                           max_revoked_at \u003e"},{"line_number":217,"context_line":"                                           Manager.last_fetch):"},{"line_number":218,"context_line":"            events \u003d self.driver.list_events()"},{"line_number":219,"context_line":"            Manager.revoke_tree \u003d model.RevokeTree(revoke_events\u003devents)"},{"line_number":220,"context_line":"            if max_revoked_at is not None:"}],"source_content_type":"text/x-python","patch_set":1,"id":"7a2fa921_32bc6edb","line":217,"updated":"2015-10-08 21:28:07.000000000","message":"in this if statement, what are we looking for? would we be able to add a comment to clarify what we\u0027re doing?","commit_id":"5b06b963cf12c5bc3c1e1eaa8eb247448e81b316"},{"author":{"_account_id":18618,"name":"Sonali Pitre","email":"sonali.pitre@in.ibm.com","username":"Sonali"},"change_message_id":"6427c94cd19667678e71c4d3f872164ee6ad61a8","unresolved":false,"context_lines":[{"line_number":214,"context_line":"            max_revoked_at \u003d self.driver.check_max_entry()"},{"line_number":215,"context_line":"        if Manager.revoke_tree is None or (max_revoked_at is None or"},{"line_number":216,"context_line":"                                           max_revoked_at \u003e"},{"line_number":217,"context_line":"                                           Manager.last_fetch):"},{"line_number":218,"context_line":"            events \u003d self.driver.list_events()"},{"line_number":219,"context_line":"            Manager.revoke_tree \u003d model.RevokeTree(revoke_events\u003devents)"},{"line_number":220,"context_line":"            if max_revoked_at is not None:"}],"source_content_type":"text/x-python","patch_set":1,"id":"7a2fa921_bcb35b4c","line":217,"in_reply_to":"7a2fa921_32bc6edb","updated":"2015-10-09 11:29:55.000000000","message":"We\u0027re rebuilding the tree only if \n1. the tree does not exist already\n2. or max_revoked_at value is empty\n3. or there is a new entry in revocation_event (ensured by checking if max_revoked_at \u003e last_fetch)\n\n1st and 3rd cases are self-explanatory. Explanation of 2nd case:\nmax_revoked_at contains the \u0027revoked_at\u0027 value of the last token, returned by  check_max_entry() module in sql.\nWhile building the tree, the revocation_event table objects returned by sql, are converted into dict objects. This conversion is the real culprit in performance, which we need to avoid. Other drivers like kvs do not carry the dict object conversions and hence do not affect the performance. In that case, we don\u0027t check for max_revoked_at value and rebuild the tree each time. The check_max_entry() module in other driver like kvs thus returns None.\n\nPlease let us know if we should add this explanation in the code.","commit_id":"5b06b963cf12c5bc3c1e1eaa8eb247448e81b316"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"48e73170f0d2f88a97eeb651f95793ade1f299ef","unresolved":false,"context_lines":[{"line_number":222,"context_line":"        return Manager.revoke_tree"},{"line_number":223,"context_line":""},{"line_number":224,"context_line":"    def invalidate_tree(self):"},{"line_number":225,"context_line":"        Manager.revoke_tree \u003d None"},{"line_number":226,"context_line":""},{"line_number":227,"context_line":"    def check_token(self, token_values):"},{"line_number":228,"context_line":"        \"\"\"Checks the values from a token against the revocation list"}],"source_content_type":"text/x-python","patch_set":1,"id":"7a2fa921_84b17549","line":225,"updated":"2015-10-09 03:01:13.000000000","message":"same comment as lance, use\n\n  self.revoke_tree \u003d None","commit_id":"5b06b963cf12c5bc3c1e1eaa8eb247448e81b316"},{"author":{"_account_id":18618,"name":"Sonali Pitre","email":"sonali.pitre@in.ibm.com","username":"Sonali"},"change_message_id":"6427c94cd19667678e71c4d3f872164ee6ad61a8","unresolved":false,"context_lines":[{"line_number":222,"context_line":"        return Manager.revoke_tree"},{"line_number":223,"context_line":""},{"line_number":224,"context_line":"    def invalidate_tree(self):"},{"line_number":225,"context_line":"        Manager.revoke_tree \u003d None"},{"line_number":226,"context_line":""},{"line_number":227,"context_line":"    def check_token(self, token_values):"},{"line_number":228,"context_line":"        \"\"\"Checks the values from a token against the revocation list"}],"source_content_type":"text/x-python","patch_set":1,"id":"7a2fa921_1c7b6f7c","line":225,"in_reply_to":"7a2fa921_84b17549","updated":"2015-10-09 11:29:55.000000000","message":"Done","commit_id":"5b06b963cf12c5bc3c1e1eaa8eb247448e81b316"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"512e64629a31a7c7c1a8053ff1555d8a0f6a18bc","unresolved":false,"context_lines":[{"line_number":212,"context_line":"    def revoke_by_domain_role_assignment(self, domain_id, role_id):"},{"line_number":213,"context_line":"        self.revoke(model.RevokeEvent(domain_id\u003ddomain_id, role_id\u003drole_id))"},{"line_number":214,"context_line":""},{"line_number":215,"context_line":"    def _get_revoke_tree(self):"},{"line_number":216,"context_line":"        max_revoked_at \u003d None"},{"line_number":217,"context_line":"        if self.revoke_tree is not None:"},{"line_number":218,"context_line":"            max_revoked_at \u003d self.driver.check_max_entry()"}],"source_content_type":"text/x-python","patch_set":2,"id":"7a2fa921_a96bf71c","line":215,"updated":"2015-10-10 04:17:50.000000000","message":"this function should really have a docstring that explains what is going on, it\u0027s not the easiest to follow\n\nAFAICT: if the tree has been initialized already, then just grab the time of the latest revoked event.\n\nif the tree or max_revoke is uninitialized, create the tree. also create the tree if latest revoked_event is \u003e last fetch","commit_id":"094851080e6aac2bb1daede5351b89d6846a2139"},{"author":{"_account_id":18618,"name":"Sonali Pitre","email":"sonali.pitre@in.ibm.com","username":"Sonali"},"change_message_id":"9b95cc052425ba943b5378dbb6bfa8f932fd8cda","unresolved":false,"context_lines":[{"line_number":212,"context_line":"    def revoke_by_domain_role_assignment(self, domain_id, role_id):"},{"line_number":213,"context_line":"        self.revoke(model.RevokeEvent(domain_id\u003ddomain_id, role_id\u003drole_id))"},{"line_number":214,"context_line":""},{"line_number":215,"context_line":"    def _get_revoke_tree(self):"},{"line_number":216,"context_line":"        max_revoked_at \u003d None"},{"line_number":217,"context_line":"        if self.revoke_tree is not None:"},{"line_number":218,"context_line":"            max_revoked_at \u003d self.driver.check_max_entry()"}],"source_content_type":"text/x-python","patch_set":2,"id":"5a2ca52d_3ec4e83e","line":215,"in_reply_to":"7a2fa921_a96bf71c","updated":"2015-10-13 12:24:49.000000000","message":"Done","commit_id":"094851080e6aac2bb1daede5351b89d6846a2139"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"512e64629a31a7c7c1a8053ff1555d8a0f6a18bc","unresolved":false,"context_lines":[{"line_number":214,"context_line":""},{"line_number":215,"context_line":"    def _get_revoke_tree(self):"},{"line_number":216,"context_line":"        max_revoked_at \u003d None"},{"line_number":217,"context_line":"        if self.revoke_tree is not None:"},{"line_number":218,"context_line":"            max_revoked_at \u003d self.driver.check_max_entry()"},{"line_number":219,"context_line":"        if self.revoke_tree is None or (max_revoked_at is None or"},{"line_number":220,"context_line":"                                        max_revoked_at \u003e"}],"source_content_type":"text/x-python","patch_set":2,"id":"7a2fa921_e99a4f61","line":217,"updated":"2015-10-10 04:17:50.000000000","message":"you can do this same check with:\n\n  if self.revoke_tree:","commit_id":"094851080e6aac2bb1daede5351b89d6846a2139"},{"author":{"_account_id":18618,"name":"Sonali Pitre","email":"sonali.pitre@in.ibm.com","username":"Sonali"},"change_message_id":"9b95cc052425ba943b5378dbb6bfa8f932fd8cda","unresolved":false,"context_lines":[{"line_number":214,"context_line":""},{"line_number":215,"context_line":"    def _get_revoke_tree(self):"},{"line_number":216,"context_line":"        max_revoked_at \u003d None"},{"line_number":217,"context_line":"        if self.revoke_tree is not None:"},{"line_number":218,"context_line":"            max_revoked_at \u003d self.driver.check_max_entry()"},{"line_number":219,"context_line":"        if self.revoke_tree is None or (max_revoked_at is None or"},{"line_number":220,"context_line":"                                        max_revoked_at \u003e"}],"source_content_type":"text/x-python","patch_set":2,"id":"5a2ca52d_fedc301a","line":217,"in_reply_to":"7a2fa921_e99a4f61","updated":"2015-10-13 12:24:49.000000000","message":"Done","commit_id":"094851080e6aac2bb1daede5351b89d6846a2139"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"512e64629a31a7c7c1a8053ff1555d8a0f6a18bc","unresolved":false,"context_lines":[{"line_number":216,"context_line":"        max_revoked_at \u003d None"},{"line_number":217,"context_line":"        if self.revoke_tree is not None:"},{"line_number":218,"context_line":"            max_revoked_at \u003d self.driver.check_max_entry()"},{"line_number":219,"context_line":"        if self.revoke_tree is None or (max_revoked_at is None or"},{"line_number":220,"context_line":"                                        max_revoked_at \u003e"},{"line_number":221,"context_line":"                                        self.last_fetch):"},{"line_number":222,"context_line":"            events \u003d self.driver.list_events()"}],"source_content_type":"text/x-python","patch_set":2,"id":"7a2fa921_c958b38c","line":219,"updated":"2015-10-10 04:17:50.000000000","message":"i think the parenthesis are pointless here? it\u0027s all or\u0027s\n\n  if not self.revoke_tree or not max_revoked_at or max_revoked_at \u003e self.last_fetch:","commit_id":"094851080e6aac2bb1daede5351b89d6846a2139"},{"author":{"_account_id":18618,"name":"Sonali Pitre","email":"sonali.pitre@in.ibm.com","username":"Sonali"},"change_message_id":"9b95cc052425ba943b5378dbb6bfa8f932fd8cda","unresolved":false,"context_lines":[{"line_number":216,"context_line":"        max_revoked_at \u003d None"},{"line_number":217,"context_line":"        if self.revoke_tree is not None:"},{"line_number":218,"context_line":"            max_revoked_at \u003d self.driver.check_max_entry()"},{"line_number":219,"context_line":"        if self.revoke_tree is None or (max_revoked_at is None or"},{"line_number":220,"context_line":"                                        max_revoked_at \u003e"},{"line_number":221,"context_line":"                                        self.last_fetch):"},{"line_number":222,"context_line":"            events \u003d self.driver.list_events()"}],"source_content_type":"text/x-python","patch_set":2,"id":"5a2ca52d_fe78b0fa","line":219,"in_reply_to":"7a2fa921_c958b38c","updated":"2015-10-13 12:24:49.000000000","message":"Modified the parenthesis location to make the code more clear. But it was needed as the line had to be split in two.\n\n\nWe have not added any unit tests as we observed that the existing tests already cover the newly added code path. Tests from class RevokeTests and RevokeTreeTests in test_revoke.py perform checks for all the basic functionality of revoke-events. For e.g. - \u0027test_expired_events_removed_validate_token_success\u0027 checks for pruning of expired events. \u0027test_by_user_expiration\u0027 checks if entry is revoked (and hence put in tree) on expiry.","commit_id":"094851080e6aac2bb1daede5351b89d6846a2139"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"512e64629a31a7c7c1a8053ff1555d8a0f6a18bc","unresolved":false,"context_lines":[{"line_number":221,"context_line":"                                        self.last_fetch):"},{"line_number":222,"context_line":"            events \u003d self.driver.list_events()"},{"line_number":223,"context_line":"            self.revoke_tree \u003d model.RevokeTree(revoke_events\u003devents)"},{"line_number":224,"context_line":"            if max_revoked_at is not None:"},{"line_number":225,"context_line":"                self.last_fetch \u003d max_revoked_at"},{"line_number":226,"context_line":"        return self.revoke_tree"},{"line_number":227,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"7a2fa921_a9a1b795","line":224,"updated":"2015-10-10 04:17:50.000000000","message":"same result with fewer characters:\n\n  if max_revoked_at:","commit_id":"094851080e6aac2bb1daede5351b89d6846a2139"},{"author":{"_account_id":18618,"name":"Sonali Pitre","email":"sonali.pitre@in.ibm.com","username":"Sonali"},"change_message_id":"9b95cc052425ba943b5378dbb6bfa8f932fd8cda","unresolved":false,"context_lines":[{"line_number":221,"context_line":"                                        self.last_fetch):"},{"line_number":222,"context_line":"            events \u003d self.driver.list_events()"},{"line_number":223,"context_line":"            self.revoke_tree \u003d model.RevokeTree(revoke_events\u003devents)"},{"line_number":224,"context_line":"            if max_revoked_at is not None:"},{"line_number":225,"context_line":"                self.last_fetch \u003d max_revoked_at"},{"line_number":226,"context_line":"        return self.revoke_tree"},{"line_number":227,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"5a2ca52d_1ee24cd6","line":224,"in_reply_to":"7a2fa921_a9a1b795","updated":"2015-10-13 12:24:49.000000000","message":"Done","commit_id":"094851080e6aac2bb1daede5351b89d6846a2139"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"512e64629a31a7c7c1a8053ff1555d8a0f6a18bc","unresolved":false,"context_lines":[{"line_number":226,"context_line":"        return self.revoke_tree"},{"line_number":227,"context_line":""},{"line_number":228,"context_line":"    def invalidate_tree(self):"},{"line_number":229,"context_line":"        Manager.revoke_tree \u003d None"},{"line_number":230,"context_line":""},{"line_number":231,"context_line":"    def check_token(self, token_values):"},{"line_number":232,"context_line":"        \"\"\"Checks the values from a token against the revocation list"}],"source_content_type":"text/x-python","patch_set":2,"id":"7a2fa921_09b9cbcb","line":229,"updated":"2015-10-10 04:17:50.000000000","message":"use self here:\n\n  self.revoke_tree \u003d None","commit_id":"094851080e6aac2bb1daede5351b89d6846a2139"},{"author":{"_account_id":18618,"name":"Sonali Pitre","email":"sonali.pitre@in.ibm.com","username":"Sonali"},"change_message_id":"9b95cc052425ba943b5378dbb6bfa8f932fd8cda","unresolved":false,"context_lines":[{"line_number":226,"context_line":"        return self.revoke_tree"},{"line_number":227,"context_line":""},{"line_number":228,"context_line":"    def invalidate_tree(self):"},{"line_number":229,"context_line":"        Manager.revoke_tree \u003d None"},{"line_number":230,"context_line":""},{"line_number":231,"context_line":"    def check_token(self, token_values):"},{"line_number":232,"context_line":"        \"\"\"Checks the values from a token against the revocation list"}],"source_content_type":"text/x-python","patch_set":2,"id":"5a2ca52d_deeb74af","line":229,"in_reply_to":"7a2fa921_09b9cbcb","updated":"2015-10-13 12:24:49.000000000","message":"Done","commit_id":"094851080e6aac2bb1daede5351b89d6846a2139"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"9cc360c81cfec4be90c1f80d345147f036a428cf","unresolved":false,"context_lines":[{"line_number":80,"context_line":"    def __init__(self):"},{"line_number":81,"context_line":"        super(Manager, self).__init__(CONF.revoke.driver)"},{"line_number":82,"context_line":"        self._register_listeners()"},{"line_number":83,"context_line":"        self.model \u003d model"},{"line_number":84,"context_line":""},{"line_number":85,"context_line":"    def _user_callback(self, service, resource_type, operation,"},{"line_number":86,"context_line":"                       payload):"}],"source_content_type":"text/x-python","patch_set":3,"id":"5a2ca52d_124d5472","side":"PARENT","line":83,"updated":"2015-10-13 15:35:52.000000000","message":"Surely you intended the above attributes to be instance attributes, not class attributes? You access them as instance attributes later.","commit_id":"e0e147cf8a916b204946dbd29d3aeb100d638533"},{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"8dd800c485af540a012dbfe1276580c7889bc44a","unresolved":false,"context_lines":[{"line_number":80,"context_line":"    def __init__(self):"},{"line_number":81,"context_line":"        super(Manager, self).__init__(CONF.revoke.driver)"},{"line_number":82,"context_line":"        self._register_listeners()"},{"line_number":83,"context_line":"        self.model \u003d model"},{"line_number":84,"context_line":""},{"line_number":85,"context_line":"    def _user_callback(self, service, resource_type, operation,"},{"line_number":86,"context_line":"                       payload):"}],"source_content_type":"text/x-python","patch_set":3,"id":"9a8ffd7b_b6ccdb6a","side":"PARENT","line":83,"in_reply_to":"5a2ca52d_124d5472","updated":"2015-11-27 11:52:13.000000000","message":"++","commit_id":"e0e147cf8a916b204946dbd29d3aeb100d638533"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"373ab7098d12470f4a52025a813264eba482d48f","unresolved":false,"context_lines":[{"line_number":206,"context_line":"    def revoke_by_domain_role_assignment(self, domain_id, role_id):"},{"line_number":207,"context_line":"        self.revoke(model.RevokeEvent(domain_id\u003ddomain_id, role_id\u003drole_id))"},{"line_number":208,"context_line":""},{"line_number":209,"context_line":"    @MEMOIZE"},{"line_number":210,"context_line":"    def _get_revoke_tree(self):"},{"line_number":211,"context_line":"        events \u003d self.driver.list_events()"},{"line_number":212,"context_line":"        revoke_tree \u003d model.RevokeTree(revoke_events\u003devents)"}],"source_content_type":"text/x-python","patch_set":3,"id":"5a2ca52d_03f8ace4","side":"PARENT","line":209,"updated":"2015-10-13 14:25:25.000000000","message":"The MEMOIZE call should keep this from being created every time.","commit_id":"e0e147cf8a916b204946dbd29d3aeb100d638533"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"9cc360c81cfec4be90c1f80d345147f036a428cf","unresolved":false,"context_lines":[{"line_number":206,"context_line":"    def revoke_by_domain_role_assignment(self, domain_id, role_id):"},{"line_number":207,"context_line":"        self.revoke(model.RevokeEvent(domain_id\u003ddomain_id, role_id\u003drole_id))"},{"line_number":208,"context_line":""},{"line_number":209,"context_line":"    @MEMOIZE"},{"line_number":210,"context_line":"    def _get_revoke_tree(self):"},{"line_number":211,"context_line":"        events \u003d self.driver.list_events()"},{"line_number":212,"context_line":"        revoke_tree \u003d model.RevokeTree(revoke_events\u003devents)"}],"source_content_type":"text/x-python","patch_set":3,"id":"5a2ca52d_32a090f4","side":"PARENT","line":209,"in_reply_to":"5a2ca52d_03f8ace4","updated":"2015-10-13 15:35:52.000000000","message":"++ the code below just reimplements @MEMOIZE but hardcodes it to be stored using in-process memory.","commit_id":"e0e147cf8a916b204946dbd29d3aeb100d638533"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"9cc360c81cfec4be90c1f80d345147f036a428cf","unresolved":false,"context_lines":[{"line_number":81,"context_line":"    # It gets updated each time a new entry is added"},{"line_number":82,"context_line":"    # in the revocation_even table."},{"line_number":83,"context_line":""},{"line_number":84,"context_line":"    last_fetch \u003d datetime.datetime(0o0001, 0o1, 0o1, 0, 0, 0)"},{"line_number":85,"context_line":""},{"line_number":86,"context_line":"    def __init__(self):"},{"line_number":87,"context_line":"        super(Manager, self).__init__(CONF.revoke.driver)"}],"source_content_type":"text/x-python","patch_set":3,"id":"5a2ca52d_d7e7ceaa","line":84,"updated":"2015-10-13 15:35:52.000000000","message":"Use the constant provided by datetime. I also don\u0027t see why you\u0027re bothering to use octals on the month and day? Finally, the last few arguments are optional, and you\u0027re not including all the optional arguments anyway, so just skip them.\n\n  # Inline comments go immediately before the code\n  # they describe, with no whitespace in between.\n  last_fetch \u003d datetime.datetime(datetime.MINYEAR, 1, 1)","commit_id":"64d43712aab6929fea9899000de7f58b71d2b886"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"373ab7098d12470f4a52025a813264eba482d48f","unresolved":false,"context_lines":[{"line_number":212,"context_line":"    def revoke_by_domain_role_assignment(self, domain_id, role_id):"},{"line_number":213,"context_line":"        self.revoke(model.RevokeEvent(domain_id\u003ddomain_id, role_id\u003drole_id))"},{"line_number":214,"context_line":""},{"line_number":215,"context_line":"    def _get_revoke_tree(self):"},{"line_number":216,"context_line":"        \"\"\"Creates or rebuilds a tree from revocation entries"},{"line_number":217,"context_line":""},{"line_number":218,"context_line":"        Create a tree if it is not initialized already."}],"source_content_type":"text/x-python","patch_set":3,"id":"5a2ca52d_e3e6d0e7","line":215,"updated":"2015-10-13 14:25:25.000000000","message":"I think this is more correctly done by fixing the MEMOIZE method if it is not performing correctly.","commit_id":"64d43712aab6929fea9899000de7f58b71d2b886"},{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"8dd800c485af540a012dbfe1276580c7889bc44a","unresolved":false,"context_lines":[{"line_number":224,"context_line":"        \"\"\""},{"line_number":225,"context_line":"        max_revoked_at \u003d None"},{"line_number":226,"context_line":"        if self.revoke_tree:"},{"line_number":227,"context_line":"            max_revoked_at \u003d self.driver.check_max_entry()"},{"line_number":228,"context_line":"        if (self.revoke_tree is None or max_revoked_at is None or"},{"line_number":229,"context_line":"                max_revoked_at \u003e self.last_fetch):"},{"line_number":230,"context_line":"            events \u003d self.driver.list_events()"}],"source_content_type":"text/x-python","patch_set":3,"id":"9a8ffd7b_f657c357","line":227,"updated":"2015-11-27 11:52:13.000000000","message":"What happens if it\u0027s the first revoked tree ? Shouldn\u0027t max_revoked_at be the current time ?\n\nPerhaps you need an \"else\" state here.\n\nAfter this, you won\u0027t need to check \u0027if max_revoked_at\u0027 in L232.","commit_id":"64d43712aab6929fea9899000de7f58b71d2b886"}]}
