)]}'
{"keystone/common/cache/core.py":[{"author":{"_account_id":13055,"name":"Alexander Makarov","email":"ajiekcahdp.makapob@gmail.com","username":"amakarov"},"change_message_id":"afb5de386e64802c3a44505e04e7da35714217ad","unresolved":false,"context_lines":[{"line_number":36,"context_line":""},{"line_number":37,"context_line":"    @property"},{"line_number":38,"context_line":"    def region_id(self):"},{"line_number":39,"context_line":"        region_id \u003d self.get(self.region_key)"},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"        if not region_id:"},{"line_number":42,"context_line":"            region_id \u003d uuid.uuid4().hex"}],"source_content_type":"text/x-python","patch_set":6,"id":"1ac06dbe_9e525fdc","line":39,"updated":"2016-08-19 14:30:52.000000000","message":"It\u0027s better to use self.get_or_create here as it is protected against race conditions.","commit_id":"2bb786a494abf535c28058afe8ee621d5824617c"},{"author":{"_account_id":13478,"name":"Boris Bobrov","email":"b.bobrov@sap.com","username":"bbobrov"},"change_message_id":"1b4bfa355855c28d6890c9891b0178d8a0cfb3a8","unresolved":false,"context_lines":[{"line_number":40,"context_line":""},{"line_number":41,"context_line":"        if not region_id:"},{"line_number":42,"context_line":"            region_id \u003d uuid.uuid4().hex"},{"line_number":43,"context_line":"            # TODO(dstanek): this should last forever"},{"line_number":44,"context_line":"            self.set(self.region_key, region_id)"},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"        return region_id"}],"source_content_type":"text/x-python","patch_set":6,"id":"3ac371cc_53e040fa","line":43,"range":{"start_line":43,"start_character":12,"end_line":43,"end_character":53},"updated":"2016-08-17 17:23:25.000000000","message":"this comment doesn\u0027t make any sense to me. Doesn\u0027t it last forever? What is left to do?","commit_id":"2bb786a494abf535c28058afe8ee621d5824617c"},{"author":{"_account_id":13055,"name":"Alexander Makarov","email":"ajiekcahdp.makapob@gmail.com","username":"amakarov"},"change_message_id":"afb5de386e64802c3a44505e04e7da35714217ad","unresolved":false,"context_lines":[{"line_number":65,"context_line":"    def invalidate(self):"},{"line_number":66,"context_line":"        region_key \u003d self.region_key"},{"line_number":67,"context_line":"        self.delete(region_key)"},{"line_number":68,"context_line":"        new_region_id \u003d uuid.uuid4().hex"},{"line_number":69,"context_line":"        # TODO(dstanek): this should last forever"},{"line_number":70,"context_line":"        self.set(region_key, new_region_id)"},{"line_number":71,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"1ac06dbe_9ee41f3c","line":68,"updated":"2016-08-19 14:30:52.000000000","message":"Race condition is possible","commit_id":"2bb786a494abf535c28058afe8ee621d5824617c"},{"author":{"_account_id":11816,"name":"mike bayer","display_name":"Mike Bayer","email":"mike_mp@zzzcomputing.com","username":"zzzeek","status":"Red Hat"},"change_message_id":"4849de142b319cfdbd99cd5aef44db38268fd2de","unresolved":false,"context_lines":[{"line_number":28,"context_line":"CONF \u003d keystone.conf.CONF"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"class CacheRegion(dogpile.cache.CacheRegion):"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"    REGION_KEY_PREFIX \u003d \u0027\u003c\u003c\u003cregion\u003e\u003e\u003e:\u0027"},{"line_number":34,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"1ac06dbe_bb3d49bd","line":31,"updated":"2016-08-22 15:32:39.000000000","message":"CacheRegion shouldn\u0027t have to be subclassed.   At the very least, you can use the key mangler, or the ProxyBackend.  There\u0027s also the invalidationstrategy hook.   Anyway, you should use hooks and if you need a new one, it should be added to dogpile :).","commit_id":"f06de6caf468ed56d927aaa787b21a98dfa92427"},{"author":{"_account_id":11816,"name":"mike bayer","display_name":"Mike Bayer","email":"mike_mp@zzzcomputing.com","username":"zzzeek","status":"Red Hat"},"change_message_id":"4849de142b319cfdbd99cd5aef44db38268fd2de","unresolved":false,"context_lines":[{"line_number":73,"context_line":"        self.backend.set(self.region_key, new_region_id)"},{"line_number":74,"context_line":""},{"line_number":75,"context_line":"    def get(self, key):"},{"line_number":76,"context_line":"        key \u003d self._add_region_key_qualifier(key)"},{"line_number":77,"context_line":"        return self.backend.get(key)"},{"line_number":78,"context_line":""},{"line_number":79,"context_line":"    def set(self, key, value):"}],"source_content_type":"text/x-python","patch_set":7,"id":"1ac06dbe_fb19817a","line":76,"updated":"2016-08-22 15:32:39.000000000","message":"the key_mangler should be able to handle this, or if you want more control use ProxyBackend.","commit_id":"f06de6caf468ed56d927aaa787b21a98dfa92427"},{"author":{"_account_id":11816,"name":"mike bayer","display_name":"Mike Bayer","email":"mike_mp@zzzcomputing.com","username":"zzzeek","status":"Red Hat"},"change_message_id":"4849de142b319cfdbd99cd5aef44db38268fd2de","unresolved":false,"context_lines":[{"line_number":98,"context_line":"        self.backend.delete_multi(keys)"},{"line_number":99,"context_line":""},{"line_number":100,"context_line":""},{"line_number":101,"context_line":"dogpile.cache.CacheRegion \u003d CacheRegion"},{"line_number":102,"context_line":"dogpile.cache.region.CacheRegion \u003d CacheRegion"},{"line_number":103,"context_line":""},{"line_number":104,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"1ac06dbe_bbab89d5","line":101,"updated":"2016-08-22 15:32:39.000000000","message":"Even if you did have to subclass CacheRegion, it shouldn\u0027t be globally monkeypatched it into the dogpile library.","commit_id":"f06de6caf468ed56d927aaa787b21a98dfa92427"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"998c990d627a115b1ad00d457f558e7b9c0a2cc8","unresolved":false,"context_lines":[{"line_number":39,"context_line":"    @property"},{"line_number":40,"context_line":"    def region_id(self):"},{"line_number":41,"context_line":"        value \u003d self.backend.get(self.region_key)"},{"line_number":42,"context_line":"        if not value:"},{"line_number":43,"context_line":"            value \u003d uuid.uuid4().hex"},{"line_number":44,"context_line":"            # TODO(dstanek): this should last forever"},{"line_number":45,"context_line":"            self.backend.set(self.region_key, value)"},{"line_number":46,"context_line":"        return value"},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"    @property"}],"source_content_type":"text/x-python","patch_set":10,"id":"1ac06dbe_6f366653","line":45,"range":{"start_line":42,"start_character":0,"end_line":45,"end_character":52},"updated":"2016-08-22 17:40:30.000000000","message":"This may not work like you expect because the proxies (notably self.backend is a proxy if configured) could get in the way. Assuming self.backend is actually the backend isn\u0027t always safe in dogpile or oslo.cache.","commit_id":"3f5908102e1a373f36cbc5e5195142ab19da6cfd"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"12a1d0ed1da9e356e199b2ac44233e7cb34e4c76","unresolved":false,"context_lines":[{"line_number":39,"context_line":"    @property"},{"line_number":40,"context_line":"    def region_id(self):"},{"line_number":41,"context_line":"        value \u003d self.backend.get(self.region_key)"},{"line_number":42,"context_line":"        if not value:"},{"line_number":43,"context_line":"            value \u003d uuid.uuid4().hex"},{"line_number":44,"context_line":"            # TODO(dstanek): this should last forever"},{"line_number":45,"context_line":"            self.backend.set(self.region_key, value)"},{"line_number":46,"context_line":"        return value"},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"    @property"}],"source_content_type":"text/x-python","patch_set":10,"id":"1ac06dbe_2917fc48","line":45,"range":{"start_line":42,"start_character":0,"end_line":45,"end_character":52},"in_reply_to":"1ac06dbe_6f366653","updated":"2016-08-23 17:42:42.000000000","message":"The goal here was really to just bypass the key_mangler logic in the case of a region key. Those should not get the same treatment as regular keys. That being said, this has been removed in favor of using get_or_create.","commit_id":"3f5908102e1a373f36cbc5e5195142ab19da6cfd"},{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"03eaff80dea16a6bab3982d3e0e6570806c051f4","unresolved":false,"context_lines":[{"line_number":54,"context_line":""},{"line_number":55,"context_line":"class DistributedInvalidationStrategy(region.RegionInvalidationStrategy):"},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"    def __init__(self, region):"},{"line_number":58,"context_line":"        self._region \u003d region"},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"    def invalidate(self, hard\u003dNone):"}],"source_content_type":"text/x-python","patch_set":11,"id":"1ac06dbe_97407d37","line":57,"range":{"start_line":57,"start_character":23,"end_line":57,"end_character":29},"updated":"2016-08-24 18:16:28.000000000","message":"it is a region manager, not a region","commit_id":"0465cab4870af749613f04b79d4230882adc0318"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"5bdd8ada7f463caeb087c6a45f879901c5548c80","unresolved":false,"context_lines":[{"line_number":54,"context_line":""},{"line_number":55,"context_line":"class DistributedInvalidationStrategy(region.RegionInvalidationStrategy):"},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"    def __init__(self, region):"},{"line_number":58,"context_line":"        self._region \u003d region"},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"    def invalidate(self, hard\u003dNone):"}],"source_content_type":"text/x-python","patch_set":11,"id":"fa7ab95a_8c05e1c3","line":57,"range":{"start_line":57,"start_character":23,"end_line":57,"end_character":29},"in_reply_to":"1ac06dbe_97407d37","updated":"2016-08-26 13:51:10.000000000","message":"Done","commit_id":"0465cab4870af749613f04b79d4230882adc0318"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"cbfb3754d789766f8a64ccca6a813fbc76c07812","unresolved":false,"context_lines":[{"line_number":76,"context_line":"        return False"},{"line_number":77,"context_line":""},{"line_number":78,"context_line":""},{"line_number":79,"context_line":"def key_manger_factory(invalidation_manager, orig_key_mangler):"},{"line_number":80,"context_line":"    def key_mangler(key):"},{"line_number":81,"context_line":"        if not invalidation_manager.is_region_key(key):"},{"line_number":82,"context_line":"            key \u003d \u0027%s:%s\u0027 % (key, invalidation_manager.region_id)"}],"source_content_type":"text/x-python","patch_set":11,"id":"1ac06dbe_1bdcc645","line":79,"updated":"2016-08-24 14:59:27.000000000","message":"key_mangler_factory()*?","commit_id":"0465cab4870af749613f04b79d4230882adc0318"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"79a85eff24ad2bb8a9ca41494cba1bd3f05ce528","unresolved":false,"context_lines":[{"line_number":76,"context_line":"        return False"},{"line_number":77,"context_line":""},{"line_number":78,"context_line":""},{"line_number":79,"context_line":"def key_manger_factory(invalidation_manager, orig_key_mangler):"},{"line_number":80,"context_line":"    def key_mangler(key):"},{"line_number":81,"context_line":"        if not invalidation_manager.is_region_key(key):"},{"line_number":82,"context_line":"            key \u003d \u0027%s:%s\u0027 % (key, invalidation_manager.region_id)"}],"source_content_type":"text/x-python","patch_set":11,"id":"1ac06dbe_2f0e97e5","line":79,"in_reply_to":"1ac06dbe_1bdcc645","updated":"2016-08-24 17:00:29.000000000","message":"Exactly. It\u0027s a factory function that when called returns a key mangler. Since the key mangler is defined *inside* the factory it has access to the factory\u0027s arguments.","commit_id":"0465cab4870af749613f04b79d4230882adc0318"},{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"7922cbe7b9603ba73e4600c6f3637598bd2dec3c","unresolved":false,"context_lines":[{"line_number":79,"context_line":"def key_manger_factory(invalidation_manager, orig_key_mangler):"},{"line_number":80,"context_line":"    def key_mangler(key):"},{"line_number":81,"context_line":"        if not invalidation_manager.is_region_key(key):"},{"line_number":82,"context_line":"            key \u003d \u0027%s:%s\u0027 % (key, invalidation_manager.region_id)"},{"line_number":83,"context_line":"        if orig_key_mangler:"},{"line_number":84,"context_line":"            key \u003d orig_key_mangler(key)"},{"line_number":85,"context_line":"        return key"}],"source_content_type":"text/x-python","patch_set":11,"id":"1ac06dbe_af61e7d5","line":82,"range":{"start_line":82,"start_character":18,"end_line":82,"end_character":65},"updated":"2016-08-24 16:55:32.000000000","message":"why this if the provided key is not valid ?","commit_id":"0465cab4870af749613f04b79d4230882adc0318"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"0503d7050aa290ca631de87729f66d3399e45033","unresolved":false,"context_lines":[{"line_number":79,"context_line":"def key_manger_factory(invalidation_manager, orig_key_mangler):"},{"line_number":80,"context_line":"    def key_mangler(key):"},{"line_number":81,"context_line":"        if not invalidation_manager.is_region_key(key):"},{"line_number":82,"context_line":"            key \u003d \u0027%s:%s\u0027 % (key, invalidation_manager.region_id)"},{"line_number":83,"context_line":"        if orig_key_mangler:"},{"line_number":84,"context_line":"            key \u003d orig_key_mangler(key)"},{"line_number":85,"context_line":"        return key"}],"source_content_type":"text/x-python","patch_set":11,"id":"1ac06dbe_d46b1384","line":82,"range":{"start_line":82,"start_character":18,"end_line":82,"end_character":65},"in_reply_to":"1ac06dbe_34a9c7e0","updated":"2016-08-24 18:03:45.000000000","message":"Exactly. All keys will effectively go through the key mangler and we need to make sure we only mess with the ones that don\u0027t store the region id.","commit_id":"0465cab4870af749613f04b79d4230882adc0318"},{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"9cf74d134f7d2c167ff13a876e62765526873097","unresolved":false,"context_lines":[{"line_number":79,"context_line":"def key_manger_factory(invalidation_manager, orig_key_mangler):"},{"line_number":80,"context_line":"    def key_mangler(key):"},{"line_number":81,"context_line":"        if not invalidation_manager.is_region_key(key):"},{"line_number":82,"context_line":"            key \u003d \u0027%s:%s\u0027 % (key, invalidation_manager.region_id)"},{"line_number":83,"context_line":"        if orig_key_mangler:"},{"line_number":84,"context_line":"            key \u003d orig_key_mangler(key)"},{"line_number":85,"context_line":"        return key"}],"source_content_type":"text/x-python","patch_set":11,"id":"1ac06dbe_b45137db","line":82,"range":{"start_line":82,"start_character":18,"end_line":82,"end_character":65},"in_reply_to":"1ac06dbe_34a9c7e0","updated":"2016-08-24 18:03:18.000000000","message":"If everything will use the region_id, why would we want to  \" leave it alone and not add the region id\" ?","commit_id":"0465cab4870af749613f04b79d4230882adc0318"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"5bdd8ada7f463caeb087c6a45f879901c5548c80","unresolved":false,"context_lines":[{"line_number":79,"context_line":"def key_manger_factory(invalidation_manager, orig_key_mangler):"},{"line_number":80,"context_line":"    def key_mangler(key):"},{"line_number":81,"context_line":"        if not invalidation_manager.is_region_key(key):"},{"line_number":82,"context_line":"            key \u003d \u0027%s:%s\u0027 % (key, invalidation_manager.region_id)"},{"line_number":83,"context_line":"        if orig_key_mangler:"},{"line_number":84,"context_line":"            key \u003d orig_key_mangler(key)"},{"line_number":85,"context_line":"        return key"}],"source_content_type":"text/x-python","patch_set":11,"id":"fa7ab95a_ecb02df7","line":82,"range":{"start_line":82,"start_character":18,"end_line":82,"end_character":65},"in_reply_to":"1ac06dbe_37454917","updated":"2016-08-26 13:51:10.000000000","message":"Done","commit_id":"0465cab4870af749613f04b79d4230882adc0318"},{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"f79869d3e5e2ed94a89329780c8eb6e01fc1bb50","unresolved":false,"context_lines":[{"line_number":79,"context_line":"def key_manger_factory(invalidation_manager, orig_key_mangler):"},{"line_number":80,"context_line":"    def key_mangler(key):"},{"line_number":81,"context_line":"        if not invalidation_manager.is_region_key(key):"},{"line_number":82,"context_line":"            key \u003d \u0027%s:%s\u0027 % (key, invalidation_manager.region_id)"},{"line_number":83,"context_line":"        if orig_key_mangler:"},{"line_number":84,"context_line":"            key \u003d orig_key_mangler(key)"},{"line_number":85,"context_line":"        return key"}],"source_content_type":"text/x-python","patch_set":11,"id":"1ac06dbe_37454917","line":82,"range":{"start_line":82,"start_character":18,"end_line":82,"end_character":65},"in_reply_to":"1ac06dbe_54344349","updated":"2016-08-24 18:19:18.000000000","message":"I think adding comments here in the mangler would help to understand what\u0027s going on. Also, adding docstrings to the class above (region manager and invalidation strategy)","commit_id":"0465cab4870af749613f04b79d4230882adc0318"},{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"15c1f0dd8271f3c9b6c815907019ac7e5ec00a39","unresolved":false,"context_lines":[{"line_number":79,"context_line":"def key_manger_factory(invalidation_manager, orig_key_mangler):"},{"line_number":80,"context_line":"    def key_mangler(key):"},{"line_number":81,"context_line":"        if not invalidation_manager.is_region_key(key):"},{"line_number":82,"context_line":"            key \u003d \u0027%s:%s\u0027 % (key, invalidation_manager.region_id)"},{"line_number":83,"context_line":"        if orig_key_mangler:"},{"line_number":84,"context_line":"            key \u003d orig_key_mangler(key)"},{"line_number":85,"context_line":"        return key"}],"source_content_type":"text/x-python","patch_set":11,"id":"1ac06dbe_34a9c7e0","line":82,"range":{"start_line":82,"start_character":18,"end_line":82,"end_character":65},"in_reply_to":"1ac06dbe_af19e724","updated":"2016-08-24 18:01:18.000000000","message":"If it is a region key, it is a call to get the region_id, right?","commit_id":"0465cab4870af749613f04b79d4230882adc0318"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"79a85eff24ad2bb8a9ca41494cba1bd3f05ce528","unresolved":false,"context_lines":[{"line_number":79,"context_line":"def key_manger_factory(invalidation_manager, orig_key_mangler):"},{"line_number":80,"context_line":"    def key_mangler(key):"},{"line_number":81,"context_line":"        if not invalidation_manager.is_region_key(key):"},{"line_number":82,"context_line":"            key \u003d \u0027%s:%s\u0027 % (key, invalidation_manager.region_id)"},{"line_number":83,"context_line":"        if orig_key_mangler:"},{"line_number":84,"context_line":"            key \u003d orig_key_mangler(key)"},{"line_number":85,"context_line":"        return key"}],"source_content_type":"text/x-python","patch_set":11,"id":"1ac06dbe_af19e724","line":82,"range":{"start_line":82,"start_character":18,"end_line":82,"end_character":65},"in_reply_to":"1ac06dbe_af61e7d5","updated":"2016-08-24 17:00:29.000000000","message":"It\u0027s not check if the key is valid, it\u0027s check if it\u0027s a region key. If it is we want to leave it alone and not add the region id.","commit_id":"0465cab4870af749613f04b79d4230882adc0318"},{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"308f862139d1375dced9e3aaed7f3735e38268b4","unresolved":false,"context_lines":[{"line_number":79,"context_line":"def key_manger_factory(invalidation_manager, orig_key_mangler):"},{"line_number":80,"context_line":"    def key_mangler(key):"},{"line_number":81,"context_line":"        if not invalidation_manager.is_region_key(key):"},{"line_number":82,"context_line":"            key \u003d \u0027%s:%s\u0027 % (key, invalidation_manager.region_id)"},{"line_number":83,"context_line":"        if orig_key_mangler:"},{"line_number":84,"context_line":"            key \u003d orig_key_mangler(key)"},{"line_number":85,"context_line":"        return key"}],"source_content_type":"text/x-python","patch_set":11,"id":"1ac06dbe_54344349","line":82,"range":{"start_line":82,"start_character":18,"end_line":82,"end_character":65},"in_reply_to":"1ac06dbe_d46b1384","updated":"2016-08-24 18:08:56.000000000","message":"Ok, so the region key will also go through this mangler, even if you call the invalidation_namanger.region_id directly","commit_id":"0465cab4870af749613f04b79d4230882adc0318"},{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"7922cbe7b9603ba73e4600c6f3637598bd2dec3c","unresolved":false,"context_lines":[{"line_number":80,"context_line":"    def key_mangler(key):"},{"line_number":81,"context_line":"        if not invalidation_manager.is_region_key(key):"},{"line_number":82,"context_line":"            key \u003d \u0027%s:%s\u0027 % (key, invalidation_manager.region_id)"},{"line_number":83,"context_line":"        if orig_key_mangler:"},{"line_number":84,"context_line":"            key \u003d orig_key_mangler(key)"},{"line_number":85,"context_line":"        return key"},{"line_number":86,"context_line":"    return key_mangler"}],"source_content_type":"text/x-python","patch_set":11,"id":"1ac06dbe_ef991fd2","line":83,"range":{"start_line":83,"start_character":8,"end_line":83,"end_character":27},"updated":"2016-08-24 16:55:32.000000000","message":"should be elif ?","commit_id":"0465cab4870af749613f04b79d4230882adc0318"},{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"f79869d3e5e2ed94a89329780c8eb6e01fc1bb50","unresolved":false,"context_lines":[{"line_number":80,"context_line":"    def key_mangler(key):"},{"line_number":81,"context_line":"        if not invalidation_manager.is_region_key(key):"},{"line_number":82,"context_line":"            key \u003d \u0027%s:%s\u0027 % (key, invalidation_manager.region_id)"},{"line_number":83,"context_line":"        if orig_key_mangler:"},{"line_number":84,"context_line":"            key \u003d orig_key_mangler(key)"},{"line_number":85,"context_line":"        return key"},{"line_number":86,"context_line":"    return key_mangler"}],"source_content_type":"text/x-python","patch_set":11,"id":"1ac06dbe_377269ae","line":83,"range":{"start_line":83,"start_character":8,"end_line":83,"end_character":27},"in_reply_to":"1ac06dbe_4fcaf36f","updated":"2016-08-24 18:19:18.000000000","message":"++","commit_id":"0465cab4870af749613f04b79d4230882adc0318"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"79a85eff24ad2bb8a9ca41494cba1bd3f05ce528","unresolved":false,"context_lines":[{"line_number":80,"context_line":"    def key_mangler(key):"},{"line_number":81,"context_line":"        if not invalidation_manager.is_region_key(key):"},{"line_number":82,"context_line":"            key \u003d \u0027%s:%s\u0027 % (key, invalidation_manager.region_id)"},{"line_number":83,"context_line":"        if orig_key_mangler:"},{"line_number":84,"context_line":"            key \u003d orig_key_mangler(key)"},{"line_number":85,"context_line":"        return key"},{"line_number":86,"context_line":"    return key_mangler"}],"source_content_type":"text/x-python","patch_set":11,"id":"1ac06dbe_4fcaf36f","line":83,"range":{"start_line":83,"start_character":8,"end_line":83,"end_character":27},"in_reply_to":"1ac06dbe_ef991fd2","updated":"2016-08-24 17:00:29.000000000","message":"This \u0027if\u0027 completely unrelated to the previous \u0027if\u0027. It\u0027s checking to see there there was a key mangler previously set and it so uses it. This way our key mangler is nothing more than a wrapper around it.","commit_id":"0465cab4870af749613f04b79d4230882adc0318"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"cbfb3754d789766f8a64ccca6a813fbc76c07812","unresolved":false,"context_lines":[{"line_number":83,"context_line":"        if orig_key_mangler:"},{"line_number":84,"context_line":"            key \u003d orig_key_mangler(key)"},{"line_number":85,"context_line":"        return key"},{"line_number":86,"context_line":"    return key_mangler"},{"line_number":87,"context_line":""},{"line_number":88,"context_line":""},{"line_number":89,"context_line":"def create_region(name):"}],"source_content_type":"text/x-python","patch_set":11,"id":"1ac06dbe_dbc50e0b","line":86,"updated":"2016-08-24 14:59:27.000000000","message":"why do we just return the function here?","commit_id":"0465cab4870af749613f04b79d4230882adc0318"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"79a85eff24ad2bb8a9ca41494cba1bd3f05ce528","unresolved":false,"context_lines":[{"line_number":83,"context_line":"        if orig_key_mangler:"},{"line_number":84,"context_line":"            key \u003d orig_key_mangler(key)"},{"line_number":85,"context_line":"        return key"},{"line_number":86,"context_line":"    return key_mangler"},{"line_number":87,"context_line":""},{"line_number":88,"context_line":""},{"line_number":89,"context_line":"def create_region(name):"}],"source_content_type":"text/x-python","patch_set":11,"id":"1ac06dbe_afc72763","line":86,"in_reply_to":"1ac06dbe_dbc50e0b","updated":"2016-08-24 17:00:29.000000000","message":"See above","commit_id":"0465cab4870af749613f04b79d4230882adc0318"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"232b60218dc8dfcfbe58319344bdde75fe192b94","unresolved":false,"context_lines":[{"line_number":104,"context_line":""},{"line_number":105,"context_line":""},{"line_number":106,"context_line":"CACHE_REGION \u003d create_region(name\u003d\u0027shared default\u0027)"},{"line_number":107,"context_line":"CACHE_INVALIDATION_REGION \u003d create_region(name\u003d\u0027invalidation region\u0027)"},{"line_number":108,"context_line":""},{"line_number":109,"context_line":"register_model_handler \u003d _context_cache._register_model_handler"},{"line_number":110,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"1ac06dbe_38f8adc4","line":107,"updated":"2016-08-24 14:47:29.000000000","message":"We shouldn\u0027t need to pass this as a kwarg - name should just be required according to the method signature. Unless we have it here for the sake of readability?","commit_id":"0465cab4870af749613f04b79d4230882adc0318"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"79a85eff24ad2bb8a9ca41494cba1bd3f05ce528","unresolved":false,"context_lines":[{"line_number":104,"context_line":""},{"line_number":105,"context_line":""},{"line_number":106,"context_line":"CACHE_REGION \u003d create_region(name\u003d\u0027shared default\u0027)"},{"line_number":107,"context_line":"CACHE_INVALIDATION_REGION \u003d create_region(name\u003d\u0027invalidation region\u0027)"},{"line_number":108,"context_line":""},{"line_number":109,"context_line":"register_model_handler \u003d _context_cache._register_model_handler"},{"line_number":110,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"1ac06dbe_76199179","line":107,"in_reply_to":"1ac06dbe_38f8adc4","updated":"2016-08-24 17:00:29.000000000","message":"Just readability.","commit_id":"0465cab4870af749613f04b79d4230882adc0318"},{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"c508600a5da83fab9329a8283c3a08e17dfd0cad","unresolved":false,"context_lines":[{"line_number":138,"context_line":"    if CACHE_INVALIDATION_REGION.is_configured:"},{"line_number":139,"context_line":"        return"},{"line_number":140,"context_line":""},{"line_number":141,"context_line":"    # NOTE(dstanek): Configuring this region manually so that we control the"},{"line_number":142,"context_line":"    # expiration and can ensure that the keys don\u0027t expire."},{"line_number":143,"context_line":"    CACHE_INVALIDATION_REGION.configure("},{"line_number":144,"context_line":"        backend\u003dCONF.cache.backend,"},{"line_number":145,"context_line":"        expiration_time\u003dNone)"},{"line_number":146,"context_line":""},{"line_number":147,"context_line":""},{"line_number":148,"context_line":"def get_memoization_decorator(group, expiration_group\u003dNone, region\u003dNone):"}],"source_content_type":"text/x-python","patch_set":12,"id":"fa7ab95a_fd936ea1","line":145,"range":{"start_line":141,"start_character":0,"end_line":145,"end_character":29},"updated":"2016-08-26 16:40:59.000000000","message":"perhaps we are not configuring it the right way. jenkins is not happy:\n\nhttp://logs.openstack.org/04/349704/12/check/gate-tempest-dsvm-neutron-full-ubuntu-xenial/a4fc1da/logs/devstacklog.txt.gz#_2016-08-26_14_07_08_262","commit_id":"ec2b11ea56d47e1304e14f17a3af55d35d56b3ef"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"a60bcc2636c3fffb7e3b7e1847fa6dc5e18a4159","unresolved":false,"context_lines":[{"line_number":140,"context_line":""},{"line_number":141,"context_line":"    # NOTE(dstanek): Configuring this region manually so that we control the"},{"line_number":142,"context_line":"    # expiration and can ensure that the keys don\u0027t expire."},{"line_number":143,"context_line":"    config_dict \u003d cache._build_cache_config(CONF)"},{"line_number":144,"context_line":"    config_dict[\u0027expiration_time\u0027] \u003d None  # we don\u0027t want an expiration"},{"line_number":145,"context_line":""},{"line_number":146,"context_line":"    CACHE_INVALIDATION_REGION.configure_from_config("}],"source_content_type":"text/x-python","patch_set":13,"id":"fa7ab95a_34424811","line":143,"updated":"2016-08-26 19:14:06.000000000","message":"I don\u0027t like this, but I didn\u0027t want to copy all of that code into this module.","commit_id":"db4aafcbf7d3cb158b738e9e41444dba805b3f98"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"b73398cb7860eda97bebfc59fab79c45bedb69ac","unresolved":false,"context_lines":[{"line_number":133,"context_line":"            region_manager, region.key_mangler)"},{"line_number":134,"context_line":"        region.region_invalidator \u003d DistributedInvalidationStrategy("},{"line_number":135,"context_line":"            region_manager)"},{"line_number":136,"context_line":""},{"line_number":137,"context_line":"def _sha1_mangle_key(key):"},{"line_number":138,"context_line":"    \"\"\"Wrapper for dogpile\u0027s sha1_mangle_key."},{"line_number":139,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"fa7ab95a_0c26c214","line":136,"updated":"2016-08-29 17:15:30.000000000","message":"Just need another new line here and we should be good to go from a pep perspective.","commit_id":"f5f0203bccee5157ac869a01c6a7716412a369bc"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"aef60e84d7db16cccb537bba21f3ba05f9a59b69","unresolved":false,"context_lines":[{"line_number":28,"context_line":"CONF \u003d keystone.conf.CONF"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"class RegionInvalidationManager(object):"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"    REGION_KEY_PREFIX \u003d \u0027\u003c\u003c\u003cregion\u003e\u003e\u003e:\u0027"},{"line_number":34,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"fa7ab95a_63dcb473","line":31,"updated":"2016-08-29 19:38:02.000000000","message":"Doc string, please!","commit_id":"42eda48c78f1153081b4c193dc13c88561409fd3"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"aef60e84d7db16cccb537bba21f3ba05f9a59b69","unresolved":false,"context_lines":[{"line_number":53,"context_line":"        return key \u003d\u003d self._region_key"},{"line_number":54,"context_line":""},{"line_number":55,"context_line":""},{"line_number":56,"context_line":"class DistributedInvalidationStrategy(region.RegionInvalidationStrategy):"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"    def __init__(self, region_manager):"},{"line_number":59,"context_line":"        self._region_manager \u003d region_manager"}],"source_content_type":"text/x-python","patch_set":15,"id":"fa7ab95a_83e53839","line":56,"updated":"2016-08-29 19:38:02.000000000","message":"Doc string, please!","commit_id":"42eda48c78f1153081b4c193dc13c88561409fd3"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"aef60e84d7db16cccb537bba21f3ba05f9a59b69","unresolved":false,"context_lines":[{"line_number":77,"context_line":"        return False"},{"line_number":78,"context_line":""},{"line_number":79,"context_line":""},{"line_number":80,"context_line":"def key_manger_factory(invalidation_manager, orig_key_mangler):"},{"line_number":81,"context_line":"    def key_mangler(key):"},{"line_number":82,"context_line":"        # NOTE(dstanek): Since *all* keys go through the key mangler we"},{"line_number":83,"context_line":"        # need to make sure the region keys don\u0027t get the region_id added."}],"source_content_type":"text/x-python","patch_set":15,"id":"fa7ab95a_4856ef5c","line":80,"updated":"2016-08-29 19:38:02.000000000","message":"Aww, that\u0027s a cute name!","commit_id":"42eda48c78f1153081b4c193dc13c88561409fd3"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"aef60e84d7db16cccb537bba21f3ba05f9a59b69","unresolved":false,"context_lines":[{"line_number":104,"context_line":""},{"line_number":105,"context_line":"    \"\"\""},{"line_number":106,"context_line":"    region \u003d cache.create_region()"},{"line_number":107,"context_line":"    region.name \u003d name  # oslo.cache doesn\u0027t allow this yet"},{"line_number":108,"context_line":"    return region"},{"line_number":109,"context_line":""},{"line_number":110,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"fa7ab95a_083947f2","line":107,"updated":"2016-08-29 19:38:02.000000000","message":"Any sort of reference (bug / bp / spec / discussion) here would be appreciated, so this code can be more easily updated later.","commit_id":"42eda48c78f1153081b4c193dc13c88561409fd3"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"aef60e84d7db16cccb537bba21f3ba05f9a59b69","unresolved":false,"context_lines":[{"line_number":152,"context_line":"    return util.sha1_mangle_key(key)"},{"line_number":153,"context_line":""},{"line_number":154,"context_line":""},{"line_number":155,"context_line":"def configure_invalidation_region():"},{"line_number":156,"context_line":"    if CACHE_INVALIDATION_REGION.is_configured:"},{"line_number":157,"context_line":"        return"},{"line_number":158,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"fa7ab95a_c35f40e3","line":155,"updated":"2016-08-29 19:38:02.000000000","message":"Doc string, please! Specifically, it\u0027s not obvious when this should (or should not) be called.","commit_id":"42eda48c78f1153081b4c193dc13c88561409fd3"}],"keystone/tests/unit/common/test_cache.py":[{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"4576791d780d9a83c60b572aae107b347602ea10","unresolved":false,"context_lines":[{"line_number":43,"context_line":""},{"line_number":44,"context_line":"        self.region_name \u003d uuid.uuid4().hex"},{"line_number":45,"context_line":"        self.region0 \u003d cache.create_region(\u0027test_region\u0027)"},{"line_number":46,"context_line":"        self.region1 \u003d cache.create_region(\u0027test_region\u0027)"},{"line_number":47,"context_line":"        cache.configure_cache(region\u003dself.region0)"},{"line_number":48,"context_line":"        cache.configure_cache(region\u003dself.region1)"},{"line_number":49,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"1ac06dbe_f707317f","line":46,"range":{"start_line":46,"start_character":44,"end_line":46,"end_character":55},"updated":"2016-08-24 18:34:13.000000000","message":"same name as region0?","commit_id":"0465cab4870af749613f04b79d4230882adc0318"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"5bdd8ada7f463caeb087c6a45f879901c5548c80","unresolved":false,"context_lines":[{"line_number":43,"context_line":""},{"line_number":44,"context_line":"        self.region_name \u003d uuid.uuid4().hex"},{"line_number":45,"context_line":"        self.region0 \u003d cache.create_region(\u0027test_region\u0027)"},{"line_number":46,"context_line":"        self.region1 \u003d cache.create_region(\u0027test_region\u0027)"},{"line_number":47,"context_line":"        cache.configure_cache(region\u003dself.region0)"},{"line_number":48,"context_line":"        cache.configure_cache(region\u003dself.region1)"},{"line_number":49,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"fa7ab95a_0ca471a4","line":46,"range":{"start_line":46,"start_character":44,"end_line":46,"end_character":55},"in_reply_to":"1ac06dbe_f707317f","updated":"2016-08-26 13:51:10.000000000","message":"Yes, this is to mimic two different processes. Invalidating one should invalidate the other.","commit_id":"0465cab4870af749613f04b79d4230882adc0318"},{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"4576791d780d9a83c60b572aae107b347602ea10","unresolved":false,"context_lines":[{"line_number":126,"context_line":"        # ensure they are gone"},{"line_number":127,"context_line":"        self._assert_has_no_value(self.region0.get_multi(keys))"},{"line_number":128,"context_line":""},{"line_number":129,"context_line":"    def test_memoize_decorator_when_invalidating_the_region(self):"},{"line_number":130,"context_line":"        memoize \u003d cache.get_memoization_decorator(\u0027cache\u0027, region\u003dself.region0)"},{"line_number":131,"context_line":""},{"line_number":132,"context_line":"        @memoize"}],"source_content_type":"text/x-python","patch_set":11,"id":"1ac06dbe_97887dc8","line":129,"range":{"start_line":129,"start_character":8,"end_line":129,"end_character":59},"updated":"2016-08-24 18:34:13.000000000","message":"nice test!","commit_id":"0465cab4870af749613f04b79d4230882adc0318"},{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"4576791d780d9a83c60b572aae107b347602ea10","unresolved":false,"context_lines":[{"line_number":163,"context_line":"        self.region0.set(key, simple_value)"},{"line_number":164,"context_line":"        self.assertEqual(simple_value, self.region0.get(key))"},{"line_number":165,"context_line":""},{"line_number":166,"context_line":"        self.region1.invalidate()"},{"line_number":167,"context_line":""},{"line_number":168,"context_line":"        # ensure that the decorated function returns a new value"},{"line_number":169,"context_line":"        new_value \u003d func(key)"}],"source_content_type":"text/x-python","patch_set":11,"id":"1ac06dbe_92124b57","line":166,"range":{"start_line":166,"start_character":8,"end_line":166,"end_character":33},"updated":"2016-08-24 18:34:13.000000000","message":"why invalidate region1? we\u0027re using region0 here, no?","commit_id":"0465cab4870af749613f04b79d4230882adc0318"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"5bdd8ada7f463caeb087c6a45f879901c5548c80","unresolved":false,"context_lines":[{"line_number":163,"context_line":"        self.region0.set(key, simple_value)"},{"line_number":164,"context_line":"        self.assertEqual(simple_value, self.region0.get(key))"},{"line_number":165,"context_line":""},{"line_number":166,"context_line":"        self.region1.invalidate()"},{"line_number":167,"context_line":""},{"line_number":168,"context_line":"        # ensure that the decorated function returns a new value"},{"line_number":169,"context_line":"        new_value \u003d func(key)"}],"source_content_type":"text/x-python","patch_set":11,"id":"fa7ab95a_ec3aed35","line":166,"range":{"start_line":166,"start_character":8,"end_line":166,"end_character":33},"in_reply_to":"1ac06dbe_92124b57","updated":"2016-08-26 13:51:10.000000000","message":"I added a comment here to explain","commit_id":"0465cab4870af749613f04b79d4230882adc0318"},{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"4576791d780d9a83c60b572aae107b347602ea10","unresolved":false,"context_lines":[{"line_number":167,"context_line":""},{"line_number":168,"context_line":"        # ensure that the decorated function returns a new value"},{"line_number":169,"context_line":"        new_value \u003d func(key)"},{"line_number":170,"context_line":"        self.assertNotEqual(return_value, new_value)"},{"line_number":171,"context_line":""},{"line_number":172,"context_line":"        # ensure that a get doesn\u0027t have a value"},{"line_number":173,"context_line":"        self.assertIsInstance(self.region0.get(key), dogpile.NoValue)"}],"source_content_type":"text/x-python","patch_set":11,"id":"1ac06dbe_f71bb17e","line":170,"updated":"2016-08-24 18:34:13.000000000","message":"make sure the new value is simple_value, because you just set that directly in the cache in L163\n\nadd another check:\n\nself.assertEqual(simple_value, new_value)","commit_id":"0465cab4870af749613f04b79d4230882adc0318"},{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"4576791d780d9a83c60b572aae107b347602ea10","unresolved":false,"context_lines":[{"line_number":169,"context_line":"        new_value \u003d func(key)"},{"line_number":170,"context_line":"        self.assertNotEqual(return_value, new_value)"},{"line_number":171,"context_line":""},{"line_number":172,"context_line":"        # ensure that a get doesn\u0027t have a value"},{"line_number":173,"context_line":"        self.assertIsInstance(self.region0.get(key), dogpile.NoValue)"},{"line_number":174,"context_line":""},{"line_number":175,"context_line":"    def test_direct_region_key_invalidation(self):"}],"source_content_type":"text/x-python","patch_set":11,"id":"1ac06dbe_d705d514","line":172,"range":{"start_line":172,"start_character":10,"end_line":172,"end_character":48},"updated":"2016-08-24 18:34:13.000000000","message":"why?","commit_id":"0465cab4870af749613f04b79d4230882adc0318"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"5bdd8ada7f463caeb087c6a45f879901c5548c80","unresolved":false,"context_lines":[{"line_number":169,"context_line":"        new_value \u003d func(key)"},{"line_number":170,"context_line":"        self.assertNotEqual(return_value, new_value)"},{"line_number":171,"context_line":""},{"line_number":172,"context_line":"        # ensure that a get doesn\u0027t have a value"},{"line_number":173,"context_line":"        self.assertIsInstance(self.region0.get(key), dogpile.NoValue)"},{"line_number":174,"context_line":""},{"line_number":175,"context_line":"    def test_direct_region_key_invalidation(self):"}],"source_content_type":"text/x-python","patch_set":11,"id":"fa7ab95a_2c8775b6","line":172,"range":{"start_line":172,"start_character":10,"end_line":172,"end_character":48},"in_reply_to":"1ac06dbe_d705d514","updated":"2016-08-26 13:51:10.000000000","message":"On line 166 we invalidated the region. So both the key stored by the decorator (line 170) and the key stored by the simple set (line below) should be invalid.","commit_id":"0465cab4870af749613f04b79d4230882adc0318"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"aef60e84d7db16cccb537bba21f3ba05f9a59b69","unresolved":false,"context_lines":[{"line_number":70,"context_line":""},{"line_number":71,"context_line":"        # invalidating region1 should invalidate region0"},{"line_number":72,"context_line":"        self.region1.invalidate()"},{"line_number":73,"context_line":"        self.assertIsInstance(self.region0.get(key), dogpile.NoValue)"},{"line_number":74,"context_line":""},{"line_number":75,"context_line":"    def test_region_singular_methods_delete(self):"},{"line_number":76,"context_line":"        key \u003d uuid.uuid4().hex"}],"source_content_type":"text/x-python","patch_set":15,"id":"fa7ab95a_83c29832","line":73,"updated":"2016-08-29 19:38:02.000000000","message":"++","commit_id":"42eda48c78f1153081b4c193dc13c88561409fd3"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"aef60e84d7db16cccb537bba21f3ba05f9a59b69","unresolved":false,"context_lines":[{"line_number":137,"context_line":""},{"line_number":138,"context_line":"        # test get/set"},{"line_number":139,"context_line":"        return_value \u003d func(key)"},{"line_number":140,"context_line":"        # the values should be the same since it comes from the cache"},{"line_number":141,"context_line":"        self.assertEqual(return_value, func(key))"},{"line_number":142,"context_line":""},{"line_number":143,"context_line":"        # invalidating region1 should invalidate region0"}],"source_content_type":"text/x-python","patch_set":15,"id":"fa7ab95a_f5223ba2","line":140,"updated":"2016-08-29 19:38:02.000000000","message":"++","commit_id":"42eda48c78f1153081b4c193dc13c88561409fd3"}],"keystone/tests/unit/test_v3_assignment.py":[{"author":{"_account_id":13478,"name":"Boris Bobrov","email":"b.bobrov@sap.com","username":"bbobrov"},"change_message_id":"1b4bfa355855c28d6890c9891b0178d8a0cfb3a8","unresolved":false,"context_lines":[{"line_number":529,"context_line":"            user1 \u003d unit.new_user_ref(domain_id\u003dself.domain[\u0027id\u0027])"},{"line_number":530,"context_line":"            user1 \u003d self.identity_api.create_user(user1)"},{"line_number":531,"context_line":""},{"line_number":532,"context_line":"            role \u003d unit.new_role_ref()"},{"line_number":533,"context_line":"            self.role_api.create_role(role[\u0027id\u0027], role)"},{"line_number":534,"context_line":""},{"line_number":535,"context_line":"            collection_url \u003d \u0027/role_assignments\u0027"}],"source_content_type":"text/x-python","patch_set":6,"id":"3ac371cc_5385e004","line":532,"range":{"start_line":532,"start_character":12,"end_line":532,"end_character":38},"updated":"2016-08-17 17:23:25.000000000","message":"oh wow.","commit_id":"2bb786a494abf535c28058afe8ee621d5824617c"}]}
