)]}'
{"keystone/common/cache/core.py":[{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"8ff221765c2558f776bedd975cb8e62161dd62d9","unresolved":false,"context_lines":[{"line_number":71,"context_line":"# so we can handle region-wide invalidations or alternatively propose"},{"line_number":72,"context_line":"# a fix to dogpile.cache to make region-wide invalidates possible to"},{"line_number":73,"context_line":"# work across distributed processes."},{"line_number":74,"context_line":"class Invalidated(object):"},{"line_number":75,"context_line":"    def __init__(self, region, region_name, invalidate_type):"},{"line_number":76,"context_line":"        self.invalidate_type \u003d invalidate_type"},{"line_number":77,"context_line":"        self.region \u003d region"}],"source_content_type":"text/x-python","patch_set":2,"id":"7aa08908_dbc34389","line":74,"range":{"start_line":74,"start_character":6,"end_line":74,"end_character":17},"updated":"2016-06-09 19:08:28.000000000","message":"Keep this as a private interface, prefix with _","commit_id":"e1e8d8e2eb12838cf59b8c2b800c2eed6917f1db"},{"author":{"_account_id":13478,"name":"Boris Bobrov","email":"b.bobrov@sap.com","username":"bbobrov"},"change_message_id":"bbd3db6d202be223a245c94ce360dd50abf6e686","unresolved":false,"context_lines":[{"line_number":71,"context_line":"# so we can handle region-wide invalidations or alternatively propose"},{"line_number":72,"context_line":"# a fix to dogpile.cache to make region-wide invalidates possible to"},{"line_number":73,"context_line":"# work across distributed processes."},{"line_number":74,"context_line":"class Invalidated(object):"},{"line_number":75,"context_line":"    def __init__(self, region, region_name, invalidate_type):"},{"line_number":76,"context_line":"        self.invalidate_type \u003d invalidate_type"},{"line_number":77,"context_line":"        self.region \u003d region"}],"source_content_type":"text/x-python","patch_set":2,"id":"7aa08908_5bb593ce","line":74,"range":{"start_line":74,"start_character":6,"end_line":74,"end_character":17},"in_reply_to":"7aa08908_dbc34389","updated":"2016-06-09 19:11:22.000000000","message":"Done","commit_id":"e1e8d8e2eb12838cf59b8c2b800c2eed6917f1db"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"8ff221765c2558f776bedd975cb8e62161dd62d9","unresolved":false,"context_lines":[{"line_number":81,"context_line":"            \u0027region_name\u0027: region_name}"},{"line_number":82,"context_line":""},{"line_number":83,"context_line":"    def __get__(self, obj, objtype\u003dNone):"},{"line_number":84,"context_line":"        invalidated \u003d self.region.backend.get(self.hard_region_key)"},{"line_number":85,"context_line":"        if invalidated is not api.NO_VALUE:"},{"line_number":86,"context_line":"            return invalidated.payload"},{"line_number":87,"context_line":"        return None"}],"source_content_type":"text/x-python","patch_set":2,"id":"7aa08908_fb9b9f70","line":84,"range":{"start_line":84,"start_character":51,"end_line":84,"end_character":66},"updated":"2016-06-09 19:08:28.000000000","message":"Is this supposed to be self.region_key?","commit_id":"e1e8d8e2eb12838cf59b8c2b800c2eed6917f1db"},{"author":{"_account_id":13478,"name":"Boris Bobrov","email":"b.bobrov@sap.com","username":"bbobrov"},"change_message_id":"bbd3db6d202be223a245c94ce360dd50abf6e686","unresolved":false,"context_lines":[{"line_number":81,"context_line":"            \u0027region_name\u0027: region_name}"},{"line_number":82,"context_line":""},{"line_number":83,"context_line":"    def __get__(self, obj, objtype\u003dNone):"},{"line_number":84,"context_line":"        invalidated \u003d self.region.backend.get(self.hard_region_key)"},{"line_number":85,"context_line":"        if invalidated is not api.NO_VALUE:"},{"line_number":86,"context_line":"            return invalidated.payload"},{"line_number":87,"context_line":"        return None"}],"source_content_type":"text/x-python","patch_set":2,"id":"7aa08908_fba9df7c","line":84,"range":{"start_line":84,"start_character":51,"end_line":84,"end_character":66},"in_reply_to":"7aa08908_fb9b9f70","updated":"2016-06-09 19:11:22.000000000","message":"Done","commit_id":"e1e8d8e2eb12838cf59b8c2b800c2eed6917f1db"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"67c7d54e2cdbffffc49c76051db48e1387ee375c","unresolved":false,"context_lines":[{"line_number":72,"context_line":"# a fix to dogpile.cache to make region-wide invalidates possible to"},{"line_number":73,"context_line":"# work across distributed processes."},{"line_number":74,"context_line":"class _Invalidated(object):"},{"line_number":75,"context_line":"    def __init__(self, region, region_name, invalidate_type):"},{"line_number":76,"context_line":"        self.invalidate_type \u003d invalidate_type"},{"line_number":77,"context_line":"        self.region \u003d region"},{"line_number":78,"context_line":"        self.region_name \u003d region_name"}],"source_content_type":"text/x-python","patch_set":4,"id":"7aa08908_c636c6e6","line":75,"range":{"start_line":75,"start_character":23,"end_line":75,"end_character":29},"updated":"2016-06-09 19:23:49.000000000","message":"see below comment","commit_id":"aaf338570fe5feaec4ad25ff8a0ae84dc535a726"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"67c7d54e2cdbffffc49c76051db48e1387ee375c","unresolved":false,"context_lines":[{"line_number":75,"context_line":"    def __init__(self, region, region_name, invalidate_type):"},{"line_number":76,"context_line":"        self.invalidate_type \u003d invalidate_type"},{"line_number":77,"context_line":"        self.region \u003d region"},{"line_number":78,"context_line":"        self.region_name \u003d region_name"},{"line_number":79,"context_line":"        self.region_key \u003d \u0027_RegionExpiration.%(type)s.%(region_name)s\u0027 % {"},{"line_number":80,"context_line":"            \u0027type\u0027: invalidate_type,"},{"line_number":81,"context_line":"            \u0027region_name\u0027: region_name}"}],"source_content_type":"text/x-python","patch_set":4,"id":"7aa08908_667392b5","line":78,"range":{"start_line":78,"start_character":8,"end_line":78,"end_character":38},"updated":"2016-06-09 19:23:49.000000000","message":"this can be accessed from obj.name below","commit_id":"aaf338570fe5feaec4ad25ff8a0ae84dc535a726"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"67c7d54e2cdbffffc49c76051db48e1387ee375c","unresolved":false,"context_lines":[{"line_number":81,"context_line":"            \u0027region_name\u0027: region_name}"},{"line_number":82,"context_line":""},{"line_number":83,"context_line":"    def __get__(self, obj, objtype\u003dNone):"},{"line_number":84,"context_line":"        invalidated \u003d self.region.backend.get(self.region_key)"},{"line_number":85,"context_line":"        if invalidated is not api.NO_VALUE:"},{"line_number":86,"context_line":"            return invalidated.payload"},{"line_number":87,"context_line":"        return None"}],"source_content_type":"text/x-python","patch_set":4,"id":"7aa08908_462ad67f","line":84,"range":{"start_line":84,"start_character":22,"end_line":84,"end_character":26},"updated":"2016-06-09 19:23:49.000000000","message":"This is the descriptor object, not the instance (which is \u0027obj\u0027 in this case). you don\u0027t need to store \"region\" on the descriptor.\n\nRemember a single descriptor object is used for every instance (shared) of the region here.","commit_id":"aaf338570fe5feaec4ad25ff8a0ae84dc535a726"},{"author":{"_account_id":13055,"name":"Alexander Makarov","email":"ajiekcahdp.makapob@gmail.com","username":"amakarov"},"change_message_id":"3e2b9774563b8af464ae6e7e3bceb574b953c4cc","unresolved":false,"context_lines":[{"line_number":81,"context_line":"            \u0027region_name\u0027: region_name}"},{"line_number":82,"context_line":""},{"line_number":83,"context_line":"    def __get__(self, obj, objtype\u003dNone):"},{"line_number":84,"context_line":"        invalidated \u003d self.region.backend.get(self.region_key)"},{"line_number":85,"context_line":"        if invalidated is not api.NO_VALUE:"},{"line_number":86,"context_line":"            return invalidated.payload"},{"line_number":87,"context_line":"        return None"}],"source_content_type":"text/x-python","patch_set":4,"id":"7aa08908_812ae82a","line":84,"range":{"start_line":84,"start_character":22,"end_line":84,"end_character":26},"in_reply_to":"7aa08908_462ad67f","updated":"2016-06-09 19:49:35.000000000","message":"I\u0027d suggest using obj.key_mangler()","commit_id":"aaf338570fe5feaec4ad25ff8a0ae84dc535a726"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"67c7d54e2cdbffffc49c76051db48e1387ee375c","unresolved":false,"context_lines":[{"line_number":87,"context_line":"        return None"},{"line_number":88,"context_line":""},{"line_number":89,"context_line":"    def __set__(self, obj, value):"},{"line_number":90,"context_line":"        self.region.set(self.region_key, value)"},{"line_number":91,"context_line":""},{"line_number":92,"context_line":"    def __delete__(self, obj):"},{"line_number":93,"context_line":"        self.region.delete(self.region_key)"}],"source_content_type":"text/x-python","patch_set":4,"id":"7aa08908_46781690","line":90,"range":{"start_line":90,"start_character":7,"end_line":90,"end_character":13},"updated":"2016-06-09 19:23:49.000000000","message":"see above.","commit_id":"aaf338570fe5feaec4ad25ff8a0ae84dc535a726"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"67c7d54e2cdbffffc49c76051db48e1387ee375c","unresolved":false,"context_lines":[{"line_number":90,"context_line":"        self.region.set(self.region_key, value)"},{"line_number":91,"context_line":""},{"line_number":92,"context_line":"    def __delete__(self, obj):"},{"line_number":93,"context_line":"        self.region.delete(self.region_key)"},{"line_number":94,"context_line":""},{"line_number":95,"context_line":""},{"line_number":96,"context_line":"def apply_invalidation_patch(region, region_name):"}],"source_content_type":"text/x-python","patch_set":4,"id":"7aa08908_e66782e8","line":93,"range":{"start_line":93,"start_character":8,"end_line":93,"end_character":13},"updated":"2016-06-09 19:23:49.000000000","message":"see above","commit_id":"aaf338570fe5feaec4ad25ff8a0ae84dc535a726"},{"author":{"_account_id":13055,"name":"Alexander Makarov","email":"ajiekcahdp.makapob@gmail.com","username":"amakarov"},"change_message_id":"5a21743acf446e8cdf5c7fb92442ed20d3c18ac6","unresolved":false,"context_lines":[{"line_number":44,"context_line":"        # since region.get is bypassed, keys need to be hashed here."},{"line_number":45,"context_line":"        key \u003d self._get_region_key(region)"},{"line_number":46,"context_line":"        if region.key_mangler:"},{"line_number":47,"context_line":"            key \u003d region.key_mangler(key)"},{"line_number":48,"context_line":"        invalidated \u003d region.backend.get(key)"},{"line_number":49,"context_line":"        if invalidated is not api.NO_VALUE:"},{"line_number":50,"context_line":"            return invalidated.payload"}],"source_content_type":"text/x-python","patch_set":7,"id":"7aa08908_c6069f1f","line":47,"updated":"2016-06-10 12:41:07.000000000","message":"You have to either repeat it every time you generate a key or  move it to _get_region_key","commit_id":"bdba65e055928d339cb9fcca61af58f0b88f680f"},{"author":{"_account_id":13055,"name":"Alexander Makarov","email":"ajiekcahdp.makapob@gmail.com","username":"amakarov"},"change_message_id":"a2824199f1453c467e35dc726687d82bcca44f84","unresolved":false,"context_lines":[{"line_number":44,"context_line":"        # since region.get is bypassed, keys need to be hashed here."},{"line_number":45,"context_line":"        key \u003d self._get_region_key(region)"},{"line_number":46,"context_line":"        if region.key_mangler:"},{"line_number":47,"context_line":"            key \u003d region.key_mangler(key)"},{"line_number":48,"context_line":"        invalidated \u003d region.backend.get(key)"},{"line_number":49,"context_line":"        if invalidated is not api.NO_VALUE:"},{"line_number":50,"context_line":"            return invalidated.payload"}],"source_content_type":"text/x-python","patch_set":7,"id":"7aa08908_9cf98acb","line":47,"in_reply_to":"7aa08908_c6069f1f","updated":"2016-06-10 13:07:57.000000000","message":"Oh, you call cache region set and delete without bypass. Ignore this comment ^","commit_id":"bdba65e055928d339cb9fcca61af58f0b88f680f"},{"author":{"_account_id":13055,"name":"Alexander Makarov","email":"ajiekcahdp.makapob@gmail.com","username":"amakarov"},"change_message_id":"f27864fd2bdbd94a91c2359ea4ac396809cebbb4","unresolved":false,"context_lines":[{"line_number":52,"context_line":""},{"line_number":53,"context_line":"    def __set__(self, region, value):"},{"line_number":54,"context_line":"        if not region.is_configured:"},{"line_number":55,"context_line":"            return None"},{"line_number":56,"context_line":"        key \u003d self._get_region_key(region)"},{"line_number":57,"context_line":"        region.set(key, value)"},{"line_number":58,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"7aa08908_616eb5ca","line":55,"updated":"2016-06-10 12:43:31.000000000","message":"(nit) both __set__ and __delete__ return nothing so you can use:\n\nif region.is_configured:\n   \u003clogic here\u003e","commit_id":"bdba65e055928d339cb9fcca61af58f0b88f680f"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"d1a607380646aaa883ca5e2376e85be5ff279145","unresolved":false,"context_lines":[{"line_number":31,"context_line":""},{"line_number":32,"context_line":"    def _get_region_key(self, region):"},{"line_number":33,"context_line":"        region_key \u003d \u0027_RegionExpiration.%(type)s.%(region_name)s\u0027 % {"},{"line_number":34,"context_line":"            \u0027type\u0027: self.invalidate_type,"},{"line_number":35,"context_line":"            \u0027region_name\u0027: region.name}"},{"line_number":36,"context_line":"        return region_key"},{"line_number":37,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"bacf61ea_7384875d","line":34,"updated":"2016-07-29 19:43:39.000000000","message":"Indentation?","commit_id":"639b1c378f8881dac6c4b7615d039ee0838ad1fc"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"eb30dfcb1f675b655a47054748696c93bb875336","unresolved":false,"context_lines":[{"line_number":31,"context_line":""},{"line_number":32,"context_line":"    def _get_region_key(self, region):"},{"line_number":33,"context_line":"        region_key \u003d \u0027_RegionExpiration.%(type)s.%(region_name)s\u0027 % {"},{"line_number":34,"context_line":"            \u0027type\u0027: self.invalidate_type,"},{"line_number":35,"context_line":"            \u0027region_name\u0027: region.name}"},{"line_number":36,"context_line":"        return region_key"},{"line_number":37,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"bacf61ea_51181b75","line":34,"in_reply_to":"bacf61ea_7384875d","updated":"2016-08-01 15:01:21.000000000","message":"Revisiting this on a different machine in Chrome, and all the indentation looks fine - must have been a problem with Safari.","commit_id":"639b1c378f8881dac6c4b7615d039ee0838ad1fc"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"d1a607380646aaa883ca5e2376e85be5ff279145","unresolved":false,"context_lines":[{"line_number":42,"context_line":"        # it is required to call backend directly, because region.get"},{"line_number":43,"context_line":"        # checks _soft/_hard_invalidated and it causes a recursion."},{"line_number":44,"context_line":"        # since region.get is bypassed, keys need to be hashed here."},{"line_number":45,"context_line":"        key \u003d self._get_region_key(region)"},{"line_number":46,"context_line":"        if region.key_mangler:"},{"line_number":47,"context_line":"            key \u003d region.key_mangler(key)"},{"line_number":48,"context_line":"        invalidated \u003d region.backend.get(key)"}],"source_content_type":"text/x-python","patch_set":13,"id":"bacf61ea_33b84f2a","line":45,"updated":"2016-07-29 19:43:39.000000000","message":"Indentation?","commit_id":"639b1c378f8881dac6c4b7615d039ee0838ad1fc"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"d1a607380646aaa883ca5e2376e85be5ff279145","unresolved":false,"context_lines":[{"line_number":44,"context_line":"        # since region.get is bypassed, keys need to be hashed here."},{"line_number":45,"context_line":"        key \u003d self._get_region_key(region)"},{"line_number":46,"context_line":"        if region.key_mangler:"},{"line_number":47,"context_line":"            key \u003d region.key_mangler(key)"},{"line_number":48,"context_line":"        invalidated \u003d region.backend.get(key)"},{"line_number":49,"context_line":"        if invalidated is not api.NO_VALUE:"},{"line_number":50,"context_line":"            return invalidated.payload"}],"source_content_type":"text/x-python","patch_set":13,"id":"bacf61ea_13b54b30","line":47,"updated":"2016-07-29 19:43:39.000000000","message":"Indentation?","commit_id":"639b1c378f8881dac6c4b7615d039ee0838ad1fc"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"d1a607380646aaa883ca5e2376e85be5ff279145","unresolved":false,"context_lines":[{"line_number":53,"context_line":"    def __set__(self, region, value):"},{"line_number":54,"context_line":"        if not region.is_configured:"},{"line_number":55,"context_line":"            return None"},{"line_number":56,"context_line":"        key \u003d self._get_region_key(region)"},{"line_number":57,"context_line":"        region.set(key, value)"},{"line_number":58,"context_line":""},{"line_number":59,"context_line":"    def __delete__(self, region):"}],"source_content_type":"text/x-python","patch_set":13,"id":"bacf61ea_b37a7f75","line":56,"updated":"2016-07-29 19:43:39.000000000","message":"Indentation?","commit_id":"639b1c378f8881dac6c4b7615d039ee0838ad1fc"}],"keystone/tests/unit/common/test_utils.py":[{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"a80fda3823f2263f04c7f0df187845283ad7a258","unresolved":false,"context_lines":[{"line_number":214,"context_line":"        self.load_backends()"},{"line_number":215,"context_line":"        super(CacheTestCase, self).setUp()"},{"line_number":216,"context_line":""},{"line_number":217,"context_line":"    def test_invalidation_is_shared(self):"},{"line_number":218,"context_line":"        \"\"\"Test that apply_invalidation_patch worked.\"\"\""},{"line_number":219,"context_line":"        # make sure nothing is invalidated yet"},{"line_number":220,"context_line":"        # pick a region"}],"source_content_type":"text/x-python","patch_set":13,"id":"bacf61ea_60774f02","line":217,"updated":"2016-08-01 14:48:44.000000000","message":"test_region_invalidation* \n\nAlso - maybe we could include what the region invalidation is shared across in the test name (processes)?","commit_id":"639b1c378f8881dac6c4b7615d039ee0838ad1fc"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"a80fda3823f2263f04c7f0df187845283ad7a258","unresolved":false,"context_lines":[{"line_number":229,"context_line":"        # there should be an entry about that in the backend"},{"line_number":230,"context_line":"        # and the region should become invalidated"},{"line_number":231,"context_line":"        value \u003d region.get(key)"},{"line_number":232,"context_line":"        self.assertNotEqual(dogpile.cache.api.NO_VALUE, value)"},{"line_number":233,"context_line":"        self.assertIsNotNone(region._hard_invalidated)"}],"source_content_type":"text/x-python","patch_set":13,"id":"bacf61ea_2006f751","line":232,"updated":"2016-08-01 14:48:44.000000000","message":"Do we know what the expected value of `value` is? We could add an assertion for that, too.","commit_id":"639b1c378f8881dac6c4b7615d039ee0838ad1fc"}]}
