)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"9fcde084a1fb048d4650222da26bb627367e6493","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     ayoung \u003cayoung@redhat.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2016-01-26 03:47:13 +0000"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"WIP/DNM: Use requst local caching [full cache]"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Use a request local cache, where possible, to offload requests"},{"line_number":10,"context_line":"to the backend."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":3,"id":"9a68dd71_ee154549","line":7,"range":{"start_line":7,"start_character":0,"end_line":7,"end_character":9},"updated":"2016-01-26 14:29:56.000000000","message":"I think I\u0027m good with this direction.","commit_id":"9dd5f746cfed0280c704a4e093fdb6acd2f5f69b"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"9fcde084a1fb048d4650222da26bb627367e6493","unresolved":false,"context_lines":[{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Use a request local cache, where possible, to offload requests"},{"line_number":10,"context_line":"to the backend."},{"line_number":11,"context_line":""},{"line_number":12,"context_line":"Change-Id: I8b744f75f21e9dd669a735a7717fd0d044d6d8ed"},{"line_number":13,"context_line":"Depends-On: I6d1d28f5b974e79d44d1e86ea53c666e3f5771df"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":3,"id":"9a68dd71_e20f992c","line":11,"updated":"2016-01-26 14:29:56.000000000","message":"Could add: \n\n    Partial-Bug: 1489061","commit_id":"9dd5f746cfed0280c704a4e093fdb6acd2f5f69b"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"b65e7380e753132777739c8e8e1a97430758e7f7","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Morgan Fainberg \u003cmorgan.fainberg@gmail.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2016-01-28 15:57:31 -0600"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Use requst local in-process cache per request"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Use a request local cache, where possible, to offload requests"},{"line_number":10,"context_line":"to the backend."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":5,"id":"7a5de9d1_d3abd073","line":7,"updated":"2016-01-29 18:06:50.000000000","message":"sp. close","commit_id":"f9c984584e651c5b8a46ae94f87d38096fa38c61"}],"keystone/common/cache/_context_cache.py":[{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"031db4cc89400651dcb1840f034bc8800a615a81","unresolved":false,"context_lines":[{"line_number":8,"context_line":"# distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT"},{"line_number":9,"context_line":"# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the"},{"line_number":10,"context_line":"# License for the specific language governing permissions and limitations"},{"line_number":11,"context_line":"# under the License."},{"line_number":12,"context_line":"from dogpile.cache import api"},{"line_number":13,"context_line":"from dogpile.cache import proxy"},{"line_number":14,"context_line":"from oslo_context import context as oslo_context"}],"source_content_type":"text/x-python","patch_set":2,"id":"9a68dd71_73c72764","line":11,"updated":"2016-01-25 19:13:02.000000000","message":"nit: throw a new line in here between the license and the imports.","commit_id":"53bfad6e6fa0b1df353d7a891f4d5821a9d64d4b"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"12c605318a044a355039403a28fe8d24125c0cf5","unresolved":false,"context_lines":[{"line_number":8,"context_line":"# distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT"},{"line_number":9,"context_line":"# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the"},{"line_number":10,"context_line":"# License for the specific language governing permissions and limitations"},{"line_number":11,"context_line":"# under the License."},{"line_number":12,"context_line":"from dogpile.cache import api"},{"line_number":13,"context_line":"from dogpile.cache import proxy"},{"line_number":14,"context_line":"from oslo_context import context as oslo_context"}],"source_content_type":"text/x-python","patch_set":2,"id":"9a68dd71_4e64bab7","line":11,"in_reply_to":"9a68dd71_73c72764","updated":"2016-01-25 19:39:51.000000000","message":"Sure. next patchset.","commit_id":"53bfad6e6fa0b1df353d7a891f4d5821a9d64d4b"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"eca3dc6c9ee58019de5ad6cbe785d1d2f7ced7c2","unresolved":false,"context_lines":[{"line_number":21,"context_line":"    # NOTE(morganfainberg): There needs to be reserved \"registry\" entries set"},{"line_number":22,"context_line":"    # in oslo_serialization for application-specific handlers. We picked 127"},{"line_number":23,"context_line":"    # here since it\u0027s waaaaaay far out before oslo_serialization will use it."},{"line_number":24,"context_line":"    identity \u003d 127"},{"line_number":25,"context_line":"    handles \u003d (revoke_model.RevokeTree,)"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"    def __init__(self, registry):"}],"source_content_type":"text/x-python","patch_set":2,"id":"9a68dd71_b66b43f0","line":24,"range":{"start_line":24,"start_character":4,"end_line":24,"end_character":18},"updated":"2016-01-26 03:51:20.000000000","message":"could make this a global constant so it\u0027s more easily referenced\n\n\n  _IDENTITY_ID\u003d127\n\nor something like that","commit_id":"53bfad6e6fa0b1df353d7a891f4d5821a9d64d4b"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"031db4cc89400651dcb1840f034bc8800a615a81","unresolved":false,"context_lines":[{"line_number":45,"context_line":"_registry.frozen \u003d True"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"class _ResponseCacheProxy(proxy.ProxyBackend):"},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"    __key_pfx \u003d \u0027_request_cache_%s\u0027"},{"line_number":51,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"9a68dd71_f3a9d790","line":48,"range":{"start_line":48,"start_character":0,"end_line":48,"end_character":46},"updated":"2016-01-25 19:13:02.000000000","message":"So; the reason we have this is to make sure we can proxy cache invalidations across threads, right?","commit_id":"53bfad6e6fa0b1df353d7a891f4d5821a9d64d4b"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"4f941c1cc33768566379a38bbf39382a834922a0","unresolved":false,"context_lines":[{"line_number":45,"context_line":"_registry.frozen \u003d True"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"class _ResponseCacheProxy(proxy.ProxyBackend):"},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"    __key_pfx \u003d \u0027_request_cache_%s\u0027"},{"line_number":51,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"9a68dd71_0ebbf976","line":48,"range":{"start_line":48,"start_character":0,"end_line":48,"end_character":46},"in_reply_to":"9a68dd71_2e6146a9","updated":"2016-01-26 14:25:19.000000000","message":"Awesome explanation; thanks! That would make a great docstring.","commit_id":"53bfad6e6fa0b1df353d7a891f4d5821a9d64d4b"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"12c605318a044a355039403a28fe8d24125c0cf5","unresolved":false,"context_lines":[{"line_number":45,"context_line":"_registry.frozen \u003d True"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"class _ResponseCacheProxy(proxy.ProxyBackend):"},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"    __key_pfx \u003d \u0027_request_cache_%s\u0027"},{"line_number":51,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"9a68dd71_2e6146a9","line":48,"range":{"start_line":48,"start_character":0,"end_line":48,"end_character":46},"in_reply_to":"9a68dd71_f3a9d790","updated":"2016-01-25 19:39:51.000000000","message":"This change set has nothing to do with cross-thread caching. This is in place so we capture any queries to the backend and cache it local to the request itself.\n\nWhat this means is that if we ask for .get_domain(domain_id), it will only ever happen a single time for the request as the rest of the time it will reference the value stored in context.get_current() [thread.local]. The only exception to this is if an invalidation of the cache occurs (an explicit update to domain_id/domain/etc) as that would pop the underlying cache as well we clear our thread.local at the same time if it has been cached.\n\nThe crossworker invalidations is a different changeset.","commit_id":"53bfad6e6fa0b1df353d7a891f4d5821a9d64d4b"},{"author":{"_account_id":13055,"name":"Alexander Makarov","email":"ajiekcahdp.makapob@gmail.com","username":"amakarov"},"change_message_id":"e1c45df7c041bd63c6ad130487b066c73c921c44","unresolved":false,"context_lines":[{"line_number":93,"context_line":""},{"line_number":94,"context_line":"    def set_multi(self, mapping):"},{"line_number":95,"context_line":"        # TODO(morganfainberg): Implement for completeness."},{"line_number":96,"context_line":"        self.proxied.set_multi(mapping)"},{"line_number":97,"context_line":""},{"line_number":98,"context_line":"    def delete_multi(self, keys):"},{"line_number":99,"context_line":"        # TODO(morganfainberg): Implement for completeness."}],"source_content_type":"text/x-python","patch_set":3,"id":"7a5de9d1_09d3f739","line":96,"updated":"2016-01-27 16:14:16.000000000","message":"If this is not supposed to be used explicitly, it may be good to log something at least.","commit_id":"9dd5f746cfed0280c704a4e093fdb6acd2f5f69b"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"d1fecbd0a9c193fdf17c81bd063fdf77fe6bd59c","unresolved":false,"context_lines":[{"line_number":97,"context_line":""},{"line_number":98,"context_line":"    def delete_multi(self, keys):"},{"line_number":99,"context_line":"        # TODO(morganfainberg): Implement for completeness."},{"line_number":100,"context_line":"        self.proxied.delete_multi(keys)"}],"source_content_type":"text/x-python","patch_set":3,"id":"7a5de9d1_c97b9f7a","line":100,"updated":"2016-01-27 16:10:46.000000000","message":"change to NOTE(morgan): do not implement these.","commit_id":"9dd5f746cfed0280c704a4e093fdb6acd2f5f69b"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"9b6791a523dc4c6ea944ffd318d05b58e9876453","unresolved":false,"context_lines":[{"line_number":9,"context_line":"# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the"},{"line_number":10,"context_line":"# License for the specific language governing permissions and limitations"},{"line_number":11,"context_line":"# under the License."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"from dogpile.cache import api"},{"line_number":14,"context_line":"from dogpile.cache import proxy"},{"line_number":15,"context_line":"from oslo_context import context as oslo_context"}],"source_content_type":"text/x-python","patch_set":5,"id":"7a5de9d1_ce07a2c8","line":12,"updated":"2016-01-29 19:37:19.000000000","message":"Module-level docstring appreciated!","commit_id":"f9c984584e651c5b8a46ae94f87d38096fa38c61"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"b65e7380e753132777739c8e8e1a97430758e7f7","unresolved":false,"context_lines":[{"line_number":66,"context_line":"    def _get_local_cache(self, key):"},{"line_number":67,"context_line":"        ctx \u003d self._get_request_context()"},{"line_number":68,"context_line":"        try:"},{"line_number":69,"context_line":"            value \u003d getattr(ctx, self._get_request_key(key))"},{"line_number":70,"context_line":"            value \u003d msgpackutils.loads(value)"},{"line_number":71,"context_line":"            return api.CachedValue(payload\u003dvalue[\u0027payload\u0027],"},{"line_number":72,"context_line":"                                   metadata\u003dvalue[\u0027metadata\u0027])"}],"source_content_type":"text/x-python","patch_set":5,"id":"7a5de9d1_d39190f2","line":69,"updated":"2016-01-29 18:06:50.000000000","message":"(nit) I\u0027d love to see only the getattr call wrapped in a try-except since that is the specific AttributeError we are looking for.","commit_id":"f9c984584e651c5b8a46ae94f87d38096fa38c61"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"b65e7380e753132777739c8e8e1a97430758e7f7","unresolved":false,"context_lines":[{"line_number":106,"context_line":"        query_keys \u003d set(keys).difference(set(values.keys()))"},{"line_number":107,"context_line":"        values.update(dict("},{"line_number":108,"context_line":"            zip(query_keys, self.proxied.get_multi(query_keys))))"},{"line_number":109,"context_line":"        return list(values.values())"},{"line_number":110,"context_line":""},{"line_number":111,"context_line":"    def set_multi(self, mapping):"},{"line_number":112,"context_line":"        ctx \u003d self._get_request_context()"}],"source_content_type":"text/x-python","patch_set":5,"id":"7a5de9d1_3e3a2bcd","line":109,"updated":"2016-01-29 18:06:50.000000000","message":"Don\u0027t you need to maintain the order based on the order of the keys? If the caller were to run this it could give them the wrong results:\n\n  data \u003d zip(keys, cache.get_multi(keys))","commit_id":"f9c984584e651c5b8a46ae94f87d38096fa38c61"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"fb76a6b9a13311647c654dd01f0b80a61035311a","unresolved":false,"context_lines":[{"line_number":106,"context_line":"        query_keys \u003d set(keys).difference(set(values.keys()))"},{"line_number":107,"context_line":"        values.update(dict("},{"line_number":108,"context_line":"            zip(query_keys, self.proxied.get_multi(query_keys))))"},{"line_number":109,"context_line":"        return list(values.values())"},{"line_number":110,"context_line":""},{"line_number":111,"context_line":"    def set_multi(self, mapping):"},{"line_number":112,"context_line":"        ctx \u003d self._get_request_context()"}],"source_content_type":"text/x-python","patch_set":5,"id":"7a5de9d1_0e8ffa75","line":109,"in_reply_to":"7a5de9d1_3e3a2bcd","updated":"2016-01-29 19:36:59.000000000","message":"Nice catch!","commit_id":"f9c984584e651c5b8a46ae94f87d38096fa38c61"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"b65e7380e753132777739c8e8e1a97430758e7f7","unresolved":false,"context_lines":[{"line_number":116,"context_line":""},{"line_number":117,"context_line":"    def delete_multi(self, keys):"},{"line_number":118,"context_line":"        for k in keys:"},{"line_number":119,"context_line":"            self._delete_local_cache(k)"},{"line_number":120,"context_line":"        self.proxied.delete_multi(keys)"}],"source_content_type":"text/x-python","patch_set":5,"id":"7a5de9d1_f3012c07","line":119,"updated":"2016-01-29 18:06:50.000000000","message":"What happens if this fails? Should we wrap it?","commit_id":"f9c984584e651c5b8a46ae94f87d38096fa38c61"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"9de93069ff36490749843d8f1b49bb2bf2e63e3d","unresolved":false,"context_lines":[{"line_number":77,"context_line":""},{"line_number":78,"context_line":"        value \u003d msgpackutils.loads(value)"},{"line_number":79,"context_line":"        return api.CachedValue(payload\u003dvalue[\u0027payload\u0027],"},{"line_number":80,"context_line":"                                   metadata\u003dvalue[\u0027metadata\u0027])"},{"line_number":81,"context_line":""},{"line_number":82,"context_line":"    def _delete_local_cache(self, key):"},{"line_number":83,"context_line":"        # On invalidate/delete remove the value from the local request cache"}],"source_content_type":"text/x-python","patch_set":6,"id":"7a5de9d1_ce7f9715","line":80,"range":{"start_line":80,"start_character":31,"end_line":80,"end_character":35},"updated":"2016-01-30 03:25:09.000000000","message":"whitespace issue","commit_id":"ce40528ceb4fd3ce02b92b78ac741c7142671c4d"}],"keystone/common/cache/core.py":[{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"031db4cc89400651dcb1840f034bc8800a615a81","unresolved":false,"context_lines":[{"line_number":30,"context_line":"        region \u003d CACHE_REGION"},{"line_number":31,"context_line":"    configured \u003d region.is_configured"},{"line_number":32,"context_line":"    cache.configure_cache_region(CONF, region)"},{"line_number":33,"context_line":"    # Only wrap the region if it was not configured. This should be pushed"},{"line_number":34,"context_line":"    # to oslo_cache lib somehow."},{"line_number":35,"context_line":"    if not configured:"},{"line_number":36,"context_line":"        region.wrap(_context_cache._ResponseCacheProxy)"},{"line_number":37,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"9a68dd71_b3e03f2a","line":34,"range":{"start_line":33,"start_character":4,"end_line":34,"end_character":32},"updated":"2016-01-25 19:13:02.000000000","message":"Maybe we can add a link/todo for this?","commit_id":"53bfad6e6fa0b1df353d7a891f4d5821a9d64d4b"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"12c605318a044a355039403a28fe8d24125c0cf5","unresolved":false,"context_lines":[{"line_number":30,"context_line":"        region \u003d CACHE_REGION"},{"line_number":31,"context_line":"    configured \u003d region.is_configured"},{"line_number":32,"context_line":"    cache.configure_cache_region(CONF, region)"},{"line_number":33,"context_line":"    # Only wrap the region if it was not configured. This should be pushed"},{"line_number":34,"context_line":"    # to oslo_cache lib somehow."},{"line_number":35,"context_line":"    if not configured:"},{"line_number":36,"context_line":"        region.wrap(_context_cache._ResponseCacheProxy)"},{"line_number":37,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"9a68dd71_ae753664","line":34,"range":{"start_line":33,"start_character":4,"end_line":34,"end_character":32},"in_reply_to":"9a68dd71_b3e03f2a","updated":"2016-01-25 19:39:51.000000000","message":"not sure how we can move this, something to discuss.","commit_id":"53bfad6e6fa0b1df353d7a891f4d5821a9d64d4b"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"fb76a6b9a13311647c654dd01f0b80a61035311a","unresolved":false,"context_lines":[{"line_number":25,"context_line":"def configure_cache(region\u003dNone):"},{"line_number":26,"context_line":"    if region is None:"},{"line_number":27,"context_line":"        region \u003d CACHE_REGION"},{"line_number":28,"context_line":"    cache.configure_cache_region(CONF, region)"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"def get_memoization_decorator(group, expiration_group\u003dNone, region\u003dNone):"}],"source_content_type":"text/x-python","patch_set":5,"id":"7a5de9d1_ae44a61a","side":"PARENT","line":28,"updated":"2016-01-29 19:36:59.000000000","message":"I assume cache.configure_cache_region would write to region.is_configured, so you need to capture that value before making this call? inline comment to prevent a refactor would be nice.","commit_id":"399a66f141e2bd7b96f34dc10ecef45bcbbbbf8a"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"53406ed882efd3ba0c79ad2e5022df4618f15fba","unresolved":false,"context_lines":[{"line_number":29,"context_line":"    if region is None:"},{"line_number":30,"context_line":"        region \u003d CACHE_REGION"},{"line_number":31,"context_line":"    # NOTE(morganfainberg): running cache.configure_cache_region()"},{"line_number":32,"context_line":"    # sets region.is_configured, this must be caputred before"},{"line_number":33,"context_line":"    # cache.configure_cache_region is called."},{"line_number":34,"context_line":"    configured \u003d region.is_configured"},{"line_number":35,"context_line":"    cache.configure_cache_region(CONF, region)"}],"source_content_type":"text/x-python","patch_set":7,"id":"7a5de9d1_4eaba775","line":32,"range":{"start_line":32,"start_character":46,"end_line":32,"end_character":54},"updated":"2016-01-30 03:29:41.000000000","message":"captured*","commit_id":"8ad6c2f54c464b2b0ab738d75a791d4905e16a0b"}],"keystone/models/revoke_model.py":[{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"9fcde084a1fb048d4650222da26bb627367e6493","unresolved":false,"context_lines":[{"line_number":14,"context_line":"from six.moves import map"},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"from keystone.common import utils"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"# The set of attributes common between the RevokeEvent"},{"line_number":20,"context_line":"# and the dictionaries created from the token Data."}],"source_content_type":"text/x-python","patch_set":3,"id":"9a68dd71_c2405538","line":17,"updated":"2016-01-26 14:29:56.000000000","message":"Just curious - how come all this stuff had to be moved?","commit_id":"9dd5f746cfed0280c704a4e093fdb6acd2f5f69b"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"082d3261ad1f31e2e09b4babbd28050d668cc6d5","unresolved":false,"context_lines":[{"line_number":14,"context_line":"from six.moves import map"},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"from keystone.common import utils"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"# The set of attributes common between the RevokeEvent"},{"line_number":20,"context_line":"# and the dictionaries created from the token Data."}],"source_content_type":"text/x-python","patch_set":3,"id":"9a68dd71_0f0be47e","line":17,"in_reply_to":"9a68dd71_c2405538","updated":"2016-01-26 19:09:02.000000000","message":"I talked to Morgan in IRC about this and this had to be refactored to resolve circular dependencies: \n\nrevoke.core -\u003e imports common.cache and common.cache._context_proxy can\u0027t import revoke.model (since revoke.core is imported from __init__","commit_id":"9dd5f746cfed0280c704a4e093fdb6acd2f5f69b"},{"author":{"_account_id":19985,"name":"Ryosuke Mizuno","email":"r-mizuno@rs.jp.nec.com","username":"r-mizuno"},"change_message_id":"51505dc63284e111531628b13e5ca6a9ab6a142b","unresolved":false,"context_lines":[{"line_number":131,"context_line":""},{"line_number":132,"context_line":"    The Tree is an index to quickly match tokens against events."},{"line_number":133,"context_line":"    Each node is a hashtable of key\u003dvalue combinations from revocation events."},{"line_number":134,"context_line":"    The"},{"line_number":135,"context_line":""},{"line_number":136,"context_line":"    \"\"\""},{"line_number":137,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"bae84128_376243ae","line":134,"range":{"start_line":134,"start_character":4,"end_line":134,"end_character":7},"updated":"2016-02-25 10:33:51.000000000","message":"Is this necessary?","commit_id":"0eba0e0477f1953a33cda9245169037676a86df7"}]}
