)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":1955,"name":"Alan Pevec","email":"alan.pevec@redhat.com","username":"apevec"},"change_message_id":"ca047de247104fda1fe0f939cea49f94013a3664","unresolved":false,"context_lines":[{"line_number":20,"context_line":""},{"line_number":21,"context_line":"Some simple tests were added to prevent future regressions. nose was"},{"line_number":22,"context_line":"added to tools/test-requires because these tests will be skipped if"},{"line_number":23,"context_line":"the keyring or pickle packages are not installed."},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"Change-Id: I1fe2c9e5cdf275df2047018368da2e4b3d2d6de2"},{"line_number":26,"context_line":"Fixes: bug #1183072"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"AAAAPH%2F%2Fty8%3D","line":23,"updated":"2013-05-24 16:35:19.000000000","message":"What has nose to do with keyring or pickle?\nNose was removed as a part of blueprint grizzly-testtools\nhttps://github.com/openstack/python-keystoneclient/commit/11263ac3186e1ccfce0d59592d64b6857673601d","commit_id":"2f5b73c95367818eda73c15996a54d3141b8c799"}],"keystoneclient/client.py":[{"author":{"_account_id":7191,"name":"Jamie Lennox","email":"jamielennox@gmail.com","username":"jamielennox"},"change_message_id":"85fcd7d6b01cf6191469fd68c874cbf99a48b22e","unresolved":false,"context_lines":[{"line_number":42,"context_line":"    try:"},{"line_number":43,"context_line":"        if not keyring:"},{"line_number":44,"context_line":"            import keyring"},{"line_number":45,"context_line":"            import pickle"},{"line_number":46,"context_line":"        return True"},{"line_number":47,"context_line":"    except ImportError:"},{"line_number":48,"context_line":"        if (hasattr(sys.stderr, \u0027isatty\u0027) and sys.stderr.isatty()):"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAPH%2F%2Fk%2Fc%3D","line":45,"updated":"2013-05-30 04:22:44.000000000","message":"I think it\u0027d be nicer if you do the import as a globally up top: \ntry: \n   import pickle\n   import keyring\nexcept: \n   keyring \u003d None\n   pickle \u003d None","commit_id":"c4d2130c2fa75a1d316efb488b1bf9f0aada4ac7"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"09a4d0c47f1a5235e2d3efafe3c522e9fac30da0","unresolved":false,"context_lines":[{"line_number":42,"context_line":"    try:"},{"line_number":43,"context_line":"        if not keyring:"},{"line_number":44,"context_line":"            import keyring"},{"line_number":45,"context_line":"            import pickle"},{"line_number":46,"context_line":"        return True"},{"line_number":47,"context_line":"    except ImportError:"},{"line_number":48,"context_line":"        if (hasattr(sys.stderr, \u0027isatty\u0027) and sys.stderr.isatty()):"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAPH%2F%2FjYY%3D","line":45,"in_reply_to":"AAAAPH%2F%2Fk%2Fc%3D","updated":"2013-05-30 17:33:48.000000000","message":"+100; I asked for this the first time around as well","commit_id":"c4d2130c2fa75a1d316efb488b1bf9f0aada4ac7"},{"author":{"_account_id":7191,"name":"Jamie Lennox","email":"jamielennox@gmail.com","username":"jamielennox"},"change_message_id":"85fcd7d6b01cf6191469fd68c874cbf99a48b22e","unresolved":false,"context_lines":[{"line_number":126,"context_line":"            if hasattr(requests, \u0027logging\u0027):"},{"line_number":127,"context_line":"                requests.logging.getLogger(requests.__name__).addHandler(ch)"},{"line_number":128,"context_line":""},{"line_number":129,"context_line":"        # keyring setup"},{"line_number":130,"context_line":"        self.use_keyring \u003d use_keyring and try_import_keyring()"},{"line_number":131,"context_line":"        self.force_new_token \u003d force_new_token"},{"line_number":132,"context_line":"        self.stale_duration \u003d stale_duration or access.STALE_TOKEN_DURATION"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAPH%2F%2Fk%2FE%3D","line":129,"updated":"2013-05-30 04:22:44.000000000","message":"and then all that messaging can be\nif use_keyring and not keyring: \n    error_atty(\u0027Failed to load keyring modules.\u0027)","commit_id":"c4d2130c2fa75a1d316efb488b1bf9f0aada4ac7"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"09a4d0c47f1a5235e2d3efafe3c522e9fac30da0","unresolved":false,"context_lines":[{"line_number":126,"context_line":"            if hasattr(requests, \u0027logging\u0027):"},{"line_number":127,"context_line":"                requests.logging.getLogger(requests.__name__).addHandler(ch)"},{"line_number":128,"context_line":""},{"line_number":129,"context_line":"        # keyring setup"},{"line_number":130,"context_line":"        self.use_keyring \u003d use_keyring and try_import_keyring()"},{"line_number":131,"context_line":"        self.force_new_token \u003d force_new_token"},{"line_number":132,"context_line":"        self.stale_duration \u003d stale_duration or access.STALE_TOKEN_DURATION"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAPH%2F%2FjYU%3D","line":129,"in_reply_to":"AAAAPH%2F%2Fk%2FE%3D","updated":"2013-05-30 17:33:48.000000000","message":"+100","commit_id":"c4d2130c2fa75a1d316efb488b1bf9f0aada4ac7"}],"tests/test_keyring.py":[{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"09a4d0c47f1a5235e2d3efafe3c522e9fac30da0","unresolved":false,"context_lines":[{"line_number":6,"context_line":"from tests import utils"},{"line_number":7,"context_line":"from tests import client_fixtures"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"keyring \u003d None"},{"line_number":10,"context_line":""},{"line_number":11,"context_line":"PROJECT_SCOPED_TOKEN \u003d client_fixtures.PROJECT_SCOPED_TOKEN"},{"line_number":12,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAPH%2F%2FjYQ%3D","line":9,"updated":"2013-05-30 17:33:48.000000000","message":"same here as in the other module","commit_id":"c4d2130c2fa75a1d316efb488b1bf9f0aada4ac7"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"09a4d0c47f1a5235e2d3efafe3c522e9fac30da0","unresolved":false,"context_lines":[{"line_number":40,"context_line":"                self.passwords \u003d {}"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"            def supported(self):"},{"line_number":43,"context_line":"                return 1"},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"            def get_password(self, service, username):"},{"line_number":46,"context_line":"                key \u003d username + \u0027@\u0027 + service"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAPH%2F%2FjYI%3D","line":43,"updated":"2013-05-30 17:33:48.000000000","message":"True? how is this used, anyway?","commit_id":"c4d2130c2fa75a1d316efb488b1bf9f0aada4ac7"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"09a4d0c47f1a5235e2d3efafe3c522e9fac30da0","unresolved":false,"context_lines":[{"line_number":65,"context_line":"                                                               TENANT_ID,"},{"line_number":66,"context_line":"                                                               TOKEN)"},{"line_number":67,"context_line":""},{"line_number":68,"context_line":"        self.assertEqual(keyring_key, None)"},{"line_number":69,"context_line":""},{"line_number":70,"context_line":"    def test_build_keyring_key(self):"},{"line_number":71,"context_line":"        cl \u003d client.HTTPClient(username\u003dUSERNAME, password\u003dPASSWORD,"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAPH%2F%2FjYE%3D","line":68,"updated":"2013-05-30 17:33:48.000000000","message":"assertIsNone","commit_id":"c4d2130c2fa75a1d316efb488b1bf9f0aada4ac7"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"09a4d0c47f1a5235e2d3efafe3c522e9fac30da0","unresolved":false,"context_lines":[{"line_number":106,"context_line":"                                            TOKEN)"},{"line_number":107,"context_line":""},{"line_number":108,"context_line":"        cl.auth_ref \u003d access.AccessInfo(PROJECT_SCOPED_TOKEN[\u0027access\u0027])"},{"line_number":109,"context_line":"        cl.auth_ref[\u0027token\u0027][\u0027expires\u0027] \u003d \u00272100-01-01T00:00:10.000123Z\u0027"},{"line_number":110,"context_line":"        cl.store_auth_ref_into_keyring(keyring_key)"},{"line_number":111,"context_line":"        (keyring_key, auth_ref) \u003d cl.get_auth_ref_from_keyring(AUTH_URL,"},{"line_number":112,"context_line":"                                                               USERNAME,"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAPH%2F%2FjXs%3D","line":109,"updated":"2013-05-30 17:33:48.000000000","message":"would prefer if these timestamps were dynamically created to be current time +/- second ... timeutils supports all that and we use it in other tests (keystone, at least)","commit_id":"c4d2130c2fa75a1d316efb488b1bf9f0aada4ac7"},{"author":{"_account_id":7191,"name":"Jamie Lennox","email":"jamielennox@gmail.com","username":"jamielennox"},"change_message_id":"1a0a569c9590158cac796bd71945f3e3ff8ad100","unresolved":false,"context_lines":[{"line_number":32,"context_line":"            import keyring"},{"line_number":33,"context_line":"            import pickle"},{"line_number":34,"context_line":"        except ImportError, e:"},{"line_number":35,"context_line":"            raise unittest.SkipTest(\u0027optional package not installed: %s\u0027 % e)"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"    def setUp(self):"},{"line_number":38,"context_line":"        class MemoryKeyring(keyring.backend.KeyringBackend):"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAPH%2F%2FeWE%3D","line":35,"updated":"2013-06-03 00:16:14.000000000","message":"Same thing here, you can import globally and then raise SkipTest in setUp if keyring is none. Apparently setUpClass is one of those things that testr doesn\u0027t handle well.","commit_id":"ef1ffb5b76a92bb778b053de6b57c68f62dd3141"},{"author":{"_account_id":7191,"name":"Jamie Lennox","email":"jamielennox@gmail.com","username":"jamielennox"},"change_message_id":"1a0a569c9590158cac796bd71945f3e3ff8ad100","unresolved":false,"context_lines":[{"line_number":35,"context_line":"            raise unittest.SkipTest(\u0027optional package not installed: %s\u0027 % e)"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"    def setUp(self):"},{"line_number":38,"context_line":"        class MemoryKeyring(keyring.backend.KeyringBackend):"},{"line_number":39,"context_line":"            \"\"\"Simple memory keyring with support for multiple keys\"\"\""},{"line_number":40,"context_line":"            def __init__(self):"},{"line_number":41,"context_line":"                self.passwords \u003d {}"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAPH%2F%2FeWA%3D","line":38,"updated":"2013-06-03 00:16:14.000000000","message":"I don\u0027t think this needs to be nested.","commit_id":"ef1ffb5b76a92bb778b053de6b57c68f62dd3141"},{"author":{"_account_id":7191,"name":"Jamie Lennox","email":"jamielennox@gmail.com","username":"jamielennox"},"change_message_id":"1a0a569c9590158cac796bd71945f3e3ff8ad100","unresolved":false,"context_lines":[{"line_number":66,"context_line":"                                                               TENANT_ID,"},{"line_number":67,"context_line":"                                                               TOKEN)"},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"        self.assertEqual(keyring_key, None)"},{"line_number":70,"context_line":""},{"line_number":71,"context_line":"    def test_build_keyring_key(self):"},{"line_number":72,"context_line":"        cl \u003d client.HTTPClient(username\u003dUSERNAME, password\u003dPASSWORD,"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAPH%2F%2FeVo%3D","line":69,"updated":"2013-06-03 00:16:14.000000000","message":"Dolph mentioned this use assertIsNone","commit_id":"ef1ffb5b76a92bb778b053de6b57c68f62dd3141"},{"author":{"_account_id":7191,"name":"Jamie Lennox","email":"jamielennox@gmail.com","username":"jamielennox"},"change_message_id":"1a0a569c9590158cac796bd71945f3e3ff8ad100","unresolved":false,"context_lines":[{"line_number":89,"context_line":"                                            TOKEN)"},{"line_number":90,"context_line":""},{"line_number":91,"context_line":"        cl.auth_ref \u003d access.AccessInfo(PROJECT_SCOPED_TOKEN[\u0027access\u0027])"},{"line_number":92,"context_line":"        cl.auth_ref[\u0027token\u0027][\u0027expires\u0027] \u003d \u00272000-01-01T00:00:10.000123Z\u0027"},{"line_number":93,"context_line":"        cl.store_auth_ref_into_keyring(keyring_key)"},{"line_number":94,"context_line":"        (keyring_key, auth_ref) \u003d cl.get_auth_ref_from_keyring(AUTH_URL,"},{"line_number":95,"context_line":"                                                               USERNAME,"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAPH%2F%2FeVY%3D","line":92,"updated":"2013-06-03 00:16:14.000000000","message":"Use timeutils and relative times.","commit_id":"ef1ffb5b76a92bb778b053de6b57c68f62dd3141"},{"author":{"_account_id":7191,"name":"Jamie Lennox","email":"jamielennox@gmail.com","username":"jamielennox"},"change_message_id":"1a0a569c9590158cac796bd71945f3e3ff8ad100","unresolved":false,"context_lines":[{"line_number":96,"context_line":"                                                               TENANT,"},{"line_number":97,"context_line":"                                                               TENANT_ID,"},{"line_number":98,"context_line":"                                                               TOKEN)"},{"line_number":99,"context_line":"        self.assertEqual(auth_ref, None)"},{"line_number":100,"context_line":""},{"line_number":101,"context_line":"    def test_set_and_get_keyring(self):"},{"line_number":102,"context_line":"        cl \u003d client.HTTPClient(username\u003dUSERNAME, password\u003dPASSWORD,"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAPH%2F%2FeVk%3D","line":99,"updated":"2013-06-03 00:16:14.000000000","message":"assertIsNone","commit_id":"ef1ffb5b76a92bb778b053de6b57c68f62dd3141"},{"author":{"_account_id":7191,"name":"Jamie Lennox","email":"jamielennox@gmail.com","username":"jamielennox"},"change_message_id":"1a0a569c9590158cac796bd71945f3e3ff8ad100","unresolved":false,"context_lines":[{"line_number":115,"context_line":"                                                               TENANT_ID,"},{"line_number":116,"context_line":"                                                               TOKEN)"},{"line_number":117,"context_line":"        self.assertEqual(auth_ref.auth_token, TOKEN)"},{"line_number":118,"context_line":"        self.assertEquals(auth_ref.username, USERNAME)"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAPH%2F%2FeVc%3D","line":118,"updated":"2013-06-03 00:16:14.000000000","message":"assertEqual","commit_id":"ef1ffb5b76a92bb778b053de6b57c68f62dd3141"},{"author":{"_account_id":7191,"name":"Jamie Lennox","email":"jamielennox@gmail.com","username":"jamielennox"},"change_message_id":"fe92c861f828cb1f60a560e4cd776f7679ab9910","unresolved":false,"context_lines":[{"line_number":34,"context_line":"            import keyring"},{"line_number":35,"context_line":"            import pickle"},{"line_number":36,"context_line":"        except ImportError, e:"},{"line_number":37,"context_line":"            raise unittest.SkipTest(\u0027optional package not installed: %s\u0027 % e)"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"    def setUp(self):"},{"line_number":40,"context_line":"        class MemoryKeyring(keyring.backend.KeyringBackend):"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAPX%2F%2F%2F8U%3D","line":37,"updated":"2013-06-04 04:22:18.000000000","message":"same as for the client.py make these global, then raise SkipTest in setUp if keyring is None","commit_id":"e528c23775e59f27a1e8b1ef54a823910e8f37f9"},{"author":{"_account_id":7191,"name":"Jamie Lennox","email":"jamielennox@gmail.com","username":"jamielennox"},"change_message_id":"123d991dc6baf55a34670391a900f516351de14d","unresolved":false,"context_lines":[{"line_number":34,"context_line":"            import keyring"},{"line_number":35,"context_line":"            import pickle"},{"line_number":36,"context_line":"        except ImportError, e:"},{"line_number":37,"context_line":"            raise unittest.SkipTest(\u0027optional package not installed: %s\u0027 % e)"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"    def setUp(self):"},{"line_number":40,"context_line":"        class MemoryKeyring(keyring.backend.KeyringBackend):"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAPX%2F%2F91Q%3D","line":37,"in_reply_to":"AAAAPX%2F%2F%2B%2B8%3D","updated":"2013-06-04 23:54:45.000000000","message":"ok, but you can do the import global as before with \n\ntry: \n   import keyring \n   import pickle\nexcept ImportError:\n  keyring \u003d None\n\nthen in setUpClass\n\nif not keyring:\n   raise unittest.SkipTest","commit_id":"e528c23775e59f27a1e8b1ef54a823910e8f37f9"},{"author":{"_account_id":7662,"name":"Rob Crittenden","email":"rcritten@redhat.com","username":"rcritten"},"change_message_id":"cd7e1e2cdfc4f6856345d313da401cf9a6d5e071","unresolved":false,"context_lines":[{"line_number":34,"context_line":"            import keyring"},{"line_number":35,"context_line":"            import pickle"},{"line_number":36,"context_line":"        except ImportError, e:"},{"line_number":37,"context_line":"            raise unittest.SkipTest(\u0027optional package not installed: %s\u0027 % e)"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"    def setUp(self):"},{"line_number":40,"context_line":"        class MemoryKeyring(keyring.backend.KeyringBackend):"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAPX%2F%2F%2B%2B8%3D","line":37,"in_reply_to":"AAAAPX%2F%2F%2F8U%3D","updated":"2013-06-04 15:45:03.000000000","message":"The difference is 1 skip vs 4 (or however many tests this ends up as). Is that really desirable?\n\nThe other option I can look into is using @unittest.skipUnless(\u003csomefunction\u003e, \u0027imports not available\u0027) where a function tries the import and we skip things early. Is that more agreeable? The class simply can\u0027t be global though.","commit_id":"e528c23775e59f27a1e8b1ef54a823910e8f37f9"},{"author":{"_account_id":7191,"name":"Jamie Lennox","email":"jamielennox@gmail.com","username":"jamielennox"},"change_message_id":"fe92c861f828cb1f60a560e4cd776f7679ab9910","unresolved":false,"context_lines":[{"line_number":37,"context_line":"            raise unittest.SkipTest(\u0027optional package not installed: %s\u0027 % e)"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"    def setUp(self):"},{"line_number":40,"context_line":"        class MemoryKeyring(keyring.backend.KeyringBackend):"},{"line_number":41,"context_line":"            \"\"\"Simple memory keyring with support for multiple keys\"\"\""},{"line_number":42,"context_line":"            def __init__(self):"},{"line_number":43,"context_line":"                self.passwords \u003d {}"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAPX%2F%2F%2F8M%3D","line":40,"updated":"2013-06-04 04:22:18.000000000","message":"I still think this should be global as well","commit_id":"e528c23775e59f27a1e8b1ef54a823910e8f37f9"},{"author":{"_account_id":7191,"name":"Jamie Lennox","email":"jamielennox@gmail.com","username":"jamielennox"},"change_message_id":"123d991dc6baf55a34670391a900f516351de14d","unresolved":false,"context_lines":[{"line_number":37,"context_line":"            raise unittest.SkipTest(\u0027optional package not installed: %s\u0027 % e)"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"    def setUp(self):"},{"line_number":40,"context_line":"        class MemoryKeyring(keyring.backend.KeyringBackend):"},{"line_number":41,"context_line":"            \"\"\"Simple memory keyring with support for multiple keys\"\"\""},{"line_number":42,"context_line":"            def __init__(self):"},{"line_number":43,"context_line":"                self.passwords \u003d {}"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAPX%2F%2F91M%3D","line":40,"in_reply_to":"AAAAPX%2F%2F%2B%2B4%3D","updated":"2013-06-04 23:54:45.000000000","message":"ok","commit_id":"e528c23775e59f27a1e8b1ef54a823910e8f37f9"},{"author":{"_account_id":7662,"name":"Rob Crittenden","email":"rcritten@redhat.com","username":"rcritten"},"change_message_id":"cd7e1e2cdfc4f6856345d313da401cf9a6d5e071","unresolved":false,"context_lines":[{"line_number":37,"context_line":"            raise unittest.SkipTest(\u0027optional package not installed: %s\u0027 % e)"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"    def setUp(self):"},{"line_number":40,"context_line":"        class MemoryKeyring(keyring.backend.KeyringBackend):"},{"line_number":41,"context_line":"            \"\"\"Simple memory keyring with support for multiple keys\"\"\""},{"line_number":42,"context_line":"            def __init__(self):"},{"line_number":43,"context_line":"                self.passwords \u003d {}"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAPX%2F%2F%2B%2B4%3D","line":40,"in_reply_to":"AAAAPX%2F%2F%2F8M%3D","updated":"2013-06-04 15:45:03.000000000","message":"This can\u0027t be global because the python will fail to execute if the import is not available. That is the point of using setUp and setupClass. setupClass does the high-level check to see if the import is available. If it isn\u0027t the setUp is never called and our class is never instantiated (it would fail with no import).","commit_id":"e528c23775e59f27a1e8b1ef54a823910e8f37f9"},{"author":{"_account_id":7191,"name":"Jamie Lennox","email":"jamielennox@gmail.com","username":"jamielennox"},"change_message_id":"fe92c861f828cb1f60a560e4cd776f7679ab9910","unresolved":false,"context_lines":[{"line_number":93,"context_line":"        cl.auth_ref \u003d access.AccessInfo(PROJECT_SCOPED_TOKEN[\u0027access\u0027])"},{"line_number":94,"context_line":"        now \u003d datetime.datetime.utcnow()"},{"line_number":95,"context_line":"        expired \u003d now - datetime.timedelta(seconds\u003d60 * 60 * 24)"},{"line_number":96,"context_line":"        timeutils.set_time_override(expired)"},{"line_number":97,"context_line":"        cl.auth_ref[\u0027token\u0027][\u0027expires\u0027] \u003d timeutils.isotime(timeutils.utcnow())"},{"line_number":98,"context_line":"        timeutils.clear_time_override()"},{"line_number":99,"context_line":"        cl.store_auth_ref_into_keyring(keyring_key)"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAPX%2F%2F%2F8I%3D","line":96,"updated":"2013-06-04 04:22:18.000000000","message":"you won\u0027t need the set_time_override, taking an example from keystone: \n\nexpired \u003d timeutils.utcnow() - datetime.timedelta(minutes\u003d10)","commit_id":"e528c23775e59f27a1e8b1ef54a823910e8f37f9"},{"author":{"_account_id":7662,"name":"Rob Crittenden","email":"rcritten@redhat.com","username":"rcritten"},"change_message_id":"cd7e1e2cdfc4f6856345d313da401cf9a6d5e071","unresolved":false,"context_lines":[{"line_number":93,"context_line":"        cl.auth_ref \u003d access.AccessInfo(PROJECT_SCOPED_TOKEN[\u0027access\u0027])"},{"line_number":94,"context_line":"        now \u003d datetime.datetime.utcnow()"},{"line_number":95,"context_line":"        expired \u003d now - datetime.timedelta(seconds\u003d60 * 60 * 24)"},{"line_number":96,"context_line":"        timeutils.set_time_override(expired)"},{"line_number":97,"context_line":"        cl.auth_ref[\u0027token\u0027][\u0027expires\u0027] \u003d timeutils.isotime(timeutils.utcnow())"},{"line_number":98,"context_line":"        timeutils.clear_time_override()"},{"line_number":99,"context_line":"        cl.store_auth_ref_into_keyring(keyring_key)"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAPX%2F%2F%2B8s%3D","line":96,"in_reply_to":"AAAAPX%2F%2F%2F8I%3D","updated":"2013-06-04 15:45:03.000000000","message":"Done","commit_id":"e528c23775e59f27a1e8b1ef54a823910e8f37f9"},{"author":{"_account_id":7191,"name":"Jamie Lennox","email":"jamielennox@gmail.com","username":"jamielennox"},"change_message_id":"baa9cc9d7791caa92c171b3443a20a225c4748ab","unresolved":false,"context_lines":[{"line_number":91,"context_line":"        cl.auth_ref \u003d access.AccessInfo(PROJECT_SCOPED_TOKEN[\u0027access\u0027])"},{"line_number":92,"context_line":"        expired \u003d timeutils.utcnow() - datetime.timedelta(minutes\u003d30)"},{"line_number":93,"context_line":"        cl.auth_ref[\u0027token\u0027][\u0027expires\u0027] \u003d timeutils.isotime(expired)"},{"line_number":94,"context_line":"        timeutils.clear_time_override()"},{"line_number":95,"context_line":"        cl.store_auth_ref_into_keyring(keyring_key)"},{"line_number":96,"context_line":"        (keyring_key, auth_ref) \u003d cl.get_auth_ref_from_keyring(AUTH_URL,"},{"line_number":97,"context_line":"                                                               USERNAME,"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAPX%2F%2F338%3D","line":94,"updated":"2013-06-06 23:54:28.000000000","message":"don\u0027t think you need this anymore","commit_id":"459103b8cd9c22ed2ed9a59c235e865065401056"},{"author":{"_account_id":7191,"name":"Jamie Lennox","email":"jamielennox@gmail.com","username":"jamielennox"},"change_message_id":"baa9cc9d7791caa92c171b3443a20a225c4748ab","unresolved":false,"context_lines":[{"line_number":109,"context_line":"                                            TOKEN)"},{"line_number":110,"context_line":""},{"line_number":111,"context_line":"        cl.auth_ref \u003d access.AccessInfo(PROJECT_SCOPED_TOKEN[\u0027access\u0027])"},{"line_number":112,"context_line":"        now \u003d datetime.datetime.utcnow()"},{"line_number":113,"context_line":"        expires \u003d timeutils.utcnow() + datetime.timedelta(minutes\u003d30)"},{"line_number":114,"context_line":"        cl.auth_ref[\u0027token\u0027][\u0027expires\u0027] \u003d timeutils.isotime(expires)"},{"line_number":115,"context_line":"        cl.store_auth_ref_into_keyring(keyring_key)"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAPX%2F%2F334%3D","line":112,"updated":"2013-06-06 23:54:28.000000000","message":"don\u0027t think this is used anywhere","commit_id":"459103b8cd9c22ed2ed9a59c235e865065401056"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"619169c26dcb483b16d08918c970269b4e895a17","unresolved":false,"context_lines":[{"line_number":1,"context_line":"import unittest"},{"line_number":2,"context_line":"import datetime"},{"line_number":3,"context_line":""},{"line_number":4,"context_line":"from keystoneclient import access"},{"line_number":5,"context_line":"from keystoneclient import client"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAAPX%2F%2F0Ak%3D","line":2,"updated":"2013-06-09 16:51:59.000000000","message":"imports should be in alphabetical order.","commit_id":"f87b2f8ade2f434b91c72d6da230839d11fd630f"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"619169c26dcb483b16d08918c970269b4e895a17","unresolved":false,"context_lines":[{"line_number":10,"context_line":"try:"},{"line_number":11,"context_line":"    import keyring  # noqa"},{"line_number":12,"context_line":"    import pickle  # noqa"},{"line_number":13,"context_line":"except ImportError, e:"},{"line_number":14,"context_line":"    keyring \u003d None"},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"PROJECT_SCOPED_TOKEN \u003d client_fixtures.PROJECT_SCOPED_TOKEN"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAAPX%2F%2F0Ag%3D","line":13,"updated":"2013-06-09 16:51:59.000000000","message":"e isn\u0027t used so remove it.","commit_id":"f87b2f8ade2f434b91c72d6da230839d11fd630f"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"619169c26dcb483b16d08918c970269b4e895a17","unresolved":false,"context_lines":[{"line_number":32,"context_line":"        super(KeyringTest, cls).setUpClass()"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"        if keyring is None:"},{"line_number":35,"context_line":"            raise unittest.SkipTest(\u0027optional package is not installed\u0027)"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"    def setUp(self):"},{"line_number":38,"context_line":"        class MemoryKeyring(keyring.backend.KeyringBackend):"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAAPX%2F%2F0Ac%3D","line":35,"updated":"2013-06-09 16:51:59.000000000","message":"add name of package,\n\n optional keyring or pickle package is not installed","commit_id":"f87b2f8ade2f434b91c72d6da230839d11fd630f"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"619169c26dcb483b16d08918c970269b4e895a17","unresolved":false,"context_lines":[{"line_number":66,"context_line":"                                                               TENANT_ID,"},{"line_number":67,"context_line":"                                                               TOKEN)"},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"        self.assertIsNone(keyring_key)"},{"line_number":70,"context_line":""},{"line_number":71,"context_line":"    def test_build_keyring_key(self):"},{"line_number":72,"context_line":"        cl \u003d client.HTTPClient(username\u003dUSERNAME, password\u003dPASSWORD,"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAAPX%2F%2F0AQ%3D","line":69,"updated":"2013-06-09 16:51:59.000000000","message":"They docstring for get_auth_ref_from_keyring indicates that it doesn\u0027t return None for keyring_key... is this wrong?","commit_id":"f87b2f8ade2f434b91c72d6da230839d11fd630f"},{"author":{"_account_id":7662,"name":"Rob Crittenden","email":"rcritten@redhat.com","username":"rcritten"},"change_message_id":"8b11188013c80b7067504d4bfbc1b8ba4c3d6ac3","unresolved":false,"context_lines":[{"line_number":66,"context_line":"                                                               TENANT_ID,"},{"line_number":67,"context_line":"                                                               TOKEN)"},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"        self.assertIsNone(keyring_key)"},{"line_number":70,"context_line":""},{"line_number":71,"context_line":"    def test_build_keyring_key(self):"},{"line_number":72,"context_line":"        cl \u003d client.HTTPClient(username\u003dUSERNAME, password\u003dPASSWORD,"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAAPX%2F%2FyuQ%3D","line":69,"in_reply_to":"AAAAPX%2F%2F0AQ%3D","updated":"2013-06-10 15:35:22.000000000","message":"The doc string is imprecise. It is true only if use_keyring is passed when HTTPClient is instantiated. It otherwise returns (None, None) which is what this test was trying to validate. I\u0027ll fix up the doc string too.","commit_id":"f87b2f8ade2f434b91c72d6da230839d11fd630f"}]}
