)]}'
{"keystone/token/backends/memcache.py":[{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"8c68463b4cfe6242a5b84159ed19d62fed7faab5","unresolved":false,"context_lines":[{"line_number":89,"context_line":"                                            token_id\u003dtoken_data)"},{"line_number":90,"context_line":"        return copy.deepcopy(data_copy)"},{"line_number":91,"context_line":""},{"line_number":92,"context_line":"    def _update_user_list_with_cas(self, user_key, token_id):"},{"line_number":93,"context_line":"        cas_retry \u003d 0"},{"line_number":94,"context_line":"        error_msg \u003d _(\u0027Unable to add token user list.\u0027)"},{"line_number":95,"context_line":"        current_time \u003d timeutils.normalize_time("}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAPH%2F%2Fb7I%3D","line":92,"updated":"2013-06-04 00:06:14.000000000","message":"Seems like this logic should be split into a generalizable portion and moved into keystone/common, and a token specific portion left here.","commit_id":"157f777d84a41ddb533a66ca825f8886e0635954"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"0958b192700a866b60054e02c85393a8c3be322b","unresolved":false,"context_lines":[{"line_number":89,"context_line":"                                            token_id\u003dtoken_data)"},{"line_number":90,"context_line":"        return copy.deepcopy(data_copy)"},{"line_number":91,"context_line":""},{"line_number":92,"context_line":"    def _update_user_list_with_cas(self, user_key, token_id):"},{"line_number":93,"context_line":"        cas_retry \u003d 0"},{"line_number":94,"context_line":"        error_msg \u003d _(\u0027Unable to add token user list.\u0027)"},{"line_number":95,"context_line":"        current_time \u003d timeutils.normalize_time("}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAPX%2F%2F%2Bps%3D","line":92,"in_reply_to":"AAAAPH%2F%2Fb7I%3D","updated":"2013-06-04 17:39:59.000000000","message":"I don\u0027t see an easy way (short of using a callback function) to rebuild the user-index-list that we are going to set in the while loop if this is generalized.\n\nThe way cas works here is that if it has changed between when we call client.gets() and when we call client.cas(), the whole list needs to be rebuild from the new values in memcache, as the underlying data has changed.  If we didn\u0027t need to avoid race conditions here (multiple keystone processes, etc) cas wouldn\u0027t be required and the while loop could be removed.  Similarly, if we could canonically rebuild the list without reading the index (which was where Termie\u0027s proposal with the clock mechanism came from) it would avoid the need for cas() as well.","commit_id":"157f777d84a41ddb533a66ca825f8886e0635954"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"5b02ffeb6e877cc4168f26e620784e2246817a65","unresolved":false,"context_lines":[{"line_number":86,"context_line":"            user_id \u003d data[\u0027user\u0027][\u0027id\u0027]"},{"line_number":87,"context_line":"            user_key \u003d self._prefix_user_id(user_id)"},{"line_number":88,"context_line":"            self._update_user_list_with_cas(user_key\u003duser_key,"},{"line_number":89,"context_line":"                                            token_id\u003dtoken_data)"},{"line_number":90,"context_line":"        return copy.deepcopy(data_copy)"},{"line_number":91,"context_line":""},{"line_number":92,"context_line":"    def _update_user_list_with_cas(self, user_key, token_id):"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAPX%2F%2F0Gg%3D","line":89,"updated":"2013-06-09 15:14:34.000000000","message":"suggest remove user_key\u003d and token_id\u003d since _update_user_list_with_cas doesn\u0027t use named parameters.","commit_id":"8146b322ea6be3d17eece0b3b90fb187fba35308"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"f233d306671b27c48d26279b706140d19e8245f8","unresolved":false,"context_lines":[{"line_number":86,"context_line":"            user_id \u003d data[\u0027user\u0027][\u0027id\u0027]"},{"line_number":87,"context_line":"            user_key \u003d self._prefix_user_id(user_id)"},{"line_number":88,"context_line":"            self._update_user_list_with_cas(user_key\u003duser_key,"},{"line_number":89,"context_line":"                                            token_id\u003dtoken_data)"},{"line_number":90,"context_line":"        return copy.deepcopy(data_copy)"},{"line_number":91,"context_line":""},{"line_number":92,"context_line":"    def _update_user_list_with_cas(self, user_key, token_id):"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAPX%2F%2FzpE%3D","line":89,"in_reply_to":"AAAAPX%2F%2F0Gg%3D","updated":"2013-06-10 07:31:38.000000000","message":"Done","commit_id":"8146b322ea6be3d17eece0b3b90fb187fba35308"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"5b02ffeb6e877cc4168f26e620784e2246817a65","unresolved":false,"context_lines":[{"line_number":91,"context_line":""},{"line_number":92,"context_line":"    def _update_user_list_with_cas(self, user_key, token_id):"},{"line_number":93,"context_line":"        cas_retry \u003d 0"},{"line_number":94,"context_line":"        error_msg \u003d _(\u0027Unable to add token user list.\u0027)"},{"line_number":95,"context_line":"        current_time \u003d timeutils.normalize_time("},{"line_number":96,"context_line":"            timeutils.parse_isotime(timeutils.isotime()))"},{"line_number":97,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAPX%2F%2F0Gc%3D","line":94,"updated":"2013-06-09 15:14:34.000000000","message":"move this down to where it\u0027s used (just before line 132)","commit_id":"8146b322ea6be3d17eece0b3b90fb187fba35308"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"f233d306671b27c48d26279b706140d19e8245f8","unresolved":false,"context_lines":[{"line_number":91,"context_line":""},{"line_number":92,"context_line":"    def _update_user_list_with_cas(self, user_key, token_id):"},{"line_number":93,"context_line":"        cas_retry \u003d 0"},{"line_number":94,"context_line":"        error_msg \u003d _(\u0027Unable to add token user list.\u0027)"},{"line_number":95,"context_line":"        current_time \u003d timeutils.normalize_time("},{"line_number":96,"context_line":"            timeutils.parse_isotime(timeutils.isotime()))"},{"line_number":97,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAPX%2F%2FzpA%3D","line":94,"in_reply_to":"AAAAPX%2F%2F0Gc%3D","updated":"2013-06-10 07:31:38.000000000","message":"Done","commit_id":"8146b322ea6be3d17eece0b3b90fb187fba35308"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"5b02ffeb6e877cc4168f26e620784e2246817a65","unresolved":false,"context_lines":[{"line_number":116,"context_line":"                for token_i in token_list:"},{"line_number":117,"context_line":"                    ptk \u003d self._prefix_token_id(token.unique_id(token_i))"},{"line_number":118,"context_line":"                    token_ref \u003d self.client.get(ptk)"},{"line_number":119,"context_line":"                    if not token_ref:"},{"line_number":120,"context_line":"                        continue"},{"line_number":121,"context_line":""},{"line_number":122,"context_line":"                    if \u0027expires\u0027 in token_ref:"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAPX%2F%2F0GM%3D","line":119,"updated":"2013-06-09 15:14:34.000000000","message":"suggest add a comment here \"skip tokens that don\u0027t exist anymore\"","commit_id":"8146b322ea6be3d17eece0b3b90fb187fba35308"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"f233d306671b27c48d26279b706140d19e8245f8","unresolved":false,"context_lines":[{"line_number":116,"context_line":"                for token_i in token_list:"},{"line_number":117,"context_line":"                    ptk \u003d self._prefix_token_id(token.unique_id(token_i))"},{"line_number":118,"context_line":"                    token_ref \u003d self.client.get(ptk)"},{"line_number":119,"context_line":"                    if not token_ref:"},{"line_number":120,"context_line":"                        continue"},{"line_number":121,"context_line":""},{"line_number":122,"context_line":"                    if \u0027expires\u0027 in token_ref:"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAPX%2F%2Fzo8%3D","line":119,"in_reply_to":"AAAAPX%2F%2F0GM%3D","updated":"2013-06-10 07:31:38.000000000","message":"Done","commit_id":"8146b322ea6be3d17eece0b3b90fb187fba35308"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"5b02ffeb6e877cc4168f26e620784e2246817a65","unresolved":false,"context_lines":[{"line_number":122,"context_line":"                    if \u0027expires\u0027 in token_ref:"},{"line_number":123,"context_line":"                        expires_at \u003d timeutils.normalize_time("},{"line_number":124,"context_line":"                            token_ref[\u0027expires\u0027])"},{"line_number":125,"context_line":"                        if expires_at \u003c current_time:"},{"line_number":126,"context_line":"                            continue"},{"line_number":127,"context_line":""},{"line_number":128,"context_line":"                    filtered_list.append(jsonutils.dumps(token_i))"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAPX%2F%2F0GI%3D","line":125,"updated":"2013-06-09 15:14:34.000000000","message":"suggest add a comment here \"skip tokens that are expired\"","commit_id":"8146b322ea6be3d17eece0b3b90fb187fba35308"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"f233d306671b27c48d26279b706140d19e8245f8","unresolved":false,"context_lines":[{"line_number":122,"context_line":"                    if \u0027expires\u0027 in token_ref:"},{"line_number":123,"context_line":"                        expires_at \u003d timeutils.normalize_time("},{"line_number":124,"context_line":"                            token_ref[\u0027expires\u0027])"},{"line_number":125,"context_line":"                        if expires_at \u003c current_time:"},{"line_number":126,"context_line":"                            continue"},{"line_number":127,"context_line":""},{"line_number":128,"context_line":"                    filtered_list.append(jsonutils.dumps(token_i))"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAPX%2F%2Fzo4%3D","line":125,"in_reply_to":"AAAAPX%2F%2F0GI%3D","updated":"2013-06-10 07:31:38.000000000","message":"Done","commit_id":"8146b322ea6be3d17eece0b3b90fb187fba35308"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"5b02ffeb6e877cc4168f26e620784e2246817a65","unresolved":false,"context_lines":[{"line_number":127,"context_line":""},{"line_number":128,"context_line":"                    filtered_list.append(jsonutils.dumps(token_i))"},{"line_number":129,"context_line":"            filtered_list.append(token_id)"},{"line_number":130,"context_line":"            if self.client.cas(user_key, \u0027,\u0027.join(filtered_list)):"},{"line_number":131,"context_line":"                return filtered_list"},{"line_number":132,"context_line":"        raise exception.UnexpectedError(error_msg)"},{"line_number":133,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAPX%2F%2F0GE%3D","line":130,"updated":"2013-06-09 15:14:34.000000000","message":"suggest add a comment here \"sucessfully set so done\". Better would be to log it.","commit_id":"8146b322ea6be3d17eece0b3b90fb187fba35308"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"f233d306671b27c48d26279b706140d19e8245f8","unresolved":false,"context_lines":[{"line_number":127,"context_line":""},{"line_number":128,"context_line":"                    filtered_list.append(jsonutils.dumps(token_i))"},{"line_number":129,"context_line":"            filtered_list.append(token_id)"},{"line_number":130,"context_line":"            if self.client.cas(user_key, \u0027,\u0027.join(filtered_list)):"},{"line_number":131,"context_line":"                return filtered_list"},{"line_number":132,"context_line":"        raise exception.UnexpectedError(error_msg)"},{"line_number":133,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAPX%2F%2Fzow%3D","line":130,"in_reply_to":"AAAAPX%2F%2F0GE%3D","updated":"2013-06-10 07:31:38.000000000","message":"Added a log line.","commit_id":"8146b322ea6be3d17eece0b3b90fb187fba35308"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"5b02ffeb6e877cc4168f26e620784e2246817a65","unresolved":false,"context_lines":[{"line_number":128,"context_line":"                    filtered_list.append(jsonutils.dumps(token_i))"},{"line_number":129,"context_line":"            filtered_list.append(token_id)"},{"line_number":130,"context_line":"            if self.client.cas(user_key, \u0027,\u0027.join(filtered_list)):"},{"line_number":131,"context_line":"                return filtered_list"},{"line_number":132,"context_line":"        raise exception.UnexpectedError(error_msg)"},{"line_number":133,"context_line":""},{"line_number":134,"context_line":"    def _add_to_revocation_list(self, data):"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAPX%2F%2F0GA%3D","line":131,"updated":"2013-06-09 15:14:34.000000000","message":"suggest add log message here \"failed to set token list for user %(user_key)s due to conflict #%(cas_retry)d\".","commit_id":"8146b322ea6be3d17eece0b3b90fb187fba35308"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"f233d306671b27c48d26279b706140d19e8245f8","unresolved":false,"context_lines":[{"line_number":128,"context_line":"                    filtered_list.append(jsonutils.dumps(token_i))"},{"line_number":129,"context_line":"            filtered_list.append(token_id)"},{"line_number":130,"context_line":"            if self.client.cas(user_key, \u0027,\u0027.join(filtered_list)):"},{"line_number":131,"context_line":"                return filtered_list"},{"line_number":132,"context_line":"        raise exception.UnexpectedError(error_msg)"},{"line_number":133,"context_line":""},{"line_number":134,"context_line":"    def _add_to_revocation_list(self, data):"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAPX%2F%2FzoA%3D","line":131,"in_reply_to":"AAAAPX%2F%2F0GA%3D","updated":"2013-06-10 07:31:38.000000000","message":"Added a log line, but the log represents a generic error as a failure from cas returns \"false\" regardless if the failure if due to cas conflict or if the memcache server is down, etc.","commit_id":"8146b322ea6be3d17eece0b3b90fb187fba35308"}],"tests/test_backend_memcache.py":[{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"5b02ffeb6e877cc4168f26e620784e2246817a65","unresolved":false,"context_lines":[{"line_number":56,"context_line":"            raise memcache.Client.MemcachedStringEncodingError()"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"    def gets(self, key):"},{"line_number":59,"context_line":"        \"\"\"Call self.get() since we don\u0027t really do \u0027cas\u0027 here.\"\"\""},{"line_number":60,"context_line":"        return self.get(key)"},{"line_number":61,"context_line":""},{"line_number":62,"context_line":"    def get(self, key):"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAPX%2F%2F0F4%3D","line":59,"updated":"2013-06-09 15:14:34.000000000","message":"A docstring should be a description of what this function does. Suggest change to a comment.","commit_id":"8146b322ea6be3d17eece0b3b90fb187fba35308"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"f233d306671b27c48d26279b706140d19e8245f8","unresolved":false,"context_lines":[{"line_number":56,"context_line":"            raise memcache.Client.MemcachedStringEncodingError()"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"    def gets(self, key):"},{"line_number":59,"context_line":"        \"\"\"Call self.get() since we don\u0027t really do \u0027cas\u0027 here.\"\"\""},{"line_number":60,"context_line":"        return self.get(key)"},{"line_number":61,"context_line":""},{"line_number":62,"context_line":"    def get(self, key):"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAPX%2F%2Fzn8%3D","line":59,"in_reply_to":"AAAAPX%2F%2F0F4%3D","updated":"2013-06-10 07:31:38.000000000","message":"Done","commit_id":"8146b322ea6be3d17eece0b3b90fb187fba35308"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"5b02ffeb6e877cc4168f26e620784e2246817a65","unresolved":false,"context_lines":[{"line_number":65,"context_line":"        obj \u003d self.cache.get(key)"},{"line_number":66,"context_line":"        now \u003d utils.unixtime(timeutils.utcnow())"},{"line_number":67,"context_line":"        if obj and (obj[1] \u003d\u003d 0 or obj[1] \u003e now):"},{"line_number":68,"context_line":"            # NOTE(morganfainberg): This will behave more like memcache"},{"line_number":69,"context_line":"            # actually does and will prevent modification of the passed in"},{"line_number":70,"context_line":"            # reference from affecting the cached back-end data. This makes"},{"line_number":71,"context_line":"            # tests a little easier to write."}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAPX%2F%2F0Fw%3D","line":68,"updated":"2013-06-09 15:14:34.000000000","message":"change \"will behave\" to \"behaves\" . Otherwise it seems like something you\u0027re planning to do sometime rather than describing how it works.","commit_id":"8146b322ea6be3d17eece0b3b90fb187fba35308"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"f233d306671b27c48d26279b706140d19e8245f8","unresolved":false,"context_lines":[{"line_number":65,"context_line":"        obj \u003d self.cache.get(key)"},{"line_number":66,"context_line":"        now \u003d utils.unixtime(timeutils.utcnow())"},{"line_number":67,"context_line":"        if obj and (obj[1] \u003d\u003d 0 or obj[1] \u003e now):"},{"line_number":68,"context_line":"            # NOTE(morganfainberg): This will behave more like memcache"},{"line_number":69,"context_line":"            # actually does and will prevent modification of the passed in"},{"line_number":70,"context_line":"            # reference from affecting the cached back-end data. This makes"},{"line_number":71,"context_line":"            # tests a little easier to write."}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAPX%2F%2Fzn4%3D","line":68,"in_reply_to":"AAAAPX%2F%2F0Fw%3D","updated":"2013-06-10 07:31:38.000000000","message":"Done","commit_id":"8146b322ea6be3d17eece0b3b90fb187fba35308"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"5b02ffeb6e877cc4168f26e620784e2246817a65","unresolved":false,"context_lines":[{"line_number":66,"context_line":"        now \u003d utils.unixtime(timeutils.utcnow())"},{"line_number":67,"context_line":"        if obj and (obj[1] \u003d\u003d 0 or obj[1] \u003e now):"},{"line_number":68,"context_line":"            # NOTE(morganfainberg): This will behave more like memcache"},{"line_number":69,"context_line":"            # actually does and will prevent modification of the passed in"},{"line_number":70,"context_line":"            # reference from affecting the cached back-end data. This makes"},{"line_number":71,"context_line":"            # tests a little easier to write."},{"line_number":72,"context_line":"            #"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAPX%2F%2F0Fs%3D","line":69,"updated":"2013-06-09 15:14:34.000000000","message":"change \"will prevent\" to \"prevents\"","commit_id":"8146b322ea6be3d17eece0b3b90fb187fba35308"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"f233d306671b27c48d26279b706140d19e8245f8","unresolved":false,"context_lines":[{"line_number":66,"context_line":"        now \u003d utils.unixtime(timeutils.utcnow())"},{"line_number":67,"context_line":"        if obj and (obj[1] \u003d\u003d 0 or obj[1] \u003e now):"},{"line_number":68,"context_line":"            # NOTE(morganfainberg): This will behave more like memcache"},{"line_number":69,"context_line":"            # actually does and will prevent modification of the passed in"},{"line_number":70,"context_line":"            # reference from affecting the cached back-end data. This makes"},{"line_number":71,"context_line":"            # tests a little easier to write."},{"line_number":72,"context_line":"            #"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAPX%2F%2Fzn0%3D","line":69,"in_reply_to":"AAAAPX%2F%2F0Fs%3D","updated":"2013-06-10 07:31:38.000000000","message":"Done","commit_id":"8146b322ea6be3d17eece0b3b90fb187fba35308"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"5b02ffeb6e877cc4168f26e620784e2246817a65","unresolved":false,"context_lines":[{"line_number":90,"context_line":"        return True"},{"line_number":91,"context_line":""},{"line_number":92,"context_line":"    def cas(self, key, value, time\u003d0, min_compress_len\u003d0):"},{"line_number":93,"context_line":"        \"\"\"Call self.set() since we don\u0027t really do \u0027cas\u0027 here.\"\"\""},{"line_number":94,"context_line":"        if self.reject_cas:"},{"line_number":95,"context_line":"            return False"},{"line_number":96,"context_line":"        return self.set(key, value, time\u003dtime)"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAPX%2F%2F0Fo%3D","line":93,"updated":"2013-06-09 15:14:34.000000000","message":"change to a comment rather than docstring.","commit_id":"8146b322ea6be3d17eece0b3b90fb187fba35308"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"f233d306671b27c48d26279b706140d19e8245f8","unresolved":false,"context_lines":[{"line_number":90,"context_line":"        return True"},{"line_number":91,"context_line":""},{"line_number":92,"context_line":"    def cas(self, key, value, time\u003d0, min_compress_len\u003d0):"},{"line_number":93,"context_line":"        \"\"\"Call self.set() since we don\u0027t really do \u0027cas\u0027 here.\"\"\""},{"line_number":94,"context_line":"        if self.reject_cas:"},{"line_number":95,"context_line":"            return False"},{"line_number":96,"context_line":"        return self.set(key, value, time\u003dtime)"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAPX%2F%2Fznw%3D","line":93,"in_reply_to":"AAAAPX%2F%2F0Fo%3D","updated":"2013-06-10 07:31:38.000000000","message":"Done","commit_id":"8146b322ea6be3d17eece0b3b90fb187fba35308"}]}
