)]}'
{"keystonemiddleware/auth_token.py":[{"author":{"_account_id":6460,"name":"Brad Topol","email":"btopol@us.ibm.com","username":"btopol"},"change_message_id":"21e534ed22ff07ceee4b46196acc9a0f551b8e60","unresolved":false,"context_lines":[{"line_number":914,"context_line":"            value \u003d value.encode(\u0027utf-8\u0027)"},{"line_number":915,"context_line":""},{"line_number":916,"context_line":"        def _atomic_write(destination, data):"},{"line_number":917,"context_line":"            with tempfile.NamedTemporaryFile(dir\u003dself.signing_dirname,"},{"line_number":918,"context_line":"                                             delete\u003dFalse) as f:"},{"line_number":919,"context_line":"                f.write(data)"},{"line_number":920,"context_line":"            os.rename(f.name, destination)"}],"source_content_type":"text/x-python","patch_set":1,"id":"1ae5cdf2_587e40e4","line":917,"updated":"2014-06-26 19:57:32.000000000","message":"I was wondering how these files were cleaned up.  NamedTemporaryFile looks very handy :-)","commit_id":"0f983416fcfae6845f3065f6bebff152edb2a107"},{"author":{"_account_id":6460,"name":"Brad Topol","email":"btopol@us.ibm.com","username":"btopol"},"change_message_id":"21e534ed22ff07ceee4b46196acc9a0f551b8e60","unresolved":false,"context_lines":[{"line_number":1338,"context_line":""},{"line_number":1339,"context_line":""},{"line_number":1340,"context_line":"class TokenRevocations(object):"},{"line_number":1341,"context_line":"    \"\"\"Token revocation list."},{"line_number":1342,"context_line":""},{"line_number":1343,"context_line":"    The auth_token middleware has to cache the token revocation list from the"},{"line_number":1344,"context_line":"    identity server."}],"source_content_type":"text/x-python","patch_set":1,"id":"1ae5cdf2_981e080c","line":1341,"updated":"2014-06-26 19:57:32.000000000","message":"I really like how you refactored the token revocation stuff into its own class.  Its much easier to understand","commit_id":"0f983416fcfae6845f3065f6bebff152edb2a107"},{"author":{"_account_id":11045,"name":"Bob Thyne","email":"bob.thyne@hp.com","username":"bobt"},"change_message_id":"e1ecc755edb3f2158209b92a6bc8fe0ae316c872","unresolved":false,"context_lines":[{"line_number":1338,"context_line":""},{"line_number":1339,"context_line":""},{"line_number":1340,"context_line":"class TokenRevocations(object):"},{"line_number":1341,"context_line":"    \"\"\"Token revocation list."},{"line_number":1342,"context_line":""},{"line_number":1343,"context_line":"    The auth_token middleware has to cache the token revocation list from the"},{"line_number":1344,"context_line":"    identity server."}],"source_content_type":"text/x-python","patch_set":1,"id":"1ae5cdf2_8a4a0181","line":1341,"in_reply_to":"1ae5cdf2_981e080c","updated":"2014-06-27 23:37:25.000000000","message":"++","commit_id":"0f983416fcfae6845f3065f6bebff152edb2a107"},{"author":{"_account_id":9101,"name":"wanghong","email":"reviewwanghong@126.com","username":"wanghong"},"change_message_id":"d8c9e34ea39f965ee5cf008490e555088856d4e7","unresolved":false,"context_lines":[{"line_number":1506,"context_line":"    \"\"\""},{"line_number":1507,"context_line":""},{"line_number":1508,"context_line":"    def __init__(self, log, identity_server, cms_verify, file_name,"},{"line_number":1509,"context_line":"                 atomic_write_to_signing_dir, cache_timeout\u003dNone):"},{"line_number":1510,"context_line":"        self._LOG \u003d log"},{"line_number":1511,"context_line":"        self._identity_server \u003d identity_server"},{"line_number":1512,"context_line":"        self._cms_verify \u003d cms_verify"}],"source_content_type":"text/x-python","patch_set":6,"id":"fa98f980_6612015a","line":1509,"updated":"2014-09-09 02:28:39.000000000","message":"I think we need more meaningful names for these parameters: \u0027cms_verify\u0027, \u0027file_name\u0027 and \u0027atomic_write_to_signing_dir\u0027.","commit_id":"123571ed92790d5ad9d1d98b2f352050b9ec8e9d"},{"author":{"_account_id":9101,"name":"wanghong","email":"reviewwanghong@126.com","username":"wanghong"},"change_message_id":"d8c9e34ea39f965ee5cf008490e555088856d4e7","unresolved":false,"context_lines":[{"line_number":1511,"context_line":"        self._identity_server \u003d identity_server"},{"line_number":1512,"context_line":"        self._cms_verify \u003d cms_verify"},{"line_number":1513,"context_line":"        self._file_name \u003d file_name"},{"line_number":1514,"context_line":"        self._atomic_write_to_signing_dir \u003d atomic_write_to_signing_dir"},{"line_number":1515,"context_line":""},{"line_number":1516,"context_line":"        self._list \u003d None"},{"line_number":1517,"context_line":"        self._list_fetched_time \u003d None"}],"source_content_type":"text/x-python","patch_set":6,"id":"fa98f980_a6b8692b","line":1514,"updated":"2014-09-09 02:28:39.000000000","message":"How about make _cms_verify and _atomic_write_to_signing_dir to be free functions?","commit_id":"123571ed92790d5ad9d1d98b2f352050b9ec8e9d"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"39fb013339c48a14218b4c7af0ff922e9293ceb2","unresolved":false,"context_lines":[{"line_number":1511,"context_line":"        self._identity_server \u003d identity_server"},{"line_number":1512,"context_line":"        self._cms_verify \u003d cms_verify"},{"line_number":1513,"context_line":"        self._file_name \u003d file_name"},{"line_number":1514,"context_line":"        self._atomic_write_to_signing_dir \u003d atomic_write_to_signing_dir"},{"line_number":1515,"context_line":""},{"line_number":1516,"context_line":"        self._list \u003d None"},{"line_number":1517,"context_line":"        self._list_fetched_time \u003d None"}],"source_content_type":"text/x-python","patch_set":6,"id":"da9df570_e801853a","line":1514,"in_reply_to":"fa98f980_a6b8692b","updated":"2014-09-22 02:56:01.000000000","message":"I created a class for singing directory and am using it... still need to look into cms_verify.","commit_id":"123571ed92790d5ad9d1d98b2f352050b9ec8e9d"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"d11f4bc919678cac4da2c3a6167ca209735eee01","unresolved":false,"context_lines":[{"line_number":1474,"context_line":""},{"line_number":1475,"context_line":""},{"line_number":1476,"context_line":"class _Revocations(object):"},{"line_number":1477,"context_line":"    FILE_NAME \u003d \u0027revoked.pem\u0027"},{"line_number":1478,"context_line":""},{"line_number":1479,"context_line":"    def __init__(self, timeout, signing_directory, identity_server,"},{"line_number":1480,"context_line":"                 cms_verify, log\u003d_LOG):"}],"source_content_type":"text/x-python","patch_set":9,"id":"baa201ad_c9b22b93","line":1477,"updated":"2014-10-08 21:49:09.000000000","message":"Make this a private class variable like it was before? \n\n    _FILE_NAME \u003d \u0027revoked.pem\u0027\n\nor even: \n\n    _REVOKED_FILE_NAME \u003d \u0027revoked.pem\u0027","commit_id":"c4042f896478c5307f1ff6e19aa1cb7c349293d0"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"803b16940ce5d7d1efc21713fa87b982e5b5f684","unresolved":false,"context_lines":[{"line_number":1474,"context_line":""},{"line_number":1475,"context_line":""},{"line_number":1476,"context_line":"class _Revocations(object):"},{"line_number":1477,"context_line":"    FILE_NAME \u003d \u0027revoked.pem\u0027"},{"line_number":1478,"context_line":""},{"line_number":1479,"context_line":"    def __init__(self, timeout, signing_directory, identity_server,"},{"line_number":1480,"context_line":"                 cms_verify, log\u003d_LOG):"}],"source_content_type":"text/x-python","patch_set":9,"id":"baa201ad_0fb8b328","line":1477,"in_reply_to":"baa201ad_c9b22b93","updated":"2014-10-08 22:21:16.000000000","message":"Done","commit_id":"c4042f896478c5307f1ff6e19aa1cb7c349293d0"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"d11f4bc919678cac4da2c3a6167ca209735eee01","unresolved":false,"context_lines":[{"line_number":1543,"context_line":"        if not revoked_tokens:"},{"line_number":1544,"context_line":"            return False"},{"line_number":1545,"context_line":""},{"line_number":1546,"context_line":"        revoked_ids \u003d (x[\u0027id\u0027] for x in revoked_tokens)"},{"line_number":1547,"context_line":"        return token_id in revoked_ids"},{"line_number":1548,"context_line":""},{"line_number":1549,"context_line":"    def _any_revoked(self, token_ids):"}],"source_content_type":"text/x-python","patch_set":9,"id":"baa201ad_8cb3d108","line":1546,"updated":"2014-10-08 21:49:09.000000000","message":"nit: we are building a list of `revoked_ids` for every `token_id` in the list of `token_ids`. Would it make sense to only build the `revoked_tokens` list once and then check all items in `token_ids` against that, instead of rebuilding it every time we check one `token_id`?","commit_id":"c4042f896478c5307f1ff6e19aa1cb7c349293d0"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"803b16940ce5d7d1efc21713fa87b982e5b5f684","unresolved":false,"context_lines":[{"line_number":1543,"context_line":"        if not revoked_tokens:"},{"line_number":1544,"context_line":"            return False"},{"line_number":1545,"context_line":""},{"line_number":1546,"context_line":"        revoked_ids \u003d (x[\u0027id\u0027] for x in revoked_tokens)"},{"line_number":1547,"context_line":"        return token_id in revoked_ids"},{"line_number":1548,"context_line":""},{"line_number":1549,"context_line":"    def _any_revoked(self, token_ids):"}],"source_content_type":"text/x-python","patch_set":9,"id":"baa201ad_8f25835d","line":1546,"in_reply_to":"baa201ad_8cb3d108","updated":"2014-10-08 22:21:16.000000000","message":"This isn\u0027t building a list, it creates a generator. [] would create a list.","commit_id":"c4042f896478c5307f1ff6e19aa1cb7c349293d0"},{"author":{"_account_id":13478,"name":"Boris Bobrov","email":"b.bobrov@sap.com","username":"bbobrov"},"change_message_id":"6570f96960b1e666788002a145667a0244ceab71","unresolved":false,"context_lines":[{"line_number":1543,"context_line":"        if not revoked_tokens:"},{"line_number":1544,"context_line":"            return False"},{"line_number":1545,"context_line":""},{"line_number":1546,"context_line":"        revoked_ids \u003d (x[\u0027id\u0027] for x in revoked_tokens)"},{"line_number":1547,"context_line":"        return token_id in revoked_ids"},{"line_number":1548,"context_line":""},{"line_number":1549,"context_line":"    def _any_revoked(self, token_ids):"}],"source_content_type":"text/x-python","patch_set":9,"id":"baa201ad_9a7e9f68","line":1546,"in_reply_to":"baa201ad_8f25835d","updated":"2014-10-08 22:57:39.000000000","message":"I think the comment was not about lists/generators. _is_revoked is being called every time token_id needs to be checked, regenerating revoked_tokens and hitting sel._list.","commit_id":"c4042f896478c5307f1ff6e19aa1cb7c349293d0"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"90a9125f11d222571b3c99870cc14ccc2715437b","unresolved":false,"context_lines":[{"line_number":1543,"context_line":"        if not revoked_tokens:"},{"line_number":1544,"context_line":"            return False"},{"line_number":1545,"context_line":""},{"line_number":1546,"context_line":"        revoked_ids \u003d (x[\u0027id\u0027] for x in revoked_tokens)"},{"line_number":1547,"context_line":"        return token_id in revoked_ids"},{"line_number":1548,"context_line":""},{"line_number":1549,"context_line":"    def _any_revoked(self, token_ids):"}],"source_content_type":"text/x-python","patch_set":9,"id":"baa201ad_3515c49b","line":1546,"in_reply_to":"baa201ad_9a005f67","updated":"2014-10-09 00:38:09.000000000","message":"You\u0027re right, it\u0027s not a list. I was just making the comment that it could be improved. Since this is a refactor, and not necessarily a change for optimizations, maybe a NOTE or TODO for someone to pick up in the future?","commit_id":"c4042f896478c5307f1ff6e19aa1cb7c349293d0"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"1c7283451f25d1bacc1acf542f203c3e077cbd45","unresolved":false,"context_lines":[{"line_number":1543,"context_line":"        if not revoked_tokens:"},{"line_number":1544,"context_line":"            return False"},{"line_number":1545,"context_line":""},{"line_number":1546,"context_line":"        revoked_ids \u003d (x[\u0027id\u0027] for x in revoked_tokens)"},{"line_number":1547,"context_line":"        return token_id in revoked_ids"},{"line_number":1548,"context_line":""},{"line_number":1549,"context_line":"    def _any_revoked(self, token_ids):"}],"source_content_type":"text/x-python","patch_set":9,"id":"baa201ad_9ab69ff7","line":1546,"in_reply_to":"baa201ad_9a7e9f68","updated":"2014-10-08 23:14:13.000000000","message":"self._list does a jsonutils.loads every time which is not efficient. The old code did the same thing. This change is just moving code from one place to another. Hopefully it makes optimizations easier which can be done separately.","commit_id":"c4042f896478c5307f1ff6e19aa1cb7c349293d0"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"5230ac037b494bf14442dbb392682f575d008e17","unresolved":false,"context_lines":[{"line_number":1543,"context_line":"        if not revoked_tokens:"},{"line_number":1544,"context_line":"            return False"},{"line_number":1545,"context_line":""},{"line_number":1546,"context_line":"        revoked_ids \u003d (x[\u0027id\u0027] for x in revoked_tokens)"},{"line_number":1547,"context_line":"        return token_id in revoked_ids"},{"line_number":1548,"context_line":""},{"line_number":1549,"context_line":"    def _any_revoked(self, token_ids):"}],"source_content_type":"text/x-python","patch_set":9,"id":"baa201ad_9a005f67","line":1546,"in_reply_to":"baa201ad_9ab69ff7","updated":"2014-10-08 23:20:37.000000000","message":"it doesn\u0027t do a jsonutils.loads every time, only when it deserializes the list from the file... I\u0027m not seeing where a list is being generated.","commit_id":"c4042f896478c5307f1ff6e19aa1cb7c349293d0"},{"author":{"_account_id":1941,"name":"Lin Hua Cheng","email":"os.lcheng@gmail.com","username":"lin-hua-cheng"},"change_message_id":"7c4b26008c419e8c8bb5d21fdb37738ea6d95c64","unresolved":false,"context_lines":[{"line_number":1573,"context_line":"    _FILE_NAME \u003d \u0027revoked.pem\u0027"},{"line_number":1574,"context_line":""},{"line_number":1575,"context_line":"    def __init__(self, timeout, signing_directory, identity_server,"},{"line_number":1576,"context_line":"                 cms_verify, log\u003d_LOG):"},{"line_number":1577,"context_line":"        self._cache_timeout \u003d timeout"},{"line_number":1578,"context_line":"        self._signing_directory \u003d signing_directory"},{"line_number":1579,"context_line":"        self._identity_server \u003d identity_server"}],"source_content_type":"text/x-python","patch_set":29,"id":"da86d52c_415abaf2","line":1576,"updated":"2015-02-12 01:55:14.000000000","message":"passing cms_verify scares me a bit here. We\u0027re passing a internal method, so there\u0027s no guarantee that the method signature will not change. I don\u0027t have an elegant alternative, perhaps moving this as a standalone method.  I\u0027m okay with what we have right now.","commit_id":"c320b6c46575c078240ebc827497e1363472b510"},{"author":{"_account_id":9101,"name":"wanghong","email":"reviewwanghong@126.com","username":"wanghong"},"change_message_id":"f11995af877fb1db291c0fc1734b6f5300842c6a","unresolved":false,"context_lines":[{"line_number":1599,"context_line":"        return self._fetched_time_prop"},{"line_number":1600,"context_line":""},{"line_number":1601,"context_line":"    @_fetched_time.setter"},{"line_number":1602,"context_line":"    def _fetched_time(self, value):"},{"line_number":1603,"context_line":"        self._fetched_time_prop \u003d value"},{"line_number":1604,"context_line":""},{"line_number":1605,"context_line":"    def _fetch(self):"}],"source_content_type":"text/x-python","patch_set":29,"id":"da86d52c_bb4bda85","line":1602,"updated":"2015-02-11 02:55:31.000000000","message":"I think we don\u0027t need this method? If we need, I think line 1598 should be self._fetched_time \u003d fetched_time","commit_id":"c320b6c46575c078240ebc827497e1363472b510"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"9aa73ee43945677d9e1bc07c0bdbabda19db008c","unresolved":false,"context_lines":[{"line_number":1599,"context_line":"        return self._fetched_time_prop"},{"line_number":1600,"context_line":""},{"line_number":1601,"context_line":"    @_fetched_time.setter"},{"line_number":1602,"context_line":"    def _fetched_time(self, value):"},{"line_number":1603,"context_line":"        self._fetched_time_prop \u003d value"},{"line_number":1604,"context_line":""},{"line_number":1605,"context_line":"    def _fetch(self):"}],"source_content_type":"text/x-python","patch_set":29,"id":"da86d52c_e667f74f","line":1602,"in_reply_to":"da86d52c_bb4bda85","updated":"2015-02-13 13:55:22.000000000","message":"_fetched_time is a property -- the getter is defined just above, so we can\u0027t set self._fetched_time without this. Removing it causes exception: AttributeError: can\u0027t set attribute","commit_id":"c320b6c46575c078240ebc827497e1363472b510"},{"author":{"_account_id":1941,"name":"Lin Hua Cheng","email":"os.lcheng@gmail.com","username":"lin-hua-cheng"},"change_message_id":"7c4b26008c419e8c8bb5d21fdb37738ea6d95c64","unresolved":false,"context_lines":[{"line_number":1599,"context_line":"        return self._fetched_time_prop"},{"line_number":1600,"context_line":""},{"line_number":1601,"context_line":"    @_fetched_time.setter"},{"line_number":1602,"context_line":"    def _fetched_time(self, value):"},{"line_number":1603,"context_line":"        self._fetched_time_prop \u003d value"},{"line_number":1604,"context_line":""},{"line_number":1605,"context_line":"    def _fetch(self):"}],"source_content_type":"text/x-python","patch_set":29,"id":"da86d52c_8193d2a1","line":1602,"in_reply_to":"da86d52c_bb4bda85","updated":"2015-02-12 01:55:14.000000000","message":"good catch - I am fine either way.","commit_id":"c320b6c46575c078240ebc827497e1363472b510"}]}
