)]}'
{"keystone/token/backends/kvs.py":[{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"ed333f32ce4110e08fbd465815d7b6aac8c5bd4b","unresolved":false,"context_lines":[{"line_number":66,"context_line":"            raise exception.TokenNotFound(token_id\u003dtoken_id)"},{"line_number":67,"context_line":""},{"line_number":68,"context_line":"    def delete_tokens(self, user_id, tenant_id\u003dNone, trust_id\u003dNone,"},{"line_number":69,"context_line":"                      consumer_id\u003dNone):"},{"line_number":70,"context_line":"        return super(Token, self).delete_tokens("},{"line_number":71,"context_line":"            user_id\u003duser_id,"},{"line_number":72,"context_line":"            tenant_id\u003dtenant_id,"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAATH%2F%2FYCY%3D","line":69,"updated":"2013-10-16 23:40:11.000000000","message":"could use *args, **kwargs?","commit_id":"3f337ac6456f0020d28c88a5445a122c70e36e4c"},{"author":{"_account_id":2472,"name":"Doug Hellmann","email":"dhellmann@redhat.com","username":"doug-hellmann"},"change_message_id":"2bfb71d27b285b464fa076c7f4c441257897a29d","unresolved":false,"context_lines":[{"line_number":66,"context_line":"            raise exception.TokenNotFound(token_id\u003dtoken_id)"},{"line_number":67,"context_line":""},{"line_number":68,"context_line":"    def delete_tokens(self, user_id, tenant_id\u003dNone, trust_id\u003dNone,"},{"line_number":69,"context_line":"                      consumer_id\u003dNone):"},{"line_number":70,"context_line":"        return super(Token, self).delete_tokens("},{"line_number":71,"context_line":"            user_id\u003duser_id,"},{"line_number":72,"context_line":"            tenant_id\u003dtenant_id,"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAATn%2F%2F4i0%3D","line":69,"in_reply_to":"AAAATH%2F%2FYCY%3D","updated":"2013-10-25 18:03:47.000000000","message":"I prefer to be explicit, so it is clear what the API of the driver actually is.","commit_id":"3f337ac6456f0020d28c88a5445a122c70e36e4c"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"ed333f32ce4110e08fbd465815d7b6aac8c5bd4b","unresolved":false,"context_lines":[{"line_number":68,"context_line":"    def delete_tokens(self, user_id, tenant_id\u003dNone, trust_id\u003dNone,"},{"line_number":69,"context_line":"                      consumer_id\u003dNone):"},{"line_number":70,"context_line":"        return super(Token, self).delete_tokens("},{"line_number":71,"context_line":"            user_id\u003duser_id,"},{"line_number":72,"context_line":"            tenant_id\u003dtenant_id,"},{"line_number":73,"context_line":"            trust_id\u003dtrust_id,"},{"line_number":74,"context_line":"            consumer_id\u003dconsumer_id,"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAATH%2F%2FYCc%3D","line":71,"updated":"2013-10-16 23:40:11.000000000","message":"suggest change to user_id since this is a positional parameter","commit_id":"3f337ac6456f0020d28c88a5445a122c70e36e4c"},{"author":{"_account_id":2472,"name":"Doug Hellmann","email":"dhellmann@redhat.com","username":"doug-hellmann"},"change_message_id":"2bfb71d27b285b464fa076c7f4c441257897a29d","unresolved":false,"context_lines":[{"line_number":68,"context_line":"    def delete_tokens(self, user_id, tenant_id\u003dNone, trust_id\u003dNone,"},{"line_number":69,"context_line":"                      consumer_id\u003dNone):"},{"line_number":70,"context_line":"        return super(Token, self).delete_tokens("},{"line_number":71,"context_line":"            user_id\u003duser_id,"},{"line_number":72,"context_line":"            tenant_id\u003dtenant_id,"},{"line_number":73,"context_line":"            trust_id\u003dtrust_id,"},{"line_number":74,"context_line":"            consumer_id\u003dconsumer_id,"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAATn%2F%2F4ik%3D","line":71,"in_reply_to":"AAAATH%2F%2FYCc%3D","updated":"2013-10-25 18:03:47.000000000","message":"It doesn\u0027t really make any difference in the way the parent method is called.","commit_id":"3f337ac6456f0020d28c88a5445a122c70e36e4c"}],"keystone/token/backends/memcache.py":[{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"ed333f32ce4110e08fbd465815d7b6aac8c5bd4b","unresolved":false,"context_lines":[{"line_number":229,"context_line":"    def flush_expired_tokens(self):"},{"line_number":230,"context_line":"        \"\"\"Archive or delete tokens that have expired."},{"line_number":231,"context_line":"        \"\"\""},{"line_number":232,"context_line":"        raise exception.NotImplemented()"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAATH%2F%2FYCE%3D","line":232,"updated":"2013-10-16 23:40:11.000000000","message":"could use super implementation ?","commit_id":"3f337ac6456f0020d28c88a5445a122c70e36e4c"},{"author":{"_account_id":2472,"name":"Doug Hellmann","email":"dhellmann@redhat.com","username":"doug-hellmann"},"change_message_id":"2bfb71d27b285b464fa076c7f4c441257897a29d","unresolved":false,"context_lines":[{"line_number":229,"context_line":"    def flush_expired_tokens(self):"},{"line_number":230,"context_line":"        \"\"\"Archive or delete tokens that have expired."},{"line_number":231,"context_line":"        \"\"\""},{"line_number":232,"context_line":"        raise exception.NotImplemented()"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAATn%2F%2F4iI%3D","line":232,"in_reply_to":"AAAATH%2F%2FYAc%3D","updated":"2013-10-25 18:03:47.000000000","message":"Again, I\u0027d prefer to be explicit. That way the base class behavior can change to a no-op at some point in the future, and someone modifying this driver can see exactly what is not being implemented.","commit_id":"3f337ac6456f0020d28c88a5445a122c70e36e4c"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"0f263ea1f33c79b89ede31864239157f30c8d913","unresolved":false,"context_lines":[{"line_number":229,"context_line":"    def flush_expired_tokens(self):"},{"line_number":230,"context_line":"        \"\"\"Archive or delete tokens that have expired."},{"line_number":231,"context_line":"        \"\"\""},{"line_number":232,"context_line":"        raise exception.NotImplemented()"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAATH%2F%2FYAc%3D","line":232,"in_reply_to":"AAAATH%2F%2FYCE%3D","updated":"2013-10-16 23:46:28.000000000","message":"++","commit_id":"3f337ac6456f0020d28c88a5445a122c70e36e4c"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"ca9b3f2c7694280c07597db005a9f49a7ad96260","unresolved":false,"context_lines":[{"line_number":229,"context_line":"    def flush_expired_tokens(self):"},{"line_number":230,"context_line":"        \"\"\"Archive or delete tokens that have expired."},{"line_number":231,"context_line":"        \"\"\""},{"line_number":232,"context_line":"        raise exception.NotImplemented()"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAATn%2F%2F4gs%3D","line":232,"in_reply_to":"AAAATn%2F%2F4iI%3D","updated":"2013-10-25 18:06:25.000000000","message":"That is fair enough.","commit_id":"3f337ac6456f0020d28c88a5445a122c70e36e4c"}],"keystone/token/core.py":[{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"56fd30752255a9a444117baa4f9063b5dbb7ffca","unresolved":false,"context_lines":[{"line_number":247,"context_line":"        raise exception.NotImplemented()"},{"line_number":248,"context_line":""},{"line_number":249,"context_line":"    def delete_tokens(self, user_id, tenant_id\u003dNone, trust_id\u003dNone,"},{"line_number":250,"context_line":"                      consumer_id\u003dNone):"},{"line_number":251,"context_line":"        \"\"\"Deletes tokens by user."},{"line_number":252,"context_line":""},{"line_number":253,"context_line":"        If the tenant_id is not None, only delete the tokens by user id under"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATH%2F%2F9A4%3D","line":250,"updated":"2013-10-07 15:05:43.000000000","message":"Suggest making this an abstract method as well, the subclass should simply call super() in the case that there is nothing to override.  See the TODO on line 274.  This doesn\u0027t need to become a virtual method, but should be abstract at the very least.","commit_id":"23f199f801974c51c2a661cbd469cee66fdd070c"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"ed333f32ce4110e08fbd465815d7b6aac8c5bd4b","unresolved":false,"context_lines":[{"line_number":246,"context_line":"        \"\"\""},{"line_number":247,"context_line":"        raise exception.NotImplemented()"},{"line_number":248,"context_line":""},{"line_number":249,"context_line":"    @abc.abstractmethod"},{"line_number":250,"context_line":"    def delete_tokens(self, user_id, tenant_id\u003dNone, trust_id\u003dNone,"},{"line_number":251,"context_line":"                      consumer_id\u003dNone):"},{"line_number":252,"context_line":"        \"\"\"Deletes tokens by user."}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAATH%2F%2FYCM%3D","line":249,"updated":"2013-10-16 23:40:11.000000000","message":"why is this an abstractmethod? seems like it\u0027s ok to use the default impl and not overrride.","commit_id":"3f337ac6456f0020d28c88a5445a122c70e36e4c"},{"author":{"_account_id":2472,"name":"Doug Hellmann","email":"dhellmann@redhat.com","username":"doug-hellmann"},"change_message_id":"2bfb71d27b285b464fa076c7f4c441257897a29d","unresolved":false,"context_lines":[{"line_number":246,"context_line":"        \"\"\""},{"line_number":247,"context_line":"        raise exception.NotImplemented()"},{"line_number":248,"context_line":""},{"line_number":249,"context_line":"    @abc.abstractmethod"},{"line_number":250,"context_line":"    def delete_tokens(self, user_id, tenant_id\u003dNone, trust_id\u003dNone,"},{"line_number":251,"context_line":"                      consumer_id\u003dNone):"},{"line_number":252,"context_line":"        \"\"\"Deletes tokens by user."}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAATn%2F%2F4hY%3D","line":249,"in_reply_to":"AAAATH%2F%2FYBE%3D","updated":"2013-10-25 18:03:47.000000000","message":"Right. Drivers must provide this feature. The base class implementation is correct, but it is very likely it could be optimized in drivers that know how the database works.","commit_id":"3f337ac6456f0020d28c88a5445a122c70e36e4c"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"0f263ea1f33c79b89ede31864239157f30c8d913","unresolved":false,"context_lines":[{"line_number":246,"context_line":"        \"\"\""},{"line_number":247,"context_line":"        raise exception.NotImplemented()"},{"line_number":248,"context_line":""},{"line_number":249,"context_line":"    @abc.abstractmethod"},{"line_number":250,"context_line":"    def delete_tokens(self, user_id, tenant_id\u003dNone, trust_id\u003dNone,"},{"line_number":251,"context_line":"                      consumer_id\u003dNone):"},{"line_number":252,"context_line":"        \"\"\"Deletes tokens by user."}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAATH%2F%2FYBE%3D","line":249,"in_reply_to":"AAAATH%2F%2FYCM%3D","updated":"2013-10-16 23:46:28.000000000","message":"The comment on line 275 covers the intention of this method.  It should be defined on the subclassed drivers and if no changes made, super() used.  In the case the driver needs to do something different, the implementation can be different.\n\nAlternatively, removing the TODO on line 275 and assuming this shouldn\u0027t be abstract is valid as well.","commit_id":"3f337ac6456f0020d28c88a5445a122c70e36e4c"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"0f263ea1f33c79b89ede31864239157f30c8d913","unresolved":false,"context_lines":[{"line_number":275,"context_line":"        # TODO(henry-nash): The SQL driver already has a more efficient"},{"line_number":276,"context_line":"        # implementation of this, although this is missing from the other"},{"line_number":277,"context_line":"        # backends.  These should be completed and then this should become"},{"line_number":278,"context_line":"        # a virtual method.  This is raised as bug #1227507."},{"line_number":279,"context_line":""},{"line_number":280,"context_line":"        token_list \u003d self.list_tokens(user_id,"},{"line_number":281,"context_line":"                                      tenant_id\u003dtenant_id,"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAATH%2F%2FYAo%3D","line":278,"updated":"2013-10-16 23:46:28.000000000","message":"This comment should be removed regardless if this is kept abstract or not (see Brant\u0027s comment on line 249)","commit_id":"3f337ac6456f0020d28c88a5445a122c70e36e4c"},{"author":{"_account_id":2472,"name":"Doug Hellmann","email":"dhellmann@redhat.com","username":"doug-hellmann"},"change_message_id":"2bfb71d27b285b464fa076c7f4c441257897a29d","unresolved":false,"context_lines":[{"line_number":275,"context_line":"        # TODO(henry-nash): The SQL driver already has a more efficient"},{"line_number":276,"context_line":"        # implementation of this, although this is missing from the other"},{"line_number":277,"context_line":"        # backends.  These should be completed and then this should become"},{"line_number":278,"context_line":"        # a virtual method.  This is raised as bug #1227507."},{"line_number":279,"context_line":""},{"line_number":280,"context_line":"        token_list \u003d self.list_tokens(user_id,"},{"line_number":281,"context_line":"                                      tenant_id\u003dtenant_id,"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAATn%2F%2F4h4%3D","line":278,"in_reply_to":"AAAATH%2F%2FYAo%3D","updated":"2013-10-25 18:03:47.000000000","message":"OK, that seems unrelated to the rest of the changes, though?","commit_id":"3f337ac6456f0020d28c88a5445a122c70e36e4c"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"ca9b3f2c7694280c07597db005a9f49a7ad96260","unresolved":false,"context_lines":[{"line_number":275,"context_line":"        # TODO(henry-nash): The SQL driver already has a more efficient"},{"line_number":276,"context_line":"        # implementation of this, although this is missing from the other"},{"line_number":277,"context_line":"        # backends.  These should be completed and then this should become"},{"line_number":278,"context_line":"        # a virtual method.  This is raised as bug #1227507."},{"line_number":279,"context_line":""},{"line_number":280,"context_line":"        token_list \u003d self.list_tokens(user_id,"},{"line_number":281,"context_line":"                                      tenant_id\u003dtenant_id,"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAATn%2F%2F4g0%3D","line":278,"in_reply_to":"AAAATn%2F%2F4h4%3D","updated":"2013-10-25 18:06:25.000000000","message":"The SQL driver is the only one with a more efficient implementation, this is just saying it should be implemented on the other drivers as i read it, meaning this resolves the TODO.  efficiency or not, making this abstract is solved and \"virtual method\" is no longer relevant.","commit_id":"3f337ac6456f0020d28c88a5445a122c70e36e4c"},{"author":{"_account_id":7073,"name":"mouad benchchaoui","email":"m.benchchaoui@x-ion.de","username":"mouad"},"change_message_id":"05bd90c3a155224449dd76d6ea63124d8688d309","unresolved":false,"context_lines":[{"line_number":208,"context_line":"        :raises: keystone.exception.TokenNotFound"},{"line_number":209,"context_line":""},{"line_number":210,"context_line":"        \"\"\""},{"line_number":211,"context_line":"        raise exception.NotImplemented()"},{"line_number":212,"context_line":""},{"line_number":213,"context_line":"    @abc.abstractmethod"},{"line_number":214,"context_line":"    def create_token(self, token_id, data):"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAATn%2F%2FvhA%3D","line":211,"updated":"2013-10-29 16:36:01.000000000","message":"Why keep the raise statement ? The same apply for all the other methods below that are decorated now with abc.abstractmethod.","commit_id":"9a0f7408b89f325bd0198d308a6f617f832b2a0d"},{"author":{"_account_id":2472,"name":"Doug Hellmann","email":"dhellmann@redhat.com","username":"doug-hellmann"},"change_message_id":"c1d40fdf28a0d2c757b1ed092a05f1606cd650b1","unresolved":false,"context_lines":[{"line_number":208,"context_line":"        :raises: keystone.exception.TokenNotFound"},{"line_number":209,"context_line":""},{"line_number":210,"context_line":"        \"\"\""},{"line_number":211,"context_line":"        raise exception.NotImplemented()"},{"line_number":212,"context_line":""},{"line_number":213,"context_line":"    @abc.abstractmethod"},{"line_number":214,"context_line":"    def create_token(self, token_id, data):"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAATn%2F%2FvCk%3D","line":211,"in_reply_to":"AAAATn%2F%2FvhA%3D","updated":"2013-10-29 18:24:45.000000000","message":"It does help a little during development. Driver authors won\u0027t even be able to run their code until they define all of the abstract methods in the concrete class. Leaving the raise statements here means new drivers (or new methods on existing drivers) can just call super() and see an error at the point where a method is called, which allows the tests to run and report errors/failures.","commit_id":"9a0f7408b89f325bd0198d308a6f617f832b2a0d"}]}
